1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
|
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<HTML>
<HEAD>
<TITLE>nevrax.org : docs</TITLE>
<LINK REL=stylesheet TYPE="text/css" HREF="/inc/css/nevrax.css">
<link href="doxygen.css" rel="stylesheet" type="text/css">
</HEAD>
<BODY MARGINHEIGHT="0" MARGINWIDTH="0">
<!-- uplinks -->
<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0>
<TR>
<TD WIDTH=16><IMG SRC="/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD>
<TD WIDTH=140 BGCOLOR=#dddddd><IMG SRC="/inc/img/pixel.gif" WIDTH="140" HEIGHT="16" BORDER=0 ALT=""></TD>
<TD WIDTH=16><IMG SRC="/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD>
<TD><IMG width=6 height=14 SRC="/inc/img/reddots.gif" ALT="#" VSPACE=2 HSPACE=2 BORDER=0 ></TD><TD VALIGN=middle> <A CLASS=uplinks HREF='/'><b>Home</B></FONT></A> </TD>
<TD><IMG width=6 height=14 SRC="/inc/img/reddots.gif" ALT="#" VSPACE=2 HSPACE=2 BORDER=0 ></TD><TD VALIGN=middle> <A CLASS=uplinks HREF=><b>nevrax.com</B></FONT></A> </TD>
</TR>
</TABLE>
<!-- banner Nevrax -->
<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%>
<TR><TD BGCOLOR="#000000" BACKGROUND="/inc/img/black_banner.jpg"><A HREF=""><IMG SRC="/inc/img/nevrax.gif" WIDTH="170" HEIGHT="45" BORDER=0 ALT="Nevrax" ></A></TD></TR>
</TABLE>
<!-- main table -->
<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 height=100%>
<TR>
<TD WIDTH=16><IMG SRC="/inc/img/pixel.gif" WIDTH="16" HEIGHT="10" BORDER=0 ALT=""></TD>
<TD WIDTH=140 BGCOLOR=#dddddd VALIGN=TOP ALIGN=middle><IMG SRC="/inc/img/pixel.gif" WIDTH="140" HEIGHT="10" BORDER=0 ALT="">
<!------ Begin Box ------>
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 BGCOLOR=black><TR><TD><TABLE border=0 cellspacing=2 cellpadding=0 width=120><tr><TD ALIGN=middle bgcolor=black>
<FONT COLOR=white FACE="sans-serif"><B>Nevrax.org</B></FONT></TD></TR><tr><td colspan=2 bgcolor=#FFFFFF>
<TABLE cellspacing=0 cellpadding=1 border=0>
<tr><td ALIGN=middle><a class='linkbox' href="/news/" TITLE="Rubrique news"><img width=13 height=15 hspace=5 border=0 src=/inc/img/picto-news.gif ALT=#></A></td><td><a class='linkbox' href="/news/" TITLE="News">News</a></td></tr>
<tr><td ALIGN=middle><a class='linkbox' href="/mail/" TITLE="Rubrique mail"><img width=15 height=11 hspace=5 border=0 src=/inc/img/picto-mail.gif ALT=#></A></td><td><a class='linkbox' href="/mail/" TITLE="Mailing list archive">Mailing-list</a></td></tr>
<tr><td ALIGN=middle><a class='linkbox' href="/docs/" TITLE="Rubrique docs"><img width=14 height=16 hspace=5 border=0 src=/inc/img/picto-docs.gif ALT=#></A></td><td><a class='linkbox' href="/docs/" TITLE="Documentation">Documentation</a></td></tr>
<tr><td ALIGN=middle><a class='linkbox' href="/cvs/" TITLE="Rubrique cvs"><img width=13 height=17 hspace=5 border=0 src=/inc/img/picto-cvs.gif ALT=#></A></td><td><a class='linkbox' href="/cvs/" TITLE="CVS Web">CVS</a></td></tr>
<tr><td ALIGN=middle><a class='linkbox' href="/bugs/" TITLE="Rubrique bugs"><img width=20 height=16 hspace=5 border=0 src=/inc/img/picto-bugs.gif ALT=#></A></td><td><a class='linkbox' href="/bugs/" TITLE="Bugtracking">Bugs</a></td></tr>
<tr><td ALIGN=middle><a class='linkbox' href="/GPL.php3" TITLE="Rubrique license"><img width=18 height=12 hspace=5 border=0 src=/inc/img/picto-gpl.gif ALT=#></A></td><td><a class='linkbox' href="/GPL.php3" TITLE="License">License</a></td></tr>
</TABLE>
</TD></TR></TABLE></TD></TR></TABLE>
<!------ End Box ------>
</TD>
<TD WIDTH=15><IMG SRC="/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD>
<TD ALIGN=left valign=top><IMG SRC="/inc/img/pixel.gif" WIDTH="140" HEIGHT="10" BORDER=0 ALT="">
<!-- title -->
<TABLE background="/inc/img/redline.gif" CELLSPACING=0 CELLPADDING=0 BORDER=0 width=100%><tr><td>
<A HREF="/docs/"><img src="/inc/img/t_docs.gif" ALT="Docs" HEIGHT=20 BORDER=0></A>
</td><td><IMG SRC="/inc/img/pixel.gif" WIDTH="1" HEIGHT="1" BORDER=0 ALT="">
</td></tr></table>
<!-- block -->
<TABLE bgcolor="#dddddd" CELLSPACING=0 CELLPADDING=0 BORDER=0 width=100%><tr><td width=1% valign=middle><img width=6 height=14 hspace=2 vspace=2 src="/inc/img/reddots.gif"></TD>
<TD><B>Documentation</B></TD>
<TD ALIGN=RIGHT> </td>
</tr></table>
<!-- Generated by Doxygen 1.2.14 -->
<center>
<a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="namespaces.html">Namespace List</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="classes.html">Alphabetical List</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="namespacemembers.html">Namespace Members</a> <a class="qindex" href="functions.html">Compound Members</a> <a class="qindex" href="globals.html">File Members</a> <a class="qindex" href="pages.html">Related Pages</a> <a class="qindexRef" doxygen="_cgi:/cgi-bin/nel-search.cgi" href="/cgi-bin/nel-search.cgi">Search</a> </center>
<hr><h1>fasthls_modifier.cpp</h1><a href="fasthls__modifier_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001
00007 <font class="comment">/* Copyright, 2000-2002 Nevrax Ltd.</font>
00008 <font class="comment"> *</font>
00009 <font class="comment"> * This file is part of NEVRAX NEL.</font>
00010 <font class="comment"> * NEVRAX NEL is free software; you can redistribute it and/or modify</font>
00011 <font class="comment"> * it under the terms of the GNU General Public License as published by</font>
00012 <font class="comment"> * the Free Software Foundation; either version 2, or (at your option)</font>
00013 <font class="comment"> * any later version.</font>
00014 <font class="comment"></font>
00015 <font class="comment"> * NEVRAX NEL is distributed in the hope that it will be useful, but</font>
00016 <font class="comment"> * WITHOUT ANY WARRANTY; without even the implied warranty of</font>
00017 <font class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</font>
00018 <font class="comment"> * General Public License for more details.</font>
00019 <font class="comment"></font>
00020 <font class="comment"> * You should have received a copy of the GNU General Public License</font>
00021 <font class="comment"> * along with NEVRAX NEL; see the file COPYING. If not, write to the</font>
00022 <font class="comment"> * Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,</font>
00023 <font class="comment"> * MA 02111-1307, USA.</font>
00024 <font class="comment"> */</font>
00025
00026
00027 <font class="preprocessor">#include "<a class="code" href="std3d_8h.html">std3d.h</a>"</font>
00028 <font class="preprocessor">#include "<a class="code" href="fasthls__modifier_8h.html">3d/fasthls_modifier.h</a>"</font>
00029 <font class="preprocessor">#include "<a class="code" href="fast__floor_8h.html">3d/fast_floor.h</a>"</font>
00030 <font class="preprocessor">#include "<a class="code" href="bitmap_8h.html">nel/misc/bitmap.h</a>"</font>
00031 <font class="preprocessor">#include "<a class="code" href="system__info_8h.html">nel/misc/system_info.h</a>"</font>
00032 <font class="preprocessor">#include "<a class="code" href="algo_8h.html">nel/misc/algo.h</a>"</font>
00033
00034
00035 <font class="keyword">using</font> <font class="keyword">namespace </font>std;
00036 <font class="keyword">using</font> <font class="keyword">namespace </font>NLMISC;
00037
00038
00039 <font class="keyword">namespace </font>NL3D
00040 {
00041
00042 <font class="comment">// ***************************************************************************</font>
<a name="l00043"></a><a class="code" href="classNL3D_1_1CFastHLSModifier.html#r0">00043</a> CFastHLSModifier *CFastHLSModifier::_Instance= NULL;
00044
00045
00046 <font class="comment">// ***************************************************************************</font>
<a name="l00047"></a><a class="code" href="classNL3D_1_1CFastHLSModifier.html#c0">00047</a> CFastHLSModifier::CFastHLSModifier()
00048 {
00049 uint i;
00050 <font class="comment">// build the HueTable.</font>
00051 <font class="keywordflow">for</font>(i=0;i<<a class="code" href="classNL3D_1_1CFastHLSModifier.html#u1u0">HueTableSize</a>;i++)
00052 {
00053 <a class="code" href="classNL3D_1_1CFastHLSModifier.html#o0">_HueTable</a>[i].buildFromHLS(360.0f*i/<a class="code" href="classNL3D_1_1CFastHLSModifier.html#u1u0">HueTableSize</a>, 0.5f, 1);
00054 }
00055 <font class="comment">// build conversion from uint16 to HLS.</font>
00056 <font class="keywordflow">for</font>(i=0;i<65536;i++)
00057 {
00058 CRGBA col;
00059 col.set565(i);
00060 <font class="keywordtype">float</font> h,<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>,<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>;
00061 col.convertToHLS(h,<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>,<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>);
00062 h= (float)floor(255*(h/360.f)+0.5f);
00063 <a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>= (float)floor(255*<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>+0.5f);
00064 <a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>= (float)floor(255*<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>+0.5f);
00065 <a class="code" href="namespaceNLMISC.html#a215">clamp</a>(h,0,255);
00066 <a class="code" href="namespaceNLMISC.html#a215">clamp</a>(<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>,0,255);
00067 <a class="code" href="namespaceNLMISC.html#a215">clamp</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>,0,255);
00068 <a class="code" href="classNL3D_1_1CFastHLSModifier.html#o1">_Color16ToHLS</a>[i].<a class="code" href="structNL3D_1_1CFastHLSModifier_1_1CHLSA.html#m0">H</a>= (uint8)h;
00069 <a class="code" href="classNL3D_1_1CFastHLSModifier.html#o1">_Color16ToHLS</a>[i].<a class="code" href="structNL3D_1_1CFastHLSModifier_1_1CHLSA.html#m1">L</a>= (uint8)<a class="code" href="namespaceNLAISCRIPT.html#a20">l</a>;
00070 <a class="code" href="classNL3D_1_1CFastHLSModifier.html#o1">_Color16ToHLS</a>[i].<a class="code" href="structNL3D_1_1CFastHLSModifier_1_1CHLSA.html#m2">S</a>= (uint8)<a class="code" href="driver__opengl__extension__def_8h.html#a383">s</a>;
00071 <a class="code" href="classNL3D_1_1CFastHLSModifier.html#o1">_Color16ToHLS</a>[i].<a class="code" href="structNL3D_1_1CFastHLSModifier_1_1CHLSA.html#m3">A</a>= 255;
00072 }
00073 }
00074
00075
00076 <font class="comment">// ***************************************************************************</font>
<a name="l00077"></a><a class="code" href="classNL3D_1_1CFastHLSModifier.html#d0">00077</a> CFastHLSModifier &CFastHLSModifier::getInstance()
00078 {
00079 <font class="keywordflow">if</font>(!<a class="code" href="classNL3D_1_1CFastHLSModifier.html#r0">_Instance</a>)
00080 <a class="code" href="classNL3D_1_1CFastHLSModifier.html#r0">_Instance</a>= <font class="keyword">new</font> <a class="code" href="classNL3D_1_1CFastHLSModifier.html#c0">CFastHLSModifier</a>;
00081 <font class="keywordflow">return</font> *<a class="code" href="classNL3D_1_1CFastHLSModifier.html#r0">_Instance</a>;
00082 }
00083
00084
00085 <font class="comment">// ***************************************************************************</font>
<a name="l00086"></a><a class="code" href="classNL3D_1_1CFastHLSModifier.html#a0">00086</a> CRGBA CFastHLSModifier::convert(uint H, uint L, uint S)
00087 {
00088 <font class="keyword">static</font> CRGBA gray(128,128,128);
00089 L+= L>>7;
00090 S+= S>>7;
00091 <font class="comment">// H.</font>
00092 CRGBA col= <a class="code" href="classNL3D_1_1CFastHLSModifier.html#o0">_HueTable</a>[H];
00093 <font class="comment">// S.</font>
00094 col.blendFromuiRGBOnly(gray, col, S);
00095 <font class="comment">// L.</font>
00096 <font class="keywordflow">if</font>(L<=128)
00097 {
00098 col.modulateFromuiRGBOnly(col, L*2);
00099 }
00100 <font class="keywordflow">else</font>
00101 {
00102 col.blendFromuiRGBOnly(col, CRGBA::White, (L-128)*2 );
00103 }
00104
00105 <font class="keywordflow">return</font> col;
00106 }
00107
00108
00109 <font class="comment">// ***************************************************************************</font>
<a name="l00110"></a><a class="code" href="classNL3D_1_1CFastHLSModifier.html#a3">00110</a> uint16 CFastHLSModifier::applyHLSMod(uint16 colorIn, uint8 dHue, uint dLum, uint dSat)
00111 {
00112 <font class="keyword">static</font> uint64 mmBlank = 0;
00113 <font class="keyword">static</font> uint64 mmOne = 0x00FF00FF00FF00FF;
00114 <font class="keyword">static</font> uint64 mmGray = 0x0080008000800080;
00115 <font class="keyword">static</font> uint64 mmInterpBufer[4]= {0,0,0,0x00FF00FF00FF00FF};
00116
00117 <font class="comment">/*</font>
00118 <font class="comment"> dLum is actually 0xFFFFFF00 + realDLum</font>
00119 <font class="comment"> dSat is actually 0xFFFFFF00 + realDSat</font>
00120 <font class="comment"> */</font>
00121
00122 uint16 retVal;
00123
00124 <font class="preprocessor">#ifdef NL_OS_WINDOWS</font>
00125 <font class="preprocessor"></font> <font class="keywordflow">if</font>(CSystemInfo::hasMMX())
00126 {
00127 __asm
00128 {
00129 mov edi, <a class="code" href="driver__opengl__extension__def_8h.html#a378">offset</a> mmInterpBufer
00130 mov ecx, <font class="keyword">this</font>
00131
00132 <font class="comment">// get HLS in edx.</font>
00133 mov eax, 0
00134 mov ebx, 0
00135 lea esi, [ecx]<font class="keyword">this</font>._Color16ToHLS
00136 mov ax, colorIn
00137 mov edx, [esi+ eax*4]
00138
00139 <font class="comment">// apply dh to H (ie dl!). Auto-wrap.</font>
00140 add dl, dHue
00141 <font class="comment">// get the color into mm0</font>
00142 mov bl, dl
00143 lea esi, [ecx]<font class="keyword">this</font>._HueTable
00144 movd mm0, [esi+ ebx*4]
00145 punpcklbw mm0, mmBlank
00146
00147 <font class="comment">// get L into eax and S into ebx</font>
00148 mov eax, edx
00149 mov ebx, edx
00150 shr eax, 8
00151 shr ebx, 16
00152 and eax, 255
00153 and ebx, 255
00154 <font class="comment">// add dLum/dSat and clamp to 1.</font>
00155 add eax, dLum
00156 sbb ecx, ecx <font class="comment">// ecx= FFFFFFFF if carry.</font>
00157 add ebx, dSat
00158 sbb edx, edx
00159 or eax, ecx <font class="comment">// eax= FFFFFFFF if carry was set</font>
00160 or ebx, edx
00161 <font class="comment">// add Magic delta, and clamp to 0.</font>
00162 add eax, 256
00163 sbb ecx, ecx <font class="comment">// ecx= 0 if carry not set => result below 0.</font>
00164 add ebx, 256
00165 sbb edx, edx
00166 and eax, ecx <font class="comment">// eax= 0 if result was below 0</font>
00167 and ebx, edx
00168
00169 <font class="comment">// Load Sat/(1-Sat) into MMX</font>
00170 movd mm2, ebx
00171 movq mm3, mmOne
00172 punpckldq mm2, mm2 <font class="comment">// mm2= 0000 00AA 0000 00AA</font>
00173 packssdw mm2, mm2 <font class="comment">// mm2= 00AA 00AA 00AA 00AA</font>
00174 movq mm1, mmGray
00175 psubusw mm3, mm2 <font class="comment">// mm3= 1-sat.</font>
00176 <font class="comment">// combine Color and Sat</font>
00177 pmullw mm0, mm2 <font class="comment">// mm0= color*sat</font>
00178 pmullw mm1, mm3 <font class="comment">// mm1= gray*(1-sat)</font>
00179 paddusw mm0, mm1 <font class="comment">// mm0= color saturated</font>
00180 <font class="comment">// shift and store into the buffer for Luminance interpolation</font>
00181 psrlw mm0, 8
00182 movq [edi+ 8], mm0
00183 movq [edi+ 16], mm0
00184
00185 <font class="comment">// use edx as index for luminance: 0: L=0 to 127. 1: L=128 to 255.</font>
00186 mov edx, eax
00187 shl eax, 1
00188 shr edx, 7
00189 and eax, 255 <font class="comment">// 0-127 and 128-255 transform auto to 0-254</font>
00190 <font class="comment">// expand 0-254 to 0-255</font>
00191 mov ecx, eax
00192 shl edx, 4
00193 shr ecx, 7
00194 add eax, ecx
00195
00196 <font class="comment">// Combine color and Luminance into MMX. interpolate 0->col or col->white according to edx.</font>
00197 <font class="comment">// Load Lum/(1-Lum) into MMX</font>
00198 movd mm2, eax
00199 movq mm3, mmOne
00200 punpckldq mm2, mm2 <font class="comment">// mm2= 0000 00AA 0000 00AA</font>
00201 packssdw mm2, mm2 <font class="comment">// mm2= 00AA 00AA 00AA 00AA</font>
00202 psubusw mm3, mm2 <font class="comment">// mm3= 1-lum.</font>
00203 <font class="comment">// Combine color and Sat into MMX</font>
00204 movq mm0, [edi+ edx]
00205 movq mm1, [edi+ edx + 8]
00206 pmullw mm0, mm3 <font class="comment">// mm0= color0*(1-lum)</font>
00207 pmullw mm1, mm2 <font class="comment">// mm1= color1*lum</font>
00208 paddusw mm0, mm1 <font class="comment">// mm0= final color</font>
00209
00210 <font class="comment">// shift and unpack</font>
00211 psrlw mm0, 8
00212 packuswb mm0, mm0
00213 movd eax, mm0
00214
00215 <font class="comment">// pack to 16bits.</font>
00216 mov ebx, eax
00217 mov ecx, eax
00218 shl eax, 8 <font class="comment">// Red</font>
00219 shr ebx, 5 <font class="comment">// Green</font>
00220 shr ecx, 19 <font class="comment">// Blue</font>
00221 and eax, 0xF800
00222 and ebx, 0x07E0
00223 and ecx, 0x001F
00224 or eax, ebx
00225 or eax, ecx
00226
00227 mov retVal, ax
00228 }
00229 }
00230 <font class="keywordflow">else</font>
00231 <font class="preprocessor">#endif // NL_OS_WINDOWS</font>
00232 <font class="preprocessor"></font> {
00233 CHLSA hls= <a class="code" href="classNL3D_1_1CFastHLSModifier.html#o1">_Color16ToHLS</a>[colorIn];
00234 <font class="comment">// apply (C version) Dhue, dLum and dSat</font>
00235 hls.<a class="code" href="structNL3D_1_1CFastHLSModifier_1_1CHLSA.html#m0">H</a>= (uint8)(hls.H + dHue);
00236 sint <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>= (sint)hls.L + (sint)(dLum-0xFFFFFF00);
00237 fastClamp8(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>);
00238 hls.L= <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>;
00239 <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>= (sint)hls.S + (sint)(dSat-0xFFFFFF00);
00240 fastClamp8(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>);
00241 hls.S= <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>;
00242
00243 CRGBA ret= <a class="code" href="classNL3D_1_1CFastHLSModifier.html#a0">convert</a>(hls.H, hls.L, hls.S);
00244 retVal= ret.get565();
00245 }
00246
00247 <font class="keywordflow">return</font> retVal;
00248 }
00249
00250
00251 <font class="comment">// ***************************************************************************</font>
<a name="l00252"></a><a class="code" href="classNL3D_1_1CFastHLSModifier.html#c1">00252</a> <font class="keywordtype">void</font> CFastHLSModifier::convertDDSBitmapDXTC1Or1A(CBitmap &dst, <font class="keyword">const</font> CBitmap &<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>, uint8 dh, uint dLum, uint dSat)
00253 {
00254 uint W= <a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>.getWidth();
00255 uint H= <a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>.getHeight();
00256
00257 <font class="keyword">const</font> uint8 *srcPix= &(<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>.getPixels()[0]);
00258 uint8 *dstPix= &(dst.getPixels()[0]);
00259 uint numBlock= (W*H)/16;
00260
00261 <font class="comment">/*</font>
00262 <font class="comment"> need to swap color and bits for DXTC1 or DXTC1A.</font>
00263 <font class="comment"> */</font>
00264
00265 <font class="keyword">static</font> uint32 bitLUT[8]= {
00266 1,0,3,2, <font class="comment">// reverse std order</font>
00267 1,0,2,3, <font class="comment">// reverse order for "special 0/black packing"</font>
00268 };
00269
00270 <font class="comment">// Do not use alpha mask for now.</font>
00271 <font class="keywordflow">for</font>(;numBlock>0;numBlock--)
00272 {
00273 uint16 srcCol0= ((uint16*)srcPix)[0];
00274 uint16 srcCol1= ((uint16*)srcPix)[1];
00275 <font class="keywordtype">bool</font> srcSign= srcCol0>srcCol1;
00276 <font class="comment">// apply modifiers for 2 colors.</font>
00277 uint16 dstCol0= <a class="code" href="classNL3D_1_1CFastHLSModifier.html#a3">applyHLSMod</a>(srcCol0, dh,dLum,dSat);
00278 uint16 dstCol1= <a class="code" href="classNL3D_1_1CFastHLSModifier.html#a3">applyHLSMod</a>(srcCol1, dh,dLum,dSat);
00279 <font class="keywordtype">bool</font> dstSign= dstCol0>dstCol1;
00280 <font class="keywordflow">if</font>((uint)dstSign!=(uint)srcSign)
00281 {
00282 swap(dstCol0,dstCol1);
00283 <font class="comment">// must change bits too!</font>
00284 uint32 srcBits= ((uint32*)srcPix)[1];
00285 uint32 dstBits= 0;
00286 <font class="comment">// take correct lut according to original sign</font>
00287 uint32 *lut;
00288 <font class="keywordflow">if</font>(srcCol0>srcCol1)
00289 lut= bitLUT;
00290 <font class="keywordflow">else</font>
00291 lut= bitLUT+4;
00292
00293 <font class="comment">// for all bits, transpose with lut.</font>
00294 <font class="preprocessor">#ifdef NL_OS_WINDOWS</font>
00295 <font class="preprocessor"></font> __asm
00296 {
00297 mov eax, srcBits
00298 mov esi, lut
00299 mov edx, 0
00300 mov ecx, 16
00301 <font class="comment">// prepare 1st.</font>
00302 rol eax, 2
00303 mov ebx, eax
00304 and ebx, 2
00305 <font class="comment">// do it 16 times.</font>
00306 myLoop:
00307 or edx, [esi+ebx*4]
00308 rol eax, 2
00309 rol edx, 2
00310 mov ebx, eax
00311 and ebx, 2
00312 dec ecx
00313 jnz myLoop
00314
00315 ror edx, 2
00316 mov dstBits, edx
00317 }
00318 <font class="preprocessor">#else</font>
00319 <font class="preprocessor"></font> <font class="keywordflow">for</font>(uint n=16;n>0;n--)
00320 {
00321 <font class="comment">// transform the id.</font>
00322 uint <a class="code" href="driver__opengl__extension__def_8h.html#a356">id</a>= srcBits&3;
00323 <a class="code" href="driver__opengl__extension__def_8h.html#a356">id</a>= lut[<a class="code" href="driver__opengl__extension__def_8h.html#a356">id</a>];
00324 <font class="comment">// write.</font>
00325 dstBits|= <a class="code" href="driver__opengl__extension__def_8h.html#a356">id</a><<30;
00326 <font class="comment">// don't decal last</font>
00327 <font class="keywordflow">if</font>(n>1)
00328 dstBits>>=2;
00329 }
00330 <font class="preprocessor">#endif</font>
00331 <font class="preprocessor"></font>
00332 <font class="comment">// store </font>
00333 ((uint32*)dstPix)[1]= dstBits;
00334 }
00335 <font class="keywordflow">else</font>
00336 <font class="comment">// just copy bits</font>
00337 ((uint32*)dstPix)[1]= ((uint32*)srcPix)[3];
00338 ((uint16*)dstPix)[0]= dstCol0;
00339 ((uint16*)dstPix)[1]= dstCol1;
00340 <font class="comment">// skip.</font>
00341 srcPix+= 8;
00342 dstPix+= 8;
00343 }
00344
00345 <font class="comment">// Must end MMX, for applyHLSMod()</font>
00346 <font class="preprocessor">#ifdef NL_OS_WINDOWS</font>
00347 <font class="preprocessor"></font> <font class="keywordflow">if</font>(CSystemInfo::hasMMX())
00348 _asm emms;
00349 <font class="preprocessor">#endif</font>
00350 <font class="preprocessor"></font>
00351 }
00352
00353 <font class="comment">// ***************************************************************************</font>
<a name="l00354"></a><a class="code" href="classNL3D_1_1CFastHLSModifier.html#c2">00354</a> <font class="keywordtype">void</font> CFastHLSModifier::convertDDSBitmapDXTC3Or5(CBitmap &dst, <font class="keyword">const</font> CBitmap &<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>, uint8 dh, uint dLum, uint dSat)
00355 {
00356 uint W= <a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>.getWidth();
00357 uint H= <a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>.getHeight();
00358
00359 <font class="keyword">const</font> uint8 *srcPix= &(<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>.getPixels()[0]);
00360 uint8 *dstPix= &(dst.getPixels()[0]);
00361 uint numBlock= (W*H)/16;
00362
00363 <font class="comment">/*</font>
00364 <font class="comment"> NB: don't need to swap color and bits for DXTC3 or DXTC5.</font>
00365 <font class="comment"> */</font>
00366
00367 <font class="comment">// Do not use alpha mask for now.</font>
00368 <font class="keywordflow">for</font>(;numBlock>0;numBlock--)
00369 {
00370 uint16 srcCol0= ((uint16*)srcPix)[4];
00371 uint16 srcCol1= ((uint16*)srcPix)[5];
00372 <font class="comment">// apply modifiers for 2 colors.</font>
00373 ((uint16*)dstPix)[4]= <a class="code" href="classNL3D_1_1CFastHLSModifier.html#a3">applyHLSMod</a>(srcCol0, dh,dLum,dSat);
00374 ((uint16*)dstPix)[5]= <a class="code" href="classNL3D_1_1CFastHLSModifier.html#a3">applyHLSMod</a>(srcCol1, dh,dLum,dSat);
00375 <font class="comment">// just copy bits</font>
00376 ((uint32*)dstPix)[3]= ((uint32*)srcPix)[3];
00377 <font class="comment">// copy alpha part.</font>
00378 ((uint32*)dstPix)[0]= ((uint32*)srcPix)[0];
00379 ((uint32*)dstPix)[1]= ((uint32*)srcPix)[1];
00380 <font class="comment">// skip bits and alpha part.</font>
00381 srcPix+= 16;
00382 dstPix+= 16;
00383 }
00384
00385 <font class="comment">// Must end MMX, for applyHLSMod()</font>
00386 <font class="preprocessor">#ifdef NL_OS_WINDOWS</font>
00387 <font class="preprocessor"></font> <font class="keywordflow">if</font>(CSystemInfo::hasMMX())
00388 _asm emms;
00389 <font class="preprocessor">#endif</font>
00390 <font class="preprocessor"></font>}
00391
00392 <font class="comment">// ***************************************************************************</font>
<a name="l00393"></a><a class="code" href="classNL3D_1_1CFastHLSModifier.html#a2">00393</a> <font class="keywordtype">void</font> CFastHLSModifier::convertDDSBitmap(CBitmap &dst, <font class="keyword">const</font> CBitmap &<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>, uint8 dh, sint dl, sint ds)
00394 {
00395 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>.getPixelFormat()==dst.getPixelFormat());
00396 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>.getWidth()==dst.getWidth() && <a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>.getHeight()==dst.getHeight());
00397
00398 <font class="comment">// Magic add clamp.</font>
00399 uint dLum= 0xFFFFFF00 + dl;
00400 uint dSat= 0xFFFFFF00 + ds;
00401
00402 <font class="keywordflow">if</font>(<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>.getPixelFormat()==CBitmap::DXTC1 || <a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>.getPixelFormat()==CBitmap::DXTC1Alpha)
00403 <a class="code" href="classNL3D_1_1CFastHLSModifier.html#c1">convertDDSBitmapDXTC1Or1A</a>(dst, <a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>, dh, dLum, dSat);
00404 <font class="keywordflow">else</font> <font class="keywordflow">if</font>(<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>.getPixelFormat()==CBitmap::DXTC3 || <a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>.getPixelFormat()==CBitmap::DXTC5)
00405 <a class="code" href="classNL3D_1_1CFastHLSModifier.html#c2">convertDDSBitmapDXTC3Or5</a>(dst, <a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>, dh, dLum, dSat);
00406 <font class="keywordflow">else</font>
00407 {
00408 <a class="code" href="debug_8h.html#a12">nlstop</a>;
00409 }
00410 }
00411
00412
00413 <font class="comment">// ***************************************************************************</font>
<a name="l00414"></a><a class="code" href="classNL3D_1_1CFastHLSModifier.html#a1">00414</a> <font class="keywordtype">void</font> CFastHLSModifier::convertRGBABitmap(CBitmap &dst, <font class="keyword">const</font> CBitmap &<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>, uint8 dh, sint dl, sint ds)
00415 {
00416 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>.getPixelFormat()==dst.getPixelFormat());
00417 <a class="code" href="debug_8h.html#a6">nlassert</a>(<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>.getPixelFormat()==CBitmap::RGBA);
00418
00419 uint W= <a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>.getWidth();
00420 uint H= <a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>.getHeight();
00421
00422 <font class="keyword">const</font> CRGBA *srcPix= (<font class="keyword">const</font> CRGBA*)&(<a class="code" href="driver__opengl__extension__def_8h.html#a409">src</a>.getPixels()[0]);
00423 CRGBA *dstPix= (CRGBA*)&(dst.getPixels()[0]);
00424 uint numPix= W*H;
00425
00426 <font class="comment">// Do not use alpha mask for now.</font>
00427 <font class="keywordflow">for</font>(;numPix>0;numPix--)
00428 {
00429 <font class="keywordtype">float</font> H,L,S;
00430 srcPix->convertToHLS(H,L,S);
00431 H*= 256.f/360.f;
00432 L*= 255.f;
00433 S*= 255.f;
00434 H+= dh+0.5f;
00435 L+= dl+0.5f;
00436 S+= ds+0.5f;
00437 <a class="code" href="namespaceNLMISC.html#a215">clamp</a>(H, 0, 255);
00438 <a class="code" href="namespaceNLMISC.html#a215">clamp</a>(L, 0, 255);
00439 <a class="code" href="namespaceNLMISC.html#a215">clamp</a>(S, 0, 255);
00440 uint8 H8= (uint8)<a class="code" href="namespaceNL3D.html#a362">OptFastFloor</a>(H);
00441 uint8 L8= (uint8)<a class="code" href="namespaceNL3D.html#a362">OptFastFloor</a>(L);
00442 uint8 S8= (uint8)<a class="code" href="namespaceNL3D.html#a362">OptFastFloor</a>(S);
00443 *dstPix= <a class="code" href="classNL3D_1_1CFastHLSModifier.html#a0">convert</a>(H8, L8, S8);
00444 srcPix++;
00445 dstPix++;
00446 }
00447 }
00448
00449
00450 } <font class="comment">// NL3D</font>
</pre></div>
<!-- footer -->
<BR><FONT Size=+5> </FONT>
</TD>
<TD WIDTH=15><IMG SRC=/inc/img/pixel.gif WIDTH=15 HEIGHT=15 BORDER=0 ALT=""></TD>
</TR>
</TABLE>
</BODY>
</HTML>
|