Rev 4 | Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1 | daniel-mar | 1 | unit DXRender; |
2 | |||
3 | interface |
||
4 | |||
5 | {$INCLUDE DelphiXcfg.inc} |
||
6 | |||
7 | uses |
||
8 | Windows, DirectX; |
||
9 | |||
10 | const |
||
11 | DXR_MAXTEXTURE = 4; |
||
12 | |||
13 | type |
||
14 | TDXR_Value = Double; |
||
15 | |||
16 | TDXR_Color = DWORD; |
||
17 | TDXR_SurfaceColor = DWORD; |
||
18 | |||
19 | { TDXR_ShadeMode } |
||
20 | |||
21 | TDXR_ShadeMode = ( |
||
22 | DXR_SHADEMODE_FLAT, |
||
23 | DXR_SHADEMODE_GOURAUD |
||
24 | ); |
||
25 | |||
26 | { TDXR_Blend } |
||
27 | |||
28 | TDXR_Blend = ( |
||
29 | // for blending |
||
30 | DXR_BLEND_ZERO, // r=0 |
||
31 | DXR_BLEND_ONE1, // r=c1 |
||
32 | DXR_BLEND_ONE2, // r=c2 |
||
33 | DXR_BLEND_ONE1_ADD_ONE2, // r=c1+c2 |
||
34 | DXR_BLEND_ONE1_SUB_ONE2, // r=c1-c2 |
||
35 | DXR_BLEND_ONE2_SUB_ONE1, // r=c2-c1 |
||
36 | DXR_BLEND_ONE1_MUL_ONE2, // r=c1*c2 |
||
37 | |||
38 | DXR_BLEND_SRCALPHA1, // r=c1*a1 |
||
39 | DXR_BLEND_SRCALPHA1_ADD_ONE2, // r=c1*a1+c2 |
||
40 | DXR_BLEND_ONE2_SUB_SRCALPHA1, // r=c2-c1*a1 |
||
41 | DXR_BLEND_SRCALPHA1_ADD_INVSRCALPHA2, // r=c1*a1+c2*(1-a2) |
||
42 | DXR_BLEND_INVSRCALPHA1_ADD_SRCALPHA2, // r=c1*(1-a1)+c2*a2 |
||
43 | // for lighting |
||
44 | DXR_BLEND_DECALALPHA, // r=c1 ra=a2 |
||
45 | DXR_BLEND_MODULATE, // r=c1*c2 ra=a2 |
||
46 | DXR_BLEND_ADD // r=c1+c2 ra=a2 |
||
47 | ); |
||
48 | |||
49 | { TDXR_TextureFilter } |
||
50 | |||
51 | TDXR_TextureFilter = ( |
||
52 | DXR_TEXTUREFILTER_NEAREST, |
||
53 | DXR_TEXTUREFILTER_LINEAR |
||
54 | ); |
||
55 | |||
56 | { TDXR_TextureAddress } |
||
57 | |||
58 | TDXR_TextureAddress = ( |
||
59 | DXR_TEXTUREADDRESS_TILE, // tx=tx and WidthMask ty=ty and HeightMask |
||
60 | DXR_TEXTUREADDRESS_DONOTCLIP // tx=tx ty=ty |
||
61 | ); |
||
62 | |||
63 | { TDXR_ColorType } |
||
64 | |||
65 | TDXR_ColorType = ( |
||
66 | DXR_COLORTYPE_INDEXED, // Palette indexed color |
||
67 | DXR_COLORTYPE_RGB // RGB color |
||
68 | ); |
||
69 | |||
70 | { TDXR_ColorChannel } |
||
71 | |||
72 | TDXR_ColorChannel = record |
||
73 | Mask: DWORD; // Bit Mask |
||
74 | BitCount: DWORD; // Number of bit |
||
75 | rshift: DWORD; |
||
76 | lshift: DWORD; |
||
77 | end; |
||
78 | |||
79 | { TDXR_Surface } |
||
80 | |||
81 | PDXR_Surface = ^TDXR_Surface; |
||
82 | TDXR_Surface = record |
||
83 | ColorType: TDXR_ColorType; // Color type |
||
84 | Width, Height: DWORD; // Size of surface |
||
85 | WidthBit, HeightBit: DWORD; // Size of surface (Number of bit) |
||
86 | Width2, Height2: DWORD; // 1 shl WidthBit, 1 shl HeightBit |
||
87 | WidthMask, HeightMask: DWORD;// Bit Mask of size of surface |
||
88 | BitCount: DWORD; // BitCount per Pixel(1, 2, 4, 8, 16, 24, 32 only) |
||
89 | Bits: Pointer; // Pointer to pixeldata(x:0 y:0) |
||
90 | Pitch: Integer; // Offset of next scanline |
||
91 | PitchBit: Integer; // Offset of next scanline (Number of bit) |
||
92 | case Integer of |
||
93 | 0: ( |
||
94 | { Indexed color } |
||
95 | idx_index: TDXR_ColorChannel; // Index channel |
||
96 | idx_alpha: TDXR_ColorChannel; // Alpha channel |
||
97 | idx_palette: array[0..255] of TPaletteEntry; |
||
98 | // Palette |
||
99 | ); |
||
100 | 1: ( |
||
101 | { RGB color } |
||
102 | rgb_red: TDXR_ColorChannel; // Red channel |
||
103 | rgb_green: TDXR_ColorChannel; // Green channel |
||
104 | rgb_blue: TDXR_ColorChannel; // Blue channel |
||
105 | rgb_alpha: TDXR_ColorChannel; // Alpha channel |
||
106 | ); |
||
107 | end; |
||
108 | |||
109 | { TDXR_Vertex } |
||
110 | |||
111 | PDXR_Vertex = ^TDXR_Vertex; |
||
112 | TDXR_Vertex = record |
||
113 | sx: TDXR_Value; // Screen coordinates |
||
114 | sy: TDXR_Value; |
||
115 | sz: TDXR_Value; |
||
116 | color: TDXR_Color; |
||
117 | specular: TDXR_Color; |
||
118 | tu, tv: array[0..DXR_MAXTEXTURE-1] of TDXR_Value; |
||
119 | end; |
||
120 | |||
121 | PPDXR_Vertex = ^PDXR_Vertex; |
||
122 | |||
123 | { TDXR_PrimitiveType } |
||
124 | |||
125 | TDXR_PrimitiveType = ( |
||
126 | DXR_PRIMITIVETYPE_TRIANGLELIST, |
||
127 | DXR_PRIMITIVETYPE_TRIANGLESTRIP |
||
128 | ); |
||
129 | |||
130 | { TDXR_TextureLayerBlend } |
||
131 | |||
132 | TDXR_TextureLayerBlend = ( |
||
133 | DXR_TEXTURELAYERBLEND_TEXTURE, |
||
134 | DXR_TEXTURELAYERBLEND_LAST, |
||
135 | DXR_TEXTURELAYERBLEND_NOBLEND |
||
136 | ); |
||
137 | |||
138 | { TDXR_TextureLayer } |
||
139 | |||
140 | PDXR_TextureLayer = ^TDXR_TextureLayer; |
||
141 | TDXR_TextureLayer = record |
||
142 | Surface: PDXR_Surface; |
||
143 | LayerBlend: TDXR_TextureLayerBlend; |
||
144 | Blend: TDXR_Blend; |
||
145 | ColorKeyEnable: Boolean; |
||
146 | ColorKey: TDXR_SurfaceColor; |
||
147 | TextureAddress: TDXR_TextureAddress; |
||
148 | end; |
||
149 | |||
150 | { TDXR_Cull } |
||
151 | |||
152 | TDXR_Cull = ( |
||
153 | DXR_CULL_NONE, |
||
154 | DXR_CULL_CW, |
||
155 | DXR_CULL_CCW |
||
156 | ); |
||
157 | |||
158 | { TDXR_RenderStates } |
||
159 | |||
160 | TDXR_RenderStates = record |
||
161 | DitherEnable: Boolean; |
||
162 | SpecularEnable: Boolean; |
||
163 | CullMode: TDXR_Cull; |
||
164 | Shade: TDXR_ShadeMode; |
||
165 | TexBlend: TDXR_Blend; |
||
166 | Blend: TDXR_Blend; |
||
167 | TextureEnable: Boolean; |
||
168 | TextureList: array[0..DXR_MAXTEXTURE-1] of TDXR_TextureLayer; |
||
169 | TextureFilter: TDXR_TextureFilter; |
||
170 | EnableDrawLine: DWORD; |
||
171 | end; |
||
172 | |||
173 | procedure dxrMakeIndexedSurface(var Surface: TDXR_Surface; Width, Height, BitCount: DWORD; |
||
174 | Bits: Pointer; pitch: Integer; idx_index, idx_alpha: DWORD); |
||
175 | procedure dxrMakeRGBSurface(var Surface: TDXR_Surface; Width, Height, BitCount: DWORD; |
||
176 | Bits: Pointer; pitch: Integer; rgb_red, rgb_green, rgb_blue, rgb_alpha: DWORD); |
||
177 | function dxrScanLine(const Surface: TDXR_Surface; y: DWORD): Pointer; |
||
178 | |||
179 | function dxrDDSurfaceLock(DDSurface: IDirectDrawSurface; var Surface: TDXR_Surface): Boolean; |
||
180 | function dxrDDSurfaceLock2(DDSurface: IDirectDrawSurface; var ddsd: TDDSurfaceDesc; |
||
181 | var Surface: TDXR_Surface): Boolean; |
||
182 | procedure dxrDDSurfaceUnLock(DDSurface: IDirectDrawSurface; const Surface: TDXR_Surface); |
||
183 | |||
184 | procedure dxrDefRenderStates(var States: TDXR_RenderStates); |
||
185 | |||
186 | procedure dxrDrawPrimitive(const Dest: TDXR_Surface; const States: TDXR_RenderStates; PrimitiveType: TDXR_PrimitiveType; |
||
187 | VertexList: PDXR_Vertex; VertexCount: DWORD); |
||
188 | procedure dxrDrawPointeredPrimitive(const Dest: TDXR_Surface; const States: TDXR_RenderStates; PrimitiveType: TDXR_PrimitiveType; |
||
189 | VertexList: PPDXR_Vertex; VertexCount: DWORD); |
||
190 | procedure dxrDrawIndexedPrimitive(const Dest: TDXR_Surface; const States: TDXR_RenderStates; PrimitiveType: TDXR_PrimitiveType; |
||
191 | VertexList: PDXR_Vertex; VertexCount: DWORD; IndexList: PDWORD; IndexCount: DWORD); |
||
192 | |||
193 | procedure dxrCopyRectBlend(const Dest, Src: TDXR_Surface; |
||
194 | const DestRect, SrcRect: TRect; Blend: TDXR_Blend; Alpha: Integer; |
||
195 | ColorKeyEnable: Boolean; ColorKey: DWORD); |
||
196 | |||
197 | procedure dxrFillRectColorBlend(const Dest: TDXR_Surface; |
||
198 | const DestRect: TRect; Blend: TDXR_Blend; Col: COLORREF); |
||
199 | |||
200 | procedure dxrDrawWaveXBlend(const Dest, Src: TDXR_Surface; |
||
201 | X, Y, Width, Height: Integer; const SrcRect: TRect; amp, Len, ph: Integer; |
||
202 | Blend: TDXR_Blend; Alpha: Integer; |
||
203 | ColorKeyEnable: Boolean; ColorKey: DWORD); |
||
204 | |||
205 | procedure dxrDrawRotateBlend(const Dest, Src: TDXR_Surface; |
||
206 | X, Y, Width, Height: Integer; const SrcRect: TRect; CenterX, CenterY: Double; |
||
207 | Angle: Integer; Blend: TDXR_Blend; Alpha: Integer; |
||
208 | ColorKeyEnable: Boolean; ColorKey: DWORD); |
||
209 | |||
210 | implementation |
||
211 | |||
212 | const |
||
213 | TextureAxisFloatBit = 16; |
||
214 | TextureAxisFloat = 1 shl TextureAxisFloatBit; |
||
215 | |||
216 | ColorFloatBit = 8; |
||
217 | ColorFloat = 1 shl ColorFloatBit; |
||
218 | |||
219 | type |
||
220 | |||
221 | PInteger = ^Integer; |
||
222 | |||
223 | { TDXR_CmpFunc } |
||
224 | |||
225 | TDXR_CmpFunc = ( |
||
226 | DXR_CMPFUNC_NEVER, |
||
227 | DXR_CMPFUNC_LESS, |
||
228 | DXR_CMPFUNC_EQUAL, |
||
229 | DXR_CMPFUNC_LESSEQUAL, |
||
230 | DXR_CMPFUNC_GREATER, |
||
231 | DXR_CMPFUNC_NOTEQUAL, |
||
232 | DXR_CMPFUNC_GREATEREQUAL, |
||
233 | DXR_CMPFUNC_ALWAYS |
||
234 | ); |
||
235 | |||
236 | { TDXRMachine } |
||
237 | |||
238 | TDXRMachine_TreeType = ( |
||
239 | DXR_TREETYPE_LOADBLACK, // Load black color |
||
240 | DXR_TREETYPE_LOADCOLOR, // Load vertex color |
||
241 | DXR_TREETYPE_LOADCONSTCOLOR, // Load constant color |
||
242 | DXR_TREETYPE_LOADTEXTURE, // Load texel |
||
243 | DXR_TREETYPE_LOADDESTPIXEL, // Load dest pixel |
||
244 | DXR_TREETYPE_BLEND // Blend color |
||
245 | ); |
||
246 | |||
247 | TDXRColorChannel = (chRed, chGreen, chBlue, chAlpha); |
||
248 | TDXRColorChannels = set of TDXRColorChannel; |
||
249 | |||
250 | PDXRMachine_Color = ^TDXRMachine_Color; |
||
251 | TDXRMachine_Color = packed record |
||
252 | R, G, B, A: WORD; |
||
253 | end; |
||
254 | |||
255 | PDXRMachine_Axis = ^TDXRMachine_Axis; |
||
256 | TDXRMachine_Axis = packed record |
||
257 | X, Y: Integer; |
||
258 | end; |
||
259 | |||
260 | PDXRMachine_Int64 = ^TDXRMachine_Int64; |
||
261 | TDXRMachine_Int64 = Comp; |
||
262 | |||
263 | PDXRMachine_Reg_Color = ^TDXRMachine_Reg_Color; |
||
264 | TDXRMachine_Reg_Color = record |
||
265 | Enable: Boolean; |
||
266 | nColor: TDXRMachine_Color; |
||
267 | iColor: TDXRMachine_Color; |
||
268 | Gouraud: Boolean; |
||
269 | Channels: TDXRColorChannels; |
||
270 | end; |
||
271 | |||
272 | PDXRMachine_Reg_Texture = ^TDXRMachine_Reg_Texture; |
||
273 | TDXRMachine_Reg_Texture = record |
||
274 | Enable: Boolean; |
||
275 | Surface: PDXR_Surface; |
||
276 | nAxis: TDXRMachine_Axis; |
||
277 | iAxis: TDXRMachine_Axis; |
||
278 | iAxisConstant: Boolean; |
||
279 | Filter: TDXR_TextureFilter; |
||
280 | ColorKeyEnable: Boolean; |
||
281 | ColorKey: TDXR_SurfaceColor; |
||
282 | EnableChannels: TDXRColorChannels; |
||
283 | TextureAddress: TDXR_TextureAddress; |
||
284 | DefaultColor: TDXRMachine_Color; |
||
285 | end; |
||
286 | |||
287 | TDXRMachine_Reg_Dither = record |
||
288 | Enable: Boolean; |
||
289 | end; |
||
290 | |||
291 | TDXRMachine_Reg_Axis = record |
||
292 | Axis: TDXRMachine_Axis; |
||
293 | IncEnable: Boolean; |
||
294 | end; |
||
295 | |||
296 | PDXRMachine_Tree = ^TDXRMachine_Tree; |
||
297 | TDXRMachine_Tree = record |
||
298 | Typ: TDXRMachine_TreeType; |
||
299 | Channels: TDXRColorChannels; |
||
300 | case TDXRMachine_TreeType of |
||
301 | DXR_TREETYPE_LOADBLACK: ( |
||
302 | ); |
||
303 | DXR_TREETYPE_LOADCOLOR: ( |
||
304 | Color: Integer |
||
305 | ); |
||
306 | DXR_TREETYPE_LOADCONSTCOLOR: ( |
||
307 | ConstColor: TDXRMachine_Color; |
||
308 | ); |
||
309 | DXR_TREETYPE_LOADTEXTURE: ( |
||
310 | Texture: Integer |
||
311 | ); |
||
312 | DXR_TREETYPE_LOADDESTPIXEL: ( |
||
313 | ); |
||
314 | DXR_TREETYPE_BLEND: ( |
||
315 | Blend: TDXR_Blend; |
||
316 | BlendTree1: PDXRMachine_Tree; |
||
317 | BlendTree2: PDXRMachine_Tree; |
||
318 | ); |
||
319 | end; |
||
320 | |||
321 | TDXRMachine = class |
||
322 | private |
||
323 | FBuf: Pointer; |
||
324 | FCall: Pointer; |
||
325 | FCompiled: Boolean; |
||
326 | FTreeCount: Integer; |
||
327 | FTreeList: array[0..127] of TDXRMachine_Tree; |
||
328 | FMMXUsed: Boolean; |
||
329 | F_BiLinearAxis: TDXRMachine_Axis; |
||
330 | F_BiLinearCol1: TDXRMachine_Color; |
||
331 | F_BiLinearCol2: TDXRMachine_Color; |
||
332 | F_BiLinearCol3: TDXRMachine_Color; |
||
333 | F_BiLinearCol4: TDXRMachine_Color; |
||
334 | FStack: array[0..255] of TDXRMachine_Color; |
||
335 | procedure GenerateCode(var Code: Pointer; Tree: PDXRMachine_Tree); |
||
336 | public |
||
337 | Dest: PDXR_Surface; |
||
338 | ColorList: array[0..7] of TDXRMachine_Reg_Color; |
||
339 | ColorIndex: array[0..7] of Integer; |
||
340 | ColorIndexCount: Integer; |
||
341 | TextureList: array[0..7] of TDXRMachine_Reg_Texture; |
||
342 | TextureIndex: array[0..7] of Integer; |
||
343 | TextureIndexCount: Integer; |
||
344 | Dither: TDXRMachine_Reg_Dither; |
||
345 | Axis: TDXRMachine_Reg_Axis; |
||
346 | constructor Create; |
||
347 | destructor Destroy; override; |
||
348 | function CreateTree: PDXRMachine_Tree; |
||
349 | function CreateTree2(Typ: TDXRMachine_TreeType): PDXRMachine_Tree; |
||
350 | function CreateTree_LoadColor(Color: DWORD): PDXRMachine_Tree; |
||
351 | function CreateTree_LoadConstColor(R, G, B, A: Byte): PDXRMachine_Tree; |
||
352 | function CreateTree_LoadTexture(Texture: DWORD): PDXRMachine_Tree; |
||
353 | function CreateTree_Blend(Blend: TDXR_Blend; BlendTree1, BlendTree2: PDXRMachine_Tree): PDXRMachine_Tree; |
||
354 | procedure Initialize; |
||
355 | procedure Compile(Tree: PDXRMachine_Tree); |
||
356 | procedure Run(Count: Integer); |
||
357 | property Compiled: Boolean read FCompiled write FCompiled; |
||
358 | end; |
||
359 | |||
360 | const |
||
361 | CPUIDF_FPU = 1 shl 0; { Floating-point unit on-chip } |
||
362 | CPUIDF_VME = 1 shl 1; { Virtual Mode Extension } |
||
363 | CPUIDF_DE = 1 shl 2; { Debugging Extension } |
||
364 | CPUIDF_PSE = 1 shl 3; { Page Size Extension } |
||
365 | CPUIDF_TSC = 1 shl 4; { Time Stamp Counter } |
||
366 | CPUIDF_MSR = 1 shl 5; { Mode Spacific Registers } |
||
367 | CPUIDF_PAE = 1 shl 6; { Physical Address Extension } |
||
368 | CPUIDF_MCE = 1 shl 7; { Machine Check Exception } |
||
369 | CPUIDF_CX8 = 1 shl 8; { CMPXCHG8 Instruction Supported } |
||
370 | CPUIDF_APIC = 1 shl 9; { On-chip APIC Hardware Supported } |
||
371 | CPUIDF_MTRR = 1 shl 12; { Memory Type Range Registers } |
||
372 | CPUIDF_PGE = 1 shl 13; { Page Global Enable } |
||
373 | CPUIDF_MCA = 1 shl 14; { Machine Check Architecture } |
||
374 | CPUIDF_CMOV = 1 shl 15; { Conditional Move Instruction Supported } |
||
375 | CPUIDF_MMX = 1 shl 23; { Intel Architecture MMX Technology supported } |
||
376 | |||
377 | var |
||
378 | CPUIDVendor: array[0..11] of Char; |
||
379 | CPUIDSignature: Integer; |
||
380 | CPUIDFeatures: Integer; |
||
381 | UseMMX: Boolean; |
||
382 | |||
383 | RenderPrimitiveCount: Integer; |
||
384 | |||
385 | procedure ReadCPUID; |
||
386 | begin |
||
387 | asm |
||
388 | push ebx |
||
389 | |||
390 | pushfd |
||
391 | pop eax |
||
392 | mov ecx,eax |
||
393 | xor eax,$200000 |
||
394 | push eax |
||
395 | popfd |
||
396 | pushfd |
||
397 | pop eax |
||
398 | xor eax,ecx |
||
399 | jz @@exit |
||
400 | |||
401 | mov eax,0 |
||
402 | db $0F,$A2 ///cpuid |
||
403 | cmp eax,1 |
||
404 | jl @@exit |
||
405 | |||
406 | { Vendor ID } |
||
407 | mov eax,0 |
||
408 | db $0F,$A2 ///cpuid |
||
409 | mov dword ptr [CPUIDVendor], ebx |
||
410 | mov dword ptr [CPUIDVendor+4], edx |
||
411 | mov dword ptr [CPUIDVendor+8], ecx |
||
412 | |||
413 | { Features, Signature } |
||
414 | mov eax,1 |
||
415 | db $0F,$A2 ///cpuid |
||
416 | mov CPUIDSignature,eax |
||
417 | mov CPUIDFeatures,edx |
||
418 | @@exit: |
||
419 | pop ebx |
||
420 | end; |
||
421 | |||
422 | UseMMX := CPUIDFeatures and CPUIDF_MMX<>0; |
||
423 | end; |
||
424 | |||
425 | function GetBitCount(B: Integer): DWORD; |
||
426 | begin |
||
427 | Result := 31; |
||
428 | while (Result>0) and (((1 shl Result) and B)=0) do Dec(Result); |
||
429 | end; |
||
430 | |||
431 | function GetFirstZeroBitCount(B: Integer): DWORD; |
||
432 | begin |
||
433 | Result := 0; |
||
434 | while (Result<31) and (((1 shl Result) and B)=0) do Inc(Result); |
||
435 | end; |
||
436 | |||
437 | function GetOneBitCount(B: Integer): DWORD; |
||
438 | var |
||
439 | i: Integer; |
||
440 | begin |
||
441 | Result := 0; |
||
442 | for i:=0 to 31 do |
||
443 | Inc(Result, Ord(b and (1 shl i)<>0)); |
||
444 | end; |
||
445 | |||
446 | function dxrMakeColorChannel(Mask: DWORD; indexed: Boolean): TDXR_ColorChannel; |
||
447 | var |
||
448 | i: Integer; |
||
449 | begin |
||
450 | Result.BitCount := GetOneBitCount(Mask shr (GetFirstZeroBitCount(Mask))); |
||
451 | Result.Mask := Mask; |
||
452 | |||
453 | if indexed then |
||
454 | begin |
||
455 | Result.rshift := GetFirstZeroBitCount(Mask); |
||
456 | Result.lshift := 0; |
||
457 | end else |
||
458 | begin |
||
459 | i := GetFirstZeroBitCount(Mask)-(8-Result.BitCount); |
||
460 | |||
461 | if i<0 then |
||
462 | begin |
||
463 | Result.lshift := -i; |
||
464 | Result.rshift := 0; |
||
465 | end else |
||
466 | begin |
||
467 | Result.lshift := 0; |
||
468 | Result.rshift := DWORD(i); |
||
469 | end; |
||
470 | end; |
||
471 | end; |
||
472 | |||
473 | procedure dxrMakeIndexedSurface(var Surface: TDXR_Surface; Width, Height, BitCount: DWORD; |
||
474 | Bits: Pointer; pitch: Integer; idx_index, idx_alpha: DWORD); |
||
475 | begin |
||
476 | FillChar(Surface, SizeOf(Surface), 0); |
||
477 | |||
478 | Surface.ColorType := DXR_COLORTYPE_INDEXED; |
||
479 | Surface.Width := Width; |
||
480 | Surface.Height := Height; |
||
481 | Surface.WidthBit := GetBitCount(Width); |
||
482 | Surface.HeightBit := GetBitCount(Height); |
||
483 | Surface.Width2 := 1 shl Surface.WidthBit; |
||
484 | Surface.Height2 := 1 shl Surface.HeightBit; |
||
485 | Surface.WidthMask := Surface.Width-1; |
||
486 | Surface.HeightMask := Surface.Height2-1; |
||
487 | |||
488 | Surface.BitCount := BitCount; |
||
489 | Surface.Bits := Bits; |
||
490 | Surface.Pitch := Pitch; |
||
491 | Surface.PitchBit := GetBitCount(Abs(Pitch)); |
||
492 | |||
493 | Surface.idx_index := dxrMakeColorChannel(idx_index, True); |
||
494 | Surface.idx_alpha := dxrMakeColorChannel(idx_alpha, False); |
||
495 | end; |
||
496 | |||
497 | procedure dxrMakeRGBSurface(var Surface: TDXR_Surface; Width, Height, BitCount: DWORD; |
||
498 | Bits: Pointer; pitch: Integer; rgb_red, rgb_green, rgb_blue, rgb_alpha: DWORD); |
||
499 | begin |
||
500 | FillChar(Surface, SizeOf(Surface), 0); |
||
501 | |||
502 | Surface.ColorType := DXR_COLORTYPE_RGB; |
||
503 | Surface.Width := Width; |
||
504 | Surface.Height := Height; |
||
505 | Surface.WidthBit := GetBitCount(Width); |
||
506 | Surface.HeightBit := GetBitCount(Height); |
||
507 | Surface.Width2 := 1 shl Surface.WidthBit; |
||
508 | Surface.Height2 := 1 shl Surface.HeightBit; |
||
509 | Surface.WidthMask := Surface.Width-1; |
||
510 | Surface.HeightMask := Surface.Height2-1; |
||
511 | |||
512 | Surface.BitCount := BitCount; |
||
513 | Surface.Bits := Bits; |
||
514 | Surface.Pitch := Pitch; |
||
515 | Surface.PitchBit := GetBitCount(Abs(Pitch)); |
||
516 | |||
517 | Surface.rgb_red := dxrMakeColorChannel(rgb_red, False); |
||
518 | Surface.rgb_green := dxrMakeColorChannel(rgb_green, False); |
||
519 | Surface.rgb_blue := dxrMakeColorChannel(rgb_blue, False); |
||
520 | Surface.rgb_alpha := dxrMakeColorChannel(rgb_alpha, False); |
||
521 | end; |
||
522 | |||
523 | function dxrCompareSurface(const Surface1, Surface2: TDXR_Surface): Boolean; |
||
524 | begin |
||
525 | if Surface1.ColorType=DXR_COLORTYPE_INDEXED then |
||
526 | begin |
||
527 | Result := (Surface2.ColorType=DXR_COLORTYPE_INDEXED) and |
||
528 | (Surface1.idx_index.Mask=Surface2.idx_index.Mask) and |
||
529 | (Surface1.idx_alpha.Mask=Surface2.idx_alpha.Mask); |
||
530 | end else if Surface1.ColorType=DXR_COLORTYPE_RGB then |
||
531 | begin |
||
532 | Result := (Surface2.ColorType=DXR_COLORTYPE_RGB) and |
||
533 | (Surface1.rgb_red.Mask=Surface2.rgb_red.Mask) and |
||
534 | (Surface1.rgb_green.Mask=Surface2.rgb_green.Mask) and |
||
535 | (Surface1.rgb_blue.Mask=Surface2.rgb_blue.Mask) and |
||
536 | (Surface1.rgb_alpha.Mask=Surface2.rgb_alpha.Mask); |
||
537 | end else |
||
538 | Result := False; |
||
539 | end; |
||
540 | |||
541 | function dxrDDSurfaceLock(DDSurface: IDirectDrawSurface; var Surface: TDXR_Surface): Boolean; |
||
542 | var |
||
543 | ddsd: TDDSurfaceDesc; |
||
544 | begin |
||
545 | Result := dxrDDSurfaceLock2(DDSurface, ddsd, Surface); |
||
546 | end; |
||
547 | |||
548 | function dxrDDSurfaceLock2(DDSurface: IDirectDrawSurface; var ddsd: TDDSurfaceDesc; |
||
549 | var Surface: TDXR_Surface): Boolean; |
||
550 | const |
||
551 | DDPF_PALETTEINDEXED = DDPF_PALETTEINDEXED1 or DDPF_PALETTEINDEXED2 or |
||
552 | DDPF_PALETTEINDEXED4 or DDPF_PALETTEINDEXED8; |
||
553 | begin |
||
554 | ddsd.dwSize := SizeOf(ddsd); |
||
555 | Result := DDSurface.Lock(nil, ddsd, DDLOCK_WAIT, 0)=DD_OK; |
||
556 | if Result then |
||
557 | begin |
||
558 | FillChar(Surface, SizeOf(Surface), 0); |
||
559 | if ddsd.ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED<>0 then |
||
560 | begin |
||
561 | dxrMakeIndexedSurface(Surface, ddsd.dwWidth, ddsd.dwHeight, ddsd.ddpfPixelFormat.dwRGBBitCount, |
||
562 | ddsd.lpSurface, ddsd.lPitch, (1 shl ddsd.ddpfPixelFormat.dwRGBBitCount)-1, 0); |
||
563 | end else |
||
564 | begin |
||
565 | {if ddsd.ddpfPixelFormat.dwFlags and DDPF_ALPHAPIXELS<>0 then |
||
566 | begin |
||
567 | dxrMakeRGBSurface(Surface, ddsd.dwWidth, ddsd.dwHeight, ddsd.ddpfPixelFormat.dwRGBBitCount, |
||
568 | ddsd.lpSurface, ddsd.lPitch, ddsd.ddpfPixelFormat.dwRBitMask, ddsd.ddpfPixelFormat.dwGBitMask, |
||
569 | ddsd.ddpfPixelFormat.dwBBitMask, ddsd.ddpfPixelFormat.dwRGBAlphaBitMask); |
||
570 | end else} |
||
571 | begin |
||
572 | dxrMakeRGBSurface(Surface, ddsd.dwWidth, ddsd.dwHeight, ddsd.ddpfPixelFormat.dwRGBBitCount, |
||
573 | ddsd.lpSurface, ddsd.lPitch, ddsd.ddpfPixelFormat.dwRBitMask, ddsd.ddpfPixelFormat.dwGBitMask, |
||
574 | ddsd.ddpfPixelFormat.dwBBitMask, 0); |
||
575 | end; |
||
576 | end; |
||
577 | end; |
||
578 | end; |
||
579 | |||
580 | procedure dxrDDSurfaceUnLock(DDSurface: IDirectDrawSurface; const Surface: TDXR_Surface); |
||
581 | begin |
||
582 | DDSurface.Unlock(Surface.Bits); |
||
583 | end; |
||
584 | |||
585 | function dxrScanLine(const Surface: TDXR_Surface; y: DWORD): Pointer; |
||
586 | begin |
||
587 | Result := Pointer(Integer(Surface.Bits)+Surface.Pitch*Integer(y)); |
||
588 | end; |
||
589 | |||
590 | { TDXRMachine } |
||
591 | |||
592 | constructor TDXRMachine.Create; |
||
593 | begin |
||
594 | inherited Create; |
||
595 | FBuf := VirtualAlloc(nil, 2048, MEM_COMMIT, PAGE_EXECUTE_READWRITE); |
||
596 | end; |
||
597 | |||
598 | destructor TDXRMachine.Destroy; |
||
599 | begin |
||
600 | VirtualFree(FBuf, 0, MEM_RELEASE); |
||
601 | inherited Destroy; |
||
602 | end; |
||
603 | |||
604 | procedure TDXRMachine.Initialize; |
||
605 | begin |
||
606 | FCall := nil; |
||
607 | ColorIndexCount := 0; |
||
608 | TextureIndexCount := 0; |
||
609 | |||
610 | FTreeCount := 0; |
||
611 | |||
612 | Dest := nil; |
||
613 | FCompiled := False; |
||
614 | FMMXUsed := False; |
||
615 | |||
616 | FillChar(ColorList, SizeOf(ColorList), 0); |
||
617 | FillChar(TextureList, SizeOf(TextureList), 0); |
||
618 | FillChar(Dither, SizeOf(Dither), 0); |
||
619 | FillChar(Axis, SizeOf(Axis), 0); |
||
620 | end; |
||
621 | |||
622 | function TDXRMachine.CreateTree: PDXRMachine_Tree; |
||
623 | begin |
||
624 | Result := @FTreeList[FTreeCount]; |
||
625 | FillChar(Result^, SizeOf(Result^), 0); |
||
626 | Inc(FTreeCount); |
||
627 | end; |
||
628 | |||
629 | function TDXRMachine.CreateTree2(Typ: TDXRMachine_TreeType): PDXRMachine_Tree; |
||
630 | begin |
||
631 | Result := CreateTree; |
||
632 | Result.Typ := Typ; |
||
633 | end; |
||
634 | |||
635 | function TDXRMachine.CreateTree_LoadColor(Color: DWORD): PDXRMachine_Tree; |
||
636 | begin |
||
637 | Result := CreateTree; |
||
638 | Result.Typ := DXR_TREETYPE_LOADCOLOR; |
||
639 | Result.Color := Color; |
||
640 | end; |
||
641 | |||
642 | function TDXRMachine.CreateTree_LoadConstColor(R, G, B, A: Byte): PDXRMachine_Tree; |
||
643 | begin |
||
644 | Result := CreateTree; |
||
645 | Result.Typ := DXR_TREETYPE_LOADCONSTCOLOR; |
||
646 | Result.ConstColor.R := R shl 8; |
||
647 | Result.ConstColor.G := G shl 8; |
||
648 | Result.ConstColor.B := B shl 8; |
||
649 | Result.ConstColor.A := A shl 8; |
||
650 | end; |
||
651 | |||
652 | function TDXRMachine.CreateTree_LoadTexture(Texture: DWORD): PDXRMachine_Tree; |
||
653 | begin |
||
654 | Result := CreateTree; |
||
655 | Result.Typ := DXR_TREETYPE_LOADTEXTURE; |
||
656 | Result.Texture := Texture; |
||
657 | end; |
||
658 | |||
659 | function TDXRMachine.CreateTree_Blend(Blend: TDXR_Blend; BlendTree1, BlendTree2: PDXRMachine_Tree): PDXRMachine_Tree; |
||
660 | begin |
||
661 | Result := CreateTree; |
||
662 | Result.Typ := DXR_TREETYPE_BLEND; |
||
663 | Result.Blend := Blend; |
||
664 | Result.BlendTree1 := BlendTree1; |
||
665 | Result.BlendTree2 := BlendTree2; |
||
666 | end; |
||
667 | |||
668 | procedure TDXRMachine.Compile; |
||
669 | |||
670 | function GetSurfaceChannels(const Surface: TDXR_Surface): TDXRColorChannels; |
||
671 | begin |
||
672 | Result := []; |
||
673 | |||
674 | if Surface.ColorType=DXR_COLORTYPE_INDEXED then |
||
675 | begin |
||
676 | if Surface.idx_index.Mask<>0 then Result := Result + [chRed, chGreen, chBlue]; |
||
677 | if Surface.idx_alpha.Mask<>0 then Result := Result + [chAlpha]; |
||
678 | end else |
||
679 | begin |
||
680 | if Surface.rgb_red.Mask<>0 then Result := Result + [chRed]; |
||
681 | if Surface.rgb_green.Mask<>0 then Result := Result + [chGreen]; |
||
682 | if Surface.rgb_blue.Mask<>0 then Result := Result + [chBlue]; |
||
683 | if Surface.rgb_alpha.Mask<>0 then Result := Result + [chAlpha]; |
||
684 | end; |
||
685 | end; |
||
686 | |||
687 | procedure OptimizeTree(var Tree: PDXRMachine_Tree); |
||
688 | |||
689 | procedure GetBlendChannels(Blend: TDXR_Blend; var Col1_1, Col1_2, Col2_1, Col2_2: TDXRColorChannels); |
||
690 | begin |
||
691 | case Blend of |
||
692 | DXR_BLEND_ZERO: |
||
693 | begin |
||
694 | Col1_1 := []; |
||
695 | Col1_2 := []; |
||
696 | Col2_1 := []; |
||
697 | Col2_2 := []; |
||
698 | end; |
||
699 | DXR_BLEND_ONE1: |
||
700 | begin |
||
701 | Col1_1 := [chRed, chGreen, chBlue, chAlpha]; |
||
702 | Col1_2 := []; |
||
703 | Col2_1 := []; |
||
704 | Col2_2 := []; |
||
705 | end; |
||
706 | DXR_BLEND_ONE2: |
||
707 | begin |
||
708 | Col1_1 := []; |
||
709 | Col1_2 := []; |
||
710 | Col2_1 := [chRed, chGreen, chBlue, chAlpha]; |
||
711 | Col2_2 := []; |
||
712 | end; |
||
713 | DXR_BLEND_ONE1_ADD_ONE2, |
||
714 | DXR_BLEND_ONE1_SUB_ONE2, |
||
715 | DXR_BLEND_ONE2_SUB_ONE1, |
||
716 | DXR_BLEND_ONE1_MUL_ONE2: |
||
717 | begin |
||
718 | Col1_1 := [chRed, chGreen, chBlue, chAlpha]; |
||
719 | Col1_2 := []; |
||
720 | Col2_1 := [chRed, chGreen, chBlue, chAlpha]; |
||
721 | Col2_2 := []; |
||
722 | end; |
||
723 | DXR_BLEND_SRCALPHA1: |
||
724 | begin |
||
725 | Col1_1 := [chRed, chGreen, chBlue]; |
||
726 | Col1_2 := [chAlpha]; |
||
727 | Col2_1 := []; |
||
728 | Col2_2 := []; |
||
729 | end; |
||
730 | DXR_BLEND_SRCALPHA1_ADD_ONE2: |
||
731 | begin |
||
732 | Col1_1 := [chRed, chGreen, chBlue]; |
||
733 | Col1_2 := [chAlpha]; |
||
734 | Col2_1 := [chRed, chGreen, chBlue, chAlpha]; |
||
735 | Col2_2 := []; |
||
736 | end; |
||
737 | DXR_BLEND_ONE2_SUB_SRCALPHA1: |
||
738 | begin |
||
739 | Col1_1 := [chRed, chGreen, chBlue]; |
||
740 | Col1_2 := [chAlpha]; |
||
741 | Col2_1 := [chRed, chGreen, chBlue, chAlpha]; |
||
742 | Col2_2 := []; |
||
743 | end; |
||
744 | DXR_BLEND_SRCALPHA1_ADD_INVSRCALPHA2: |
||
745 | begin |
||
746 | Col1_1 := [chRed, chGreen, chBlue]; |
||
747 | Col1_2 := [chAlpha]; |
||
748 | Col2_1 := [chRed, chGreen, chBlue, chAlpha]; |
||
749 | Col2_2 := []; |
||
750 | end; |
||
751 | DXR_BLEND_INVSRCALPHA1_ADD_SRCALPHA2: |
||
752 | begin |
||
753 | Col1_1 := [chRed, chGreen, chBlue]; |
||
754 | Col1_2 := [chAlpha]; |
||
755 | Col2_1 := [chRed, chGreen, chBlue, chAlpha]; |
||
756 | Col2_2 := []; |
||
757 | end; |
||
758 | |||
759 | DXR_BLEND_DECALALPHA: |
||
760 | begin |
||
761 | Col1_1 := [chRed, chGreen, chBlue]; |
||
762 | Col1_2 := []; |
||
763 | Col2_1 := []; |
||
764 | Col2_2 := [chAlpha]; |
||
765 | end; |
||
766 | DXR_BLEND_MODULATE: |
||
767 | begin |
||
768 | Col1_1 := [chRed, chGreen, chBlue]; |
||
769 | Col1_2 := [chAlpha]; |
||
770 | Col2_1 := [chRed, chGreen, chBlue]; |
||
771 | Col2_2 := [chAlpha]; |
||
772 | end; |
||
773 | DXR_BLEND_ADD: |
||
774 | begin |
||
775 | Col1_1 := [chRed, chGreen, chBlue, chAlpha]; |
||
776 | Col1_2 := []; |
||
777 | Col2_1 := [chRed, chGreen, chBlue, chAlpha]; |
||
778 | Col2_2 := []; |
||
779 | end; |
||
780 | end; |
||
781 | end; |
||
782 | |||
783 | var |
||
784 | c: TDXRColorChannels; |
||
785 | Col1_1, Col1_2, Col2_1, Col2_2: TDXRColorChannels; |
||
786 | begin |
||
787 | case Tree.Typ of |
||
788 | DXR_TREETYPE_LOADBLACK: |
||
789 | begin |
||
790 | // Load black color |
||
791 | end; |
||
792 | DXR_TREETYPE_LOADCOLOR: |
||
793 | begin |
||
794 | // Load color |
||
795 | end; |
||
796 | DXR_TREETYPE_LOADTEXTURE: |
||
797 | begin |
||
798 | // Load texel |
||
799 | end; |
||
800 | DXR_TREETYPE_LOADDESTPIXEL: |
||
801 | begin |
||
802 | // Load dest pixel |
||
803 | end; |
||
804 | DXR_TREETYPE_BLEND: |
||
805 | begin |
||
806 | // Blend color |
||
807 | GetBlendChannels(Tree.Blend, Col1_1, Col1_2, Col2_1, Col2_2); |
||
808 | |||
809 | Tree.BlendTree1.Channels := Tree.Channels*Col1_1+Col1_2; |
||
810 | Tree.BlendTree2.Channels := Tree.Channels*Col2_1+Col2_2; |
||
811 | |||
812 | OptimizeTree(Tree.BlendTree1); |
||
813 | OptimizeTree(Tree.BlendTree2); |
||
814 | |||
815 | if (Tree.Blend=DXR_BLEND_ZERO) then |
||
816 | begin |
||
817 | c := Tree.Channels; Tree^.Typ := DXR_TREETYPE_LOADBLACK; Tree.Channels := c; |
||
818 | end else |
||
819 | if (Tree.Blend in [DXR_BLEND_ONE1]) then |
||
820 | begin |
||
821 | c := Tree.Channels; Tree := Tree.BlendTree1; Tree.Channels := c; |
||
822 | end else |
||
823 | if (Tree.Blend=DXR_BLEND_ONE2) then |
||
824 | begin |
||
825 | c := Tree.Channels; Tree := Tree.BlendTree2; Tree.Channels := c; |
||
826 | end else |
||
827 | if (Tree.Blend in [DXR_BLEND_ONE1_ADD_ONE2, DXR_BLEND_ONE1_SUB_ONE2]) and |
||
828 | (Tree.BlendTree2.Typ=DXR_TREETYPE_LOADBLACK) then |
||
829 | begin |
||
830 | c := Tree.Channels; Tree := Tree.BlendTree1; Tree.Channels := c; |
||
831 | end else |
||
832 | if (Tree.Blend in [DXR_BLEND_ONE1_ADD_ONE2, DXR_BLEND_ONE1_SUB_ONE2]) and |
||
833 | (Tree.BlendTree1.Typ=DXR_TREETYPE_LOADBLACK) then |
||
834 | begin |
||
835 | c := Tree.Channels; Tree := Tree.BlendTree2; Tree.Channels := c; |
||
836 | end else |
||
837 | begin |
||
838 | if (Col1_1=[]) and (Col1_2=[]) then Tree.BlendTree1 := nil; |
||
839 | if (Col2_1=[]) and (Col2_2=[]) then Tree.BlendTree2 := nil; |
||
840 | end; |
||
841 | end; |
||
842 | end; |
||
843 | end; |
||
844 | |||
845 | procedure GetEnableChannels(Tree: PDXRMachine_Tree); |
||
846 | begin |
||
847 | case Tree.Typ of |
||
848 | DXR_TREETYPE_LOADBLACK: |
||
849 | begin |
||
850 | // Load black color |
||
851 | end; |
||
852 | DXR_TREETYPE_LOADCOLOR: |
||
853 | begin |
||
854 | // Load color |
||
855 | ColorList[Tree.Color].Channels := ColorList[Tree.Color].Channels + Tree.Channels; |
||
856 | ColorList[Tree.Color].Enable := ColorList[Tree.Color].Channels<>[]; |
||
857 | end; |
||
858 | DXR_TREETYPE_LOADTEXTURE: |
||
859 | begin |
||
860 | // Load texel |
||
861 | TextureList[Tree.Texture].EnableChannels := TextureList[Tree.Texture].EnableChannels + |
||
862 | Tree.Channels*GetSurfaceChannels(TextureList[Tree.Texture].Surface^); |
||
863 | TextureList[Tree.Texture].Enable := TextureList[Tree.Texture].EnableChannels<>[]; |
||
864 | end; |
||
865 | DXR_TREETYPE_LOADDESTPIXEL: |
||
866 | begin |
||
867 | // Load dest pixel |
||
868 | end; |
||
869 | DXR_TREETYPE_BLEND: |
||
870 | begin |
||
871 | // Blend color |
||
872 | if Tree.BlendTree1<>nil then GetEnableChannels(Tree.BlendTree1); |
||
873 | if Tree.BlendTree2<>nil then GetEnableChannels(Tree.BlendTree2); |
||
874 | end; |
||
875 | end; |
||
876 | end; |
||
877 | |||
878 | var |
||
879 | Code: Pointer; |
||
880 | i: Integer; |
||
881 | begin |
||
882 | { Optimize tree } |
||
883 | Tree.Channels := GetSurfaceChannels(Dest^); |
||
884 | OptimizeTree(Tree); |
||
885 | |||
886 | { Get enable channels } |
||
887 | GetEnableChannels(Tree); |
||
888 | |||
889 | for i:=Low(ColorList) to High(ColorList) do |
||
890 | if ColorList[i].Enable then |
||
891 | begin |
||
892 | ColorIndex[ColorIndexCount] := i; |
||
893 | Inc(ColorIndexCount); |
||
894 | end; |
||
895 | |||
896 | for i:=Low(TextureList) to High(TextureList) do |
||
897 | if TextureList[i].Enable then |
||
898 | begin |
||
899 | TextureIndex[TextureIndexCount] := i; |
||
900 | Inc(TextureIndexCount); |
||
901 | end; |
||
902 | |||
903 | Axis.IncEnable := Dither.Enable; |
||
904 | |||
905 | { Generate X86 code } |
||
906 | Code := FBuf; GenerateCode(Code, Tree); |
||
907 | |||
908 | FCompiled := True; |
||
909 | end; |
||
910 | |||
911 | const |
||
912 | Mask1: array[0..7] of DWORD= ($80, $40, $20, $10, $08, $04, $02, $01); |
||
913 | Mask2: array[0..3] of DWORD= ($C0, $30, $0C, $03); |
||
914 | Mask4: array[0..1] of DWORD= ($F0, $0F); |
||
915 | |||
916 | Shift1: array[0..7] of DWORD= (7, 6, 5, 4, 3, 2, 1, 0); |
||
917 | Shift2: array[0..3] of DWORD= (6, 4, 2, 0); |
||
918 | Shift4: array[0..1] of DWORD= (4, 0); |
||
919 | |||
920 | var |
||
921 | _null: Byte; |
||
922 | |||
923 | // Saturation addition table |
||
924 | // Result := Min(n+j, 255) |
||
925 | _AddTable: array[0..256*2-1] of Byte; |
||
926 | _SubTable: array[-255..255] of Byte; |
||
927 | |||
928 | // Byte to QWORD convert table |
||
929 | // Result := (n shl 56)+(n shl 48)+(n shl 32)+(n shl 24)+(n shl 16)+(n shl 8)+n |
||
930 | _ByteToQWORDTable: array[0..255, 0..3] of WORD; |
||
931 | |||
932 | _BlackColor: TDXRMachine_Color = (R: 0; G: 0; B: 0; A: 0); |
||
933 | |||
934 | procedure Init; |
||
935 | var |
||
936 | i: Integer; |
||
937 | begin |
||
938 | for i:=Low(_AddTable) to High(_AddTable) do |
||
939 | begin |
||
940 | if i>255 then |
||
941 | _AddTable[i] := 255 |
||
942 | else |
||
943 | _AddTable[i] := i; |
||
944 | end; |
||
945 | |||
946 | for i:=Low(_SubTable) to High(_SubTable) do |
||
947 | begin |
||
948 | if i<0 then |
||
949 | _SubTable[i] := 0 |
||
950 | else |
||
951 | _SubTable[i] := i; |
||
952 | end; |
||
953 | |||
954 | for i:=0 to 255 do |
||
955 | begin |
||
956 | _ByteToQWORDTable[i, 0] := i; |
||
957 | _ByteToQWORDTable[i, 1] := i; |
||
958 | _ByteToQWORDTable[i, 2] := i; |
||
959 | _ByteToQWORDTable[i, 3] := i; |
||
960 | end; |
||
961 | end; |
||
962 | |||
963 | procedure TDXRMachine.GenerateCode(var Code: Pointer; Tree: PDXRMachine_Tree); |
||
964 | var |
||
965 | SkipAddress: Pointer; |
||
966 | |||
967 | procedure genCmpFunc(var Code: Pointer; Func: TDXR_CmpFunc; JmpAdress: Pointer); |
||
968 | |||
969 | procedure genShortJmp(var Code: Pointer; JmpCode: Pointer; sC: Byte); |
||
970 | type |
||
971 | PShortJmp = ^TShortJmp; |
||
972 | TShortJmp = packed record |
||
973 | c: Byte; |
||
974 | A: ShortInt; |
||
975 | end; |
||
976 | begin |
||
977 | with PShortJmp(Code)^ do |
||
978 | begin |
||
979 | c := sC; |
||
980 | A := Integer(JmpCode)-(Integer(Code)+2); |
||
981 | end; |
||
982 | Inc(Integer(Code), 2); |
||
983 | end; |
||
984 | |||
985 | procedure genNearJmp(var Code: Pointer; JmpCode: Pointer; nC: Byte); |
||
986 | type |
||
987 | PNearJmp = ^TNearJmp; |
||
988 | TNearJmp = packed record |
||
989 | c: Byte; |
||
990 | A: Integer; |
||
991 | end; |
||
992 | begin |
||
993 | with PNearJmp(Code)^ do |
||
994 | begin |
||
995 | c := nC; |
||
996 | A := Integer(JmpCode)-(Integer(Code)+5); |
||
997 | end; |
||
998 | Inc(Integer(Code), 5); |
||
999 | end; |
||
1000 | |||
1001 | procedure genNearJmp2(var Code: Pointer; JmpCode: Pointer; nC1, nC2: Byte); |
||
1002 | type |
||
1003 | PNearJmp2 = ^TNearJmp2; |
||
1004 | TNearJmp2 = packed record |
||
1005 | c1, c2: Byte; |
||
1006 | A: Integer; |
||
1007 | end; |
||
1008 | begin |
||
1009 | with PNearJmp2(Code)^ do |
||
1010 | begin |
||
1011 | c1 := nC1; |
||
1012 | c2 := nC2; |
||
1013 | A := Integer(JmpCode)-(Integer(Code)+6); |
||
1014 | end; |
||
1015 | Inc(Integer(Code), 6); |
||
1016 | end; |
||
1017 | |||
1018 | procedure genFlagJmp(var Code: Pointer; JmpCode: Pointer; sC, nC1, nC2: Byte); |
||
1019 | var |
||
1020 | i: Integer; |
||
1021 | begin |
||
1022 | i := Integer(JmpCode)-(Integer(Code)+2); |
||
1023 | if abs(i)<128 then |
||
1024 | genShortJmp(Code, JmpCode, sC) |
||
1025 | else |
||
1026 | genNearJmp2(Code, JmpCode, nC1, nC2); |
||
1027 | end; |
||
1028 | |||
1029 | procedure genJmp(var Code: Pointer; JmpCode: Pointer); |
||
1030 | var |
||
1031 | i: Integer; |
||
1032 | begin |
||
1033 | i := Integer(JmpCode)-(Integer(Code)+2); |
||
1034 | if abs(i)<128 then |
||
1035 | genShortJmp(Code, JmpCode, $EB) |
||
1036 | else |
||
1037 | genNearJmp(Code, JmpCode, $E9); |
||
1038 | end; |
||
1039 | |||
1040 | begin |
||
1041 | case Func of |
||
1042 | DXR_CMPFUNC_NEVER: |
||
1043 | begin |
||
1044 | { if (False) then Jump } |
||
1045 | end; |
||
1046 | DXR_CMPFUNC_LESS: |
||
1047 | begin |
||
1048 | { if (New<Old) then Jump } |
||
1049 | genFlagJmp(Code, JmpAdress, $7C, $0F, $8C); |
||
1050 | end; |
||
1051 | DXR_CMPFUNC_EQUAL: |
||
1052 | begin |
||
1053 | { if (New=Old) then Jump } |
||
1054 | genFlagJmp(Code, JmpAdress, $74, $0F, $84); |
||
1055 | end; |
||
1056 | DXR_CMPFUNC_LESSEQUAL: |
||
1057 | begin |
||
1058 | { if (New<=Old) then Jump } |
||
1059 | genFlagJmp(Code, JmpAdress, $7E, $0F, $8E); |
||
1060 | end; |
||
1061 | DXR_CMPFUNC_GREATER: |
||
1062 | begin |
||
1063 | { if (New>Old) then Jump } |
||
1064 | genFlagJmp(Code, JmpAdress, $7F, $0F, $8F); |
||
1065 | end; |
||
1066 | DXR_CMPFUNC_NOTEQUAL: |
||
1067 | begin |
||
1068 | { if (New<>Old) then Jump } |
||
1069 | genFlagJmp(Code, JmpAdress, $75, $0F, $85); |
||
1070 | end; |
||
1071 | DXR_CMPFUNC_GREATEREQUAL: |
||
1072 | begin |
||
1073 | { if (New>=Old) then Jump } |
||
1074 | genFlagJmp(Code, JmpAdress, $7D, $0F, $8D); |
||
1075 | end; |
||
1076 | DXR_CMPFUNC_ALWAYS: |
||
1077 | begin |
||
1078 | { if (True) then Break } |
||
1079 | genJmp(Code, JmpAdress); |
||
1080 | end; |
||
1081 | end; |
||
1082 | end; |
||
1083 | |||
1084 | procedure genInitDestAddress(var Code: Pointer); |
||
1085 | var |
||
1086 | _Axis: Pointer; |
||
1087 | ByteCount, Pitch: DWORD; |
||
1088 | Bits: Pointer; |
||
1089 | begin |
||
1090 | _Axis := @Axis.Axis; |
||
1091 | |||
1092 | ByteCount := Dest.BitCount shr 3; |
||
1093 | Pitch := Dest.pitch; |
||
1094 | Bits := Dest.Bits; |
||
1095 | |||
1096 | asm |
||
1097 | jmp @@EndCode |
||
1098 | @@StartCode: |
||
1099 | mov eax,dword ptr [offset _null]{}@@AxisX: |
||
1100 | imul eax,$11{} @@ByteCount: // Dest.BitCount div 8 |
||
1101 | mov edi,dword ptr [offset _null]{}@@AxisY: |
||
1102 | imul edi,$11111111{} @@Pitch: // Dest.pitch |
||
1103 | add edi,$11111111{} @@Bits: // Dest.Bits |
||
1104 | add edi,eax |
||
1105 | @@EndCode: |
||
1106 | {$I DXRender.inc} |
||
1107 | { @@AxisX } |
||
1108 | mov eax,_Axis; add eax,TDXRMachine_Axis.X |
||
1109 | mov edx,offset @@AxisX-4 |
||
1110 | sub edx,offset @@StartCode |
||
1111 | mov dword ptr [ecx+edx],eax |
||
1112 | |||
1113 | { @@AxisY } |
||
1114 | mov eax,_Axis; add eax,TDXRMachine_Axis.Y |
||
1115 | mov edx,offset @@AxisY-4 |
||
1116 | sub edx,offset @@StartCode |
||
1117 | mov dword ptr [ecx+edx],eax |
||
1118 | |||
1119 | { @@ByteCount } |
||
1120 | mov eax,ByteCount |
||
1121 | mov edx,offset @@ByteCount-1 |
||
1122 | sub edx,offset @@StartCode |
||
1123 | mov byte ptr [ecx+edx],al |
||
1124 | |||
1125 | { @@Pitch } |
||
1126 | mov eax,Pitch |
||
1127 | mov edx,offset @@Pitch-4 |
||
1128 | sub edx,offset @@StartCode |
||
1129 | mov dword ptr [ecx+edx],eax |
||
1130 | |||
1131 | { @@Bits } |
||
1132 | mov eax,Bits |
||
1133 | mov edx,offset @@Bits-4 |
||
1134 | sub edx,offset @@StartCode |
||
1135 | mov dword ptr [ecx+edx],eax |
||
1136 | end; |
||
1137 | end; |
||
1138 | |||
1139 | procedure genReadDestPixel(var Code: Pointer); |
||
1140 | begin |
||
1141 | case Dest.BitCount of |
||
1142 | 8: begin |
||
1143 | asm |
||
1144 | jmp @@EndCode |
||
1145 | @@StartCode: |
||
1146 | movzx eax,byte ptr [edi] |
||
1147 | @@EndCode: |
||
1148 | {$I DXRender.inc} |
||
1149 | end; |
||
1150 | end; |
||
1151 | 16: begin |
||
1152 | asm |
||
1153 | jmp @@EndCode |
||
1154 | @@StartCode: |
||
1155 | movzx eax,word ptr [edi] |
||
1156 | @@EndCode: |
||
1157 | {$I DXRender.inc} |
||
1158 | end; |
||
1159 | end; |
||
1160 | 24: begin |
||
1161 | asm |
||
1162 | jmp @@EndCode |
||
1163 | @@StartCode: |
||
1164 | movzx eax,byte ptr [edi+2] |
||
1165 | shl eax,16 |
||
1166 | mov ax,word ptr [edi] |
||
1167 | @@EndCode: |
||
1168 | {$I DXRender.inc} |
||
1169 | end; |
||
1170 | end; |
||
1171 | 32: begin |
||
1172 | asm |
||
1173 | jmp @@EndCode |
||
1174 | @@StartCode: |
||
1175 | mov eax,dword ptr [edi] |
||
1176 | @@EndCode: |
||
1177 | {$I DXRender.inc} |
||
1178 | end; |
||
1179 | end; |
||
1180 | end; |
||
1181 | end; |
||
1182 | |||
1183 | procedure genWriteDestPixel(var Code: Pointer); |
||
1184 | begin |
||
1185 | case Dest.BitCount of |
||
1186 | 8: begin |
||
1187 | asm |
||
1188 | jmp @@EndCode |
||
1189 | @@StartCode: |
||
1190 | mov byte ptr [edi],al |
||
1191 | @@EndCode: |
||
1192 | {$I DXRender.inc} |
||
1193 | end; |
||
1194 | end; |
||
1195 | 16: begin |
||
1196 | asm |
||
1197 | jmp @@EndCode |
||
1198 | @@StartCode: |
||
1199 | mov word ptr [edi],ax |
||
1200 | @@EndCode: |
||
1201 | {$I DXRender.inc} |
||
1202 | end; |
||
1203 | end; |
||
1204 | 24: begin |
||
1205 | asm |
||
1206 | jmp @@EndCode |
||
1207 | @@StartCode: |
||
1208 | mov word ptr [edi],ax |
||
1209 | bswap eax |
||
1210 | mov byte ptr [edi+2],ah |
||
1211 | @@EndCode: |
||
1212 | {$I DXRender.inc} |
||
1213 | end; |
||
1214 | end; |
||
1215 | 32: begin |
||
1216 | asm |
||
1217 | jmp @@EndCode |
||
1218 | @@StartCode: |
||
1219 | mov dword ptr [edi],eax |
||
1220 | @@EndCode: |
||
1221 | {$I DXRender.inc} |
||
1222 | end; |
||
1223 | end; |
||
1224 | end; |
||
1225 | end; |
||
1226 | |||
1227 | procedure genUpdateDestAddress(var Code: Pointer); |
||
1228 | var |
||
1229 | ByteCount: DWORD; |
||
1230 | begin |
||
1231 | ByteCount := Dest.BitCount shr 3; |
||
1232 | |||
1233 | if ByteCount=1 then |
||
1234 | begin |
||
1235 | asm |
||
1236 | jmp @@EndCode |
||
1237 | @@StartCode: |
||
1238 | inc edi |
||
1239 | @@EndCode: |
||
1240 | {$I DXRender.inc} |
||
1241 | end; |
||
1242 | end else |
||
1243 | begin |
||
1244 | asm |
||
1245 | jmp @@EndCode |
||
1246 | @@StartCode: |
||
1247 | add edi,$11{}@@ByteCount: // Dest.BitCount div 8; |
||
1248 | @@EndCode: |
||
1249 | {$I DXRender.inc} |
||
1250 | { @@ByteCount } |
||
1251 | mov eax,ByteCount |
||
1252 | mov edx,offset @@ByteCount-1 |
||
1253 | sub edx,offset @@StartCode |
||
1254 | mov byte ptr [ecx+edx],al |
||
1255 | end; |
||
1256 | end; |
||
1257 | end; |
||
1258 | |||
1259 | procedure genReadSurfacePixel_Tile(var Code: Pointer; const Source: TDXR_Surface; Axis: PDXRMachine_Axis); |
||
1260 | begin |
||
1261 | case Source.BitCount of |
||
1262 | 1: begin |
||
1263 | asm |
||
1264 | jmp @@EndCode |
||
1265 | @@StartCode: |
||
1266 | mov esi,dword ptr [offset _null]{}//TexY |
||
1267 | @@TexY: |
||
1268 | shr esi,16 |
||
1269 | and esi,$11111111{} @@MaskY: // Source.HeightMask |
||
1270 | imul esi,$11111111{}@@Pitch: // Source.pitch |
||
1271 | mov edx,dword ptr [offset _null]{}//TexX |
||
1272 | @@TexX: |
||
1273 | shr edx,16 |
||
1274 | and edx,$11111111{} @@MaskX: // Source.WidthMask |
||
1275 | mov ebx,edx |
||
1276 | shr edx,3 |
||
1277 | and ebx,7 |
||
1278 | movzx eax,byte ptr [esi+edx+$11111111] |
||
1279 | @@Bits: // Source.Bits |
||
1280 | and eax,dword ptr [offset Mask1+ebx*4] |
||
1281 | push ecx |
||
1282 | mov ecx,dword ptr [offset Shift1+ebx*4] |
||
1283 | shr eax,cl |
||
1284 | pop ecx |
||
1285 | @@EndCode: |
||
1286 | {$I DXRender.inc} |
||
1287 | { @@TexX } |
||
1288 | mov eax,Axis; add eax,TDXRMachine_Axis.X |
||
1289 | mov edx,offset @@TexX-4 |
||
1290 | sub edx,offset @@StartCode |
||
1291 | mov dword ptr [ecx+edx],eax |
||
1292 | |||
1293 | { @@TexY } |
||
1294 | mov eax,Axis; add eax,TDXRMachine_Axis.Y |
||
1295 | mov edx,offset @@TexY-4 |
||
1296 | sub edx,offset @@StartCode |
||
1297 | mov dword ptr [ecx+edx],eax |
||
1298 | |||
1299 | { @@MaskY } |
||
1300 | mov eax,Source; mov eax,[eax + TDXR_Surface.HeightMask] |
||
1301 | mov edx,offset @@MaskY-4 |
||
1302 | sub edx,offset @@StartCode |
||
1303 | mov dword ptr [ecx+edx],eax |
||
1304 | |||
1305 | { @@Pitch } |
||
1306 | mov eax,Source; mov eax,[eax + TDXR_Surface.Pitch] |
||
1307 | mov edx,offset @@Pitch-4 |
||
1308 | sub edx,offset @@StartCode |
||
1309 | mov dword ptr [ecx+edx],eax |
||
1310 | |||
1311 | { @@MaskX } |
||
1312 | mov eax,Source; mov eax,[eax + TDXR_Surface.WidthMask] |
||
1313 | mov edx,offset @@MaskX-4 |
||
1314 | sub edx,offset @@StartCode |
||
1315 | mov dword ptr [ecx+edx],eax |
||
1316 | |||
1317 | { @@Bits } |
||
1318 | mov eax,Source; mov eax,[eax + TDXR_Surface.Bits] |
||
1319 | mov edx,offset @@Bits-4 |
||
1320 | sub edx,offset @@StartCode |
||
1321 | mov dword ptr [ecx+edx],eax |
||
1322 | end; |
||
1323 | end; |
||
1324 | 2: begin |
||
1325 | asm |
||
1326 | jmp @@EndCode |
||
1327 | @@StartCode: |
||
1328 | mov esi,dword ptr [offset _null]{}//TexY |
||
1329 | @@TexY: |
||
1330 | shr esi,16 |
||
1331 | and esi,$11111111{} @@MaskY: // Source.HeightMask |
||
1332 | imul esi,$11111111{}@@Pitch: // Source.pitch |
||
1333 | mov edx,dword ptr [offset _null]{}//TexX |
||
1334 | @@TexX: |
||
1335 | shr edx,16 |
||
1336 | and edx,$11111111{} @@MaskX: // Source.WidthMask |
||
1337 | mov ebx,edx |
||
1338 | shr edx,2 |
||
1339 | and ebx,3 |
||
1340 | movzx eax,byte ptr [esi+edx+$11111111] |
||
1341 | @@Bits: // Source.Bits |
||
1342 | and eax,dword ptr [offset Mask2+ebx*4] |
||
1343 | push ecx |
||
1344 | mov ecx,dword ptr [offset Shift2+ebx*4] |
||
1345 | shr eax,cl |
||
1346 | pop ecx |
||
1347 | @@EndCode: |
||
1348 | {$I DXRender.inc} |
||
1349 | { @@TexX } |
||
1350 | mov eax,Axis; add eax,TDXRMachine_Axis.X |
||
1351 | mov edx,offset @@TexX-4 |
||
1352 | sub edx,offset @@StartCode |
||
1353 | mov dword ptr [ecx+edx],eax |
||
1354 | |||
1355 | { @@TexY } |
||
1356 | mov eax,Axis; add eax,TDXRMachine_Axis.Y |
||
1357 | mov edx,offset @@TexY-4 |
||
1358 | sub edx,offset @@StartCode |
||
1359 | mov dword ptr [ecx+edx],eax |
||
1360 | |||
1361 | { @@MaskY } |
||
1362 | mov eax,Source; mov eax,[eax + TDXR_Surface.HeightMask] |
||
1363 | mov edx,offset @@MaskY-4 |
||
1364 | sub edx,offset @@StartCode |
||
1365 | mov dword ptr [ecx+edx],eax |
||
1366 | |||
1367 | { @@Pitch } |
||
1368 | mov eax,Source; mov eax,[eax + TDXR_Surface.Pitch] |
||
1369 | mov edx,offset @@Pitch-4 |
||
1370 | sub edx,offset @@StartCode |
||
1371 | mov dword ptr [ecx+edx],eax |
||
1372 | |||
1373 | { @@MaskX } |
||
1374 | mov eax,Source; mov eax,[eax + TDXR_Surface.WidthMask] |
||
1375 | mov edx,offset @@MaskX-4 |
||
1376 | sub edx,offset @@StartCode |
||
1377 | mov dword ptr [ecx+edx],eax |
||
1378 | { @@Bits } |
||
1379 | mov eax,Source; mov eax,[eax + TDXR_Surface.Bits] |
||
1380 | mov edx,offset @@Bits-4 |
||
1381 | sub edx,offset @@StartCode |
||
1382 | mov dword ptr [ecx+edx],eax |
||
1383 | end; |
||
1384 | end; |
||
1385 | 4: begin |
||
1386 | asm |
||
1387 | jmp @@EndCode |
||
1388 | @@StartCode: |
||
1389 | mov esi,dword ptr [offset _null]{}//TexY |
||
1390 | @@TexY: |
||
1391 | shr esi,16 |
||
1392 | and esi,$11111111{} @@MaskY: // Source.HeightMask |
||
1393 | imul esi,$11111111{}@@Pitch: // Source.pitch |
||
1394 | mov edx,dword ptr [offset _null]{}//TexX |
||
1395 | @@TexX: |
||
1396 | shr edx,16 |
||
1397 | and edx,$11111111{} @@MaskX: // Source.WidthMask |
||
1398 | mov ebx,edx |
||
1399 | shr edx,1 |
||
1400 | and ebx,1 |
||
1401 | movzx eax,byte ptr [esi+edx+$11111111] |
||
1402 | @@Bits: // Source.Bits |
||
1403 | and eax,dword ptr [offset Mask4+ebx*4] |
||
1404 | push ecx |
||
1405 | mov ecx,dword ptr [offset Shift4+ebx*4] |
||
1406 | shr eax,cl |
||
1407 | pop ecx |
||
1408 | @@EndCode: |
||
1409 | {$I DXRender.inc} |
||
1410 | { @@TexX } |
||
1411 | mov eax,Axis; add eax,TDXRMachine_Axis.X |
||
1412 | mov edx,offset @@TexX-4 |
||
1413 | sub edx,offset @@StartCode |
||
1414 | mov dword ptr [ecx+edx],eax |
||
1415 | |||
1416 | { @@TexY } |
||
1417 | mov eax,Axis; add eax,TDXRMachine_Axis.Y |
||
1418 | mov edx,offset @@TexY-4 |
||
1419 | sub edx,offset @@StartCode |
||
1420 | mov dword ptr [ecx+edx],eax |
||
1421 | |||
1422 | { @@MaskY } |
||
1423 | mov eax,Source; mov eax,[eax + TDXR_Surface.HeightMask] |
||
1424 | mov edx,offset @@MaskY-4 |
||
1425 | sub edx,offset @@StartCode |
||
1426 | mov dword ptr [ecx+edx],eax |
||
1427 | |||
1428 | { @@Pitch } |
||
1429 | mov eax,Source; mov eax,[eax + TDXR_Surface.Pitch] |
||
1430 | mov edx,offset @@Pitch-4 |
||
1431 | sub edx,offset @@StartCode |
||
1432 | mov dword ptr [ecx+edx],eax |
||
1433 | |||
1434 | { @@MaskX } |
||
1435 | mov eax,Source; mov eax,[eax + TDXR_Surface.WidthMask] |
||
1436 | mov edx,offset @@MaskX-4 |
||
1437 | sub edx,offset @@StartCode |
||
1438 | mov dword ptr [ecx+edx],eax |
||
1439 | |||
1440 | { @@Bits } |
||
1441 | mov eax,Source; mov eax,[eax + TDXR_Surface.Bits] |
||
1442 | mov edx,offset @@Bits-4 |
||
1443 | sub edx,offset @@StartCode |
||
1444 | mov dword ptr [ecx+edx],eax |
||
1445 | end; |
||
1446 | end; |
||
1447 | 8: begin |
||
1448 | if Source.pitch=(1 shl Source.PitchBit) then |
||
1449 | begin |
||
1450 | asm |
||
1451 | jmp @@EndCode |
||
1452 | @@StartCode: |
||
1453 | mov esi,dword ptr [offset _null]{}@@TexY: //TexY |
||
1454 | mov edx,dword ptr [offset _null]{}@@TexX: //TexX |
||
1455 | shr esi,$11{} @@YShift: // 16-Source.PitchBit |
||
1456 | shr edx,16 |
||
1457 | and esi,$11111111{} @@MaskY: // Source.HeightMask shl Source.PitchBit |
||
1458 | and edx,$11111111{} @@MaskX: // Source.WidthMask |
||
1459 | movzx eax,byte ptr [$11111111+esi+edx] |
||
1460 | @@Bits: // Source.Bits |
||
1461 | @@EndCode: |
||
1462 | {$I DXRender.inc} |
||
1463 | { @@TexX } |
||
1464 | mov eax,Axis; add eax,TDXRMachine_Axis.X |
||
1465 | mov edx,offset @@TexX-4 |
||
1466 | sub edx,offset @@StartCode |
||
1467 | mov dword ptr [ecx+edx],eax |
||
1468 | |||
1469 | { @@TexY } |
||
1470 | mov eax,Axis; add eax,TDXRMachine_Axis.Y |
||
1471 | mov edx,offset @@TexY-4 |
||
1472 | sub edx,offset @@StartCode |
||
1473 | mov dword ptr [ecx+edx],eax |
||
1474 | |||
1475 | { @@YShift } |
||
1476 | push ebx |
||
1477 | mov eax,16 |
||
1478 | mov ebx,Source; sub eax,[ebx + TDXR_Surface.PitchBit] |
||
1479 | pop ebx |
||
1480 | mov edx,offset @@YShift-1 |
||
1481 | sub edx,offset @@StartCode |
||
1482 | mov byte ptr [ecx+edx],al |
||
1483 | |||
1484 | { @@MaskY } |
||
1485 | push ecx |
||
1486 | mov ecx,Source; mov ecx,[ecx + TDXR_Surface.PitchBit] |
||
1487 | mov eax,Source; mov eax,[eax + TDXR_Surface.HeightMask] |
||
1488 | shl eax,cl |
||
1489 | pop ecx |
||
1490 | mov edx,offset @@MaskY-4 |
||
1491 | sub edx,offset @@StartCode |
||
1492 | mov dword ptr [ecx+edx],eax |
||
1493 | |||
1494 | { @@MaskX } |
||
1495 | mov eax,Source; mov eax,[eax + TDXR_Surface.WidthMask] |
||
1496 | mov edx,offset @@MaskX-4 |
||
1497 | sub edx,offset @@StartCode |
||
1498 | mov dword ptr [ecx+edx],eax |
||
1499 | |||
1500 | { @@Bits } |
||
1501 | mov eax,Source; mov eax,[eax + TDXR_Surface.Bits] |
||
1502 | mov edx,offset @@Bits-4 |
||
1503 | sub edx,offset @@StartCode |
||
1504 | mov dword ptr [ecx+edx],eax |
||
1505 | end; |
||
1506 | end else |
||
1507 | if -Source.pitch=(1 shl Source.PitchBit) then |
||
1508 | begin |
||
1509 | asm |
||
1510 | jmp @@EndCode |
||
1511 | @@StartCode: |
||
1512 | mov esi,dword ptr [offset _null]{}@@TexY: //TexY |
||
1513 | mov edx,dword ptr [offset _null]{}@@TexX: //TexX |
||
1514 | shr esi,$11{} @@YShift: // 16-Source.PitchBit |
||
1515 | shr edx,16 |
||
1516 | and esi,$11111111{} @@MaskY: // Source.HeightMask shl Source.PitchBit |
||
1517 | and edx,$11111111{} @@MaskX: // Source.WidthMask |
||
1518 | neg esi |
||
1519 | movzx eax,byte ptr [$11111111+esi+edx] |
||
1520 | @@Bits: // Source.Bits |
||
1521 | @@EndCode: |
||
1522 | {$I DXRender.inc} |
||
1523 | { @@TexX } |
||
1524 | mov eax,Axis; add eax,TDXRMachine_Axis.X |
||
1525 | mov edx,offset @@TexX-4 |
||
1526 | sub edx,offset @@StartCode |
||
1527 | mov dword ptr [ecx+edx],eax |
||
1528 | |||
1529 | { @@TexY } |
||
1530 | mov eax,Axis; add eax,TDXRMachine_Axis.Y |
||
1531 | mov edx,offset @@TexY-4 |
||
1532 | sub edx,offset @@StartCode |
||
1533 | mov dword ptr [ecx+edx],eax |
||
1534 | |||
1535 | { @@YShift } |
||
1536 | push ebx |
||
1537 | mov eax,16 |
||
1538 | mov ebx,Source; sub eax,[ebx + TDXR_Surface.PitchBit] |
||
1539 | pop ebx |
||
1540 | mov edx,offset @@YShift-1 |
||
1541 | sub edx,offset @@StartCode |
||
1542 | mov byte ptr [ecx+edx],al |
||
1543 | |||
1544 | { @@MaskY } |
||
1545 | push ecx |
||
1546 | mov ecx,Source; mov ecx,[ecx + TDXR_Surface.PitchBit] |
||
1547 | mov eax,Source; mov eax,[eax + TDXR_Surface.HeightMask] |
||
1548 | shl eax,cl |
||
1549 | pop ecx |
||
1550 | mov edx,offset @@MaskY-4 |
||
1551 | sub edx,offset @@StartCode |
||
1552 | mov dword ptr [ecx+edx],eax |
||
1553 | |||
1554 | { @@MaskX } |
||
1555 | mov eax,Source; mov eax,[eax + TDXR_Surface.WidthMask] |
||
1556 | mov edx,offset @@MaskX-4 |
||
1557 | sub edx,offset @@StartCode |
||
1558 | mov dword ptr [ecx+edx],eax |
||
1559 | |||
1560 | { @@Bits } |
||
1561 | mov eax,Source; mov eax,[eax + TDXR_Surface.Bits] |
||
1562 | mov edx,offset @@Bits-4 |
||
1563 | sub edx,offset @@StartCode |
||
1564 | mov dword ptr [ecx+edx],eax |
||
1565 | end; |
||
1566 | end else |
||
1567 | begin |
||
1568 | asm |
||
1569 | jmp @@EndCode |
||
1570 | @@StartCode: |
||
1571 | mov esi,dword ptr [offset _null]{}@@TexY: //TexY |
||
1572 | mov edx,dword ptr [offset _null]{}@@TexX: //TexX |
||
1573 | shr esi,16 |
||
1574 | shr edx,16 |
||
1575 | and esi,$11111111{} @@MaskY: // Source.HeightMask |
||
1576 | and edx,$11111111{} @@MaskX: // Source.WidthMask |
||
1577 | imul esi,$11111111{}@@Pitch: // Source.pitch |
||
1578 | movzx eax,byte ptr [esi+edx+$11111111] |
||
1579 | @@Bits: // Source.Bits |
||
1580 | @@EndCode: |
||
1581 | {$I DXRender.inc} |
||
1582 | { @@TexX } |
||
1583 | mov eax,Axis; add eax,TDXRMachine_Axis.X |
||
1584 | mov edx,offset @@TexX-4 |
||
1585 | sub edx,offset @@StartCode |
||
1586 | mov dword ptr [ecx+edx],eax |
||
1587 | |||
1588 | { @@TexY } |
||
1589 | mov eax,Axis; add eax,TDXRMachine_Axis.Y |
||
1590 | mov edx,offset @@TexY-4 |
||
1591 | sub edx,offset @@StartCode |
||
1592 | mov dword ptr [ecx+edx],eax |
||
1593 | |||
1594 | { @@MaskY } |
||
1595 | mov eax,Source; mov eax,[eax + TDXR_Surface.HeightMask] |
||
1596 | mov edx,offset @@MaskY-4 |
||
1597 | sub edx,offset @@StartCode |
||
1598 | mov dword ptr [ecx+edx],eax |
||
1599 | |||
1600 | { @@Pitch } |
||
1601 | mov eax,Source; mov eax,[eax + TDXR_Surface.Pitch] |
||
1602 | mov edx,offset @@Pitch-4 |
||
1603 | sub edx,offset @@StartCode |
||
1604 | mov dword ptr [ecx+edx],eax |
||
1605 | |||
1606 | { @@MaskX } |
||
1607 | mov eax,Source; mov eax,[eax + TDXR_Surface.WidthMask] |
||
1608 | mov edx,offset @@MaskX-4 |
||
1609 | sub edx,offset @@StartCode |
||
1610 | mov dword ptr [ecx+edx],eax |
||
1611 | |||
1612 | { @@Bits } |
||
1613 | mov eax,Source; mov eax,[eax + TDXR_Surface.Bits] |
||
1614 | mov edx,offset @@Bits-4 |
||
1615 | sub edx,offset @@StartCode |
||
1616 | mov dword ptr [ecx+edx],eax |
||
1617 | end; |
||
1618 | end; |
||
1619 | end; |
||
1620 | 16: begin |
||
1621 | if Source.pitch=(1 shl Source.PitchBit) then |
||
1622 | begin |
||
1623 | asm |
||
1624 | jmp @@EndCode |
||
1625 | @@StartCode: |
||
1626 | mov esi,dword ptr [offset _null]{}@@TexY: //TexY |
||
1627 | mov edx,dword ptr [offset _null]{}@@TexX: //TexX |
||
1628 | shr esi,$11{} @@YShift: // 16-Source.PitchBit |
||
1629 | shr edx,16 |
||
1630 | and esi,$11111111{} @@MaskY: // Source.HeightMask shl Source.PitchBit |
||
1631 | and edx,$11111111{} @@MaskX: // Source.WidthMask |
||
1632 | movzx eax,word ptr [$11111111+esi+edx*2] |
||
1633 | @@Bits: // Source.Bits |
||
1634 | @@EndCode: |
||
1635 | {$I DXRender.inc} |
||
1636 | { @@TexX } |
||
1637 | mov eax,Axis; add eax,TDXRMachine_Axis.X |
||
1638 | mov edx,offset @@TexX-4 |
||
1639 | sub edx,offset @@StartCode |
||
1640 | mov dword ptr [ecx+edx],eax |
||
1641 | |||
1642 | { @@TexY } |
||
1643 | mov eax,Axis; add eax,TDXRMachine_Axis.Y |
||
1644 | mov edx,offset @@TexY-4 |
||
1645 | sub edx,offset @@StartCode |
||
1646 | mov dword ptr [ecx+edx],eax |
||
1647 | |||
1648 | { @@YShift } |
||
1649 | push ebx |
||
1650 | mov eax,16 |
||
1651 | mov ebx,Source; sub eax,[ebx + TDXR_Surface.PitchBit] |
||
1652 | pop ebx |
||
1653 | mov edx,offset @@YShift-1 |
||
1654 | sub edx,offset @@StartCode |
||
1655 | mov byte ptr [ecx+edx],al |
||
1656 | |||
1657 | { @@MaskY } |
||
1658 | push ecx |
||
1659 | mov ecx,Source; mov ecx,[ecx + TDXR_Surface.PitchBit] |
||
1660 | mov eax,Source; mov eax,[eax + TDXR_Surface.HeightMask] |
||
1661 | shl eax,cl |
||
1662 | pop ecx |
||
1663 | mov edx,offset @@MaskY-4 |
||
1664 | sub edx,offset @@StartCode |
||
1665 | mov dword ptr [ecx+edx],eax |
||
1666 | |||
1667 | { @@MaskX } |
||
1668 | mov eax,Source; mov eax,[eax + TDXR_Surface.WidthMask] |
||
1669 | mov edx,offset @@MaskX-4 |
||
1670 | sub edx,offset @@StartCode |
||
1671 | mov dword ptr [ecx+edx],eax |
||
1672 | |||
1673 | { @@Bits } |
||
1674 | mov eax,Source; mov eax,[eax + TDXR_Surface.Bits] |
||
1675 | mov edx,offset @@Bits-4 |
||
1676 | sub edx,offset @@StartCode |
||
1677 | mov dword ptr [ecx+edx],eax |
||
1678 | end; |
||
1679 | end else |
||
1680 | if -Source.pitch=(1 shl Source.PitchBit) then |
||
1681 | begin |
||
1682 | asm |
||
1683 | jmp @@EndCode |
||
1684 | @@StartCode: |
||
1685 | mov esi,dword ptr [offset _null]{}@@TexY: //TexY |
||
1686 | mov edx,dword ptr [offset _null]{}@@TexX: //TexX |
||
1687 | shr esi,$11{} @@YShift: // 16-Source.PitchBit |
||
1688 | shr edx,16 |
||
1689 | and esi,$11111111{} @@MaskY: // Source.HeightMask shl Source.PitchBit |
||
1690 | and edx,$11111111{} @@MaskX: // Source.WidthMask |
||
1691 | neg esi |
||
1692 | movzx eax,word ptr [$11111111+esi+edx*2] |
||
1693 | @@Bits: // Source.Bits |
||
1694 | @@EndCode: |
||
1695 | {$I DXRender.inc} |
||
1696 | { @@TexX } |
||
1697 | mov eax,Axis; add eax,TDXRMachine_Axis.X |
||
1698 | mov edx,offset @@TexX-4 |
||
1699 | sub edx,offset @@StartCode |
||
1700 | mov dword ptr [ecx+edx],eax |
||
1701 | |||
1702 | { @@TexY } |
||
1703 | mov eax,Axis; add eax,TDXRMachine_Axis.Y |
||
1704 | mov edx,offset @@TexY-4 |
||
1705 | sub edx,offset @@StartCode |
||
1706 | mov dword ptr [ecx+edx],eax |
||
1707 | |||
1708 | { @@YShift } |
||
1709 | push ebx |
||
1710 | mov eax,16 |
||
1711 | mov ebx,Source; sub eax,[ebx + TDXR_Surface.PitchBit] |
||
1712 | pop ebx |
||
1713 | mov edx,offset @@YShift-1 |
||
1714 | sub edx,offset @@StartCode |
||
1715 | mov byte ptr [ecx+edx],al |
||
1716 | |||
1717 | { @@MaskY } |
||
1718 | push ecx |
||
1719 | mov ecx,Source; mov ecx,[ecx + TDXR_Surface.PitchBit] |
||
1720 | mov eax,Source; mov eax,[eax + TDXR_Surface.HeightMask] |
||
1721 | shl eax,cl |
||
1722 | pop ecx |
||
1723 | mov edx,offset @@MaskY-4 |
||
1724 | sub edx,offset @@StartCode |
||
1725 | mov dword ptr [ecx+edx],eax |
||
1726 | |||
1727 | { @@MaskX } |
||
1728 | mov eax,Source; mov eax,[eax + TDXR_Surface.WidthMask] |
||
1729 | mov edx,offset @@MaskX-4 |
||
1730 | sub edx,offset @@StartCode |
||
1731 | mov dword ptr [ecx+edx],eax |
||
1732 | |||
1733 | { @@Bits } |
||
1734 | mov eax,Source; mov eax,[eax + TDXR_Surface.Bits] |
||
1735 | mov edx,offset @@Bits-4 |
||
1736 | sub edx,offset @@StartCode |
||
1737 | mov dword ptr [ecx+edx],eax |
||
1738 | end; |
||
1739 | end else |
||
1740 | begin |
||
1741 | asm |
||
1742 | jmp @@EndCode |
||
1743 | @@StartCode: |
||
1744 | mov esi,dword ptr [offset _null]{}@@TexY: //TexY |
||
1745 | mov edx,dword ptr [offset _null]{}@@TexX: //TexX |
||
1746 | shr esi,16 |
||
1747 | shr edx,16 |
||
1748 | and esi,$11111111{} @@MaskY: // Source.HeightMask |
||
1749 | and edx,$11111111{} @@MaskX: // Source.WidthMask |
||
1750 | imul esi,$11111111{}@@Pitch: // Source.pitch |
||
1751 | movzx eax,word ptr [esi+edx*2+$11111111] |
||
1752 | @@Bits: // Source.Bits |
||
1753 | @@EndCode: |
||
1754 | {$I DXRender.inc} |
||
1755 | { @@TexX } |
||
1756 | mov eax,Axis; add eax,TDXRMachine_Axis.X |
||
1757 | mov edx,offset @@TexX-4 |
||
1758 | sub edx,offset @@StartCode |
||
1759 | mov dword ptr [ecx+edx],eax |
||
1760 | |||
1761 | { @@TexY } |
||
1762 | mov eax,Axis; add eax,TDXRMachine_Axis.Y |
||
1763 | mov edx,offset @@TexY-4 |
||
1764 | sub edx,offset @@StartCode |
||
1765 | mov dword ptr [ecx+edx],eax |
||
1766 | |||
1767 | { @@MaskY } |
||
1768 | mov eax,Source; mov eax,[eax + TDXR_Surface.HeightMask] |
||
1769 | mov edx,offset @@MaskY-4 |
||
1770 | sub edx,offset @@StartCode |
||
1771 | mov dword ptr [ecx+edx],eax |
||
1772 | |||
1773 | { @@Pitch } |
||
1774 | mov eax,Source; mov eax,[eax + TDXR_Surface.Pitch] |
||
1775 | mov edx,offset @@Pitch-4 |
||
1776 | sub edx,offset @@StartCode |
||
1777 | mov dword ptr [ecx+edx],eax |
||
1778 | |||
1779 | { @@MaskX } |
||
1780 | mov eax,Source; mov eax,[eax + TDXR_Surface.WidthMask] |
||
1781 | mov edx,offset @@MaskX-4 |
||
1782 | sub edx,offset @@StartCode |
||
1783 | mov dword ptr [ecx+edx],eax |
||
1784 | |||
1785 | { @@Bits } |
||
1786 | mov eax,Source; mov eax,[eax + TDXR_Surface.Bits] |
||
1787 | mov edx,offset @@Bits-4 |
||
1788 | sub edx,offset @@StartCode |
||
1789 | mov dword ptr [ecx+edx],eax |
||
1790 | end; |
||
1791 | end; |
||
1792 | end; |
||
1793 | 24: begin |
||
1794 | asm |
||
1795 | jmp @@EndCode |
||
1796 | @@StartCode: |
||
1797 | mov esi,dword ptr [offset _null]{}//TexY |
||
1798 | @@TexY: |
||
1799 | mov edx,dword ptr [offset _null]{}//TexX |
||
1800 | @@TexX: |
||
1801 | shr esi,16 |
||
1802 | shr edx,16 |
||
1803 | and esi,$11111111{} @@MaskY: // Source.HeightMask |
||
1804 | and edx,$11111111{} @@MaskX: // Source.WidthMask |
||
1805 | imul esi,$11111111{}@@Pitch: // Source.pitch |
||
1806 | lea edx,[edx+edx*2+$11111111] // Source.Bits |
||
1807 | @@Bits: |
||
1808 | movzx eax,byte ptr [esi+edx+2] |
||
1809 | shl eax,16 |
||
1810 | mov ax,word ptr [esi+edx] |
||
1811 | @@EndCode: |
||
1812 | {$I DXRender.inc} |
||
1813 | { @@TexX } |
||
1814 | mov eax,Axis; add eax,TDXRMachine_Axis.X |
||
1815 | mov edx,offset @@TexX-4 |
||
1816 | sub edx,offset @@StartCode |
||
1817 | mov dword ptr [ecx+edx],eax |
||
1818 | |||
1819 | { @@TexY } |
||
1820 | mov eax,Axis; add eax,TDXRMachine_Axis.Y |
||
1821 | mov edx,offset @@TexY-4 |
||
1822 | sub edx,offset @@StartCode |
||
1823 | mov dword ptr [ecx+edx],eax |
||
1824 | |||
1825 | { @@MaskY } |
||
1826 | mov eax,Source; mov eax,[eax + TDXR_Surface.HeightMask] |
||
1827 | mov edx,offset @@MaskY-4 |
||
1828 | sub edx,offset @@StartCode |
||
1829 | mov dword ptr [ecx+edx],eax |
||
1830 | |||
1831 | { @@Pitch } |
||
1832 | mov eax,Source; mov eax,[eax + TDXR_Surface.Pitch] |
||
1833 | mov edx,offset @@Pitch-4 |
||
1834 | sub edx,offset @@StartCode |
||
1835 | mov dword ptr [ecx+edx],eax |
||
1836 | |||
1837 | { @@MaskX } |
||
1838 | mov eax,Source; mov eax,[eax + TDXR_Surface.WidthMask] |
||
1839 | mov edx,offset @@MaskX-4 |
||
1840 | sub edx,offset @@StartCode |
||
1841 | mov dword ptr [ecx+edx],eax |
||
1842 | |||
1843 | { @@Bits } |
||
1844 | mov eax,Source; mov eax,[eax + TDXR_Surface.Bits] |
||
1845 | mov edx,offset @@Bits-4 |
||
1846 | sub edx,offset @@StartCode |
||
1847 | mov dword ptr [ecx+edx],eax |
||
1848 | end; |
||
1849 | end; |
||
1850 | 32: begin |
||
1851 | if Source.pitch=(1 shl Source.PitchBit) then |
||
1852 | begin |
||
1853 | asm |
||
1854 | jmp @@EndCode |
||
1855 | @@StartCode: |
||
1856 | mov esi,dword ptr [offset _null]{}@@TexY: //TexY |
||
1857 | mov edx,dword ptr [offset _null]{}@@TexX: //TexX |
||
1858 | shr esi,$11{} @@YShift: // 16-Source.PitchBit |
||
1859 | shr edx,16 |
||
1860 | and esi,$11111111{} @@MaskY: // Source.HeightMask shl Source.PitchBit |
||
1861 | and edx,$11111111{} @@MaskX: // Source.WidthMask |
||
1862 | mov eax,dword ptr [$11111111+esi+edx*4] |
||
1863 | @@Bits: // Source.Bits |
||
1864 | @@EndCode: |
||
1865 | {$I DXRender.inc} |
||
1866 | { @@TexX } |
||
1867 | mov eax,Axis; add eax,TDXRMachine_Axis.X |
||
1868 | mov edx,offset @@TexX-4 |
||
1869 | sub edx,offset @@StartCode |
||
1870 | mov dword ptr [ecx+edx],eax |
||
1871 | |||
1872 | { @@TexY } |
||
1873 | mov eax,Axis; add eax,TDXRMachine_Axis.Y |
||
1874 | mov edx,offset @@TexY-4 |
||
1875 | sub edx,offset @@StartCode |
||
1876 | mov dword ptr [ecx+edx],eax |
||
1877 | |||
1878 | { @@YShift } |
||
1879 | push ebx |
||
1880 | mov eax,16 |
||
1881 | mov ebx,Source; sub eax,[ebx + TDXR_Surface.PitchBit] |
||
1882 | pop ebx |
||
1883 | mov edx,offset @@YShift-1 |
||
1884 | sub edx,offset @@StartCode |
||
1885 | mov byte ptr [ecx+edx],al |
||
1886 | |||
1887 | { @@MaskY } |
||
1888 | push ecx |
||
1889 | mov ecx,Source; mov ecx,[ecx + TDXR_Surface.PitchBit] |
||
1890 | mov eax,Source; mov eax,[eax + TDXR_Surface.HeightMask] |
||
1891 | shl eax,cl |
||
1892 | pop ecx |
||
1893 | mov edx,offset @@MaskY-4 |
||
1894 | sub edx,offset @@StartCode |
||
1895 | mov dword ptr [ecx+edx],eax |
||
1896 | |||
1897 | { @@MaskX } |
||
1898 | mov eax,Source; mov eax,[eax + TDXR_Surface.WidthMask] |
||
1899 | mov edx,offset @@MaskX-4 |
||
1900 | sub edx,offset @@StartCode |
||
1901 | mov dword ptr [ecx+edx],eax |
||
1902 | |||
1903 | { @@Bits } |
||
1904 | mov eax,Source; mov eax,[eax + TDXR_Surface.Bits] |
||
1905 | mov edx,offset @@Bits-4 |
||
1906 | sub edx,offset @@StartCode |
||
1907 | mov dword ptr [ecx+edx],eax |
||
1908 | end; |
||
1909 | end else |
||
1910 | if -Source.pitch=(1 shl Source.PitchBit) then |
||
1911 | begin |
||
1912 | asm |
||
1913 | jmp @@EndCode |
||
1914 | @@StartCode: |
||
1915 | mov esi,dword ptr [offset _null]{}@@TexY: //TexY |
||
1916 | mov edx,dword ptr [offset _null]{}@@TexX: //TexX |
||
1917 | shr esi,$11{} @@YShift: // 16-Source.PitchBit |
||
1918 | shr edx,16 |
||
1919 | and esi,$11111111{} @@MaskY: // Source.HeightMask shl Source.PitchBit |
||
1920 | and edx,$11111111{} @@MaskX: // Source.WidthMask |
||
1921 | neg esi |
||
1922 | mov eax,dword ptr [$11111111+esi+edx*4] |
||
1923 | @@Bits: // Source.Bits |
||
1924 | @@EndCode: |
||
1925 | {$I DXRender.inc} |
||
1926 | { @@TexX } |
||
1927 | mov eax,Axis; add eax,TDXRMachine_Axis.X |
||
1928 | mov edx,offset @@TexX-4 |
||
1929 | sub edx,offset @@StartCode |
||
1930 | mov dword ptr [ecx+edx],eax |
||
1931 | |||
1932 | { @@TexY } |
||
1933 | mov eax,Axis; add eax,TDXRMachine_Axis.Y |
||
1934 | mov edx,offset @@TexY-4 |
||
1935 | sub edx,offset @@StartCode |
||
1936 | mov dword ptr [ecx+edx],eax |
||
1937 | |||
1938 | { @@YShift } |
||
1939 | push ebx |
||
1940 | mov eax,16 |
||
1941 | mov ebx,Source; sub eax,[ebx + TDXR_Surface.PitchBit] |
||
1942 | pop ebx |
||
1943 | mov edx,offset @@YShift-1 |
||
1944 | sub edx,offset @@StartCode |
||
1945 | mov byte ptr [ecx+edx],al |
||
1946 | |||
1947 | { @@MaskY } |
||
1948 | push ecx |
||
1949 | mov ecx,Source; mov ecx,[ecx + TDXR_Surface.PitchBit] |
||
1950 | mov eax,Source; mov eax,[eax + TDXR_Surface.HeightMask] |
||
1951 | shl eax,cl |
||
1952 | pop ecx |
||
1953 | mov edx,offset @@MaskY-4 |
||
1954 | sub edx,offset @@StartCode |
||
1955 | mov dword ptr [ecx+edx],eax |
||
1956 | |||
1957 | { @@MaskX } |
||
1958 | mov eax,Source; mov eax,[eax + TDXR_Surface.WidthMask] |
||
1959 | mov edx,offset @@MaskX-4 |
||
1960 | sub edx,offset @@StartCode |
||
1961 | mov dword ptr [ecx+edx],eax |
||
1962 | |||
1963 | { @@Bits } |
||
1964 | mov eax,Source; mov eax,[eax + TDXR_Surface.Bits] |
||
1965 | mov edx,offset @@Bits-4 |
||
1966 | sub edx,offset @@StartCode |
||
1967 | mov dword ptr [ecx+edx],eax |
||
1968 | end; |
||
1969 | end else |
||
1970 | begin |
||
1971 | asm |
||
1972 | jmp @@EndCode |
||
1973 | @@StartCode: |
||
1974 | mov esi,dword ptr [offset _null]{}@@TexY: //TexY |
||
1975 | mov edx,dword ptr [offset _null]{}@@TexX: //TexX |
||
1976 | shr esi,16 |
||
1977 | shr edx,16 |
||
1978 | and esi,$11111111{} @@MaskY: // Source.HeightMask |
||
1979 | and edx,$11111111{} @@MaskX: // Source.WidthMask |
||
1980 | imul esi,$11111111{}@@Pitch: // Source.pitch |
||
1981 | mov eax,dword ptr [esi+edx*4+$11111111] |
||
1982 | @@Bits: // Source.Bits |
||
1983 | @@EndCode: |
||
1984 | {$I DXRender.inc} |
||
1985 | { @@TexX } |
||
1986 | mov eax,Axis; add eax,TDXRMachine_Axis.X |
||
1987 | mov edx,offset @@TexX-4 |
||
1988 | sub edx,offset @@StartCode |
||
1989 | mov dword ptr [ecx+edx],eax |
||
1990 | |||
1991 | { @@TexY } |
||
1992 | mov eax,Axis; add eax,TDXRMachine_Axis.Y |
||
1993 | mov edx,offset @@TexY-4 |
||
1994 | sub edx,offset @@StartCode |
||
1995 | mov dword ptr [ecx+edx],eax |
||
1996 | |||
1997 | { @@MaskY } |
||
1998 | mov eax,Source; mov eax,[eax + TDXR_Surface.HeightMask] |
||
1999 | mov edx,offset @@MaskY-4 |
||
2000 | sub edx,offset @@StartCode |
||
2001 | mov dword ptr [ecx+edx],eax |
||
2002 | |||
2003 | { @@Pitch } |
||
2004 | mov eax,Source; mov eax,[eax + TDXR_Surface.Pitch] |
||
2005 | mov edx,offset @@Pitch-4 |
||
2006 | sub edx,offset @@StartCode |
||
2007 | mov dword ptr [ecx+edx],eax |
||
2008 | |||
2009 | { @@MaskX } |
||
2010 | mov eax,Source; mov eax,[eax + TDXR_Surface.WidthMask] |
||
2011 | mov edx,offset @@MaskX-4 |
||
2012 | sub edx,offset @@StartCode |
||
2013 | mov dword ptr [ecx+edx],eax |
||
2014 | |||
2015 | { @@Bits } |
||
2016 | mov eax,Source; mov eax,[eax + TDXR_Surface.Bits] |
||
2017 | mov edx,offset @@Bits-4 |
||
2018 | sub edx,offset @@StartCode |
||
2019 | mov dword ptr [ecx+edx],eax |
||
2020 | end; |
||
2021 | end; |
||
2022 | end; |
||
2023 | end; |
||
2024 | end; |
||
2025 | |||
2026 | procedure genReadSurfacePixel_DoNotClip(var Code: Pointer; const Source: TDXR_Surface; Axis: PDXRMachine_Axis); |
||
2027 | begin |
||
2028 | case Source.BitCount of |
||
2029 | 1: begin |
||
2030 | asm |
||
2031 | jmp @@EndCode |
||
2032 | @@StartCode: |
||
2033 | mov esi,dword ptr [offset _null]{}//TexY |
||
2034 | @@TexY: |
||
2035 | shr esi,16 |
||
2036 | imul esi,$11111111{}@@Pitch: // Source.pitch |
||
2037 | mov edx,dword ptr [offset _null]{}//TexX |
||
2038 | @@TexX: |
||
2039 | shr edx,16 |
||
2040 | mov ebx,edx |
||
2041 | shr edx,3 |
||
2042 | and ebx,7 |
||
2043 | movzx eax,byte ptr [esi+edx+$11111111] |
||
2044 | @@Bits: // Source.Bits |
||
2045 | and eax,dword ptr [offset Mask1+ebx*4] |
||
2046 | push ecx |
||
2047 | mov ecx,dword ptr [offset Shift1+ebx*4] |
||
2048 | shr eax,cl |
||
2049 | pop ecx |
||
2050 | @@EndCode: |
||
2051 | {$I DXRender.inc} |
||
2052 | { @@TexX } |
||
2053 | mov eax,Axis; add eax,TDXRMachine_Axis.X |
||
2054 | mov edx,offset @@TexX-4 |
||
2055 | sub edx,offset @@StartCode |
||
2056 | mov dword ptr [ecx+edx],eax |
||
2057 | |||
2058 | { @@TexY } |
||
2059 | mov eax,Axis; add eax,TDXRMachine_Axis.Y |
||
2060 | mov edx,offset @@TexY-4 |
||
2061 | sub edx,offset @@StartCode |
||
2062 | mov dword ptr [ecx+edx],eax |
||
2063 | |||
2064 | { @@Pitch } |
||
2065 | mov eax,Source; mov eax,[eax + TDXR_Surface.Pitch] |
||
2066 | mov edx,offset @@Pitch-4 |
||
2067 | sub edx,offset @@StartCode |
||
2068 | mov dword ptr [ecx+edx],eax |
||
2069 | |||
2070 | { @@Bits } |
||
2071 | mov eax,Source; mov eax,[eax + TDXR_Surface.Bits] |
||
2072 | mov edx,offset @@Bits-4 |
||
2073 | sub edx,offset @@StartCode |
||
2074 | mov dword ptr [ecx+edx],eax |
||
2075 | end; |
||
2076 | end; |
||
2077 | 2: begin |
||
2078 | asm |
||
2079 | jmp @@EndCode |
||
2080 | @@StartCode: |
||
2081 | mov esi,dword ptr [offset _null]{}//TexY |
||
2082 | @@TexY: |
||
2083 | shr esi,16 |
||
2084 | imul esi,$11111111{}@@Pitch: // Source.pitch |
||
2085 | mov edx,dword ptr [offset _null]{}//TexX |
||
2086 | @@TexX: |
||
2087 | shr edx,16 |
||
2088 | mov ebx,edx |
||
2089 | shr edx,2 |
||
2090 | and ebx,3 |
||
2091 | movzx eax,byte ptr [esi+edx+$11111111] |
||
2092 | @@Bits: // Source.Bits |
||
2093 | and eax,dword ptr [offset Mask2+ebx*4] |
||
2094 | push ecx |
||
2095 | mov ecx,dword ptr [offset Shift2+ebx*4] |
||
2096 | shr eax,cl |
||
2097 | pop ecx |
||
2098 | @@EndCode: |
||
2099 | {$I DXRender.inc} |
||
2100 | { @@TexX } |
||
2101 | mov eax,Axis; add eax,TDXRMachine_Axis.X |
||
2102 | mov edx,offset @@TexX-4 |
||
2103 | sub edx,offset @@StartCode |
||
2104 | mov dword ptr [ecx+edx],eax |
||
2105 | |||
2106 | { @@TexY } |
||
2107 | mov eax,Axis; add eax,TDXRMachine_Axis.Y |
||
2108 | mov edx,offset @@TexY-4 |
||
2109 | sub edx,offset @@StartCode |
||
2110 | mov dword ptr [ecx+edx],eax |
||
2111 | |||
2112 | { @@Pitch } |
||
2113 | mov eax,Source; mov eax,[eax + TDXR_Surface.Pitch] |
||
2114 | mov edx,offset @@Pitch-4 |
||
2115 | sub edx,offset @@StartCode |
||
2116 | mov dword ptr [ecx+edx],eax |
||
2117 | |||
2118 | { @@Bits } |
||
2119 | mov eax,Source; mov eax,[eax + TDXR_Surface.Bits] |
||
2120 | mov edx,offset @@Bits-4 |
||
2121 | sub edx,offset @@StartCode |
||
2122 | mov dword ptr [ecx+edx],eax |
||
2123 | end; |
||
2124 | end; |
||
2125 | 4: begin |
||
2126 | asm |
||
2127 | jmp @@EndCode |
||
2128 | @@StartCode: |
||
2129 | mov esi,dword ptr [offset _null]{}//TexY |
||
2130 | @@TexY: |
||
2131 | shr esi,16 |
||
2132 | imul esi,$11111111{}@@Pitch: // Source.pitch |
||
2133 | mov edx,dword ptr [offset _null]{}//TexX |
||
2134 | @@TexX: |
||
2135 | shr edx,16 |
||
2136 | mov ebx,edx |
||
2137 | shr edx,1 |
||
2138 | and ebx,1 |
||
2139 | movzx eax,byte ptr [esi+edx+$11111111] |
||
2140 | @@Bits: // Source.Bits |
||
2141 | and eax,dword ptr [offset Mask4+ebx*4] |
||
2142 | push ecx |
||
2143 | mov ecx,dword ptr [offset Shift4+ebx*4] |
||
2144 | shr eax,cl |
||
2145 | pop ecx |
||
2146 | @@EndCode: |
||
2147 | {$I DXRender.inc} |
||
2148 | { @@TexX } |
||
2149 | mov eax,Axis; add eax,TDXRMachine_Axis.X |
||
2150 | mov edx,offset @@TexX-4 |
||
2151 | sub edx,offset @@StartCode |
||
2152 | mov dword ptr [ecx+edx],eax |
||
2153 | |||
2154 | { @@TexY } |
||
2155 | mov eax,Axis; add eax,TDXRMachine_Axis.Y |
||
2156 | mov edx,offset @@TexY-4 |
||
2157 | sub edx,offset @@StartCode |
||
2158 | mov dword ptr [ecx+edx],eax |
||
2159 | |||
2160 | { @@Pitch } |
||
2161 | mov eax,Source; mov eax,[eax + TDXR_Surface.Pitch] |
||
2162 | mov edx,offset @@Pitch-4 |
||
2163 | sub edx,offset @@StartCode |
||
2164 | mov dword ptr [ecx+edx],eax |
||
2165 | |||
2166 | { @@Bits } |
||
2167 | mov eax,Source; mov eax,[eax + TDXR_Surface.Bits] |
||
2168 | mov edx,offset @@Bits-4 |
||
2169 | sub edx,offset @@StartCode |
||
2170 | mov dword ptr [ecx+edx],eax |
||
2171 | end; |
||
2172 | end; |
||
2173 | 8: begin |
||
2174 | if Source.pitch=(1 shl Source.PitchBit) then |
||
2175 | begin |
||
2176 | asm |
||
2177 | jmp @@EndCode |
||
2178 | @@StartCode: |
||
2179 | mov esi,dword ptr [offset _null]{}@@TexY: //TexY |
||
2180 | mov edx,dword ptr [offset _null]{}@@TexX: //TexX |
||
2181 | shr esi,16 |
||
2182 | shr edx,16 |
||
2183 | shl esi,$11{} @@PitchBit: // Source.PitchBit |
||
2184 | movzx eax,byte ptr [$11111111+esi+edx] |
||
2185 | @@Bits: // Source.Bits |
||
2186 | @@EndCode: |
||
2187 | {$I DXRender.inc} |
||
2188 | { @@TexX } |
||
2189 | mov eax,Axis; add eax,TDXRMachine_Axis.X |
||
2190 | mov edx,offset @@TexX-4 |
||
2191 | sub edx,offset @@StartCode |
||
2192 | mov dword ptr [ecx+edx],eax |
||
2193 | |||
2194 | { @@TexY } |
||
2195 | mov eax,Axis; add eax,TDXRMachine_Axis.Y |
||
2196 | mov edx,offset @@TexY-4 |
||
2197 | sub edx,offset @@StartCode |
||
2198 | mov dword ptr [ecx+edx],eax |
||
2199 | |||
2200 | { @@PitchBit } |
||
2201 | mov eax,Source; mov eax,[eax + TDXR_Surface.PitchBit] |
||
2202 | mov edx,offset @@PitchBit-1 |
||
2203 | sub edx,offset @@StartCode |
||
2204 | mov byte ptr [ecx+edx],al |
||
2205 | |||
2206 | { @@Bits } |
||
2207 | mov eax,Source; mov eax,[eax + TDXR_Surface.Bits] |
||
2208 | mov edx,offset @@Bits-4 |
||
2209 | sub edx,offset @@StartCode |
||
2210 | mov dword ptr [ecx+edx],eax |
||
2211 | end; |
||
2212 | end else |
||
2213 | if -Source.pitch=(1 shl Source.PitchBit) then |
||
2214 | begin |
||
2215 | asm |
||
2216 | jmp @@EndCode |
||
2217 | @@StartCode: |
||
2218 | mov esi,dword ptr [offset _null]{}@@TexY: //TexY |
||
2219 | mov edx,dword ptr [offset _null]{}@@TexX: //TexX |
||
2220 | shr esi,16 |
||
2221 | shr edx,16 |
||
2222 | shl esi,$11{} @@PitchBit: // Source.PitchBit |
||
2223 | neg esi |
||
2224 | movzx eax,byte ptr [$11111111+esi+edx] |
||
2225 | @@Bits: // Source.Bits |
||
2226 | @@EndCode: |
||
2227 | {$I DXRender.inc} |
||
2228 | { @@TexX } |
||
2229 | mov eax,Axis; add eax,TDXRMachine_Axis.X |
||
2230 | mov edx,offset @@TexX-4 |
||
2231 | sub edx,offset @@StartCode |
||
2232 | mov dword ptr [ecx+edx],eax |
||
2233 | |||
2234 | { @@TexY } |
||
2235 | mov eax,Axis; add eax,TDXRMachine_Axis.Y |
||
2236 | mov edx,offset @@TexY-4 |
||
2237 | sub edx,offset @@StartCode |
||
2238 | mov dword ptr [ecx+edx],eax |
||
2239 | |||
2240 | { @@PitchBit } |
||
2241 | mov eax,Source; mov eax,[eax + TDXR_Surface.PitchBit] |
||
2242 | mov edx,offset @@PitchBit-1 |
||
2243 | sub edx,offset @@StartCode |
||
2244 | mov byte ptr [ecx+edx],al |
||
2245 | |||
2246 | { @@Bits } |
||
2247 | mov eax,Source; mov eax,[eax + TDXR_Surface.Bits] |
||
2248 | mov edx,offset @@Bits-4 |
||
2249 | sub edx,offset @@StartCode |
||
2250 | mov dword ptr [ecx+edx],eax |
||
2251 | end; |
||
2252 | end else |
||
2253 | begin |
||
2254 | asm |
||
2255 | jmp @@EndCode |
||
2256 | @@StartCode: |
||
2257 | mov esi,dword ptr [offset _null]{}@@TexY: //TexY |
||
2258 | mov edx,dword ptr [offset _null]{}@@TexX: //TexX |
||
2259 | shr esi,16 |
||
2260 | shr edx,16 |
||
2261 | imul esi,$11111111{}@@Pitch: // Source.pitch |
||
2262 | movzx eax,byte ptr [esi+edx+$11111111] |
||
2263 | @@Bits: // Source.Bits |
||
2264 | @@EndCode: |
||
2265 | {$I DXRender.inc} |
||
2266 | { @@TexX } |
||
2267 | mov eax,Axis; add eax,TDXRMachine_Axis.X |
||
2268 | mov edx,offset @@TexX-4 |
||
2269 | sub edx,offset @@StartCode |
||
2270 | mov dword ptr [ecx+edx],eax |
||
2271 | |||
2272 | { @@TexY } |
||
2273 | mov eax,Axis; add eax,TDXRMachine_Axis.Y |
||
2274 | mov edx,offset @@TexY-4 |
||
2275 | sub edx,offset @@StartCode |
||
2276 | mov dword ptr [ecx+edx],eax |
||
2277 | |||
2278 | { @@Pitch } |
||
2279 | mov eax,Source; mov eax,[eax + TDXR_Surface.Pitch] |
||
2280 | mov edx,offset @@Pitch-4 |
||
2281 | sub edx,offset @@StartCode |
||
2282 | mov dword ptr [ecx+edx],eax |
||
2283 | |||
2284 | { @@Bits } |
||
2285 | mov eax,Source; mov eax,[eax + TDXR_Surface.Bits] |
||
2286 | mov edx,offset @@Bits-4 |
||
2287 | sub edx,offset @@StartCode |
||
2288 | mov dword ptr [ecx+edx],eax |
||
2289 | end; |
||
2290 | end; |
||
2291 | end; |
||
2292 | 16: begin |
||
2293 | if Source.pitch=(1 shl Source.PitchBit) then |
||
2294 | begin |
||
2295 | asm |
||
2296 | jmp @@EndCode |
||
2297 | @@StartCode: |
||
2298 | mov esi,dword ptr [offset _null]{}@@TexY: //TexY |
||
2299 | mov edx,dword ptr [offset _null]{}@@TexX: //TexX |
||
2300 | shr esi,16 |
||
2301 | shr edx,16 |
||
2302 | shl esi,$11{} @@PitchBit: // Source.PitchBit |
||
2303 | movzx eax,word ptr [$11111111+esi+edx*2] |
||
2304 | @@Bits: // Source.Bits |
||
2305 | @@EndCode: |
||
2306 | {$I DXRender.inc} |
||
2307 | { @@TexX } |
||
2308 | mov eax,Axis; add eax,TDXRMachine_Axis.X |
||
2309 | mov edx,offset @@TexX-4 |
||
2310 | sub edx,offset @@StartCode |
||
2311 | mov dword ptr [ecx+edx],eax |
||
2312 | |||
2313 | { @@TexY } |
||
2314 | mov eax,Axis; add eax,TDXRMachine_Axis.Y |
||
2315 | mov edx,offset @@TexY-4 |
||
2316 | sub edx,offset @@StartCode |
||
2317 | mov dword ptr [ecx+edx],eax |
||
2318 | |||
2319 | { @@PitchBit } |
||
2320 | mov eax,Source; mov eax,[eax + TDXR_Surface.PitchBit] |
||
2321 | mov edx,offset @@PitchBit-1 |
||
2322 | sub edx,offset @@StartCode |
||
2323 | mov byte ptr [ecx+edx],al |
||
2324 | |||
2325 | { @@Bits } |
||
2326 | mov eax,Source; mov eax,[eax + TDXR_Surface.Bits] |
||
2327 | mov edx,offset @@Bits-4 |
||
2328 | sub edx,offset @@StartCode |
||
2329 | mov dword ptr [ecx+edx],eax |
||
2330 | end; |
||
2331 | end else |
||
2332 | if -Source.pitch=(1 shl Source.PitchBit) then |
||
2333 | begin |
||
2334 | asm |
||
2335 | jmp @@EndCode |
||
2336 | @@StartCode: |
||
2337 | mov esi,dword ptr [offset _null]{}@@TexY: //TexY |
||
2338 | mov edx,dword ptr [offset _null]{}@@TexX: //TexX |
||
2339 | shr esi,16 |
||
2340 | shr edx,16 |
||
2341 | shl esi,$11{} @@PitchBit: // Source.PitchBit |
||
2342 | neg esi |
||
2343 | movzx eax,word ptr [$11111111+esi+edx*2] |
||
2344 | @@Bits: // Source.Bits |
||
2345 | @@EndCode: |
||
2346 | {$I DXRender.inc} |
||
2347 | { @@TexX } |
||
2348 | mov eax,Axis; add eax,TDXRMachine_Axis.X |
||
2349 | mov edx,offset @@TexX-4 |
||
2350 | sub edx,offset @@StartCode |
||
2351 | mov dword ptr [ecx+edx],eax |
||
2352 | |||
2353 | { @@TexY } |
||
2354 | mov eax,Axis; add eax,TDXRMachine_Axis.Y |
||
2355 | mov edx,offset @@TexY-4 |
||
2356 | sub edx,offset @@StartCode |
||
2357 | mov dword ptr [ecx+edx],eax |
||
2358 | |||
2359 | { @@PitchBit } |
||
2360 | mov eax,Source; mov eax,[eax + TDXR_Surface.PitchBit] |
||
2361 | mov edx,offset @@PitchBit-1 |
||
2362 | sub edx,offset @@StartCode |
||
2363 | mov byte ptr [ecx+edx],al |
||
2364 | |||
2365 | { @@Bits } |
||
2366 | mov eax,Source; mov eax,[eax + TDXR_Surface.Bits] |
||
2367 | mov edx,offset @@Bits-4 |
||
2368 | sub edx,offset @@StartCode |
||
2369 | mov dword ptr [ecx+edx],eax |
||
2370 | end; |
||
2371 | end else |
||
2372 | begin |
||
2373 | asm |
||
2374 | jmp @@EndCode |
||
2375 | @@StartCode: |
||
2376 | mov esi,dword ptr [offset _null]{}@@TexY: //TexY |
||
2377 | mov edx,dword ptr [offset _null]{}@@TexX: //TexX |
||
2378 | shr esi,16 |
||
2379 | shr edx,16 |
||
2380 | imul esi,$11111111{}@@Pitch: // Source.pitch |
||
2381 | movzx eax,word ptr [esi+edx*2+$11111111] |
||
2382 | @@Bits: // Source.Bits |
||
2383 | @@EndCode: |
||
2384 | {$I DXRender.inc} |
||
2385 | { @@TexX } |
||
2386 | mov eax,Axis; add eax,TDXRMachine_Axis.X |
||
2387 | mov edx,offset @@TexX-4 |
||
2388 | sub edx,offset @@StartCode |
||
2389 | mov dword ptr [ecx+edx],eax |
||
2390 | |||
2391 | { @@TexY } |
||
2392 | mov eax,Axis; add eax,TDXRMachine_Axis.Y |
||
2393 | mov edx,offset @@TexY-4 |
||
2394 | sub edx,offset @@StartCode |
||
2395 | mov dword ptr [ecx+edx],eax |
||
2396 | |||
2397 | { @@Pitch } |
||
2398 | mov eax,Source; mov eax,[eax + TDXR_Surface.Pitch] |
||
2399 | mov edx,offset @@Pitch-4 |
||
2400 | sub edx,offset @@StartCode |
||
2401 | mov dword ptr [ecx+edx],eax |
||
2402 | |||
2403 | { @@Bits } |
||
2404 | mov eax,Source; mov eax,[eax + TDXR_Surface.Bits] |
||
2405 | mov edx,offset @@Bits-4 |
||
2406 | sub edx,offset @@StartCode |
||
2407 | mov dword ptr [ecx+edx],eax |
||
2408 | end; |
||
2409 | end; |
||
2410 | end; |
||
2411 | 24: begin |
||
2412 | asm |
||
2413 | jmp @@EndCode |
||
2414 | @@StartCode: |
||
2415 | mov esi,dword ptr [offset _null]{}//TexY |
||
2416 | @@TexY: |
||
2417 | mov edx,dword ptr [offset _null]{}//TexX |
||
2418 | @@TexX: |
||
2419 | shr esi,16 |
||
2420 | shr edx,16 |
||
2421 | imul esi,$11111111{}@@Pitch: // Source.pitch |
||
2422 | lea edx,[edx+edx*2+$11111111] // Source.Bits |
||
2423 | @@Bits: |
||
2424 | movzx eax,byte ptr [esi+edx+2] |
||
2425 | shl eax,16 |
||
2426 | mov ax,word ptr [esi+edx] |
||
2427 | @@EndCode: |
||
2428 | {$I DXRender.inc} |
||
2429 | { @@TexX } |
||
2430 | mov eax,Axis; add eax,TDXRMachine_Axis.X |
||
2431 | mov edx,offset @@TexX-4 |
||
2432 | sub edx,offset @@StartCode |
||
2433 | mov dword ptr [ecx+edx],eax |
||
2434 | |||
2435 | { @@TexY } |
||
2436 | mov eax,Axis; add eax,TDXRMachine_Axis.Y |
||
2437 | mov edx,offset @@TexY-4 |
||
2438 | sub edx,offset @@StartCode |
||
2439 | mov dword ptr [ecx+edx],eax |
||
2440 | |||
2441 | { @@Pitch } |
||
2442 | mov eax,Source; mov eax,[eax + TDXR_Surface.Pitch] |
||
2443 | mov edx,offset @@Pitch-4 |
||
2444 | sub edx,offset @@StartCode |
||
2445 | mov dword ptr [ecx+edx],eax |
||
2446 | |||
2447 | { @@Bits } |
||
2448 | mov eax,Source; mov eax,[eax + TDXR_Surface.Bits] |
||
2449 | mov edx,offset @@Bits-4 |
||
2450 | sub edx,offset @@StartCode |
||
2451 | mov dword ptr [ecx+edx],eax |
||
2452 | end; |
||
2453 | end; |
||
2454 | 32: begin |
||
2455 | if Source.pitch=(1 shl Source.PitchBit) then |
||
2456 | begin |
||
2457 | asm |
||
2458 | jmp @@EndCode |
||
2459 | @@StartCode: |
||
2460 | mov esi,dword ptr [offset _null]{}@@TexY: //TexY |
||
2461 | mov edx,dword ptr [offset _null]{}@@TexX: //TexX |
||
2462 | shr esi,16 |
||
2463 | shr edx,16 |
||
2464 | shl esi,$11{} @@PitchBit: // Source.PitchBit |
||
2465 | mov eax,dword ptr [$11111111+esi+edx*4] |
||
2466 | @@Bits: // Source.Bits |
||
2467 | @@EndCode: |
||
2468 | {$I DXRender.inc} |
||
2469 | { @@TexX } |
||
2470 | mov eax,Axis; add eax,TDXRMachine_Axis.X |
||
2471 | mov edx,offset @@TexX-4 |
||
2472 | sub edx,offset @@StartCode |
||
2473 | mov dword ptr [ecx+edx],eax |
||
2474 | |||
2475 | { @@TexY } |
||
2476 | mov eax,Axis; add eax,TDXRMachine_Axis.Y |
||
2477 | mov edx,offset @@TexY-4 |
||
2478 | sub edx,offset @@StartCode |
||
2479 | mov dword ptr [ecx+edx],eax |
||
2480 | |||
2481 | { @@PitchBit } |
||
2482 | mov eax,Source; mov eax,[eax + TDXR_Surface.PitchBit] |
||
2483 | mov edx,offset @@PitchBit-1 |
||
2484 | sub edx,offset @@StartCode |
||
2485 | mov byte ptr [ecx+edx],al |
||
2486 | |||
2487 | { @@Bits } |
||
2488 | mov eax,Source; mov eax,[eax + TDXR_Surface.Bits] |
||
2489 | mov edx,offset @@Bits-4 |
||
2490 | sub edx,offset @@StartCode |
||
2491 | mov dword ptr [ecx+edx],eax |
||
2492 | end; |
||
2493 | end else |
||
2494 | if -Source.pitch=(1 shl Source.PitchBit) then |
||
2495 | begin |
||
2496 | asm |
||
2497 | jmp @@EndCode |
||
2498 | @@StartCode: |
||
2499 | mov esi,dword ptr [offset _null]{}@@TexY: //TexY |
||
2500 | mov edx,dword ptr [offset _null]{}@@TexX: //TexX |
||
2501 | shr esi,16 |
||
2502 | shr edx,16 |
||
2503 | shl esi,$11{} @@PitchBit: // Source.PitchBit |
||
2504 | neg esi |
||
2505 | mov eax,dword ptr [$11111111+esi+edx*4] |
||
2506 | @@Bits: // Source.Bits |
||
2507 | @@EndCode: |
||
2508 | {$I DXRender.inc} |
||
2509 | { @@TexX } |
||
2510 | mov eax,Axis; add eax,TDXRMachine_Axis.X |
||
2511 | mov edx,offset @@TexX-4 |
||
2512 | sub edx,offset @@StartCode |
||
2513 | mov dword ptr [ecx+edx],eax |
||
2514 | |||
2515 | { @@TexY } |
||
2516 | mov eax,Axis; add eax,TDXRMachine_Axis.Y |
||
2517 | mov edx,offset @@TexY-4 |
||
2518 | sub edx,offset @@StartCode |
||
2519 | mov dword ptr [ecx+edx],eax |
||
2520 | |||
2521 | { @@PitchBit } |
||
2522 | mov eax,Source; mov eax,[eax + TDXR_Surface.PitchBit] |
||
2523 | mov edx,offset @@PitchBit-1 |
||
2524 | sub edx,offset @@StartCode |
||
2525 | mov byte ptr [ecx+edx],al |
||
2526 | |||
2527 | { @@Bits } |
||
2528 | mov eax,Source; mov eax,[eax + TDXR_Surface.Bits] |
||
2529 | mov edx,offset @@Bits-4 |
||
2530 | sub edx,offset @@StartCode |
||
2531 | mov dword ptr [ecx+edx],eax |
||
2532 | end; |
||
2533 | end else |
||
2534 | begin |
||
2535 | asm |
||
2536 | jmp @@EndCode |
||
2537 | @@StartCode: |
||
2538 | mov esi,dword ptr [offset _null]{}@@TexY: //TexY |
||
2539 | mov edx,dword ptr [offset _null]{}@@TexX: //TexX |
||
2540 | shr esi,16 |
||
2541 | shr edx,16 |
||
2542 | imul esi,$11111111{}@@Pitch: // Source.pitch |
||
2543 | mov eax,dword ptr [esi+edx*4+$11111111] |
||
2544 | @@Bits: // Source.Bits |
||
2545 | @@EndCode: |
||
2546 | {$I DXRender.inc} |
||
2547 | { @@TexX } |
||
2548 | mov eax,Axis; add eax,TDXRMachine_Axis.X |
||
2549 | mov edx,offset @@TexX-4 |
||
2550 | sub edx,offset @@StartCode |
||
2551 | mov dword ptr [ecx+edx],eax |
||
2552 | |||
2553 | { @@TexY } |
||
2554 | mov eax,Axis; add eax,TDXRMachine_Axis.Y |
||
2555 | mov edx,offset @@TexY-4 |
||
2556 | sub edx,offset @@StartCode |
||
2557 | mov dword ptr [ecx+edx],eax |
||
2558 | |||
2559 | { @@Pitch } |
||
2560 | mov eax,Source; mov eax,[eax + TDXR_Surface.Pitch] |
||
2561 | mov edx,offset @@Pitch-4 |
||
2562 | sub edx,offset @@StartCode |
||
2563 | mov dword ptr [ecx+edx],eax |
||
2564 | |||
2565 | { @@Bits } |
||
2566 | mov eax,Source; mov eax,[eax + TDXR_Surface.Bits] |
||
2567 | mov edx,offset @@Bits-4 |
||
2568 | sub edx,offset @@StartCode |
||
2569 | mov dword ptr [ecx+edx],eax |
||
2570 | end; |
||
2571 | end; |
||
2572 | end; |
||
2573 | end; |
||
2574 | end; |
||
2575 | |||
2576 | procedure genReadSurfacePixel(var Code: Pointer; const Texture: TDXRMachine_Reg_Texture; Axis: PDXRMachine_Axis); |
||
2577 | begin |
||
2578 | case Texture.TextureAddress of |
||
2579 | DXR_TEXTUREADDRESS_TILE : genReadSurfacePixel_Tile(Code, Texture.Surface^, Axis); |
||
2580 | DXR_TEXTUREADDRESS_DONOTCLIP: genReadSurfacePixel_DoNotClip(Code, Texture.Surface^, Axis); |
||
2581 | end; |
||
2582 | end; |
||
2583 | |||
2584 | procedure genDecodeColor(var Code: Pointer; const Surface: TDXR_Surface; Dest: PDXRMachine_Color; |
||
2585 | EnableChannels: TDXRColorChannels; DefaultColor: TDXRMachine_Color); |
||
2586 | var |
||
2587 | dcR, dcG, dcB, dcA: Word; |
||
2588 | begin |
||
2589 | if EnableChannels=[] then Exit; |
||
2590 | |||
2591 | dcR := DefaultColor.R; |
||
2592 | dcG := DefaultColor.G; |
||
2593 | dcB := DefaultColor.B; |
||
2594 | dcA := DefaultColor.A; |
||
2595 | |||
2596 | if Surface.ColorType=DXR_COLORTYPE_INDEXED then |
||
2597 | begin |
||
2598 | { Index Channel } |
||
2599 | if EnableChannels*[chRed, chGreen, chBlue]<>[] then |
||
2600 | begin |
||
2601 | if Surface.idx_index.Mask<>0 then |
||
2602 | begin |
||
2603 | if (Surface.idx_index.rshift=0) and (Surface.idx_index.lshift=0) and |
||
2604 | (Surface.idx_index.Mask=DWORD((1 shl Surface.BitCount)-1)) and (Surface.idx_alpha.Mask=0) then |
||
2605 | begin |
||
2606 | asm |
||
2607 | jmp @@EndCode |
||
2608 | @@StartCode: |
||
2609 | { Index channel } |
||
2610 | mov edx,dword ptr [eax*4+$11111111] |
||
2611 | {}@@idx_indexPal:// @Surface.idx_palette |
||
2612 | |||
2613 | mov byte ptr [offset _null],dl{}@@DestR:// @Dest.R |
||
2614 | mov byte ptr [offset _null],dh{}@@DestG:// @Dest.G |
||
2615 | bswap edx |
||
2616 | mov byte ptr [offset _null],dh{}@@DestB:// @Dest.B |
||
2617 | @@EndCode: |
||
2618 | {$I DXRender.inc} |
||
2619 | { @@idx_indexPal } |
||
2620 | mov eax,Surface; lea eax,dword ptr [eax + TDXR_Surface.idx_palette] |
||
2621 | mov edx,offset @@idx_indexPal-4 |
||
2622 | sub edx,offset @@StartCode |
||
2623 | mov dword ptr [ecx+edx],eax |
||
2624 | |||
2625 | { @@DestR } |
||
2626 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R+1) |
||
2627 | mov edx,offset @@DestR-4 |
||
2628 | sub edx,offset @@StartCode |
||
2629 | mov dword ptr [ecx+edx],eax |
||
2630 | |||
2631 | { @@DestG } |
||
2632 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G+1) |
||
2633 | mov edx,offset @@DestG-4 |
||
2634 | sub edx,offset @@StartCode |
||
2635 | mov dword ptr [ecx+edx],eax |
||
2636 | |||
2637 | { @@DestB } |
||
2638 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B+1) |
||
2639 | mov edx,offset @@DestB-4 |
||
2640 | sub edx,offset @@StartCode |
||
2641 | mov dword ptr [ecx+edx],eax |
||
2642 | end; |
||
2643 | end else |
||
2644 | if Surface.idx_index.rshift<>0 then |
||
2645 | begin |
||
2646 | asm |
||
2647 | jmp @@EndCode |
||
2648 | @@StartCode: |
||
2649 | { Index channel } |
||
2650 | mov edx,eax |
||
2651 | and edx,$11111111{}@@idx_indexMask: // Surface.idx_index.Mask |
||
2652 | shr edx,$11 {}@@idx_indexRShift: // Surface.idx_index.rshift |
||
2653 | mov edx,dword ptr [edx*4+$11111111] |
||
2654 | {}@@idx_indexPal: // @Surface.idx_palette |
||
2655 | |||
2656 | mov byte ptr [offset _null],dl{}@@DestR:// @Dest.R |
||
2657 | mov byte ptr [offset _null],dh{}@@DestG:// @Dest.G |
||
2658 | bswap edx |
||
2659 | mov byte ptr [offset _null],dh{}@@DestB:// @Dest.B |
||
2660 | @@EndCode: |
||
2661 | {$I DXRender.inc} |
||
2662 | { @@idx_indexMask } |
||
2663 | mov eax,Surface; mov eax,[eax + TDXR_Surface.idx_index.Mask] |
||
2664 | mov edx,offset @@idx_indexMask-4 |
||
2665 | sub edx,offset @@StartCode |
||
2666 | mov dword ptr [ecx+edx],eax |
||
2667 | |||
2668 | { @@idx_indexRShift } |
||
2669 | mov eax,Surface; mov eax,[eax + TDXR_Surface.idx_index.rshift] |
||
2670 | mov edx,offset @@idx_indexRShift-1 |
||
2671 | sub edx,offset @@StartCode |
||
2672 | mov byte ptr [ecx+edx],al |
||
2673 | |||
2674 | { @@idx_indexPal } |
||
2675 | mov eax,Surface; lea eax,dword ptr [eax + TDXR_Surface.idx_palette] |
||
2676 | mov edx,offset @@idx_indexPal-4 |
||
2677 | sub edx,offset @@StartCode |
||
2678 | mov dword ptr [ecx+edx],eax |
||
2679 | |||
2680 | { @@DestR } |
||
2681 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R+1) |
||
2682 | mov edx,offset @@DestR-4 |
||
2683 | sub edx,offset @@StartCode |
||
2684 | mov dword ptr [ecx+edx],eax |
||
2685 | |||
2686 | { @@DestG } |
||
2687 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G+1) |
||
2688 | mov edx,offset @@DestG-4 |
||
2689 | sub edx,offset @@StartCode |
||
2690 | mov dword ptr [ecx+edx],eax |
||
2691 | |||
2692 | { @@DestB } |
||
2693 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B+1) |
||
2694 | mov edx,offset @@DestB-4 |
||
2695 | sub edx,offset @@StartCode |
||
2696 | mov dword ptr [ecx+edx],eax |
||
2697 | end; |
||
2698 | end else |
||
2699 | begin |
||
2700 | asm |
||
2701 | jmp @@EndCode |
||
2702 | @@StartCode: |
||
2703 | { Index channel } |
||
2704 | mov edx,eax |
||
2705 | and edx,$11111111{}@@idx_indexMask: // Surface.idx_index.Mask |
||
2706 | shl edx,$11 {}@@idx_indexLShift: // Surface.idx_index.lshift |
||
2707 | mov edx,dword ptr [edx*4+$11111111] |
||
2708 | {}@@idx_indexPal: // @Surface.idx_palette |
||
2709 | |||
2710 | mov byte ptr [offset _null],dl{}@@DestR:// @Dest.R |
||
2711 | mov byte ptr [offset _null],dh{}@@DestG:// @Dest.G |
||
2712 | bswap edx |
||
2713 | mov byte ptr [offset _null],dh{}@@DestB:// @Dest.B |
||
2714 | @@EndCode: |
||
2715 | {$I DXRender.inc} |
||
2716 | { @@idx_indexMask } |
||
2717 | mov eax,Surface; mov eax,[eax + TDXR_Surface.idx_index.Mask] |
||
2718 | mov edx,offset @@idx_indexMask-4 |
||
2719 | sub edx,offset @@StartCode |
||
2720 | mov dword ptr [ecx+edx],eax |
||
2721 | |||
2722 | { @@idx_indexLShift } |
||
2723 | mov eax,Surface; mov eax,[eax + TDXR_Surface.idx_index.lshift] |
||
2724 | mov edx,offset @@idx_indexLShift-1 |
||
2725 | sub edx,offset @@StartCode |
||
2726 | mov byte ptr [ecx+edx],al |
||
2727 | |||
2728 | { @@idx_indexPal } |
||
2729 | mov eax,Surface; lea eax,dword ptr [eax + TDXR_Surface.idx_palette] |
||
2730 | mov edx,offset @@idx_indexPal-4 |
||
2731 | sub edx,offset @@StartCode |
||
2732 | mov dword ptr [ecx+edx],eax |
||
2733 | |||
2734 | { @@DestR } |
||
2735 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R+1) |
||
2736 | mov edx,offset @@DestR-4 |
||
2737 | sub edx,offset @@StartCode |
||
2738 | mov dword ptr [ecx+edx],eax |
||
2739 | |||
2740 | { @@DestG } |
||
2741 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G+1) |
||
2742 | mov edx,offset @@DestG-4 |
||
2743 | sub edx,offset @@StartCode |
||
2744 | mov dword ptr [ecx+edx],eax |
||
2745 | |||
2746 | { @@DestB } |
||
2747 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B+1) |
||
2748 | mov edx,offset @@DestB-4 |
||
2749 | sub edx,offset @@StartCode |
||
2750 | mov dword ptr [ecx+edx],eax |
||
2751 | end; |
||
2752 | end; |
||
2753 | end else |
||
2754 | begin |
||
2755 | asm |
||
2756 | jmp @@EndCode |
||
2757 | @@StartCode: |
||
2758 | mov word ptr [offset _null],$1111{}@@DestR:// @Dest.R |
||
2759 | mov word ptr [offset _null],$1111{}@@DestG:// @Dest.G |
||
2760 | mov word ptr [offset _null],$1111{}@@DestB:// @Dest.B |
||
2761 | @@EndCode: |
||
2762 | {$I DXRender.inc} |
||
2763 | { @@DestR } |
||
2764 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R) |
||
2765 | mov edx,offset @@DestR-6 |
||
2766 | sub edx,offset @@StartCode |
||
2767 | mov dword ptr [ecx+edx],eax |
||
2768 | |||
2769 | mov ax,dcR |
||
2770 | mov edx,offset @@DestR-2 |
||
2771 | sub edx,offset @@StartCode |
||
2772 | mov word ptr [ecx+edx],ax |
||
2773 | |||
2774 | { @@DestG } |
||
2775 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G) |
||
2776 | mov edx,offset @@DestG-6 |
||
2777 | sub edx,offset @@StartCode |
||
2778 | mov dword ptr [ecx+edx],eax |
||
2779 | |||
2780 | mov ax,dcG |
||
2781 | mov edx,offset @@DestG-2 |
||
2782 | sub edx,offset @@StartCode |
||
2783 | mov word ptr [ecx+edx],ax |
||
2784 | |||
2785 | { @@DestB } |
||
2786 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B) |
||
2787 | mov edx,offset @@DestB-6 |
||
2788 | sub edx,offset @@StartCode |
||
2789 | mov dword ptr [ecx+edx],eax |
||
2790 | |||
2791 | mov ax,dcB |
||
2792 | mov edx,offset @@DestB-2 |
||
2793 | sub edx,offset @@StartCode |
||
2794 | mov word ptr [ecx+edx],ax |
||
2795 | end; |
||
2796 | end; |
||
2797 | end; |
||
2798 | |||
2799 | { Alpha Channel } |
||
2800 | if chAlpha in EnableChannels then |
||
2801 | begin |
||
2802 | if Surface.idx_alpha.Mask<>0 then |
||
2803 | begin |
||
2804 | if Surface.idx_alpha.rshift<>0 then |
||
2805 | begin |
||
2806 | asm |
||
2807 | jmp @@EndCode |
||
2808 | @@StartCode: |
||
2809 | mov edx,eax |
||
2810 | and edx,$11111111{}@@idx_alphaMask: // Surface.idx_alpha.Mask |
||
2811 | shr edx,$11 {}@@idx_alphaRShift: // Surface.idx_alpha.rshift |
||
2812 | mov byte ptr [offset _null],dl{}@@Dest:// @Dest.A |
||
2813 | @@EndCode: |
||
2814 | {$I DXRender.inc} |
||
2815 | { @@idx_alphaMask } |
||
2816 | mov eax,Surface; mov eax,[eax + TDXR_Surface.idx_alpha.Mask] |
||
2817 | mov edx,offset @@idx_alphaMask-4 |
||
2818 | sub edx,offset @@StartCode |
||
2819 | mov dword ptr [ecx+edx],eax |
||
2820 | |||
2821 | { @@idx_alphaRShift } |
||
2822 | mov eax,Surface; mov eax,[eax + TDXR_Surface.idx_alpha.rshift] |
||
2823 | mov edx,offset @@idx_alphaRShift-1 |
||
2824 | sub edx,offset @@StartCode |
||
2825 | mov byte ptr [ecx+edx],al |
||
2826 | |||
2827 | { @@Dest } |
||
2828 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1) |
||
2829 | mov edx,offset @@Dest-4 |
||
2830 | sub edx,offset @@StartCode |
||
2831 | mov dword ptr [ecx+edx],eax |
||
2832 | end; |
||
2833 | end else |
||
2834 | begin |
||
2835 | asm |
||
2836 | jmp @@EndCode |
||
2837 | @@StartCode: |
||
2838 | mov edx,eax |
||
2839 | and edx,$11111111{}@@idx_alphaMask: // Surface.idx_alpha.Mask |
||
2840 | shl edx,$11 {}@@idx_alphaLShift: // Surface.idx_alpha.lshift |
||
2841 | mov byte ptr [offset _null],dl{}@@Dest:// @Dest.A |
||
2842 | @@EndCode: |
||
2843 | {$I DXRender.inc} |
||
2844 | { @@idx_alphaMask } |
||
2845 | mov eax,Surface; mov eax,[eax + TDXR_Surface.idx_alpha.Mask] |
||
2846 | mov edx,offset @@idx_alphaMask-4 |
||
2847 | sub edx,offset @@StartCode |
||
2848 | mov dword ptr [ecx+edx],eax |
||
2849 | |||
2850 | { @@idx_alphaLShift } |
||
2851 | mov eax,Surface; mov eax,[eax + TDXR_Surface.idx_alpha.lshift] |
||
2852 | mov edx,offset @@idx_alphaLShift-1 |
||
2853 | sub edx,offset @@StartCode |
||
2854 | mov byte ptr [ecx+edx],al |
||
2855 | |||
2856 | { @@Dest } |
||
2857 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1) |
||
2858 | mov edx,offset @@Dest-4 |
||
2859 | sub edx,offset @@StartCode |
||
2860 | mov dword ptr [ecx+edx],eax |
||
2861 | end; |
||
2862 | end; |
||
2863 | end else |
||
2864 | begin |
||
2865 | asm |
||
2866 | jmp @@EndCode |
||
2867 | @@StartCode: |
||
2868 | mov word ptr [offset _null],$1111{}@@Dest:// @Dest.A |
||
2869 | @@EndCode: |
||
2870 | {$I DXRender.inc} |
||
2871 | { @@Dest } |
||
2872 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A) |
||
2873 | mov edx,offset @@Dest-6 |
||
2874 | sub edx,offset @@StartCode |
||
2875 | mov dword ptr [ecx+edx],eax |
||
2876 | |||
2877 | mov ax,dcA |
||
2878 | mov edx,offset @@Dest-2 |
||
2879 | sub edx,offset @@StartCode |
||
2880 | mov word ptr [ecx+edx],ax |
||
2881 | end; |
||
2882 | end; |
||
2883 | end; |
||
2884 | end else if Surface.ColorType=DXR_COLORTYPE_RGB then |
||
2885 | begin |
||
2886 | { Red Channel } |
||
2887 | if chRed in EnableChannels then |
||
2888 | begin |
||
2889 | if Surface.rgb_red.Mask<>0 then |
||
2890 | begin |
||
2891 | if Surface.rgb_red.rshift<>0 then |
||
2892 | begin |
||
2893 | asm |
||
2894 | jmp @@EndCode |
||
2895 | @@StartCode: |
||
2896 | mov edx,eax |
||
2897 | and edx,$11111111{}@@Mask: // Surface.rgb_red.Mask |
||
2898 | shr edx,$11 {}@@RShift: // Surface.rgb_red.rshift |
||
2899 | mov byte ptr [offset _null],dl{}@@Dest:// @Dest.R |
||
2900 | @@EndCode: |
||
2901 | {$I DXRender.inc} |
||
2902 | { @@Mask } |
||
2903 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_red.Mask] |
||
2904 | mov edx,offset @@Mask-4 |
||
2905 | sub edx,offset @@StartCode |
||
2906 | mov dword ptr [ecx+edx],eax |
||
2907 | |||
2908 | { @@RShift } |
||
2909 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_red.rshift] |
||
2910 | mov edx,offset @@RShift-1 |
||
2911 | sub edx,offset @@StartCode |
||
2912 | mov byte ptr [ecx+edx],al |
||
2913 | |||
2914 | { @@Dest } |
||
2915 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R+1) |
||
2916 | mov edx,offset @@Dest-4 |
||
2917 | sub edx,offset @@StartCode |
||
2918 | mov dword ptr [ecx+edx],eax |
||
2919 | end; |
||
2920 | end else |
||
2921 | begin |
||
2922 | asm |
||
2923 | jmp @@EndCode |
||
2924 | @@StartCode: |
||
2925 | mov edx,eax |
||
2926 | and edx,$11111111{}@@Mask: // Surface.rgb_red.Mask |
||
2927 | shl edx,$11 {}@@LShift: // Surface.rgb_red.lshift |
||
2928 | mov byte ptr [offset _null],dl{}@@Dest:// @Dest.R |
||
2929 | @@EndCode: |
||
2930 | {$I DXRender.inc} |
||
2931 | { @@Mask } |
||
2932 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_red.Mask] |
||
2933 | mov edx,offset @@Mask-4 |
||
2934 | sub edx,offset @@StartCode |
||
2935 | mov dword ptr [ecx+edx],eax |
||
2936 | |||
2937 | { @@LShift } |
||
2938 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_red.lshift] |
||
2939 | mov edx,offset @@LShift-1 |
||
2940 | sub edx,offset @@StartCode |
||
2941 | mov byte ptr [ecx+edx],al |
||
2942 | |||
2943 | { @@Dest } |
||
2944 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R+1) |
||
2945 | mov edx,offset @@Dest-4 |
||
2946 | sub edx,offset @@StartCode |
||
2947 | mov dword ptr [ecx+edx],eax |
||
2948 | end; |
||
2949 | end; |
||
2950 | end else |
||
2951 | begin |
||
2952 | asm |
||
2953 | jmp @@EndCode |
||
2954 | @@StartCode: |
||
2955 | mov word ptr [offset _null],$1111{}@@Dest:// @Dest.R |
||
2956 | @@EndCode: |
||
2957 | {$I DXRender.inc} |
||
2958 | { @@Dest } |
||
2959 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R) |
||
2960 | mov edx,offset @@Dest-6 |
||
2961 | sub edx,offset @@StartCode |
||
2962 | mov dword ptr [ecx+edx],eax |
||
2963 | |||
2964 | mov ax,dcR |
||
2965 | mov edx,offset @@Dest-2 |
||
2966 | sub edx,offset @@StartCode |
||
2967 | mov word ptr [ecx+edx],ax |
||
2968 | end; |
||
2969 | end; |
||
2970 | end; |
||
2971 | |||
2972 | { Green Channel } |
||
2973 | if chGreen in EnableChannels then |
||
2974 | begin |
||
2975 | if Surface.rgb_green.Mask<>0 then |
||
2976 | begin |
||
2977 | if Surface.rgb_green.rshift<>0 then |
||
2978 | begin |
||
2979 | asm |
||
2980 | jmp @@EndCode |
||
2981 | @@StartCode: |
||
2982 | mov edx,eax |
||
2983 | and edx,$11111111{}@@Mask: // Surface.rgb_green.Mask |
||
2984 | shr edx,$11 {}@@RShift: // Surface.rgb_green.rshift |
||
2985 | mov byte ptr [offset _null],dl{}@@Dest:// @Dest.G |
||
2986 | @@EndCode: |
||
2987 | {$I DXRender.inc} |
||
2988 | { @@Mask } |
||
2989 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_green.Mask] |
||
2990 | mov edx,offset @@Mask-4 |
||
2991 | sub edx,offset @@StartCode |
||
2992 | mov dword ptr [ecx+edx],eax |
||
2993 | |||
2994 | { @@RShift } |
||
2995 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_green.rshift] |
||
2996 | mov edx,offset @@RShift-1 |
||
2997 | sub edx,offset @@StartCode |
||
2998 | mov byte ptr [ecx+edx],al |
||
2999 | |||
3000 | { @@Dest } |
||
3001 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G+1) |
||
3002 | mov edx,offset @@Dest-4 |
||
3003 | sub edx,offset @@StartCode |
||
3004 | mov dword ptr [ecx+edx],eax |
||
3005 | end; |
||
3006 | end else |
||
3007 | begin |
||
3008 | asm |
||
3009 | jmp @@EndCode |
||
3010 | @@StartCode: |
||
3011 | mov edx,eax |
||
3012 | and edx,$11111111{}@@Mask: // Surface.rgb_green.Mask |
||
3013 | shl edx,$11 {}@@LShift: // Surface.rgb_green.lshift |
||
3014 | mov byte ptr [offset _null],dl{}@@Dest:// @Dest.G |
||
3015 | @@EndCode: |
||
3016 | {$I DXRender.inc} |
||
3017 | { @@Mask } |
||
3018 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_green.Mask] |
||
3019 | mov edx,offset @@Mask-4 |
||
3020 | sub edx,offset @@StartCode |
||
3021 | mov dword ptr [ecx+edx],eax |
||
3022 | |||
3023 | { @@LShift } |
||
3024 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_green.lshift] |
||
3025 | mov edx,offset @@LShift-1 |
||
3026 | sub edx,offset @@StartCode |
||
3027 | mov byte ptr [ecx+edx],al |
||
3028 | |||
3029 | { @@Dest } |
||
3030 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G+1) |
||
3031 | mov edx,offset @@Dest-4 |
||
3032 | sub edx,offset @@StartCode |
||
3033 | mov dword ptr [ecx+edx],eax |
||
3034 | end; |
||
3035 | end; |
||
3036 | end else |
||
3037 | begin |
||
3038 | asm |
||
3039 | jmp @@EndCode |
||
3040 | @@StartCode: |
||
3041 | mov word ptr [offset _null],$1111{}@@Dest:// @Dest.G |
||
3042 | @@EndCode: |
||
3043 | {$I DXRender.inc} |
||
3044 | { @@Dest } |
||
3045 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G) |
||
3046 | mov edx,offset @@Dest-6 |
||
3047 | sub edx,offset @@StartCode |
||
3048 | mov dword ptr [ecx+edx],eax |
||
3049 | |||
3050 | mov ax,dcG |
||
3051 | mov edx,offset @@Dest-2 |
||
3052 | sub edx,offset @@StartCode |
||
3053 | mov word ptr [ecx+edx],ax |
||
3054 | end; |
||
3055 | end; |
||
3056 | end; |
||
3057 | |||
3058 | { Blue Channel } |
||
3059 | if chBlue in EnableChannels then |
||
3060 | begin |
||
3061 | if Surface.rgb_blue.Mask<>0 then |
||
3062 | begin |
||
3063 | if Surface.rgb_blue.rshift<>0 then |
||
3064 | begin |
||
3065 | asm |
||
3066 | jmp @@EndCode |
||
3067 | @@StartCode: |
||
3068 | mov edx,eax |
||
3069 | and edx,$11111111{}@@Mask: // Surface.rgb_blue.Mask |
||
3070 | shr edx,$11 {}@@RShift: // Surface.rgb_blue.rshift |
||
3071 | mov byte ptr [offset _null],dl{}@@Dest:// @Dest.B |
||
3072 | @@EndCode: |
||
3073 | {$I DXRender.inc} |
||
3074 | { @@Mask } |
||
3075 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_blue.Mask] |
||
3076 | mov edx,offset @@Mask-4 |
||
3077 | sub edx,offset @@StartCode |
||
3078 | mov dword ptr [ecx+edx],eax |
||
3079 | |||
3080 | { @@RShift } |
||
3081 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_blue.rshift] |
||
3082 | mov edx,offset @@RShift-1 |
||
3083 | sub edx,offset @@StartCode |
||
3084 | mov byte ptr [ecx+edx],al |
||
3085 | |||
3086 | { @@Dest } |
||
3087 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B+1) |
||
3088 | mov edx,offset @@Dest-4 |
||
3089 | sub edx,offset @@StartCode |
||
3090 | mov dword ptr [ecx+edx],eax |
||
3091 | end; |
||
3092 | end else |
||
3093 | begin |
||
3094 | asm |
||
3095 | jmp @@EndCode |
||
3096 | @@StartCode: |
||
3097 | mov edx,eax |
||
3098 | and edx,$11111111{}@@Mask: // Surface.rgb_blue.Mask |
||
3099 | shl edx,$11 {}@@LShift: // Surface.rgb_blue.lshift |
||
3100 | mov byte ptr [offset _null],dl{}@@Dest:// @Dest.B |
||
3101 | @@EndCode: |
||
3102 | {$I DXRender.inc} |
||
3103 | { @@Mask } |
||
3104 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_blue.Mask] |
||
3105 | mov edx,offset @@Mask-4 |
||
3106 | sub edx,offset @@StartCode |
||
3107 | mov dword ptr [ecx+edx],eax |
||
3108 | |||
3109 | { @@LShift } |
||
3110 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_blue.lshift] |
||
3111 | mov edx,offset @@LShift-1 |
||
3112 | sub edx,offset @@StartCode |
||
3113 | mov byte ptr [ecx+edx],al |
||
3114 | |||
3115 | { @@Dest } |
||
3116 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B+1) |
||
3117 | mov edx,offset @@Dest-4 |
||
3118 | sub edx,offset @@StartCode |
||
3119 | mov dword ptr [ecx+edx],eax |
||
3120 | end; |
||
3121 | end; |
||
3122 | end else |
||
3123 | begin |
||
3124 | asm |
||
3125 | jmp @@EndCode |
||
3126 | @@StartCode: |
||
3127 | mov word ptr [offset _null],$1111{}@@Dest:// @Dest.B |
||
3128 | @@EndCode: |
||
3129 | {$I DXRender.inc} |
||
3130 | { @@Dest } |
||
3131 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B) |
||
3132 | mov edx,offset @@Dest-6 |
||
3133 | sub edx,offset @@StartCode |
||
3134 | mov dword ptr [ecx+edx],eax |
||
3135 | |||
3136 | mov ax,dcB |
||
3137 | mov edx,offset @@Dest-2 |
||
3138 | sub edx,offset @@StartCode |
||
3139 | mov word ptr [ecx+edx],ax |
||
3140 | end; |
||
3141 | end; |
||
3142 | end; |
||
3143 | |||
3144 | { Alpha Channel } |
||
3145 | if chAlpha in EnableChannels then |
||
3146 | begin |
||
3147 | if Surface.rgb_alpha.Mask<>0 then |
||
3148 | begin |
||
3149 | if Surface.rgb_alpha.rshift<>0 then |
||
3150 | begin |
||
3151 | asm |
||
3152 | jmp @@EndCode |
||
3153 | @@StartCode: |
||
3154 | mov edx,eax |
||
3155 | and edx,$11111111{}@@Mask: // Surface.rgb_alpha.Mask |
||
3156 | shr edx,$11 {}@@RShift: // Surface.rgb_alpha.rshift |
||
3157 | mov byte ptr [offset _null],dl{}@@Dest:// @Dest.A |
||
3158 | @@EndCode: |
||
3159 | {$I DXRender.inc} |
||
3160 | { @@Mask } |
||
3161 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_alpha.Mask] |
||
3162 | mov edx,offset @@Mask-4 |
||
3163 | sub edx,offset @@StartCode |
||
3164 | mov dword ptr [ecx+edx],eax |
||
3165 | |||
3166 | { @@RShift } |
||
3167 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_alpha.rshift] |
||
3168 | mov edx,offset @@RShift-1 |
||
3169 | sub edx,offset @@StartCode |
||
3170 | mov byte ptr [ecx+edx],al |
||
3171 | |||
3172 | { @@Dest } |
||
3173 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1) |
||
3174 | mov edx,offset @@Dest-4 |
||
3175 | sub edx,offset @@StartCode |
||
3176 | mov dword ptr [ecx+edx],eax |
||
3177 | end; |
||
3178 | end else |
||
3179 | begin |
||
3180 | asm |
||
3181 | jmp @@EndCode |
||
3182 | @@StartCode: |
||
3183 | mov edx,eax |
||
3184 | and edx,$11111111{}@@Mask: // Surface.rgb_alpha.Mask |
||
3185 | shl edx,$11 {}@@LShift: // Surface.rgb_alpha.lshift |
||
3186 | mov byte ptr [offset _null],dl{}@@Dest:// @Dest.A |
||
3187 | @@EndCode: |
||
3188 | {$I DXRender.inc} |
||
3189 | { @@Mask } |
||
3190 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_alpha.Mask] |
||
3191 | mov edx,offset @@Mask-4 |
||
3192 | sub edx,offset @@StartCode |
||
3193 | mov dword ptr [ecx+edx],eax |
||
3194 | |||
3195 | { @@LShift } |
||
3196 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_alpha.lshift] |
||
3197 | mov edx,offset @@LShift-1 |
||
3198 | sub edx,offset @@StartCode |
||
3199 | mov byte ptr [ecx+edx],al |
||
3200 | |||
3201 | { @@Dest } |
||
3202 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1) |
||
3203 | mov edx,offset @@Dest-4 |
||
3204 | sub edx,offset @@StartCode |
||
3205 | mov dword ptr [ecx+edx],eax |
||
3206 | end; |
||
3207 | end; |
||
3208 | end else |
||
3209 | begin |
||
3210 | asm |
||
3211 | jmp @@EndCode |
||
3212 | @@StartCode: |
||
3213 | mov word ptr [offset _null],$1111{}@@Dest:// @Dest.A |
||
3214 | @@EndCode: |
||
3215 | {$I DXRender.inc} |
||
3216 | { @@Dest } |
||
3217 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A) |
||
3218 | mov edx,offset @@Dest-6 |
||
3219 | sub edx,offset @@StartCode |
||
3220 | mov dword ptr [ecx+edx],eax |
||
3221 | |||
3222 | mov ax,dcA |
||
3223 | mov edx,offset @@Dest-2 |
||
3224 | sub edx,offset @@StartCode |
||
3225 | mov word ptr [ecx+edx],ax |
||
3226 | end; |
||
3227 | end; |
||
3228 | end; |
||
3229 | end; |
||
3230 | end; |
||
3231 | |||
3232 | procedure genEncodeColor(var Code: Pointer; const Surface: TDXR_Surface; Src: PDXRMachine_Color; EnableChannels: TDXRColorChannels); |
||
3233 | begin |
||
3234 | asm |
||
3235 | jmp @@EndCode |
||
3236 | @@StartCode: |
||
3237 | xor eax,eax |
||
3238 | @@EndCode: |
||
3239 | {$I DXRender.inc} |
||
3240 | end; |
||
3241 | |||
3242 | { Red channel } |
||
3243 | if chRed in EnableChannels then |
||
3244 | begin |
||
3245 | if Surface.rgb_red.rshift<>0 then |
||
3246 | begin |
||
3247 | asm |
||
3248 | jmp @@EndCode |
||
3249 | @@StartCode: |
||
3250 | movzx edx,byte ptr [offset _null]{}@@Src:// @Src.R |
||
3251 | shl edx,$11 {}@@rgb_redRShift: // Surface.rgb_red.rshift |
||
3252 | and edx,$11111111{}@@rgb_redMask: // Surface.rgb_red.Mask |
||
3253 | or eax,edx |
||
3254 | @@EndCode: |
||
3255 | {$I DXRender.inc} |
||
3256 | { @@Src } |
||
3257 | mov eax,Src; add eax,BYTE(TDXRMachine_Color.R+1) |
||
3258 | mov edx,offset @@Src-4 |
||
3259 | sub edx,offset @@StartCode |
||
3260 | mov dword ptr [ecx+edx],eax |
||
3261 | |||
3262 | { @@rgb_redMask } |
||
3263 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_red.Mask] |
||
3264 | mov edx,offset @@rgb_redMask-4 |
||
3265 | sub edx,offset @@StartCode |
||
3266 | mov dword ptr [ecx+edx],eax |
||
3267 | |||
3268 | { @@rgb_redRShift } |
||
3269 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_red.rshift] |
||
3270 | mov edx,offset @@rgb_redRShift-1 |
||
3271 | sub edx,offset @@StartCode |
||
3272 | mov byte ptr [ecx+edx],al |
||
3273 | end; |
||
3274 | end else |
||
3275 | begin |
||
3276 | asm |
||
3277 | jmp @@EndCode |
||
3278 | @@StartCode: |
||
3279 | movzx edx,byte ptr [offset _null]{}@@Src:// @Src.R |
||
3280 | shr edx,$11 {}@@rgb_redLShift: // Surface.rgb_red.lshift |
||
3281 | and edx,$11111111{}@@rgb_redMask: // Surface.rgb_red.Mask |
||
3282 | or eax,edx |
||
3283 | @@EndCode: |
||
3284 | {$I DXRender.inc} |
||
3285 | { @@Src } |
||
3286 | mov eax,Src; add eax,BYTE(TDXRMachine_Color.R+1) |
||
3287 | mov edx,offset @@Src-4 |
||
3288 | sub edx,offset @@StartCode |
||
3289 | mov dword ptr [ecx+edx],eax |
||
3290 | |||
3291 | { @@rgb_redMask } |
||
3292 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_red.Mask] |
||
3293 | mov edx,offset @@rgb_redMask-4 |
||
3294 | sub edx,offset @@StartCode |
||
3295 | mov dword ptr [ecx+edx],eax |
||
3296 | |||
3297 | { @@rgb_redLShift } |
||
3298 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_red.lshift] |
||
3299 | mov edx,offset @@rgb_redLShift-1 |
||
3300 | sub edx,offset @@StartCode |
||
3301 | mov byte ptr [ecx+edx],al |
||
3302 | end; |
||
3303 | end; |
||
3304 | end; |
||
3305 | |||
3306 | { Green channel } |
||
3307 | if chGreen in EnableChannels then |
||
3308 | begin |
||
3309 | if Surface.rgb_green.rshift<>0 then |
||
3310 | begin |
||
3311 | asm |
||
3312 | jmp @@EndCode |
||
3313 | @@StartCode: |
||
3314 | movzx edx,byte ptr [offset _null]{}@@Src:// @Src.G |
||
3315 | shl edx,$11 {}@@rgb_greenRShift: // Surface.rgb_green.rshift |
||
3316 | and edx,$11111111{}@@rgb_greenMask: // Surface.rgb_green.Mask |
||
3317 | or eax,edx |
||
3318 | @@EndCode: |
||
3319 | {$I DXRender.inc} |
||
3320 | { @@Src } |
||
3321 | mov eax,Src; add eax,BYTE(TDXRMachine_Color.G+1) |
||
3322 | mov edx,offset @@Src-4 |
||
3323 | sub edx,offset @@StartCode |
||
3324 | mov dword ptr [ecx+edx],eax |
||
3325 | |||
3326 | { @@rgb_greenMask } |
||
3327 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_green.Mask] |
||
3328 | mov edx,offset @@rgb_greenMask-4 |
||
3329 | sub edx,offset @@StartCode |
||
3330 | mov dword ptr [ecx+edx],eax |
||
3331 | |||
3332 | { @@rgb_greenRShift } |
||
3333 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_green.rshift] |
||
3334 | mov edx,offset @@rgb_greenRShift-1 |
||
3335 | sub edx,offset @@StartCode |
||
3336 | mov byte ptr [ecx+edx],al |
||
3337 | end; |
||
3338 | end else |
||
3339 | begin |
||
3340 | asm |
||
3341 | jmp @@EndCode |
||
3342 | @@StartCode: |
||
3343 | movzx edx,byte ptr [offset _null]{}@@Src:// @Src.G |
||
3344 | shr edx,$11 {}@@rgb_greenLShift: // Surface.rgb_green.lshift |
||
3345 | and edx,$11111111{}@@rgb_greenMask: // Surface.rgb_green.Mask |
||
3346 | or eax,edx |
||
3347 | @@EndCode: |
||
3348 | {$I DXRender.inc} |
||
3349 | { @@Src } |
||
3350 | mov eax,Src; add eax,BYTE(TDXRMachine_Color.G+1) |
||
3351 | mov edx,offset @@Src-4 |
||
3352 | sub edx,offset @@StartCode |
||
3353 | mov dword ptr [ecx+edx],eax |
||
3354 | |||
3355 | { @@rgb_greenMask } |
||
3356 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_green.Mask] |
||
3357 | mov edx,offset @@rgb_greenMask-4 |
||
3358 | sub edx,offset @@StartCode |
||
3359 | mov dword ptr [ecx+edx],eax |
||
3360 | |||
3361 | { @@rgb_greenLShift } |
||
3362 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_green.lshift] |
||
3363 | mov edx,offset @@rgb_greenLShift-1 |
||
3364 | sub edx,offset @@StartCode |
||
3365 | mov byte ptr [ecx+edx],al |
||
3366 | end; |
||
3367 | end; |
||
3368 | end; |
||
3369 | |||
3370 | { Blue channel } |
||
3371 | if chBlue in EnableChannels then |
||
3372 | begin |
||
3373 | if Surface.rgb_blue.rshift<>0 then |
||
3374 | begin |
||
3375 | asm |
||
3376 | jmp @@EndCode |
||
3377 | @@StartCode: |
||
3378 | movzx edx,byte ptr [offset _null]{}@@Src:// @Src.B |
||
3379 | shl edx,$11 {}@@rgb_blueRShift: // Surface.rgb_blue.rshift |
||
3380 | and edx,$11111111{}@@rgb_blueMask: // Surface.rgb_blue.Mask |
||
3381 | or eax,edx |
||
3382 | @@EndCode: |
||
3383 | {$I DXRender.inc} |
||
3384 | { @@Src } |
||
3385 | mov eax,Src; add eax,BYTE(TDXRMachine_Color.B+1) |
||
3386 | mov edx,offset @@Src-4 |
||
3387 | sub edx,offset @@StartCode |
||
3388 | mov dword ptr [ecx+edx],eax |
||
3389 | |||
3390 | { @@rgb_blueMask } |
||
3391 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_blue.Mask] |
||
3392 | mov edx,offset @@rgb_blueMask-4 |
||
3393 | sub edx,offset @@StartCode |
||
3394 | mov dword ptr [ecx+edx],eax |
||
3395 | |||
3396 | { @@rgb_blueRShift } |
||
3397 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_blue.rshift] |
||
3398 | mov edx,offset @@rgb_blueRShift-1 |
||
3399 | sub edx,offset @@StartCode |
||
3400 | mov byte ptr [ecx+edx],al |
||
3401 | end; |
||
3402 | end else |
||
3403 | begin |
||
3404 | asm |
||
3405 | jmp @@EndCode |
||
3406 | @@StartCode: |
||
3407 | movzx edx,byte ptr [offset _null]{}@@Src:// @Src.B |
||
3408 | shr edx,$11 {}@@rgb_blueLShift: // Surface.rgb_blue.lshift |
||
3409 | and edx,$11111111{}@@rgb_blueMask: // Surface.rgb_blue.Mask |
||
3410 | or eax,edx |
||
3411 | @@EndCode: |
||
3412 | {$I DXRender.inc} |
||
3413 | { @@Src } |
||
3414 | mov eax,Src; add eax,BYTE(TDXRMachine_Color.B+1) |
||
3415 | mov edx,offset @@Src-4 |
||
3416 | sub edx,offset @@StartCode |
||
3417 | mov dword ptr [ecx+edx],eax |
||
3418 | |||
3419 | { @@rgb_blueMask } |
||
3420 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_blue.Mask] |
||
3421 | mov edx,offset @@rgb_blueMask-4 |
||
3422 | sub edx,offset @@StartCode |
||
3423 | mov dword ptr [ecx+edx],eax |
||
3424 | |||
3425 | { @@rgb_blueLShift } |
||
3426 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_blue.lshift] |
||
3427 | mov edx,offset @@rgb_blueLShift-1 |
||
3428 | sub edx,offset @@StartCode |
||
3429 | mov byte ptr [ecx+edx],al |
||
3430 | end; |
||
3431 | end; |
||
3432 | end; |
||
3433 | |||
3434 | { Alpha channel } |
||
3435 | if chAlpha in EnableChannels then |
||
3436 | begin |
||
3437 | if Surface.rgb_alpha.rshift<>0 then |
||
3438 | begin |
||
3439 | asm |
||
3440 | jmp @@EndCode |
||
3441 | @@StartCode: |
||
3442 | movzx edx,byte ptr [offset _null]{}@@Src:// @Src.A |
||
3443 | shl edx,$11 {}@@rgb_alphaRShift: // Surface.rgb_alpha.rshift |
||
3444 | and edx,$11111111{}@@rgb_alphaMask: // Surface.rgb_alpha.Mask |
||
3445 | or eax,edx |
||
3446 | @@EndCode: |
||
3447 | {$I DXRender.inc} |
||
3448 | { @@Src } |
||
3449 | mov eax,Src; add eax,BYTE(TDXRMachine_Color.A+1) |
||
3450 | mov edx,offset @@Src-4 |
||
3451 | sub edx,offset @@StartCode |
||
3452 | mov dword ptr [ecx+edx],eax |
||
3453 | |||
3454 | { @@rgb_alphaMask } |
||
3455 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_alpha.Mask] |
||
3456 | mov edx,offset @@rgb_alphaMask-4 |
||
3457 | sub edx,offset @@StartCode |
||
3458 | mov dword ptr [ecx+edx],eax |
||
3459 | |||
3460 | { @@rgb_alphaRShift } |
||
3461 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_alpha.rshift] |
||
3462 | mov edx,offset @@rgb_alphaRShift-1 |
||
3463 | sub edx,offset @@StartCode |
||
3464 | mov byte ptr [ecx+edx],al |
||
3465 | end; |
||
3466 | end else |
||
3467 | begin |
||
3468 | asm |
||
3469 | jmp @@EndCode |
||
3470 | @@StartCode: |
||
3471 | movzx edx,byte ptr [offset _null]{}@@Src:// @Src.A |
||
3472 | shr edx,$11 {}@@rgb_alphaLShift: // Surface.rgb_alpha.lshift |
||
3473 | and edx,$11111111{}@@rgb_alphaMask: // Surface.rgb_alpha.Mask |
||
3474 | or eax,edx |
||
3475 | @@EndCode: |
||
3476 | {$I DXRender.inc} |
||
3477 | { @@Src } |
||
3478 | mov eax,Src; add eax,BYTE(TDXRMachine_Color.A+1) |
||
3479 | mov edx,offset @@Src-4 |
||
3480 | sub edx,offset @@StartCode |
||
3481 | mov dword ptr [ecx+edx],eax |
||
3482 | |||
3483 | { @@rgb_alphaMask } |
||
3484 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_alpha.Mask] |
||
3485 | mov edx,offset @@rgb_alphaMask-4 |
||
3486 | sub edx,offset @@StartCode |
||
3487 | mov dword ptr [ecx+edx],eax |
||
3488 | |||
3489 | { @@rgb_alphaLShift } |
||
3490 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_alpha.lshift] |
||
3491 | mov edx,offset @@rgb_alphaLShift-1 |
||
3492 | sub edx,offset @@StartCode |
||
3493 | mov byte ptr [ecx+edx],al |
||
3494 | end; |
||
3495 | end; |
||
3496 | end; |
||
3497 | end; |
||
3498 | |||
3499 | procedure genEncodeColor_with_Dither(var Code: Pointer; const Surface: TDXR_Surface; Src: PDXRMachine_Color; |
||
3500 | Axis: PDXRMachine_Axis; EnableChannels: TDXRColorChannels); |
||
3501 | const |
||
3502 | m: array[0..3, 0..3] of Byte = ((0, 0, 0, 0), (1, 0, 0, 0), (1, 0, 0, 1), (1, 1, 1, 0)); |
||
3503 | begin |
||
3504 | asm |
||
3505 | jmp @@EndCode |
||
3506 | @@StartCode: |
||
3507 | xor eax,eax |
||
3508 | movzx ebp,byte ptr [offset _null]{}@@AxisX: |
||
3509 | movzx edx,byte ptr [offset _null]{}@@AxisY: |
||
3510 | and ebp,1 |
||
3511 | and edx,1 |
||
3512 | lea ebp,[offset m+ebp*2+edx] |
||
3513 | @@EndCode: |
||
3514 | {$I DXRender.inc} |
||
3515 | { @@AxisX } |
||
3516 | mov eax,Axis; add eax,TDXRMachine_Axis.X |
||
3517 | mov edx,offset @@AxisX-4 |
||
3518 | sub edx,offset @@StartCode |
||
3519 | mov dword ptr [ecx+edx],eax |
||
3520 | |||
3521 | { @@AxisY } |
||
3522 | mov eax,Axis; add eax,TDXRMachine_Axis.Y |
||
3523 | mov edx,offset @@AxisY-4 |
||
3524 | sub edx,offset @@StartCode |
||
3525 | mov dword ptr [ecx+edx],eax |
||
3526 | end; |
||
3527 | |||
3528 | { Red channel } |
||
3529 | if chRed in EnableChannels then |
||
3530 | begin |
||
3531 | asm |
||
3532 | jmp @@EndCode |
||
3533 | @@StartCode: |
||
3534 | movzx edx,byte ptr [offset _null]{}@@Src:// @Src.R |
||
3535 | @@EndCode: |
||
3536 | {$I DXRender.inc} |
||
3537 | { @@Src } |
||
3538 | mov eax,Src; add eax,BYTE(TDXRMachine_Color.R+1) |
||
3539 | mov edx,offset @@Src-4 |
||
3540 | sub edx,offset @@StartCode |
||
3541 | mov dword ptr [ecx+edx],eax |
||
3542 | end; |
||
3543 | |||
3544 | if Surface.rgb_red.Bitcount<7 then |
||
3545 | begin |
||
3546 | asm |
||
3547 | jmp @@EndCode |
||
3548 | @@StartCode: |
||
3549 | mov ebx,edx |
||
3550 | shr ebx,$11 {}@@BitCount: // 6-bitcount |
||
3551 | and ebx,3 |
||
3552 | movzx ebx,byte ptr [ebp+ebx*4] |
||
3553 | shl ebx,$11 {}@@BitCount2: // 8-bitcount |
||
3554 | movzx edx,byte [offset (_AddTable+edx+ebx)] |
||
3555 | @@EndCode: |
||
3556 | {$I DXRender.inc} |
||
3557 | { @@BitCount } |
||
3558 | mov eax,6; mov edx,Surface; sub eax,[edx + TDXR_Surface.rgb_red.Bitcount] |
||
3559 | mov edx,offset @@BitCount-1 |
||
3560 | sub edx,offset @@StartCode |
||
3561 | mov byte ptr [ecx+edx],al |
||
3562 | |||
3563 | { @@BitCount2 } |
||
3564 | mov eax,8; mov edx,Surface; sub eax,[edx + TDXR_Surface.rgb_red.Bitcount] |
||
3565 | mov edx,offset @@BitCount2-1 |
||
3566 | sub edx,offset @@StartCode |
||
3567 | mov byte ptr [ecx+edx],al |
||
3568 | end; |
||
3569 | end; |
||
3570 | |||
3571 | if Surface.rgb_red.rshift<>0 then |
||
3572 | begin |
||
3573 | asm |
||
3574 | jmp @@EndCode |
||
3575 | @@StartCode: |
||
3576 | shl edx,$11 {}@@rgb_redRShift: // Surface.rgb_red.rshift |
||
3577 | and edx,$11111111{}@@rgb_redMask: // Surface.rgb_red.Mask |
||
3578 | or eax,edx |
||
3579 | @@EndCode: |
||
3580 | {$I DXRender.inc} |
||
3581 | { @@rgb_redMask } |
||
3582 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_red.Mask] |
||
3583 | mov edx,offset @@rgb_redMask-4 |
||
3584 | sub edx,offset @@StartCode |
||
3585 | mov dword ptr [ecx+edx],eax |
||
3586 | |||
3587 | { @@rgb_redRShift } |
||
3588 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_red.rshift] |
||
3589 | mov edx,offset @@rgb_redRShift-1 |
||
3590 | sub edx,offset @@StartCode |
||
3591 | mov byte ptr [ecx+edx],al |
||
3592 | end; |
||
3593 | end else |
||
3594 | begin |
||
3595 | asm |
||
3596 | jmp @@EndCode |
||
3597 | @@StartCode: |
||
3598 | shr edx,$11 {}@@rgb_redLShift: // Surface.rgb_red.lshift |
||
3599 | and edx,$11111111{}@@rgb_redMask: // Surface.rgb_red.Mask |
||
3600 | or eax,edx |
||
3601 | @@EndCode: |
||
3602 | {$I DXRender.inc} |
||
3603 | { @@rgb_redMask } |
||
3604 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_red.Mask] |
||
3605 | mov edx,offset @@rgb_redMask-4 |
||
3606 | sub edx,offset @@StartCode |
||
3607 | mov dword ptr [ecx+edx],eax |
||
3608 | |||
3609 | { @@rgb_redLShift } |
||
3610 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_red.lshift] |
||
3611 | mov edx,offset @@rgb_redLShift-1 |
||
3612 | sub edx,offset @@StartCode |
||
3613 | mov byte ptr [ecx+edx],al |
||
3614 | end; |
||
3615 | end; |
||
3616 | end; |
||
3617 | |||
3618 | { Green channel } |
||
3619 | if chGreen in EnableChannels then |
||
3620 | begin |
||
3621 | asm |
||
3622 | jmp @@EndCode |
||
3623 | @@StartCode: |
||
3624 | movzx edx,byte ptr [offset _null]{}@@Src:// @Src.G |
||
3625 | @@EndCode: |
||
3626 | {$I DXRender.inc} |
||
3627 | { @@Src } |
||
3628 | mov eax,Src; add eax,BYTE(TDXRMachine_Color.G+1) |
||
3629 | mov edx,offset @@Src-4 |
||
3630 | sub edx,offset @@StartCode |
||
3631 | mov dword ptr [ecx+edx],eax |
||
3632 | end; |
||
3633 | |||
3634 | if Surface.rgb_green.Bitcount<7 then |
||
3635 | begin |
||
3636 | asm |
||
3637 | jmp @@EndCode |
||
3638 | @@StartCode: |
||
3639 | mov ebx,edx |
||
3640 | shr ebx,$11 {}@@BitCount: // 6-bitcount |
||
3641 | and ebx,3 |
||
3642 | movzx ebx,byte ptr [ebp+ebx*4] |
||
3643 | shl ebx,$11 {}@@BitCount2: // 8-bitcount |
||
3644 | movzx edx,byte [offset (_AddTable+edx+ebx)] |
||
3645 | @@EndCode: |
||
3646 | {$I DXRender.inc} |
||
3647 | { @@BitCount } |
||
3648 | mov eax,6; mov edx,Surface; sub eax,[edx + TDXR_Surface.rgb_green.Bitcount] |
||
3649 | mov edx,offset @@BitCount-1 |
||
3650 | sub edx,offset @@StartCode |
||
3651 | mov byte ptr [ecx+edx],al |
||
3652 | |||
3653 | { @@BitCount2 } |
||
3654 | mov eax,8; mov edx,Surface; sub eax,[edx + TDXR_Surface.rgb_green.Bitcount] |
||
3655 | mov edx,offset @@BitCount2-1 |
||
3656 | sub edx,offset @@StartCode |
||
3657 | mov byte ptr [ecx+edx],al |
||
3658 | end; |
||
3659 | end; |
||
3660 | |||
3661 | if Surface.rgb_green.rshift<>0 then |
||
3662 | begin |
||
3663 | asm |
||
3664 | jmp @@EndCode |
||
3665 | @@StartCode: |
||
3666 | shl edx,$11 {}@@rgb_greenRShift: // Surface.rgb_green.rshift |
||
3667 | and edx,$11111111{}@@rgb_greenMask: // Surface.rgb_green.Mask |
||
3668 | or eax,edx |
||
3669 | @@EndCode: |
||
3670 | {$I DXRender.inc} |
||
3671 | { @@rgb_greenMask } |
||
3672 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_green.Mask] |
||
3673 | mov edx,offset @@rgb_greenMask-4 |
||
3674 | sub edx,offset @@StartCode |
||
3675 | mov dword ptr [ecx+edx],eax |
||
3676 | |||
3677 | { @@rgb_greenRShift } |
||
3678 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_green.rshift] |
||
3679 | mov edx,offset @@rgb_greenRShift-1 |
||
3680 | sub edx,offset @@StartCode |
||
3681 | mov byte ptr [ecx+edx],al |
||
3682 | end; |
||
3683 | end else |
||
3684 | begin |
||
3685 | asm |
||
3686 | jmp @@EndCode |
||
3687 | @@StartCode: |
||
3688 | shr edx,$11 {}@@rgb_greenLShift: // Surface.rgb_green.lshift |
||
3689 | and edx,$11111111{}@@rgb_greenMask: // Surface.rgb_green.Mask |
||
3690 | or eax,edx |
||
3691 | @@EndCode: |
||
3692 | {$I DXRender.inc} |
||
3693 | { @@rgb_greenMask } |
||
3694 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_green.Mask] |
||
3695 | mov edx,offset @@rgb_greenMask-4 |
||
3696 | sub edx,offset @@StartCode |
||
3697 | mov dword ptr [ecx+edx],eax |
||
3698 | |||
3699 | { @@rgb_greenLShift } |
||
3700 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_green.lshift] |
||
3701 | mov edx,offset @@rgb_greenLShift-1 |
||
3702 | sub edx,offset @@StartCode |
||
3703 | mov byte ptr [ecx+edx],al |
||
3704 | end; |
||
3705 | end; |
||
3706 | end; |
||
3707 | |||
3708 | { Blue channel } |
||
3709 | if chBlue in EnableChannels then |
||
3710 | begin |
||
3711 | asm |
||
3712 | jmp @@EndCode |
||
3713 | @@StartCode: |
||
3714 | movzx edx,byte ptr [offset _null]{}@@Src:// @Src.B |
||
3715 | @@EndCode: |
||
3716 | {$I DXRender.inc} |
||
3717 | { @@Src } |
||
3718 | mov eax,Src; add eax,BYTE(TDXRMachine_Color.B+1) |
||
3719 | mov edx,offset @@Src-4 |
||
3720 | sub edx,offset @@StartCode |
||
3721 | mov dword ptr [ecx+edx],eax |
||
3722 | end; |
||
3723 | |||
3724 | if Surface.rgb_blue.Bitcount<7 then |
||
3725 | begin |
||
3726 | asm |
||
3727 | jmp @@EndCode |
||
3728 | @@StartCode: |
||
3729 | mov ebx,edx |
||
3730 | shr ebx,$11 {}@@BitCount: // 6-bitcount |
||
3731 | and ebx,3 |
||
3732 | movzx ebx,byte ptr [ebp+ebx*4] |
||
3733 | shl ebx,$11 {}@@BitCount2: // 8-bitcount |
||
3734 | movzx edx,byte [offset (_AddTable+edx+ebx)] |
||
3735 | @@EndCode: |
||
3736 | {$I DXRender.inc} |
||
3737 | { @@BitCount } |
||
3738 | mov eax,6; mov edx,Surface; sub eax,[edx + TDXR_Surface.rgb_blue.Bitcount] |
||
3739 | mov edx,offset @@BitCount-1 |
||
3740 | sub edx,offset @@StartCode |
||
3741 | mov byte ptr [ecx+edx],al |
||
3742 | |||
3743 | { @@BitCount2 } |
||
3744 | mov eax,8; mov edx,Surface; sub eax,[edx + TDXR_Surface.rgb_blue.Bitcount] |
||
3745 | mov edx,offset @@BitCount2-1 |
||
3746 | sub edx,offset @@StartCode |
||
3747 | mov byte ptr [ecx+edx],al |
||
3748 | end; |
||
3749 | end; |
||
3750 | |||
3751 | if Surface.rgb_blue.rshift<>0 then |
||
3752 | begin |
||
3753 | asm |
||
3754 | jmp @@EndCode |
||
3755 | @@StartCode: |
||
3756 | shl edx,$11 {}@@rgb_blueRShift: // Surface.rgb_blue.rshift |
||
3757 | and edx,$11111111{}@@rgb_blueMask: // Surface.rgb_blue.Mask |
||
3758 | or eax,edx |
||
3759 | @@EndCode: |
||
3760 | {$I DXRender.inc} |
||
3761 | { @@rgb_blueMask } |
||
3762 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_blue.Mask] |
||
3763 | mov edx,offset @@rgb_blueMask-4 |
||
3764 | sub edx,offset @@StartCode |
||
3765 | mov dword ptr [ecx+edx],eax |
||
3766 | |||
3767 | { @@rgb_blueRShift } |
||
3768 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_blue.rshift] |
||
3769 | mov edx,offset @@rgb_blueRShift-1 |
||
3770 | sub edx,offset @@StartCode |
||
3771 | mov byte ptr [ecx+edx],al |
||
3772 | end; |
||
3773 | end else |
||
3774 | begin |
||
3775 | asm |
||
3776 | jmp @@EndCode |
||
3777 | @@StartCode: |
||
3778 | shr edx,$11 {}@@rgb_blueLShift: // Surface.rgb_blue.lshift |
||
3779 | and edx,$11111111{}@@rgb_blueMask: // Surface.rgb_blue.Mask |
||
3780 | or eax,edx |
||
3781 | @@EndCode: |
||
3782 | {$I DXRender.inc} |
||
3783 | { @@rgb_blueMask } |
||
3784 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_blue.Mask] |
||
3785 | mov edx,offset @@rgb_blueMask-4 |
||
3786 | sub edx,offset @@StartCode |
||
3787 | mov dword ptr [ecx+edx],eax |
||
3788 | |||
3789 | { @@rgb_blueLShift } |
||
3790 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_blue.lshift] |
||
3791 | mov edx,offset @@rgb_blueLShift-1 |
||
3792 | sub edx,offset @@StartCode |
||
3793 | mov byte ptr [ecx+edx],al |
||
3794 | end; |
||
3795 | end; |
||
3796 | end; |
||
3797 | |||
3798 | { Alpha channel } |
||
3799 | if chAlpha in EnableChannels then |
||
3800 | begin |
||
3801 | asm |
||
3802 | jmp @@EndCode |
||
3803 | @@StartCode: |
||
3804 | movzx edx,byte ptr [offset _null]{}@@Src:// @Src.R |
||
3805 | @@EndCode: |
||
3806 | {$I DXRender.inc} |
||
3807 | { @@Src } |
||
3808 | mov eax,Src; add eax,BYTE(TDXRMachine_Color.A+1) |
||
3809 | mov edx,offset @@Src-4 |
||
3810 | sub edx,offset @@StartCode |
||
3811 | mov dword ptr [ecx+edx],eax |
||
3812 | end; |
||
3813 | |||
3814 | if Surface.rgb_alpha.Bitcount<7 then |
||
3815 | begin |
||
3816 | asm |
||
3817 | jmp @@EndCode |
||
3818 | @@StartCode: |
||
3819 | mov ebx,edx |
||
3820 | shr ebx,$11 {}@@BitCount: // 6-bitcount |
||
3821 | and ebx,3 |
||
3822 | movzx ebx,byte ptr [ebp+ebx] |
||
3823 | shl ebx,$11 {}@@BitCount2: // 8-bitcount |
||
3824 | movzx edx,byte [offset (_AddTable+edx+ebx)] |
||
3825 | @@EndCode: |
||
3826 | {$I DXRender.inc} |
||
3827 | { @@BitCount } |
||
3828 | mov eax,6; mov edx,Surface; sub eax,[edx + TDXR_Surface.rgb_alpha.Bitcount] |
||
3829 | mov edx,offset @@BitCount-1 |
||
3830 | sub edx,offset @@StartCode |
||
3831 | mov byte ptr [ecx+edx],al |
||
3832 | |||
3833 | { @@BitCount2 } |
||
3834 | mov eax,8; mov edx,Surface; sub eax,[edx + TDXR_Surface.rgb_alpha.Bitcount] |
||
3835 | mov edx,offset @@BitCount2-1 |
||
3836 | sub edx,offset @@StartCode |
||
3837 | mov byte ptr [ecx+edx],al |
||
3838 | end; |
||
3839 | end; |
||
3840 | |||
3841 | if Surface.rgb_alpha.rshift<>0 then |
||
3842 | begin |
||
3843 | asm |
||
3844 | jmp @@EndCode |
||
3845 | @@StartCode: |
||
3846 | shl edx,$11 {}@@rgb_alphaRShift: // Surface.rgb_alpha.rshift |
||
3847 | and edx,$11111111{}@@rgb_alphaMask: // Surface.rgb_alpha.Mask |
||
3848 | or eax,edx |
||
3849 | @@EndCode: |
||
3850 | {$I DXRender.inc} |
||
3851 | { @@rgb_alphaMask } |
||
3852 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_alpha.Mask] |
||
3853 | mov edx,offset @@rgb_alphaMask-4 |
||
3854 | sub edx,offset @@StartCode |
||
3855 | mov dword ptr [ecx+edx],eax |
||
3856 | |||
3857 | { @@rgb_alphaRShift } |
||
3858 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_alpha.rshift] |
||
3859 | mov edx,offset @@rgb_alphaRShift-1 |
||
3860 | sub edx,offset @@StartCode |
||
3861 | mov byte ptr [ecx+edx],al |
||
3862 | end; |
||
3863 | end else |
||
3864 | begin |
||
3865 | asm |
||
3866 | jmp @@EndCode |
||
3867 | @@StartCode: |
||
3868 | shr edx,$11 {}@@rgb_alphaLShift: // Surface.rgb_alpha.lshift |
||
3869 | and edx,$11111111{}@@rgb_alphaMask: // Surface.rgb_alpha.Mask |
||
3870 | or eax,edx |
||
3871 | @@EndCode: |
||
3872 | {$I DXRender.inc} |
||
3873 | { @@rgb_alphaMask } |
||
3874 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_alpha.Mask] |
||
3875 | mov edx,offset @@rgb_alphaMask-4 |
||
3876 | sub edx,offset @@StartCode |
||
3877 | mov dword ptr [ecx+edx],eax |
||
3878 | |||
3879 | { @@rgb_alphaLShift } |
||
3880 | mov eax,Surface; mov eax,[eax + TDXR_Surface.rgb_alpha.lshift] |
||
3881 | mov edx,offset @@rgb_alphaLShift-1 |
||
3882 | sub edx,offset @@StartCode |
||
3883 | mov byte ptr [ecx+edx],al |
||
3884 | end; |
||
3885 | end; |
||
3886 | end; |
||
3887 | end; |
||
3888 | |||
3889 | procedure genEncodeColor2(var Code: Pointer; const Surface: TDXR_Surface; Src: PDXRMachine_Color; EnableChannels: TDXRColorChannels); |
||
3890 | begin |
||
3891 | if Dither.Enable then |
||
3892 | genEncodeColor_with_Dither(Code, Surface, Src, @Axis.Axis, EnableChannels) |
||
3893 | else |
||
3894 | genEncodeColor(Code, Surface, Src, EnableChannels); |
||
3895 | end; |
||
3896 | |||
3897 | procedure genColorKey(var Code: Pointer; const Texture: TDXRMachine_Reg_Texture); |
||
3898 | var |
||
3899 | TransparentMask, TransparentColor: DWORD; |
||
3900 | begin |
||
3901 | if not Texture.ColorKeyEnable then Exit; |
||
3902 | |||
3903 | if Texture.Surface.ColorType=DXR_COLORTYPE_INDEXED then |
||
3904 | begin |
||
3905 | TransparentMask := not Texture.Surface.idx_alpha.Mask; |
||
3906 | end else if Texture.Surface.ColorType=DXR_COLORTYPE_RGB then |
||
3907 | begin |
||
3908 | TransparentMask := not Texture.Surface.rgb_alpha.Mask; |
||
3909 | end; |
||
3910 | |||
3911 | TransparentColor := Texture.ColorKey; |
||
3912 | |||
3913 | if TransparentMask=$FFFFFFFF then |
||
3914 | begin |
||
3915 | if Texture.Surface.BitCount=32 then |
||
3916 | begin |
||
3917 | if TransparentColor=0 then |
||
3918 | begin |
||
3919 | asm |
||
3920 | jmp @@EndCode |
||
3921 | @@StartCode: |
||
3922 | and eax,$FFFFFF |
||
3923 | @@EndCode: |
||
3924 | {$I DXRender.inc} |
||
3925 | end; |
||
3926 | end else |
||
3927 | begin |
||
3928 | asm |
||
3929 | jmp @@EndCode |
||
3930 | @@StartCode: |
||
3931 | and eax,$FFFFFF |
||
3932 | cmp eax,$11111111{}@@TransColor: // Process.Texture.TransparentColor |
||
3933 | @@EndCode: |
||
3934 | {$I DXRender.inc} |
||
3935 | { @@TransColor } |
||
3936 | mov eax,TransparentColor |
||
3937 | mov edx,offset @@TransColor-4 |
||
3938 | sub edx,offset @@StartCode |
||
3939 | mov dword ptr [ecx+edx],eax |
||
3940 | end; |
||
3941 | end; |
||
3942 | end else |
||
3943 | begin |
||
3944 | if TransparentColor=0 then |
||
3945 | begin |
||
3946 | asm |
||
3947 | jmp @@EndCode |
||
3948 | @@StartCode: |
||
3949 | test eax,eax |
||
3950 | @@EndCode: |
||
3951 | {$I DXRender.inc} |
||
3952 | end; |
||
3953 | end else |
||
3954 | begin |
||
3955 | asm |
||
3956 | jmp @@EndCode |
||
3957 | @@StartCode: |
||
3958 | cmp eax,$11111111{}@@TransColor: // Process.Texture.TransparentColor |
||
3959 | @@EndCode: |
||
3960 | {$I DXRender.inc} |
||
3961 | { @@TransColor } |
||
3962 | mov eax,TransparentColor |
||
3963 | mov edx,offset @@TransColor-4 |
||
3964 | sub edx,offset @@StartCode |
||
3965 | mov dword ptr [ecx+edx],eax |
||
3966 | end; |
||
3967 | end; |
||
3968 | end; |
||
3969 | end else |
||
3970 | begin |
||
3971 | if Texture.Surface.BitCount=32 then |
||
3972 | TransparentMask := TransparentMask and $FFFFFF; |
||
3973 | |||
3974 | asm |
||
3975 | jmp @@EndCode |
||
3976 | @@StartCode: |
||
3977 | mov edx,eax |
||
3978 | and edx,$11111111{}@@TransMask: // TransparentMask |
||
3979 | cmp edx,$11111111{}@@TransColor: // Process.Texture.TransparentColor |
||
3980 | @@EndCode: |
||
3981 | {$I DXRender.inc} |
||
3982 | { @@TransMask } |
||
3983 | mov eax,TransparentMask |
||
3984 | mov edx,offset @@TransMask-4 |
||
3985 | sub edx,offset @@StartCode |
||
3986 | mov dword ptr [ecx+edx],eax |
||
3987 | |||
3988 | { @@TransColor } |
||
3989 | mov eax,TransparentColor |
||
3990 | mov edx,offset @@TransColor-4 |
||
3991 | sub edx,offset @@StartCode |
||
3992 | mov dword ptr [ecx+edx],eax |
||
3993 | end; |
||
3994 | end; |
||
3995 | |||
3996 | genCmpFunc(Code, DXR_CMPFUNC_EQUAL, SkipAddress); |
||
3997 | end; |
||
3998 | |||
3999 | procedure genReadTexture_Nearest(var Code: Pointer; Dest: PDXRMachine_Color; |
||
4000 | const Texture: TDXRMachine_Reg_Texture; const Axis: TDXRMachine_Axis; EnableChannels: TDXRColorChannels); |
||
4001 | begin |
||
4002 | if EnableChannels=[] then Exit; |
||
4003 | |||
4004 | genReadSurfacePixel(Code, Texture, @Axis); |
||
4005 | genColorKey(Code, Texture); |
||
4006 | genDecodeColor(Code, Texture.Surface^, Dest, EnableChannels, Texture.DefaultColor); |
||
4007 | end; |
||
4008 | |||
4009 | procedure genReadTexture_BiLinear(var Code: Pointer; Dest: PDXRMachine_Color; |
||
4010 | const Texture: TDXRMachine_Reg_Texture; const Axis: TDXRMachine_Axis; EnableChannels: TDXRColorChannels); |
||
4011 | var |
||
4012 | _Axis, _BiLinearAxis, _BiLinearCol1, _BiLinearCol2, _BiLinearCol3, _BiLinearCol4: Pointer; |
||
4013 | begin |
||
4014 | if EnableChannels=[] then Exit; |
||
4015 | |||
4016 | _Axis := @Axis; |
||
4017 | _BiLinearAxis := @F_BiLinearAxis; |
||
4018 | _BiLinearCol1 := @F_BiLinearCol1; |
||
4019 | _BiLinearCol2 := @F_BiLinearCol2; |
||
4020 | _BiLinearCol3 := @F_BiLinearCol3; |
||
4021 | _BiLinearCol4 := @F_BiLinearCol4; |
||
4022 | |||
4023 | genReadSurfacePixel(Code, Texture, _Axis); |
||
4024 | genColorKey(Code, Texture); |
||
4025 | genDecodeColor(Code, Texture.Surface^, _BiLinearCol1, EnableChannels, Texture.DefaultColor); |
||
4026 | |||
4027 | asm |
||
4028 | jmp @@EndCode |
||
4029 | @@StartCode: |
||
4030 | mov eax,dword ptr [offset _null]{}@@TexX: |
||
4031 | mov edx,dword ptr [offset _null]{}@@TexY: |
||
4032 | add eax,65536 |
||
4033 | mov dword ptr [offset _null],edx{}@@AxisY: |
||
4034 | mov dword ptr [offset _null],eax{}@@AxisX: |
||
4035 | @@EndCode: |
||
4036 | {$I DXRender.inc} |
||
4037 | { @@TexX } |
||
4038 | mov eax,_Axis; add eax,TDXRMachine_Axis.X |
||
4039 | mov edx,offset @@TexX-4 |
||
4040 | sub edx,offset @@StartCode |
||
4041 | mov dword ptr [ecx+edx],eax |
||
4042 | |||
4043 | { @@TexY } |
||
4044 | mov eax,_Axis; add eax,TDXRMachine_Axis.Y |
||
4045 | mov edx,offset @@TexY-4 |
||
4046 | sub edx,offset @@StartCode |
||
4047 | mov dword ptr [ecx+edx],eax |
||
4048 | |||
4049 | { @@AxisX } |
||
4050 | mov eax,_BiLinearAxis; add eax,TDXRMachine_Axis.X |
||
4051 | mov edx,offset @@AxisX-4 |
||
4052 | sub edx,offset @@StartCode |
||
4053 | mov dword ptr [ecx+edx],eax |
||
4054 | |||
4055 | { @@AxisY } |
||
4056 | mov eax,_BiLinearAxis; add eax,TDXRMachine_Axis.Y |
||
4057 | mov edx,offset @@AxisY-4 |
||
4058 | sub edx,offset @@StartCode |
||
4059 | mov dword ptr [ecx+edx],eax |
||
4060 | end; |
||
4061 | genReadSurfacePixel(Code, Texture, _BiLinearAxis); |
||
4062 | genDecodeColor(Code, Texture.Surface^, _BiLinearCol2, EnableChannels, Texture.DefaultColor); |
||
4063 | |||
4064 | asm |
||
4065 | jmp @@EndCode |
||
4066 | @@StartCode: |
||
4067 | add dword ptr [offset _null],65536{}@@AxisY: |
||
4068 | @@EndCode: |
||
4069 | {$I DXRender.inc} |
||
4070 | { @@AxisY } |
||
4071 | mov eax,_BiLinearAxis; add eax,TDXRMachine_Axis.Y |
||
4072 | mov edx,offset @@AxisY-8 |
||
4073 | sub edx,offset @@StartCode |
||
4074 | mov dword ptr [ecx+edx],eax |
||
4075 | end; |
||
4076 | genReadSurfacePixel(Code, Texture, _BiLinearAxis); |
||
4077 | genDecodeColor(Code, Texture.Surface^, _BiLinearCol4, EnableChannels, Texture.DefaultColor); |
||
4078 | |||
4079 | asm |
||
4080 | jmp @@EndCode |
||
4081 | @@StartCode: |
||
4082 | sub dword ptr [offset _null],65536{}@@AxisX: |
||
4083 | @@EndCode: |
||
4084 | {$I DXRender.inc} |
||
4085 | { @@AxisX } |
||
4086 | mov eax,_BiLinearAxis; add eax,TDXRMachine_Axis.X |
||
4087 | mov edx,offset @@AxisX-8 |
||
4088 | sub edx,offset @@StartCode |
||
4089 | mov dword ptr [ecx+edx],eax |
||
4090 | end; |
||
4091 | genReadSurfacePixel(Code, Texture, _BiLinearAxis); |
||
4092 | genDecodeColor(Code, Texture.Surface^, _BiLinearCol3, EnableChannels, Texture.DefaultColor); |
||
4093 | (* |
||
4094 | if UseMMX then |
||
4095 | begin |
||
4096 | asm |
||
4097 | jmp @@EndCode |
||
4098 | @@StartCode: |
||
4099 | movzx eax,byte ptr [offset _null]{}@@TexX: |
||
4100 | movzx edx,byte ptr [offset _null]{}@@TexY: |
||
4101 | |||
4102 | db $0F,$6F,$1C,$C5,$11,$11,$11,$11///movq mm3,qword ptr [$11111111+eax*8] |
||
4103 | @@_ByteToQWORDTable1: |
||
4104 | xor eax,$FF |
||
4105 | db $0F,$6F,$24,$C5,$11,$11,$11,$11///movq mm4,qword ptr [$11111111+eax*8] |
||
4106 | @@_ByteToQWORDTable2: |
||
4107 | |||
4108 | db $0F,$6F,$05,$11,$11,$11,$11///movq mm0,qword ptr [$11111111] |
||
4109 | @@_BiLinearCol1: |
||
4110 | db $0F,$6F,$0D,$11,$11,$11,$11///movq mm1,qword ptr [$11111111] |
||
4111 | @@_BiLinearCol2: |
||
4112 | |||
4113 | db $0F,$D5,$C3 ///pmullw mm0,mm3 |
||
4114 | db $0F,$D5,$CC ///pmullw mm1,mm4 |
||
4115 | db $0F,$FD,$C1 ///paddw mm0,mm1 |
||
4116 | db $0F,$71,$D0,$08 ///psrlw mm0,8 |
||
4117 | |||
4118 | db $0F,$6F,$0D,$11,$11,$11,$11///movq mm1,qword ptr [$11111111] |
||
4119 | @@_BiLinearCol3: |
||
4120 | db $0F,$6F,$15,$11,$11,$11,$11///movq mm2,qword ptr [$11111111] |
||
4121 | @@_BiLinearCol4: |
||
4122 | |||
4123 | db $0F,$D5,$CB ///pmullw mm1,mm3 |
||
4124 | db $0F,$D5,$D4 ///pmullw mm2,mm4 |
||
4125 | db $0F,$FD,$CA ///paddw mm1,mm2 |
||
4126 | db $0F,$71,$D1,$08 ///psrlw mm1,8 |
||
4127 | |||
4128 | db $0F,$D5,$04,$D5,$11,$11,$11,$11///pmullw mm0,qword ptr [$11111111+edx*8] |
||
4129 | @@_ByteToQWORDTable3: |
||
4130 | xor edx,$FF |
||
4131 | db $0F,$D5,$0C,$D5,$11,$11,$11,$11///pmullw mm1,qword ptr [$11111111+edx*8] |
||
4132 | @@_ByteToQWORDTable4: |
||
4133 | db $0F,$FD,$C1 ///paddw mm0,mm1 |
||
4134 | db $0F,$71,$D0,$08 ///psrlw mm0,8 |
||
4135 | |||
4136 | db $0F,$7F,$05,$11,$11,$11,$11///movq qword ptr [$11111111],mm0 |
||
4137 | @@Dest: |
||
4138 | @@EndCode: |
||
4139 | {$I DXRender.inc} |
||
4140 | { @@TexX } |
||
4141 | mov eax,_Axis; add eax,TDXRMachine_Axis.X+1 |
||
4142 | mov edx,offset @@TexX-4 |
||
4143 | sub edx,offset @@StartCode |
||
4144 | mov dword ptr [ecx+edx],eax |
||
4145 | |||
4146 | { @@TexY } |
||
4147 | mov eax,_Axis; add eax,TDXRMachine_Axis.Y+1 |
||
4148 | mov edx,offset @@TexY-4 |
||
4149 | sub edx,offset @@StartCode |
||
4150 | mov dword ptr [ecx+edx],eax |
||
4151 | |||
4152 | { @@_ByteToQWORDTable1 } |
||
4153 | mov eax,offset _ByteToQWORDTable |
||
4154 | mov edx,offset @@_ByteToQWORDTable1-4 |
||
4155 | sub edx,offset @@StartCode |
||
4156 | mov dword ptr [ecx+edx],eax |
||
4157 | |||
4158 | { @@_ByteToQWORDTable2 } |
||
4159 | mov eax,offset _ByteToQWORDTable |
||
4160 | mov edx,offset @@_ByteToQWORDTable2-4 |
||
4161 | sub edx,offset @@StartCode |
||
4162 | mov dword ptr [ecx+edx],eax |
||
4163 | |||
4164 | { @@_ByteToQWORDTable3 } |
||
4165 | mov eax,offset _ByteToQWORDTable |
||
4166 | mov edx,offset @@_ByteToQWORDTable3-4 |
||
4167 | sub edx,offset @@StartCode |
||
4168 | mov dword ptr [ecx+edx],eax |
||
4169 | |||
4170 | { @@_ByteToQWORDTable4 } |
||
4171 | mov eax,offset _ByteToQWORDTable |
||
4172 | mov edx,offset @@_ByteToQWORDTable4-4 |
||
4173 | sub edx,offset @@StartCode |
||
4174 | mov dword ptr [ecx+edx],eax |
||
4175 | |||
4176 | { @@_BiLinearCol1 } |
||
4177 | mov eax,_BiLinearCol1 |
||
4178 | mov edx,offset @@_BiLinearCol1-4 |
||
4179 | sub edx,offset @@StartCode |
||
4180 | mov dword ptr [ecx+edx],eax |
||
4181 | |||
4182 | { @@_BiLinearCol2 } |
||
4183 | mov eax,_BiLinearCol2 |
||
4184 | mov edx,offset @@_BiLinearCol2-4 |
||
4185 | sub edx,offset @@StartCode |
||
4186 | mov dword ptr [ecx+edx],eax |
||
4187 | |||
4188 | { @@_BiLinearCol3 } |
||
4189 | mov eax,_BiLinearCol3 |
||
4190 | mov edx,offset @@_BiLinearCol3-4 |
||
4191 | sub edx,offset @@StartCode |
||
4192 | mov dword ptr [ecx+edx],eax |
||
4193 | |||
4194 | { @@_BiLinearCol4 } |
||
4195 | mov eax,_BiLinearCol4 |
||
4196 | mov edx,offset @@_BiLinearCol4-4 |
||
4197 | sub edx,offset @@StartCode |
||
4198 | mov dword ptr [ecx+edx],eax |
||
4199 | |||
4200 | { @@Dest } |
||
4201 | mov eax,Dest |
||
4202 | mov edx,offset @@Dest-4 |
||
4203 | sub edx,offset @@StartCode |
||
4204 | mov dword ptr [ecx+edx],eax |
||
4205 | end; |
||
4206 | end else *) |
||
4207 | begin |
||
4208 | { Red Channel } |
||
4209 | if chRed in EnableChannels then |
||
4210 | begin |
||
4211 | asm |
||
4212 | jmp @@EndCode |
||
4213 | @@StartCode: |
||
4214 | movzx eax,byte ptr [offset _null]{}@@_BiLinearCol2: |
||
4215 | movzx edx,byte ptr [offset _null]{}@@TexX: |
||
4216 | imul eax,edx |
||
4217 | movzx ebx,byte ptr [offset _null]{}@@_BiLinearCol1: |
||
4218 | xor edx,$FF |
||
4219 | imul ebx,edx |
||
4220 | add ebx,eax |
||
4221 | xor edx,$FF |
||
4222 | |||
4223 | movzx eax,byte ptr [offset _null]{}@@_BiLinearCol4: |
||
4224 | imul eax,edx |
||
4225 | movzx ebp,byte ptr [offset _null]{}@@_BiLinearCol3: |
||
4226 | xor edx,$FF |
||
4227 | imul ebp,edx |
||
4228 | add eax,ebp |
||
4229 | |||
4230 | movzx edx,byte ptr [offset _Null]{}@@TexY: |
||
4231 | imul eax,edx |
||
4232 | xor edx,$FF |
||
4233 | imul ebx,edx |
||
4234 | add eax,ebx |
||
4235 | shr eax,16 |
||
4236 | |||
4237 | mov byte ptr [offset _Null],al{}@@Dest: |
||
4238 | @@EndCode: |
||
4239 | {$I DXRender.inc} |
||
4240 | { @@_BiLinearCol1 } |
||
4241 | mov eax,_BiLinearCol1; add eax,BYTE(TDXRMachine_Color.R+1) |
||
4242 | mov edx,offset @@_BiLinearCol1-4 |
||
4243 | sub edx,offset @@StartCode |
||
4244 | mov dword ptr [ecx+edx],eax |
||
4245 | |||
4246 | { @@_BiLinearCol2 } |
||
4247 | mov eax,_BiLinearCol2; add eax,BYTE(TDXRMachine_Color.R+1) |
||
4248 | mov edx,offset @@_BiLinearCol2-4 |
||
4249 | sub edx,offset @@StartCode |
||
4250 | mov dword ptr [ecx+edx],eax |
||
4251 | |||
4252 | { @@_BiLinearCol3 } |
||
4253 | mov eax,_BiLinearCol3; add eax,BYTE(TDXRMachine_Color.R+1) |
||
4254 | mov edx,offset @@_BiLinearCol3-4 |
||
4255 | sub edx,offset @@StartCode |
||
4256 | mov dword ptr [ecx+edx],eax |
||
4257 | |||
4258 | { @@_BiLinearCol4 } |
||
4259 | mov eax,_BiLinearCol4; add eax,BYTE(TDXRMachine_Color.R+1) |
||
4260 | mov edx,offset @@_BiLinearCol4-4 |
||
4261 | sub edx,offset @@StartCode |
||
4262 | mov dword ptr [ecx+edx],eax |
||
4263 | |||
4264 | { @@TexX } |
||
4265 | mov eax,_Axis; add eax,TDXRMachine_Axis.X+1 |
||
4266 | mov edx,offset @@TexX-4 |
||
4267 | sub edx,offset @@StartCode |
||
4268 | mov dword ptr [ecx+edx],eax |
||
4269 | |||
4270 | { @@TexY } |
||
4271 | mov eax,_Axis; add eax,TDXRMachine_Axis.Y+1 |
||
4272 | mov edx,offset @@TexY-4 |
||
4273 | sub edx,offset @@StartCode |
||
4274 | mov dword ptr [ecx+edx],eax |
||
4275 | |||
4276 | { @@Dest } |
||
4277 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R+1) |
||
4278 | mov edx,offset @@Dest-4 |
||
4279 | sub edx,offset @@StartCode |
||
4280 | mov dword ptr [ecx+edx],eax |
||
4281 | end; |
||
4282 | end; |
||
4283 | |||
4284 | { Green Channel } |
||
4285 | if chGreen in EnableChannels then |
||
4286 | begin |
||
4287 | asm |
||
4288 | jmp @@EndCode |
||
4289 | @@StartCode: |
||
4290 | movzx eax,byte ptr [offset _null]{}@@_BiLinearCol2: |
||
4291 | movzx edx,byte ptr [offset _null]{}@@TexX: |
||
4292 | imul eax,edx |
||
4293 | movzx ebx,byte ptr [offset _null]{}@@_BiLinearCol1: |
||
4294 | xor edx,$FF |
||
4295 | imul ebx,edx |
||
4296 | add ebx,eax |
||
4297 | xor edx,$FF |
||
4298 | |||
4299 | movzx eax,byte ptr [offset _null]{}@@_BiLinearCol4: |
||
4300 | imul eax,edx |
||
4301 | movzx ebp,byte ptr [offset _null]{}@@_BiLinearCol3: |
||
4302 | xor edx,$FF |
||
4303 | imul ebp,edx |
||
4304 | add eax,ebp |
||
4305 | |||
4306 | movzx edx,byte ptr [offset _Null]{}@@TexY: |
||
4307 | imul eax,edx |
||
4308 | xor edx,$FF |
||
4309 | imul ebx,edx |
||
4310 | add eax,ebx |
||
4311 | shr eax,16 |
||
4312 | |||
4313 | mov byte ptr [offset _Null],al{}@@Dest: |
||
4314 | @@EndCode: |
||
4315 | {$I DXRender.inc} |
||
4316 | { @@_BiLinearCol1 } |
||
4317 | mov eax,_BiLinearCol1; add eax,BYTE(TDXRMachine_Color.G+1) |
||
4318 | mov edx,offset @@_BiLinearCol1-4 |
||
4319 | sub edx,offset @@StartCode |
||
4320 | mov dword ptr [ecx+edx],eax |
||
4321 | |||
4322 | { @@_BiLinearCol2 } |
||
4323 | mov eax,_BiLinearCol2; add eax,BYTE(TDXRMachine_Color.G+1) |
||
4324 | mov edx,offset @@_BiLinearCol2-4 |
||
4325 | sub edx,offset @@StartCode |
||
4326 | mov dword ptr [ecx+edx],eax |
||
4327 | |||
4328 | { @@_BiLinearCol3 } |
||
4329 | mov eax,_BiLinearCol3; add eax,BYTE(TDXRMachine_Color.G+1) |
||
4330 | mov edx,offset @@_BiLinearCol3-4 |
||
4331 | sub edx,offset @@StartCode |
||
4332 | mov dword ptr [ecx+edx],eax |
||
4333 | |||
4334 | { @@_BiLinearCol4 } |
||
4335 | mov eax,_BiLinearCol4; add eax,BYTE(TDXRMachine_Color.G+1) |
||
4336 | mov edx,offset @@_BiLinearCol4-4 |
||
4337 | sub edx,offset @@StartCode |
||
4338 | mov dword ptr [ecx+edx],eax |
||
4339 | |||
4340 | { @@TexX } |
||
4341 | mov eax,_Axis; add eax,TDXRMachine_Axis.X+1 |
||
4342 | mov edx,offset @@TexX-4 |
||
4343 | sub edx,offset @@StartCode |
||
4344 | mov dword ptr [ecx+edx],eax |
||
4345 | |||
4346 | { @@TexY } |
||
4347 | mov eax,_Axis; add eax,TDXRMachine_Axis.Y+1 |
||
4348 | mov edx,offset @@TexY-4 |
||
4349 | sub edx,offset @@StartCode |
||
4350 | mov dword ptr [ecx+edx],eax |
||
4351 | |||
4352 | { @@Dest } |
||
4353 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G+1) |
||
4354 | mov edx,offset @@Dest-4 |
||
4355 | sub edx,offset @@StartCode |
||
4356 | mov dword ptr [ecx+edx],eax |
||
4357 | end; |
||
4358 | end; |
||
4359 | |||
4360 | { Blue Channel } |
||
4361 | if chBlue in EnableChannels then |
||
4362 | begin |
||
4363 | asm |
||
4364 | jmp @@EndCode |
||
4365 | @@StartCode: |
||
4366 | movzx eax,byte ptr [offset _null]{}@@_BiLinearCol2: |
||
4367 | movzx edx,byte ptr [offset _null]{}@@TexX: |
||
4368 | imul eax,edx |
||
4369 | movzx ebx,byte ptr [offset _null]{}@@_BiLinearCol1: |
||
4370 | xor edx,$FF |
||
4371 | imul ebx,edx |
||
4372 | add ebx,eax |
||
4373 | xor edx,$FF |
||
4374 | |||
4375 | movzx eax,byte ptr [offset _null]{}@@_BiLinearCol4: |
||
4376 | imul eax,edx |
||
4377 | movzx ebp,byte ptr [offset _null]{}@@_BiLinearCol3: |
||
4378 | xor edx,$FF |
||
4379 | imul ebp,edx |
||
4380 | add eax,ebp |
||
4381 | |||
4382 | movzx edx,byte ptr [offset _Null]{}@@TexY: |
||
4383 | imul eax,edx |
||
4384 | xor edx,$FF |
||
4385 | imul ebx,edx |
||
4386 | add eax,ebx |
||
4387 | shr eax,16 |
||
4388 | |||
4389 | mov byte ptr [offset _Null],al{}@@Dest: |
||
4390 | @@EndCode: |
||
4391 | {$I DXRender.inc} |
||
4392 | { @@_BiLinearCol1 } |
||
4393 | mov eax,_BiLinearCol1; add eax,BYTE(TDXRMachine_Color.B+1) |
||
4394 | mov edx,offset @@_BiLinearCol1-4 |
||
4395 | sub edx,offset @@StartCode |
||
4396 | mov dword ptr [ecx+edx],eax |
||
4397 | |||
4398 | { @@_BiLinearCol2 } |
||
4399 | mov eax,_BiLinearCol2; add eax,BYTE(TDXRMachine_Color.B+1) |
||
4400 | mov edx,offset @@_BiLinearCol2-4 |
||
4401 | sub edx,offset @@StartCode |
||
4402 | mov dword ptr [ecx+edx],eax |
||
4403 | |||
4404 | { @@_BiLinearCol3 } |
||
4405 | mov eax,_BiLinearCol3; add eax,BYTE(TDXRMachine_Color.B+1) |
||
4406 | mov edx,offset @@_BiLinearCol3-4 |
||
4407 | sub edx,offset @@StartCode |
||
4408 | mov dword ptr [ecx+edx],eax |
||
4409 | |||
4410 | { @@_BiLinearCol4 } |
||
4411 | mov eax,_BiLinearCol4; add eax,BYTE(TDXRMachine_Color.B+1) |
||
4412 | mov edx,offset @@_BiLinearCol4-4 |
||
4413 | sub edx,offset @@StartCode |
||
4414 | mov dword ptr [ecx+edx],eax |
||
4415 | |||
4416 | { @@TexX } |
||
4417 | mov eax,_Axis; add eax,TDXRMachine_Axis.X+1 |
||
4418 | mov edx,offset @@TexX-4 |
||
4419 | sub edx,offset @@StartCode |
||
4420 | mov dword ptr [ecx+edx],eax |
||
4421 | |||
4422 | { @@TexY } |
||
4423 | mov eax,_Axis; add eax,TDXRMachine_Axis.Y+1 |
||
4424 | mov edx,offset @@TexY-4 |
||
4425 | sub edx,offset @@StartCode |
||
4426 | mov dword ptr [ecx+edx],eax |
||
4427 | |||
4428 | { @@Dest } |
||
4429 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B+1) |
||
4430 | mov edx,offset @@Dest-4 |
||
4431 | sub edx,offset @@StartCode |
||
4432 | mov dword ptr [ecx+edx],eax |
||
4433 | end; |
||
4434 | end; |
||
4435 | |||
4436 | { Alpha Channel } |
||
4437 | if chAlpha in EnableChannels then |
||
4438 | begin |
||
4439 | asm |
||
4440 | jmp @@EndCode |
||
4441 | @@StartCode: |
||
4442 | movzx eax,byte ptr [offset _null]{}@@_BiLinearCol2: |
||
4443 | movzx edx,byte ptr [offset _null]{}@@TexX: |
||
4444 | imul eax,edx |
||
4445 | movzx ebx,byte ptr [offset _null]{}@@_BiLinearCol1: |
||
4446 | xor edx,$FF |
||
4447 | imul ebx,edx |
||
4448 | add ebx,eax |
||
4449 | xor edx,$FF |
||
4450 | |||
4451 | movzx eax,byte ptr [offset _null]{}@@_BiLinearCol4: |
||
4452 | imul eax,edx |
||
4453 | movzx ebp,byte ptr [offset _null]{}@@_BiLinearCol3: |
||
4454 | xor edx,$FF |
||
4455 | imul ebp,edx |
||
4456 | add eax,ebp |
||
4457 | |||
4458 | movzx edx,byte ptr [offset _Null]{}@@TexY: |
||
4459 | imul eax,edx |
||
4460 | xor edx,$FF |
||
4461 | imul ebx,edx |
||
4462 | add eax,ebx |
||
4463 | shr eax,16 |
||
4464 | |||
4465 | mov byte ptr [offset _Null],al{}@@Dest: |
||
4466 | @@EndCode: |
||
4467 | {$I DXRender.inc} |
||
4468 | { @@_BiLinearCol1 } |
||
4469 | mov eax,_BiLinearCol1; add eax,BYTE(TDXRMachine_Color.A+1) |
||
4470 | mov edx,offset @@_BiLinearCol1-4 |
||
4471 | sub edx,offset @@StartCode |
||
4472 | mov dword ptr [ecx+edx],eax |
||
4473 | |||
4474 | { @@_BiLinearCol2 } |
||
4475 | mov eax,_BiLinearCol2; add eax,BYTE(TDXRMachine_Color.A+1) |
||
4476 | mov edx,offset @@_BiLinearCol2-4 |
||
4477 | sub edx,offset @@StartCode |
||
4478 | mov dword ptr [ecx+edx],eax |
||
4479 | |||
4480 | { @@_BiLinearCol3 } |
||
4481 | mov eax,_BiLinearCol3; add eax,BYTE(TDXRMachine_Color.A+1) |
||
4482 | mov edx,offset @@_BiLinearCol3-4 |
||
4483 | sub edx,offset @@StartCode |
||
4484 | mov dword ptr [ecx+edx],eax |
||
4485 | |||
4486 | { @@_BiLinearCol4 } |
||
4487 | mov eax,_BiLinearCol4; add eax,BYTE(TDXRMachine_Color.A+1) |
||
4488 | mov edx,offset @@_BiLinearCol4-4 |
||
4489 | sub edx,offset @@StartCode |
||
4490 | mov dword ptr [ecx+edx],eax |
||
4491 | |||
4492 | { @@TexX } |
||
4493 | mov eax,_Axis; add eax,TDXRMachine_Axis.X+1 |
||
4494 | mov edx,offset @@TexX-4 |
||
4495 | sub edx,offset @@StartCode |
||
4496 | mov dword ptr [ecx+edx],eax |
||
4497 | |||
4498 | { @@TexY } |
||
4499 | mov eax,_Axis; add eax,TDXRMachine_Axis.Y+1 |
||
4500 | mov edx,offset @@TexY-4 |
||
4501 | sub edx,offset @@StartCode |
||
4502 | mov dword ptr [ecx+edx],eax |
||
4503 | |||
4504 | { @@Dest } |
||
4505 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1) |
||
4506 | mov edx,offset @@Dest-4 |
||
4507 | sub edx,offset @@StartCode |
||
4508 | mov dword ptr [ecx+edx],eax |
||
4509 | end; |
||
4510 | end; |
||
4511 | end; |
||
4512 | end; |
||
4513 | |||
4514 | procedure genReadTexture(var Code: Pointer; Dest: PDXRMachine_Color; |
||
4515 | const Texture: TDXRMachine_Reg_Texture; EnableChannels: TDXRColorChannels); |
||
4516 | begin |
||
4517 | if Texture.Filter in [DXR_TEXTUREFILTER_LINEAR] then |
||
4518 | genReadTexture_BiLinear(Code, Dest, Texture, Texture.nAxis, EnableChannels) |
||
4519 | else |
||
4520 | genReadTexture_Nearest(Code, Dest, Texture, Texture.nAxis, EnableChannels); |
||
4521 | end; |
||
4522 | |||
4523 | procedure genUpdateAxis(var Code: Pointer); |
||
4524 | var |
||
4525 | _Axis: Pointer; |
||
4526 | begin |
||
4527 | if not Axis.IncEnable then Exit; |
||
4528 | |||
4529 | _Axis := @Axis.Axis; |
||
4530 | asm |
||
4531 | jmp @@EndCode |
||
4532 | @@StartCode: |
||
4533 | inc dword ptr [offset _null]{}@@AxisX: |
||
4534 | @@EndCode: |
||
4535 | {$I DXRender.inc} |
||
4536 | { @@AxisX } |
||
4537 | mov eax,_Axis; add eax,TDXRMachine_Axis.X |
||
4538 | mov edx,offset @@AxisX-4 |
||
4539 | sub edx,offset @@StartCode |
||
4540 | mov dword ptr [ecx+edx],eax |
||
4541 | end; |
||
4542 | end; |
||
4543 | |||
4544 | procedure genUpdateColor(var Code: Pointer); |
||
4545 | var |
||
4546 | i: Integer; |
||
4547 | Color: PDXRMachine_Reg_Color; |
||
4548 | nColor, iColor: Pointer; |
||
4549 | begin |
||
4550 | for i:=0 to ColorIndexCount-1 do |
||
4551 | begin |
||
4552 | Color := @ColorList[ColorIndex[i]]; |
||
4553 | if Color.Gouraud then |
||
4554 | begin |
||
4555 | nColor := @Color.nColor; |
||
4556 | iColor := @Color.iColor; |
||
4557 | |||
4558 | if UseMMX then |
||
4559 | begin |
||
4560 | FMMXUsed := True; |
||
4561 | asm |
||
4562 | jmp @@EndCode |
||
4563 | @@StartCode: |
||
4564 | db $0F,$6F,$05,$11,$11,$11,$11/// movq mm0,qword ptr [$11111111] |
||
4565 | @@_nColor: |
||
4566 | db $0F,$FD,$05,$11,$11,$11,$11/// paddw mm0,qword ptr [$11111111] |
||
4567 | @@_iColor: |
||
4568 | db $0F,$7F,$05,$11,$11,$11,$11/// movq qword ptr [$11111111],mm0 |
||
4569 | @@_nColor2: |
||
4570 | @@EndCode: |
||
4571 | {$I DXRender.inc} |
||
4572 | { @@_nColor } |
||
4573 | mov eax,nColor |
||
4574 | mov edx,offset @@_nColor-4 |
||
4575 | sub edx,offset @@StartCode |
||
4576 | mov dword ptr [ecx+edx],eax |
||
4577 | |||
4578 | { @@_iColor } |
||
4579 | mov eax,iColor |
||
4580 | mov edx,offset @@_iColor-4 |
||
4581 | sub edx,offset @@StartCode |
||
4582 | mov dword ptr [ecx+edx],eax |
||
4583 | |||
4584 | { @@_nColor2 } |
||
4585 | mov eax,nColor |
||
4586 | mov edx,offset @@_nColor2-4 |
||
4587 | sub edx,offset @@StartCode |
||
4588 | mov dword ptr [ecx+edx],eax |
||
4589 | end; |
||
4590 | end else |
||
4591 | begin |
||
4592 | asm |
||
4593 | jmp @@EndCode |
||
4594 | @@StartCode: |
||
4595 | mov eax,dword ptr [offset _null]{}@@nColor11: |
||
4596 | mov edx,dword ptr [offset _null]{}@@nColor12: |
||
4597 | add eax,dword ptr [offset _null]{}@@iColor1: |
||
4598 | add edx,dword ptr [offset _null]{}@@iColor2: |
||
4599 | mov dword ptr [offset _null],eax{}@@nColor21: |
||
4600 | mov dword ptr [offset _null],edx{}@@nColor22: |
||
4601 | @@EndCode: |
||
4602 | {$I DXRender.inc} |
||
4603 | |||
4604 | { @@nColor11 } |
||
4605 | mov eax,nColor |
||
4606 | mov edx,offset @@nColor11-4 |
||
4607 | sub edx,offset @@StartCode |
||
4608 | mov dword ptr [ecx+edx],eax |
||
4609 | |||
4610 | { @@nColor12 } |
||
4611 | mov eax,nColor; add eax,4 |
||
4612 | mov edx,offset @@nColor12-4 |
||
4613 | sub edx,offset @@StartCode |
||
4614 | mov dword ptr [ecx+edx],eax |
||
4615 | |||
4616 | { @@iColor1 } |
||
4617 | mov eax,iColor |
||
4618 | mov edx,offset @@iColor1-4 |
||
4619 | sub edx,offset @@StartCode |
||
4620 | mov dword ptr [ecx+edx],eax |
||
4621 | |||
4622 | { @@iColor2 } |
||
4623 | mov eax,iColor; add eax,4 |
||
4624 | mov edx,offset @@iColor2-4 |
||
4625 | sub edx,offset @@StartCode |
||
4626 | mov dword ptr [ecx+edx],eax |
||
4627 | |||
4628 | { @@nColor21 } |
||
4629 | mov eax,nColor |
||
4630 | mov edx,offset @@nColor21-4 |
||
4631 | sub edx,offset @@StartCode |
||
4632 | mov dword ptr [ecx+edx],eax |
||
4633 | |||
4634 | { @@nColor22 } |
||
4635 | mov eax,nColor; add eax,4 |
||
4636 | mov edx,offset @@nColor22-4 |
||
4637 | sub edx,offset @@StartCode |
||
4638 | mov dword ptr [ecx+edx],eax |
||
4639 | end; |
||
4640 | end; |
||
4641 | end; |
||
4642 | end; |
||
4643 | end; |
||
4644 | |||
4645 | procedure genUpdateTextureAxis(var Code: Pointer); |
||
4646 | var |
||
4647 | i: Integer; |
||
4648 | Texture: PDXRMachine_Reg_Texture; |
||
4649 | nTex, iTex: Pointer; |
||
4650 | begin |
||
4651 | for i:=0 to TextureIndexCount-1 do |
||
4652 | begin |
||
4653 | Texture := @TextureList[TextureIndex[i]]; |
||
4654 | |||
4655 | nTex := @Texture.nAxis; |
||
4656 | iTex := @Texture.iAxis; |
||
4657 | |||
4658 | if Texture.iAxisConstant then |
||
4659 | begin |
||
4660 | if Texture.iAxis.X<>0 then |
||
4661 | begin |
||
4662 | asm |
||
4663 | jmp @@EndCode |
||
4664 | @@StartCode: |
||
4665 | add dword ptr [offset _Null],$11111111{}@@nTexX: |
||
4666 | @@EndCode: |
||
4667 | {$I DXRender.inc} |
||
4668 | { @@nTexX } |
||
4669 | mov eax,iTex; add eax,TDXRMachine_Axis.X; mov eax,dword ptr [eax] |
||
4670 | mov edx,offset @@nTexX-4 |
||
4671 | sub edx,offset @@StartCode |
||
4672 | mov dword ptr [ecx+edx],eax |
||
4673 | |||
4674 | mov eax,nTex; add eax,TDXRMachine_Axis.X |
||
4675 | mov edx,offset @@nTexX-8 |
||
4676 | sub edx,offset @@StartCode |
||
4677 | mov dword ptr [ecx+edx],eax |
||
4678 | end; |
||
4679 | end; |
||
4680 | |||
4681 | if Texture.iAxis.Y<>0 then |
||
4682 | begin |
||
4683 | asm |
||
4684 | jmp @@EndCode |
||
4685 | @@StartCode: |
||
4686 | add dword ptr [offset _Null],$11111111{}@@nTexY: |
||
4687 | @@EndCode: |
||
4688 | {$I DXRender.inc} |
||
4689 | { @@nTexY } |
||
4690 | mov eax,iTex; add eax,TDXRMachine_Axis.Y; mov eax,dword ptr [eax] |
||
4691 | mov edx,offset @@nTexY-4 |
||
4692 | sub edx,offset @@StartCode |
||
4693 | mov dword ptr [ecx+edx],eax |
||
4694 | |||
4695 | mov eax,nTex; add eax,TDXRMachine_Axis.Y |
||
4696 | mov edx,offset @@nTexY-8 |
||
4697 | sub edx,offset @@StartCode |
||
4698 | mov dword ptr [ecx+edx],eax |
||
4699 | end; |
||
4700 | end; |
||
4701 | end else |
||
4702 | begin |
||
4703 | if UseMMX then |
||
4704 | begin |
||
4705 | FMMXUsed := True; |
||
4706 | asm |
||
4707 | jmp @@EndCode |
||
4708 | @@StartCode: |
||
4709 | db $0F,$6F,$05,$11,$11,$11,$11///movq mm0,qword ptr [$11111111] |
||
4710 | @@nTex: |
||
4711 | db $0F,$FE,$05,$11,$11,$11,$11///paddd mm0,qword ptr [$11111111] |
||
4712 | @@iTex: |
||
4713 | db $0F,$7F,$05,$11,$11,$11,$11///movq qword ptr [$11111111],mm0 |
||
4714 | @@nTex2: |
||
4715 | @@EndCode: |
||
4716 | {$I DXRender.inc} |
||
4717 | { @@nTex } |
||
4718 | mov eax,nTex |
||
4719 | mov edx,offset @@nTex-4 |
||
4720 | sub edx,offset @@StartCode |
||
4721 | mov dword ptr [ecx+edx],eax |
||
4722 | |||
4723 | { @@nTex2 } |
||
4724 | mov eax,nTex |
||
4725 | mov edx,offset @@nTex2-4 |
||
4726 | sub edx,offset @@StartCode |
||
4727 | mov dword ptr [ecx+edx],eax |
||
4728 | |||
4729 | { @@iTex } |
||
4730 | mov eax,iTex |
||
4731 | mov edx,offset @@iTex-4 |
||
4732 | sub edx,offset @@StartCode |
||
4733 | mov dword ptr [ecx+edx],eax |
||
4734 | end; |
||
4735 | end else |
||
4736 | begin |
||
4737 | asm |
||
4738 | jmp @@EndCode |
||
4739 | @@StartCode: |
||
4740 | mov eax,dword ptr [offset _Null]{}@@iTexX: |
||
4741 | mov edx,dword ptr [offset _Null]{}@@iTexY: |
||
4742 | add dword ptr [offset _Null],eax{}@@nTexX: |
||
4743 | add dword ptr [offset _Null],edx{}@@nTexY: |
||
4744 | @@EndCode: |
||
4745 | {$I DXRender.inc} |
||
4746 | { @@iTexX } |
||
4747 | mov eax,iTex; add eax,TDXRMachine_Axis.X |
||
4748 | mov edx,offset @@iTexX-4 |
||
4749 | sub edx,offset @@StartCode |
||
4750 | mov dword ptr [ecx+edx],eax |
||
4751 | |||
4752 | { @@iTexY } |
||
4753 | mov eax,iTex; add eax,TDXRMachine_Axis.Y |
||
4754 | mov edx,offset @@iTexY-4 |
||
4755 | sub edx,offset @@StartCode |
||
4756 | mov dword ptr [ecx+edx],eax |
||
4757 | |||
4758 | { @@nTexX } |
||
4759 | mov eax,nTex; add eax,TDXRMachine_Axis.X |
||
4760 | mov edx,offset @@nTexX-4 |
||
4761 | sub edx,offset @@StartCode |
||
4762 | mov dword ptr [ecx+edx],eax |
||
4763 | |||
4764 | { @@nTexY } |
||
4765 | mov eax,nTex; add eax,TDXRMachine_Axis.Y |
||
4766 | mov edx,offset @@nTexY-4 |
||
4767 | sub edx,offset @@StartCode |
||
4768 | mov dword ptr [ecx+edx],eax |
||
4769 | end; |
||
4770 | end; |
||
4771 | end; |
||
4772 | end; |
||
4773 | end; |
||
4774 | |||
4775 | procedure genBlend(var Code: Pointer; Blend: TDXR_Blend; |
||
4776 | Dest, Col1, Col2: PDXRMachine_Color; EnableChannels: TDXRColorChannels; |
||
4777 | ConstChannels1, ConstChannels2: TDXRColorChannels); |
||
4778 | |||
4779 | procedure Func_col1_Add_col2(var Code: Pointer; Dest, col1, col2: PWord); |
||
4780 | begin |
||
4781 | asm |
||
4782 | jmp @@EndCode |
||
4783 | @@StartCode: |
||
4784 | movzx eax,byte ptr [offset _null]{}@@Col1: |
||
4785 | movzx edx,byte ptr [offset _null]{}@@Col2: |
||
4786 | mov al,byte ptr [offset (_AddTable + eax + edx)] |
||
4787 | mov byte ptr [offset _null],al{}@@Dest: |
||
4788 | @@EndCode: |
||
4789 | {$I DXRender.inc} |
||
4790 | { @@Col1 } |
||
4791 | mov eax,Col1; inc eax |
||
4792 | mov edx,offset @@Col1-4 |
||
4793 | sub edx,offset @@StartCode |
||
4794 | mov dword ptr [ecx+edx],eax |
||
4795 | |||
4796 | { @@Col2 } |
||
4797 | mov eax,Col2; inc eax |
||
4798 | mov edx,offset @@Col2-4 |
||
4799 | sub edx,offset @@StartCode |
||
4800 | mov dword ptr [ecx+edx],eax |
||
4801 | |||
4802 | { @@Dest } |
||
4803 | mov eax,Dest; inc eax |
||
4804 | mov edx,offset @@Dest-4 |
||
4805 | sub edx,offset @@StartCode |
||
4806 | mov dword ptr [ecx+edx],eax |
||
4807 | end; |
||
4808 | end; |
||
4809 | |||
4810 | procedure Func_col1_Add_const2(var Code: Pointer; Dest, col1, col2: PWord); |
||
4811 | begin |
||
4812 | asm |
||
4813 | jmp @@EndCode |
||
4814 | @@StartCode: |
||
4815 | movzx eax,byte ptr [offset _null]{}@@Col1: |
||
4816 | mov al,byte ptr [$11111111 + eax]{}@@Col2: |
||
4817 | mov byte ptr [offset _null],al{}@@Dest: |
||
4818 | @@EndCode: |
||
4819 | {$I DXRender.inc} |
||
4820 | { @@Col1 } |
||
4821 | mov eax,Col1; inc eax |
||
4822 | mov edx,offset @@Col1-4 |
||
4823 | sub edx,offset @@StartCode |
||
4824 | mov dword ptr [ecx+edx],eax |
||
4825 | |||
4826 | { @@Col2 } |
||
4827 | mov eax,Col2; inc eax; movzx eax,byte ptr [eax] |
||
4828 | add eax,offset _AddTable |
||
4829 | |||
4830 | mov edx,offset @@Col2-4 |
||
4831 | sub edx,offset @@StartCode |
||
4832 | mov dword ptr [ecx+edx],eax |
||
4833 | |||
4834 | { @@Dest } |
||
4835 | mov eax,Dest; inc eax |
||
4836 | mov edx,offset @@Dest-4 |
||
4837 | sub edx,offset @@StartCode |
||
4838 | mov dword ptr [ecx+edx],eax |
||
4839 | end; |
||
4840 | end; |
||
4841 | |||
4842 | procedure Func_col1_Sub_col2(var Code: Pointer; Dest, col1, col2: PWord); |
||
4843 | begin |
||
4844 | asm |
||
4845 | jmp @@EndCode |
||
4846 | @@StartCode: |
||
4847 | movzx eax,byte ptr [offset _null]{}@@Col1: |
||
4848 | movzx edx,byte ptr [offset _null]{}@@Col2: |
||
4849 | sub eax,edx |
||
4850 | mov al,byte ptr [offset (_SubTable + 255 + eax)] |
||
4851 | mov byte ptr [offset _null],al{}@@Dest: |
||
4852 | @@EndCode: |
||
4853 | {$I DXRender.inc} |
||
4854 | { @@Col1 } |
||
4855 | mov eax,Col1; inc eax |
||
4856 | mov edx,offset @@Col1-4 |
||
4857 | sub edx,offset @@StartCode |
||
4858 | mov dword ptr [ecx+edx],eax |
||
4859 | |||
4860 | { @@Col2 } |
||
4861 | mov eax,Col2; inc eax |
||
4862 | mov edx,offset @@Col2-4 |
||
4863 | sub edx,offset @@StartCode |
||
4864 | mov dword ptr [ecx+edx],eax |
||
4865 | |||
4866 | { @@Dest } |
||
4867 | mov eax,Dest; inc eax |
||
4868 | mov edx,offset @@Dest-4 |
||
4869 | sub edx,offset @@StartCode |
||
4870 | mov dword ptr [ecx+edx],eax |
||
4871 | end; |
||
4872 | end; |
||
4873 | |||
4874 | procedure Func_const1_Sub_col2(var Code: Pointer; Dest, col1, col2: PWord); |
||
4875 | begin |
||
4876 | asm |
||
4877 | jmp @@EndCode |
||
4878 | @@StartCode: |
||
4879 | mov eax,$11111111{}@@Col1: |
||
4880 | movzx edx,byte ptr [offset _null]{}@@Col2: |
||
4881 | sub eax,edx |
||
4882 | mov al,byte ptr [offset (_SubTable + 255 + eax)] |
||
4883 | mov byte ptr [offset _null],al{}@@Dest: |
||
4884 | @@EndCode: |
||
4885 | {$I DXRender.inc} |
||
4886 | { @@Col1 } |
||
4887 | mov eax,Col1; inc eax; movzx eax,byte ptr [eax] |
||
4888 | mov edx,offset @@Col1-4 |
||
4889 | sub edx,offset @@StartCode |
||
4890 | mov dword ptr [ecx+edx],eax |
||
4891 | |||
4892 | { @@Col2 } |
||
4893 | mov eax,Col2; inc eax |
||
4894 | mov edx,offset @@Col2-4 |
||
4895 | sub edx,offset @@StartCode |
||
4896 | mov dword ptr [ecx+edx],eax |
||
4897 | |||
4898 | { @@Dest } |
||
4899 | mov eax,Dest; inc eax |
||
4900 | mov edx,offset @@Dest-4 |
||
4901 | sub edx,offset @@StartCode |
||
4902 | mov dword ptr [ecx+edx],eax |
||
4903 | end; |
||
4904 | end; |
||
4905 | |||
4906 | procedure Func_col1_Sub_const2(var Code: Pointer; Dest, col1, col2: PWord); |
||
4907 | begin |
||
4908 | asm |
||
4909 | jmp @@EndCode |
||
4910 | @@StartCode: |
||
4911 | movzx eax,byte ptr [offset _null]{}@@Col1: |
||
4912 | mov al,byte ptr [$11111111 + eax]{}@@Col2: |
||
4913 | mov byte ptr [offset _null],al{}@@Dest: |
||
4914 | @@EndCode: |
||
4915 | {$I DXRender.inc} |
||
4916 | { @@Col1 } |
||
4917 | mov eax,Col1; inc eax |
||
4918 | mov edx,offset @@Col1-4 |
||
4919 | sub edx,offset @@StartCode |
||
4920 | mov dword ptr [ecx+edx],eax |
||
4921 | |||
4922 | { @@Col2 } |
||
4923 | mov eax,Col2; inc eax; movzx eax,byte ptr [eax]; neg eax |
||
4924 | add eax,offset _SubTable+255 |
||
4925 | |||
4926 | mov edx,offset @@Col2-4 |
||
4927 | sub edx,offset @@StartCode |
||
4928 | mov dword ptr [ecx+edx],eax |
||
4929 | |||
4930 | { @@Dest } |
||
4931 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R+1) |
||
4932 | mov edx,offset @@Dest-4 |
||
4933 | sub edx,offset @@StartCode |
||
4934 | mov dword ptr [ecx+edx],eax |
||
4935 | end; |
||
4936 | end; |
||
4937 | |||
4938 | procedure genBlend_ZERO(var Code: Pointer; Dest: PDXRMachine_Color); |
||
4939 | begin |
||
4940 | asm |
||
4941 | jmp @@EndCode |
||
4942 | @@StartCode: |
||
4943 | mov dword ptr [offset _null],0{}@@Dest: |
||
4944 | mov dword ptr [offset _null],0{}@@Dest2: |
||
4945 | @@EndCode: |
||
4946 | {$I DXRender.inc} |
||
4947 | { @@Dest } |
||
4948 | mov eax,Dest |
||
4949 | mov edx,offset @@Dest-8 |
||
4950 | sub edx,offset @@StartCode |
||
4951 | mov dword ptr [ecx+edx],eax |
||
4952 | |||
4953 | { @@Dest2 } |
||
4954 | mov eax,Dest; add eax,4 |
||
4955 | mov edx,offset @@Dest2-8 |
||
4956 | sub edx,offset @@StartCode |
||
4957 | mov dword ptr [ecx+edx],eax |
||
4958 | end; |
||
4959 | end; |
||
4960 | |||
4961 | procedure genBlend_ONE1(var Code: Pointer; Dest, Col1: PDXRMachine_Color; |
||
4962 | ConstChannels1: TDXRColorChannels); |
||
4963 | begin |
||
4964 | if Dest=Col1 then Exit; |
||
4965 | |||
4966 | if UseMMX then |
||
4967 | begin |
||
4968 | FMMXUsed := True; |
||
4969 | asm |
||
4970 | jmp @@EndCode |
||
4971 | @@StartCode: |
||
4972 | db $0F,$6F,$05,$11,$11,$11,$11/// movq mm0,qword ptr [$11111111] |
||
4973 | @@Col: |
||
4974 | db $0F,$7F,$05,$11,$11,$11,$11/// movq qword ptr [$11111111],mm0 |
||
4975 | @@Dest: |
||
4976 | @@EndCode: |
||
4977 | {$I DXRender.inc} |
||
4978 | { @@Col } |
||
4979 | mov eax,Col1 |
||
4980 | mov edx,offset @@Col-4 |
||
4981 | sub edx,offset @@StartCode |
||
4982 | mov dword ptr [ecx+edx],eax |
||
4983 | |||
4984 | { @@Dest } |
||
4985 | mov eax,Dest |
||
4986 | mov edx,offset @@Dest-4 |
||
4987 | sub edx,offset @@StartCode |
||
4988 | mov dword ptr [ecx+edx],eax |
||
4989 | end; |
||
4990 | end else |
||
4991 | begin |
||
4992 | if ConstChannels1=[chRed, chGreen, chBlue, chAlpha] then |
||
4993 | begin |
||
4994 | asm |
||
4995 | jmp @@EndCode |
||
4996 | @@StartCode: |
||
4997 | mov dword ptr [offset _null],$11111111{}@@Dest: |
||
4998 | mov dword ptr [offset _null],$11111111{}@@Dest2: |
||
4999 | @@EndCode: |
||
5000 | {$I DXRender.inc} |
||
5001 | { @@Dest } |
||
5002 | mov eax,Col1 |
||
5003 | mov eax,dword ptr [eax] |
||
5004 | mov edx,offset @@Dest-4 |
||
5005 | sub edx,offset @@StartCode |
||
5006 | mov dword ptr [ecx+edx],eax |
||
5007 | |||
5008 | mov eax,Dest |
||
5009 | mov edx,offset @@Dest-8 |
||
5010 | sub edx,offset @@StartCode |
||
5011 | mov dword ptr [ecx+edx],eax |
||
5012 | |||
5013 | { @@Dest2 } |
||
5014 | mov eax,Col1; add eax,4 |
||
5015 | mov eax,dword ptr [eax] |
||
5016 | mov edx,offset @@Dest2-4 |
||
5017 | sub edx,offset @@StartCode |
||
5018 | mov dword ptr [ecx+edx],eax |
||
5019 | |||
5020 | mov eax,Dest; add eax,8 |
||
5021 | mov edx,offset @@Dest2-4 |
||
5022 | sub edx,offset @@StartCode |
||
5023 | mov dword ptr [ecx+edx],eax |
||
5024 | end; |
||
5025 | end else |
||
5026 | begin |
||
5027 | asm |
||
5028 | jmp @@EndCode |
||
5029 | @@StartCode: |
||
5030 | mov eax,dword ptr [offset _null]{}@@Col: |
||
5031 | mov edx,dword ptr [offset _null]{}@@Col2: |
||
5032 | mov dword ptr [offset _null],eax{}@@Dest: |
||
5033 | mov dword ptr [offset _null],edx{}@@Dest2: |
||
5034 | @@EndCode: |
||
5035 | {$I DXRender.inc} |
||
5036 | { @@Col } |
||
5037 | mov eax,Col1 |
||
5038 | mov edx,offset @@Col-4 |
||
5039 | sub edx,offset @@StartCode |
||
5040 | mov dword ptr [ecx+edx],eax |
||
5041 | |||
5042 | { @@Col2 } |
||
5043 | mov eax,Col1; add eax,4 |
||
5044 | mov edx,offset @@Col2-4 |
||
5045 | sub edx,offset @@StartCode |
||
5046 | mov dword ptr [ecx+edx],eax |
||
5047 | |||
5048 | { @@Dest } |
||
5049 | mov eax,Dest |
||
5050 | mov edx,offset @@Dest-4 |
||
5051 | sub edx,offset @@StartCode |
||
5052 | mov dword ptr [ecx+edx],eax |
||
5053 | |||
5054 | { @@Dest2 } |
||
5055 | mov eax,Dest; add eax,4 |
||
5056 | mov edx,offset @@Dest2-4 |
||
5057 | sub edx,offset @@StartCode |
||
5058 | mov dword ptr [ecx+edx],eax |
||
5059 | end; |
||
5060 | end; |
||
5061 | end; |
||
5062 | end; |
||
5063 | |||
5064 | procedure genBlend_ONE1_ADD_ONE2(var Code: Pointer; Dest, Col1, Col2: PDXRMachine_Color; |
||
5065 | ConstChannels1, ConstChannels12: TDXRColorChannels); |
||
5066 | begin |
||
5067 | if UseMMX then |
||
5068 | begin |
||
5069 | FMMXUsed := True; |
||
5070 | asm |
||
5071 | jmp @@EndCode |
||
5072 | @@StartCode: |
||
5073 | db $0F,$6F,$05,$11,$11,$11,$11/// movq mm0,qword ptr [$11111111] |
||
5074 | @@Col1: |
||
5075 | db $0F,$DD,$05,$11,$11,$11,$11/// paddusw mm0,qword ptr [$11111111] |
||
5076 | @@Col2: |
||
5077 | db $0F,$7F,$05,$11,$11,$11,$11/// movq qword ptr [$11111111],mm0 |
||
5078 | @@Dest: |
||
5079 | @@EndCode: |
||
5080 | {$I DXRender.inc} |
||
5081 | { @@Col1 } |
||
5082 | mov eax,Col1 |
||
5083 | mov edx,offset @@Col1-4 |
||
5084 | sub edx,offset @@StartCode |
||
5085 | mov dword ptr [ecx+edx],eax |
||
5086 | |||
5087 | { @@Col2 } |
||
5088 | mov eax,Col2 |
||
5089 | mov edx,offset @@Col2-4 |
||
5090 | sub edx,offset @@StartCode |
||
5091 | mov dword ptr [ecx+edx],eax |
||
5092 | |||
5093 | { @@Dest } |
||
5094 | mov eax,Dest |
||
5095 | mov edx,offset @@Dest-4 |
||
5096 | sub edx,offset @@StartCode |
||
5097 | mov dword ptr [ecx+edx],eax |
||
5098 | end; |
||
5099 | end else |
||
5100 | begin |
||
5101 | { Red Channel } |
||
5102 | if chRed in EnableChannels then |
||
5103 | begin |
||
5104 | if chRed in ConstChannels1 then |
||
5105 | begin |
||
5106 | Func_col1_Add_const2(Code, @Dest.R, @Col2.R, @Col1.R); |
||
5107 | end else |
||
5108 | if chRed in ConstChannels2 then |
||
5109 | begin |
||
5110 | Func_col1_Add_const2(Code, @Dest.R, @Col1.R, @Col2.R); |
||
5111 | end else |
||
5112 | Func_col1_Add_col2(Code, @Dest.R, @Col1.R, @Col2.R); |
||
5113 | end; |
||
5114 | |||
5115 | { Green Channel } |
||
5116 | if chGreen in EnableChannels then |
||
5117 | begin |
||
5118 | if chRed in ConstChannels1 then |
||
5119 | begin |
||
5120 | Func_col1_Add_const2(Code, @Dest.G, @Col2.G, @Col1.G); |
||
5121 | end else |
||
5122 | if chRed in ConstChannels2 then |
||
5123 | begin |
||
5124 | Func_col1_Add_const2(Code, @Dest.G, @Col1.G, @Col2.G); |
||
5125 | end else |
||
5126 | Func_col1_Add_col2(Code, @Dest.G, @Col1.G, @Col2.G); |
||
5127 | end; |
||
5128 | |||
5129 | { Blue Channel } |
||
5130 | if chBlue in EnableChannels then |
||
5131 | begin |
||
5132 | if chRed in ConstChannels1 then |
||
5133 | begin |
||
5134 | Func_col1_Add_const2(Code, @Dest.B, @Col2.B, @Col1.B); |
||
5135 | end else |
||
5136 | if chRed in ConstChannels2 then |
||
5137 | begin |
||
5138 | Func_col1_Add_const2(Code, @Dest.B, @Col1.B, @Col2.B); |
||
5139 | end else |
||
5140 | Func_col1_Add_col2(Code, @Dest.B, @Col1.B, @Col2.B); |
||
5141 | end; |
||
5142 | |||
5143 | { Alpha Channel } |
||
5144 | if chAlpha in EnableChannels then |
||
5145 | begin |
||
5146 | if chRed in ConstChannels1 then |
||
5147 | begin |
||
5148 | Func_col1_Add_const2(Code, @Dest.A, @Col2.A, @Col1.A); |
||
5149 | end else |
||
5150 | if chRed in ConstChannels2 then |
||
5151 | begin |
||
5152 | Func_col1_Add_const2(Code, @Dest.A, @Col1.A, @Col2.A); |
||
5153 | end else |
||
5154 | Func_col1_Add_col2(Code, @Dest.A, @Col1.A, @Col2.A); |
||
5155 | end; |
||
5156 | end; |
||
5157 | end; |
||
5158 | |||
5159 | procedure genBlend_ONE1_SUB_ONE2(var Code: Pointer; Dest, Col1, Col2: PDXRMachine_Color; |
||
5160 | ConstChannels1, ConstChannels12: TDXRColorChannels); |
||
5161 | begin |
||
5162 | if UseMMX then |
||
5163 | begin |
||
5164 | FMMXUsed := True; |
||
5165 | asm |
||
5166 | jmp @@EndCode |
||
5167 | @@StartCode: |
||
5168 | db $0F,$6F,$05,$11,$11,$11,$11/// movq mm0,qword ptr [$11111111] |
||
5169 | @@Col1: |
||
5170 | db $0F,$D9,$05,$11,$11,$11,$11/// psubusw mm0,qword ptr [$11111111] |
||
5171 | @@Col2: |
||
5172 | db $0F,$7F,$05,$11,$11,$11,$11/// movq qword ptr [$11111111],mm0 |
||
5173 | @@Dest: |
||
5174 | @@EndCode: |
||
5175 | {$I DXRender.inc} |
||
5176 | { @@Col1 } |
||
5177 | mov eax,Col1 |
||
5178 | mov edx,offset @@Col1-4 |
||
5179 | sub edx,offset @@StartCode |
||
5180 | mov dword ptr [ecx+edx],eax |
||
5181 | |||
5182 | { @@Col2 } |
||
5183 | mov eax,Col2 |
||
5184 | mov edx,offset @@Col2-4 |
||
5185 | sub edx,offset @@StartCode |
||
5186 | mov dword ptr [ecx+edx],eax |
||
5187 | |||
5188 | { @@Dest } |
||
5189 | mov eax,Dest |
||
5190 | mov edx,offset @@Dest-4 |
||
5191 | sub edx,offset @@StartCode |
||
5192 | mov dword ptr [ecx+edx],eax |
||
5193 | end; |
||
5194 | end else |
||
5195 | begin |
||
5196 | { Red Channel } |
||
5197 | if chRed in EnableChannels then |
||
5198 | begin |
||
5199 | if chRed in ConstChannels1 then |
||
5200 | begin |
||
5201 | Func_col1_Sub_const2(Code, @Dest.R, @Col1.R, @Col2.R); |
||
5202 | end else |
||
5203 | if chRed in ConstChannels2 then |
||
5204 | begin |
||
5205 | Func_const1_Sub_col2(Code, @Dest.R, @Col2.R, @Col1.R); |
||
5206 | end else |
||
5207 | Func_col1_Sub_col2(Code, @Dest.R, @Col1.R, @Col2.R); |
||
5208 | end; |
||
5209 | |||
5210 | { Green Channel } |
||
5211 | if chRed in EnableChannels then |
||
5212 | begin |
||
5213 | if chRed in ConstChannels1 then |
||
5214 | begin |
||
5215 | Func_col1_Sub_const2(Code, @Dest.G, @Col1.G, @Col2.G); |
||
5216 | end else |
||
5217 | if chRed in ConstChannels2 then |
||
5218 | begin |
||
5219 | Func_const1_Sub_col2(Code, @Dest.G, @Col2.G, @Col1.G); |
||
5220 | end else |
||
5221 | Func_col1_Sub_col2(Code, @Dest.G, @Col1.G, @Col2.G); |
||
5222 | end; |
||
5223 | |||
5224 | { Blue Channel } |
||
5225 | if chRed in EnableChannels then |
||
5226 | begin |
||
5227 | if chRed in ConstChannels1 then |
||
5228 | begin |
||
5229 | Func_col1_Sub_const2(Code, @Dest.B, @Col1.B, @Col2.B); |
||
5230 | end else |
||
5231 | if chRed in ConstChannels2 then |
||
5232 | begin |
||
5233 | Func_const1_Sub_col2(Code, @Dest.B, @Col2.B, @Col1.B); |
||
5234 | end else |
||
5235 | Func_col1_Sub_col2(Code, @Dest.B, @Col1.B, @Col2.B); |
||
5236 | end; |
||
5237 | |||
5238 | { Alpha Channel } |
||
5239 | if chRed in EnableChannels then |
||
5240 | begin |
||
5241 | if chRed in ConstChannels1 then |
||
5242 | begin |
||
5243 | Func_col1_Sub_const2(Code, @Dest.A, @Col1.A, @Col2.A); |
||
5244 | end else |
||
5245 | if chRed in ConstChannels2 then |
||
5246 | begin |
||
5247 | Func_const1_Sub_col2(Code, @Dest.A, @Col2.A, @Col1.A); |
||
5248 | end else |
||
5249 | Func_col1_Sub_col2(Code, @Dest.A, @Col1.A, @Col2.A); |
||
5250 | end; |
||
5251 | end; |
||
5252 | end; |
||
5253 | |||
5254 | procedure genBlend_ONE1_MUL_ONE2(var Code: Pointer; Dest, Col1, Col2: PDXRMachine_Color; |
||
5255 | ConstChannels1, ConstChannels12: TDXRColorChannels); |
||
5256 | begin |
||
5257 | if UseMMX then |
||
5258 | begin |
||
5259 | FMMXUsed := True; |
||
5260 | asm |
||
5261 | jmp @@EndCode |
||
5262 | @@StartCode: |
||
5263 | db $0F,$6F,$05,$11,$11,$11,$11/// movq mm0,qword ptr [$11111111] |
||
5264 | @@Col1: |
||
5265 | db $0F,$6F,$0D,$11,$11,$11,$11/// movq mm1,qword ptr [$11111111] |
||
5266 | @@Col2: |
||
5267 | db $0F,$71,$D0,$01 /// psrlw mm0,1 |
||
5268 | db $0F,$71,$D1,$01 /// psrlw mm1,1 |
||
5269 | db $0F,$E5,$C1 /// pmulhw mm0,mm1 |
||
5270 | db $0F,$71,$F0,$02 /// psllw mm0,2 |
||
5271 | db $0F,$7F,$05,$11,$11,$11,$11/// movq qword ptr [$11111111],mm0 |
||
5272 | @@Dest: |
||
5273 | @@EndCode: |
||
5274 | {$I DXRender.inc} |
||
5275 | { @@Col1 } |
||
5276 | mov eax,Col1 |
||
5277 | mov edx,offset @@Col1-4 |
||
5278 | sub edx,offset @@StartCode |
||
5279 | mov dword ptr [ecx+edx],eax |
||
5280 | |||
5281 | { @@Col2 } |
||
5282 | mov eax,Col2 |
||
5283 | mov edx,offset @@Col2-4 |
||
5284 | sub edx,offset @@StartCode |
||
5285 | mov dword ptr [ecx+edx],eax |
||
5286 | |||
5287 | { @@Dest } |
||
5288 | mov eax,Dest |
||
5289 | mov edx,offset @@Dest-4 |
||
5290 | sub edx,offset @@StartCode |
||
5291 | mov dword ptr [ecx+edx],eax |
||
5292 | end; |
||
5293 | end else |
||
5294 | begin |
||
5295 | if chRed in EnableChannels then |
||
5296 | begin |
||
5297 | asm |
||
5298 | jmp @@EndCode |
||
5299 | @@StartCode: |
||
5300 | mov al,byte ptr [offset offset _null]{}@@Col1: |
||
5301 | mul byte ptr [offset offset _null] {}@@Col2: |
||
5302 | mov byte ptr [offset offset _null],ah{}@@Dest: |
||
5303 | @@EndCode: |
||
5304 | {$I DXRender.inc} |
||
5305 | { @@Col1 } |
||
5306 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.R+1) |
||
5307 | mov edx,offset @@Col1-4 |
||
5308 | sub edx,offset @@StartCode |
||
5309 | mov dword ptr [ecx+edx],eax |
||
5310 | |||
5311 | { @@Col2 } |
||
5312 | mov eax,Col2; add eax,BYTE(TDXRMachine_Color.R+1) |
||
5313 | mov edx,offset @@Col2-4 |
||
5314 | sub edx,offset @@StartCode |
||
5315 | mov dword ptr [ecx+edx],eax |
||
5316 | |||
5317 | { @@Dest } |
||
5318 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R+1) |
||
5319 | mov edx,offset @@Dest-4 |
||
5320 | sub edx,offset @@StartCode |
||
5321 | mov dword ptr [ecx+edx],eax |
||
5322 | end; |
||
5323 | end; |
||
5324 | |||
5325 | if chGreen in EnableChannels then |
||
5326 | begin |
||
5327 | asm |
||
5328 | jmp @@EndCode |
||
5329 | @@StartCode: |
||
5330 | mov al,byte ptr [offset offset _null]{}@@Col1: |
||
5331 | mul byte ptr [offset offset _null] {}@@Col2: |
||
5332 | mov byte ptr [offset offset _null],ah{}@@Dest: |
||
5333 | @@EndCode: |
||
5334 | {$I DXRender.inc} |
||
5335 | { @@Col1 } |
||
5336 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.G+1) |
||
5337 | mov edx,offset @@Col1-4 |
||
5338 | sub edx,offset @@StartCode |
||
5339 | mov dword ptr [ecx+edx],eax |
||
5340 | |||
5341 | { @@Col2 } |
||
5342 | mov eax,Col2; add eax,BYTE(TDXRMachine_Color.G+1) |
||
5343 | mov edx,offset @@Col2-4 |
||
5344 | sub edx,offset @@StartCode |
||
5345 | mov dword ptr [ecx+edx],eax |
||
5346 | |||
5347 | { @@Dest } |
||
5348 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G+1) |
||
5349 | mov edx,offset @@Dest-4 |
||
5350 | sub edx,offset @@StartCode |
||
5351 | mov dword ptr [ecx+edx],eax |
||
5352 | end; |
||
5353 | end; |
||
5354 | |||
5355 | if chBlue in EnableChannels then |
||
5356 | begin |
||
5357 | asm |
||
5358 | jmp @@EndCode |
||
5359 | @@StartCode: |
||
5360 | mov al,byte ptr [offset offset _null]{}@@Col1: |
||
5361 | mul byte ptr [offset offset _null] {}@@Col2: |
||
5362 | mov byte ptr [offset offset _null],ah{}@@Dest: |
||
5363 | @@EndCode: |
||
5364 | {$I DXRender.inc} |
||
5365 | { @@Col1 } |
||
5366 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.B+1) |
||
5367 | mov edx,offset @@Col1-4 |
||
5368 | sub edx,offset @@StartCode |
||
5369 | mov dword ptr [ecx+edx],eax |
||
5370 | |||
5371 | { @@Col2 } |
||
5372 | mov eax,Col2; add eax,BYTE(TDXRMachine_Color.B+1) |
||
5373 | mov edx,offset @@Col2-4 |
||
5374 | sub edx,offset @@StartCode |
||
5375 | mov dword ptr [ecx+edx],eax |
||
5376 | |||
5377 | { @@Dest } |
||
5378 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B+1) |
||
5379 | mov edx,offset @@Dest-4 |
||
5380 | sub edx,offset @@StartCode |
||
5381 | mov dword ptr [ecx+edx],eax |
||
5382 | end; |
||
5383 | end; |
||
5384 | |||
5385 | if chAlpha in EnableChannels then |
||
5386 | begin |
||
5387 | asm |
||
5388 | jmp @@EndCode |
||
5389 | @@StartCode: |
||
5390 | mov al,byte ptr [offset offset _null]{}@@Col1: |
||
5391 | mul byte ptr [offset offset _null] {}@@Col2: |
||
5392 | mov byte ptr [offset offset _null],ah{}@@Dest: |
||
5393 | @@EndCode: |
||
5394 | {$I DXRender.inc} |
||
5395 | { @@Col1 } |
||
5396 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.A+1) |
||
5397 | mov edx,offset @@Col1-4 |
||
5398 | sub edx,offset @@StartCode |
||
5399 | mov dword ptr [ecx+edx],eax |
||
5400 | |||
5401 | { @@Col2 } |
||
5402 | mov eax,Col2; add eax,BYTE(TDXRMachine_Color.A+1) |
||
5403 | mov edx,offset @@Col2-4 |
||
5404 | sub edx,offset @@StartCode |
||
5405 | mov dword ptr [ecx+edx],eax |
||
5406 | |||
5407 | { @@Dest } |
||
5408 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1) |
||
5409 | mov edx,offset @@Dest-4 |
||
5410 | sub edx,offset @@StartCode |
||
5411 | mov dword ptr [ecx+edx],eax |
||
5412 | end; |
||
5413 | end; |
||
5414 | end; |
||
5415 | end; |
||
5416 | |||
5417 | procedure genBlend_SRCALPHA1(var Code: Pointer; Dest, Col1: PDXRMachine_Color; |
||
5418 | ConstChannels1: TDXRColorChannels); |
||
5419 | begin |
||
5420 | asm |
||
5421 | jmp @@EndCode |
||
5422 | @@StartCode: |
||
5423 | movzx ebx,byte ptr [offset _null]{}@@Col1: |
||
5424 | @@EndCode: |
||
5425 | {$I DXRender.inc} |
||
5426 | { @@Col1 } |
||
5427 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.A+1) |
||
5428 | mov edx,offset @@Col1-4 |
||
5429 | sub edx,offset @@StartCode |
||
5430 | mov dword ptr [ecx+edx],eax |
||
5431 | end; |
||
5432 | |||
5433 | if [chRed, chGreen]<=EnableChannels then |
||
5434 | begin |
||
5435 | asm |
||
5436 | jmp @@EndCode |
||
5437 | @@StartCode: |
||
5438 | mov eax,dword ptr [offset _null]{}@@Col1: |
||
5439 | shr eax,8 |
||
5440 | and eax,$00FF00FF |
||
5441 | imul eax,ebx |
||
5442 | mov dword ptr [offset _null],eax{}@@Dest: |
||
5443 | @@EndCode: |
||
5444 | {$I DXRender.inc} |
||
5445 | { @@Col1 } |
||
5446 | mov eax,Col1 |
||
5447 | mov edx,offset @@Col1-4 |
||
5448 | sub edx,offset @@StartCode |
||
5449 | mov dword ptr [ecx+edx],eax |
||
5450 | |||
5451 | { @@Dest } |
||
5452 | mov eax,Dest |
||
5453 | mov edx,offset @@Dest-4 |
||
5454 | sub edx,offset @@StartCode |
||
5455 | mov dword ptr [ecx+edx],eax |
||
5456 | end; |
||
5457 | end else |
||
5458 | begin |
||
5459 | if chRed in EnableChannels then |
||
5460 | begin |
||
5461 | asm |
||
5462 | jmp @@EndCode |
||
5463 | @@StartCode: |
||
5464 | movzx eax,byte ptr [offset _null]{}@@Col1: |
||
5465 | imul eax,ebx |
||
5466 | mov byte ptr [offset _null],ah{}@@Dest: |
||
5467 | @@EndCode: |
||
5468 | {$I DXRender.inc} |
||
5469 | { @@Col1 } |
||
5470 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.R+1) |
||
5471 | mov edx,offset @@Col1-4 |
||
5472 | sub edx,offset @@StartCode |
||
5473 | mov dword ptr [ecx+edx],eax |
||
5474 | |||
5475 | { @@Dest } |
||
5476 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R+1) |
||
5477 | mov edx,offset @@Dest-4 |
||
5478 | sub edx,offset @@StartCode |
||
5479 | mov dword ptr [ecx+edx],eax |
||
5480 | end; |
||
5481 | end; |
||
5482 | |||
5483 | if chGreen in EnableChannels then |
||
5484 | begin |
||
5485 | asm |
||
5486 | jmp @@EndCode |
||
5487 | @@StartCode: |
||
5488 | movzx eax,byte ptr [offset _null]{}@@Col1: |
||
5489 | imul eax,ebx |
||
5490 | mov byte ptr [offset _null],ah{}@@Dest: |
||
5491 | @@EndCode: |
||
5492 | {$I DXRender.inc} |
||
5493 | { @@Col1 } |
||
5494 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.G+1) |
||
5495 | mov edx,offset @@Col1-4 |
||
5496 | sub edx,offset @@StartCode |
||
5497 | mov dword ptr [ecx+edx],eax |
||
5498 | |||
5499 | { @@Dest } |
||
5500 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G+1) |
||
5501 | mov edx,offset @@Dest-4 |
||
5502 | sub edx,offset @@StartCode |
||
5503 | mov dword ptr [ecx+edx],eax |
||
5504 | end; |
||
5505 | end; |
||
5506 | end; |
||
5507 | |||
5508 | if [chBlue, chAlpha]<=EnableChannels then |
||
5509 | begin |
||
5510 | asm |
||
5511 | jmp @@EndCode |
||
5512 | @@StartCode: |
||
5513 | mov eax,dword ptr [offset _null]{}@@Col1: |
||
5514 | shr eax,8 |
||
5515 | and eax,$00FF00FF |
||
5516 | imul eax,ebx |
||
5517 | mov dword ptr [offset _null],eax{}@@Dest: |
||
5518 | @@EndCode: |
||
5519 | {$I DXRender.inc} |
||
5520 | { @@Col1 } |
||
5521 | mov eax,Col1; add eax,4 |
||
5522 | mov edx,offset @@Col1-4 |
||
5523 | sub edx,offset @@StartCode |
||
5524 | mov dword ptr [ecx+edx],eax |
||
5525 | |||
5526 | { @@Dest } |
||
5527 | mov eax,Dest; add eax,4 |
||
5528 | mov edx,offset @@Dest-4 |
||
5529 | sub edx,offset @@StartCode |
||
5530 | mov dword ptr [ecx+edx],eax |
||
5531 | end; |
||
5532 | end else |
||
5533 | begin |
||
5534 | if chBlue in EnableChannels then |
||
5535 | begin |
||
5536 | asm |
||
5537 | jmp @@EndCode |
||
5538 | @@StartCode: |
||
5539 | movzx eax,byte ptr [offset _null]{}@@Col1: |
||
5540 | imul eax,ebx |
||
5541 | mov byte ptr [offset _null],ah{}@@Dest: |
||
5542 | @@EndCode: |
||
5543 | {$I DXRender.inc} |
||
5544 | { @@Col1 } |
||
5545 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.B+1) |
||
5546 | mov edx,offset @@Col1-4 |
||
5547 | sub edx,offset @@StartCode |
||
5548 | mov dword ptr [ecx+edx],eax |
||
5549 | |||
5550 | { @@Dest } |
||
5551 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B+1) |
||
5552 | mov edx,offset @@Dest-4 |
||
5553 | sub edx,offset @@StartCode |
||
5554 | mov dword ptr [ecx+edx],eax |
||
5555 | end; |
||
5556 | end; |
||
5557 | |||
5558 | if chAlpha in EnableChannels then |
||
5559 | begin |
||
5560 | asm |
||
5561 | jmp @@EndCode |
||
5562 | @@StartCode: |
||
5563 | movzx eax,byte ptr [offset _null]{}@@Col1: |
||
5564 | imul eax,ebx |
||
5565 | mov byte ptr [offset _null],ah{}@@Dest: |
||
5566 | @@EndCode: |
||
5567 | {$I DXRender.inc} |
||
5568 | { @@Col1 } |
||
5569 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.A+1) |
||
5570 | mov edx,offset @@Col1-4 |
||
5571 | sub edx,offset @@StartCode |
||
5572 | mov dword ptr [ecx+edx],eax |
||
5573 | |||
5574 | { @@Dest } |
||
5575 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1) |
||
5576 | mov edx,offset @@Dest-4 |
||
5577 | sub edx,offset @@StartCode |
||
5578 | mov dword ptr [ecx+edx],eax |
||
5579 | end; |
||
5580 | end; |
||
5581 | end; |
||
5582 | end; |
||
5583 | |||
5584 | procedure genBlend_SRCALPHA1_ADD_ONE2(var Code: Pointer; Dest, Col1, Col2: PDXRMachine_Color; |
||
5585 | ConstChannels1, ConstChannels12: TDXRColorChannels); |
||
5586 | begin |
||
5587 | asm |
||
5588 | jmp @@EndCode |
||
5589 | @@StartCode: |
||
5590 | movzx ebx,byte ptr [offset _null]{}@@Col1: |
||
5591 | @@EndCode: |
||
5592 | {$I DXRender.inc} |
||
5593 | { @@Col1 } |
||
5594 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.A+1) |
||
5595 | mov edx,offset @@Col1-4 |
||
5596 | sub edx,offset @@StartCode |
||
5597 | mov dword ptr [ecx+edx],eax |
||
5598 | end; |
||
5599 | |||
5600 | if chRed in EnableChannels then |
||
5601 | begin |
||
5602 | asm |
||
5603 | jmp @@EndCode |
||
5604 | @@StartCode: |
||
5605 | movzx eax,byte ptr [offset _null]{}@@Col1: |
||
5606 | movzx edx,byte ptr [offset _null]{}@@Col2: |
||
5607 | imul eax,ebx |
||
5608 | shr eax,8 |
||
5609 | mov al,byte ptr [offset (_AddTable + eax + edx)] |
||
5610 | mov byte ptr [offset _null],al{}@@Dest: |
||
5611 | @@EndCode: |
||
5612 | {$I DXRender.inc} |
||
5613 | { @@Col1 } |
||
5614 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.R+1) |
||
5615 | mov edx,offset @@Col1-4 |
||
5616 | sub edx,offset @@StartCode |
||
5617 | mov dword ptr [ecx+edx],eax |
||
5618 | |||
5619 | { @@Col2 } |
||
5620 | mov eax,Col2; add eax,BYTE(TDXRMachine_Color.R+1) |
||
5621 | mov edx,offset @@Col2-4 |
||
5622 | sub edx,offset @@StartCode |
||
5623 | mov dword ptr [ecx+edx],eax |
||
5624 | |||
5625 | { @@Dest } |
||
5626 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R+1) |
||
5627 | mov edx,offset @@Dest-4 |
||
5628 | sub edx,offset @@StartCode |
||
5629 | mov dword ptr [ecx+edx],eax |
||
5630 | end; |
||
5631 | end; |
||
5632 | |||
5633 | if chGreen in EnableChannels then |
||
5634 | begin |
||
5635 | asm |
||
5636 | jmp @@EndCode |
||
5637 | @@StartCode: |
||
5638 | movzx eax,byte ptr [offset _null]{}@@Col1: |
||
5639 | movzx edx,byte ptr [offset _null]{}@@Col2: |
||
5640 | imul eax,ebx |
||
5641 | shr eax,8 |
||
5642 | mov al,byte ptr [offset (_AddTable + eax + edx)] |
||
5643 | mov byte ptr [offset _null],al{}@@Dest: |
||
5644 | @@EndCode: |
||
5645 | {$I DXRender.inc} |
||
5646 | { @@Col1 } |
||
5647 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.G+1) |
||
5648 | mov edx,offset @@Col1-4 |
||
5649 | sub edx,offset @@StartCode |
||
5650 | mov dword ptr [ecx+edx],eax |
||
5651 | |||
5652 | { @@Col2 } |
||
5653 | mov eax,Col2; add eax,BYTE(TDXRMachine_Color.G+1) |
||
5654 | mov edx,offset @@Col2-4 |
||
5655 | sub edx,offset @@StartCode |
||
5656 | mov dword ptr [ecx+edx],eax |
||
5657 | |||
5658 | { @@Dest } |
||
5659 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G+1) |
||
5660 | mov edx,offset @@Dest-4 |
||
5661 | sub edx,offset @@StartCode |
||
5662 | mov dword ptr [ecx+edx],eax |
||
5663 | end; |
||
5664 | end; |
||
5665 | |||
5666 | if chBlue in EnableChannels then |
||
5667 | begin |
||
5668 | asm |
||
5669 | jmp @@EndCode |
||
5670 | @@StartCode: |
||
5671 | movzx eax,byte ptr [offset _null]{}@@Col1: |
||
5672 | movzx edx,byte ptr [offset _null]{}@@Col2: |
||
5673 | imul eax,ebx |
||
5674 | shr eax,8 |
||
5675 | mov al,byte ptr [offset (_AddTable + eax + edx)] |
||
5676 | mov byte ptr [offset _null],al{}@@Dest: |
||
5677 | @@EndCode: |
||
5678 | {$I DXRender.inc} |
||
5679 | { @@Col1 } |
||
5680 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.B+1) |
||
5681 | mov edx,offset @@Col1-4 |
||
5682 | sub edx,offset @@StartCode |
||
5683 | mov dword ptr [ecx+edx],eax |
||
5684 | |||
5685 | { @@Col2 } |
||
5686 | mov eax,Col2; add eax,BYTE(TDXRMachine_Color.B+1) |
||
5687 | mov edx,offset @@Col2-4 |
||
5688 | sub edx,offset @@StartCode |
||
5689 | mov dword ptr [ecx+edx],eax |
||
5690 | |||
5691 | { @@Dest } |
||
5692 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B+1) |
||
5693 | mov edx,offset @@Dest-4 |
||
5694 | sub edx,offset @@StartCode |
||
5695 | mov dword ptr [ecx+edx],eax |
||
5696 | end; |
||
5697 | end; |
||
5698 | |||
5699 | if chAlpha in EnableChannels then |
||
5700 | begin |
||
5701 | asm |
||
5702 | jmp @@EndCode |
||
5703 | @@StartCode: |
||
5704 | movzx eax,byte ptr [offset _null]{}@@Col1: |
||
5705 | movzx edx,byte ptr [offset _null]{}@@Col2: |
||
5706 | imul eax,ebx |
||
5707 | shr eax,8 |
||
5708 | mov al,byte ptr [offset (_AddTable + eax + edx)] |
||
5709 | mov byte ptr [offset _null],al{}@@Dest: |
||
5710 | @@EndCode: |
||
5711 | {$I DXRender.inc} |
||
5712 | { @@Col1 } |
||
5713 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.A+1) |
||
5714 | mov edx,offset @@Col1-4 |
||
5715 | sub edx,offset @@StartCode |
||
5716 | mov dword ptr [ecx+edx],eax |
||
5717 | |||
5718 | { @@Col2 } |
||
5719 | mov eax,Col2; add eax,BYTE(TDXRMachine_Color.A+1) |
||
5720 | mov edx,offset @@Col2-4 |
||
5721 | sub edx,offset @@StartCode |
||
5722 | mov dword ptr [ecx+edx],eax |
||
5723 | |||
5724 | { @@Dest } |
||
5725 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1) |
||
5726 | mov edx,offset @@Dest-4 |
||
5727 | sub edx,offset @@StartCode |
||
5728 | mov dword ptr [ecx+edx],eax |
||
5729 | end; |
||
5730 | end; |
||
5731 | end; |
||
5732 | |||
5733 | procedure genBlend_ONE2_SUB_SRCALPHA1(var Code: Pointer; Dest, Col1, Col2: PDXRMachine_Color; |
||
5734 | ConstChannels1, ConstChannels12: TDXRColorChannels); |
||
5735 | begin |
||
5736 | asm |
||
5737 | jmp @@EndCode |
||
5738 | @@StartCode: |
||
5739 | movzx ebx,byte ptr [offset _null]{}@@Col1: |
||
5740 | @@EndCode: |
||
5741 | {$I DXRender.inc} |
||
5742 | { @@Col1 } |
||
5743 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.A+1) |
||
5744 | mov edx,offset @@Col1-4 |
||
5745 | sub edx,offset @@StartCode |
||
5746 | mov dword ptr [ecx+edx],eax |
||
5747 | end; |
||
5748 | |||
5749 | if chRed in EnableChannels then |
||
5750 | begin |
||
5751 | asm |
||
5752 | jmp @@EndCode |
||
5753 | @@StartCode: |
||
5754 | movzx eax,byte ptr [offset _null]{}@@Col1: |
||
5755 | movzx edx,byte ptr [offset _null]{}@@Col2: |
||
5756 | imul eax,ebx |
||
5757 | shr eax,8 |
||
5758 | sub edx,eax |
||
5759 | mov al,byte ptr [offset (_SubTable + 255 + edx)] |
||
5760 | mov byte ptr [offset _null],al{}@@Dest: |
||
5761 | @@EndCode: |
||
5762 | {$I DXRender.inc} |
||
5763 | { @@Col1 } |
||
5764 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.R+1) |
||
5765 | mov edx,offset @@Col1-4 |
||
5766 | sub edx,offset @@StartCode |
||
5767 | mov dword ptr [ecx+edx],eax |
||
5768 | |||
5769 | { @@Col2 } |
||
5770 | mov eax,Col2; add eax,BYTE(TDXRMachine_Color.R+1) |
||
5771 | mov edx,offset @@Col2-4 |
||
5772 | sub edx,offset @@StartCode |
||
5773 | mov dword ptr [ecx+edx],eax |
||
5774 | |||
5775 | { @@Dest } |
||
5776 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R+1) |
||
5777 | mov edx,offset @@Dest-4 |
||
5778 | sub edx,offset @@StartCode |
||
5779 | mov dword ptr [ecx+edx],eax |
||
5780 | end; |
||
5781 | end; |
||
5782 | |||
5783 | if chGreen in EnableChannels then |
||
5784 | begin |
||
5785 | asm |
||
5786 | jmp @@EndCode |
||
5787 | @@StartCode: |
||
5788 | movzx eax,byte ptr [offset _null]{}@@Col1: |
||
5789 | movzx edx,byte ptr [offset _null]{}@@Col2: |
||
5790 | imul eax,ebx |
||
5791 | shr eax,8 |
||
5792 | sub edx,eax |
||
5793 | mov al,byte ptr [offset (_SubTable + 255 + edx)] |
||
5794 | mov byte ptr [offset _null],al{}@@Dest: |
||
5795 | @@EndCode: |
||
5796 | {$I DXRender.inc} |
||
5797 | { @@Col1 } |
||
5798 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.G+1) |
||
5799 | mov edx,offset @@Col1-4 |
||
5800 | sub edx,offset @@StartCode |
||
5801 | mov dword ptr [ecx+edx],eax |
||
5802 | |||
5803 | { @@Col2 } |
||
5804 | mov eax,Col2; add eax,BYTE(TDXRMachine_Color.G+1) |
||
5805 | mov edx,offset @@Col2-4 |
||
5806 | sub edx,offset @@StartCode |
||
5807 | mov dword ptr [ecx+edx],eax |
||
5808 | |||
5809 | { @@Dest } |
||
5810 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G+1) |
||
5811 | mov edx,offset @@Dest-4 |
||
5812 | sub edx,offset @@StartCode |
||
5813 | mov dword ptr [ecx+edx],eax |
||
5814 | end; |
||
5815 | end; |
||
5816 | |||
5817 | if chBlue in EnableChannels then |
||
5818 | begin |
||
5819 | asm |
||
5820 | jmp @@EndCode |
||
5821 | @@StartCode: |
||
5822 | movzx eax,byte ptr [offset _null]{}@@Col1: |
||
5823 | movzx edx,byte ptr [offset _null]{}@@Col2: |
||
5824 | imul eax,ebx |
||
5825 | shr eax,8 |
||
5826 | sub edx,eax |
||
5827 | mov al,byte ptr [offset (_SubTable + 255 + edx)] |
||
5828 | mov byte ptr [offset _null],al{}@@Dest: |
||
5829 | @@EndCode: |
||
5830 | {$I DXRender.inc} |
||
5831 | { @@Col1 } |
||
5832 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.B+1) |
||
5833 | mov edx,offset @@Col1-4 |
||
5834 | sub edx,offset @@StartCode |
||
5835 | mov dword ptr [ecx+edx],eax |
||
5836 | |||
5837 | { @@Col2 } |
||
5838 | mov eax,Col2; add eax,BYTE(TDXRMachine_Color.B+1) |
||
5839 | mov edx,offset @@Col2-4 |
||
5840 | sub edx,offset @@StartCode |
||
5841 | mov dword ptr [ecx+edx],eax |
||
5842 | |||
5843 | { @@Dest } |
||
5844 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B+1) |
||
5845 | mov edx,offset @@Dest-4 |
||
5846 | sub edx,offset @@StartCode |
||
5847 | mov dword ptr [ecx+edx],eax |
||
5848 | end; |
||
5849 | end; |
||
5850 | |||
5851 | if chAlpha in EnableChannels then |
||
5852 | begin |
||
5853 | asm |
||
5854 | jmp @@EndCode |
||
5855 | @@StartCode: |
||
5856 | movzx eax,byte ptr [offset _null]{}@@Col1: |
||
5857 | movzx edx,byte ptr [offset _null]{}@@Col2: |
||
5858 | imul eax,ebx |
||
5859 | shr eax,8 |
||
5860 | sub edx,eax |
||
5861 | mov al,byte ptr [offset (_SubTable + 255 + edx)] |
||
5862 | mov byte ptr [offset _null],al{}@@Dest: |
||
5863 | @@EndCode: |
||
5864 | {$I DXRender.inc} |
||
5865 | { @@Col1 } |
||
5866 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.A+1) |
||
5867 | mov edx,offset @@Col1-4 |
||
5868 | sub edx,offset @@StartCode |
||
5869 | mov dword ptr [ecx+edx],eax |
||
5870 | |||
5871 | { @@Col2 } |
||
5872 | mov eax,Col2; add eax,BYTE(TDXRMachine_Color.A+1) |
||
5873 | mov edx,offset @@Col2-4 |
||
5874 | sub edx,offset @@StartCode |
||
5875 | mov dword ptr [ecx+edx],eax |
||
5876 | |||
5877 | { @@Dest } |
||
5878 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1) |
||
5879 | mov edx,offset @@Dest-4 |
||
5880 | sub edx,offset @@StartCode |
||
5881 | mov dword ptr [ecx+edx],eax |
||
5882 | end; |
||
5883 | end; |
||
5884 | end; |
||
5885 | |||
5886 | procedure genBlend_SRCALPHA1_ADD_INVSRCALPHA2(var Code: Pointer; Dest, Col1, Col2: PDXRMachine_Color; |
||
5887 | ConstChannels1, ConstChannels12: TDXRColorChannels); |
||
5888 | begin |
||
5889 | asm |
||
5890 | jmp @@EndCode |
||
5891 | @@StartCode: |
||
5892 | movzx ebx,byte ptr [offset _null]{}@@Col1: |
||
5893 | mov ebp,ebx |
||
5894 | xor ebp,$FF |
||
5895 | @@EndCode: |
||
5896 | {$I DXRender.inc} |
||
5897 | { @@Col1 } |
||
5898 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.A+1) |
||
5899 | mov edx,offset @@Col1-4 |
||
5900 | sub edx,offset @@StartCode |
||
5901 | mov dword ptr [ecx+edx],eax |
||
5902 | end; |
||
5903 | |||
5904 | if [chRed, chGreen]<=EnableChannels then |
||
5905 | begin |
||
5906 | asm |
||
5907 | jmp @@EndCode |
||
5908 | @@StartCode: |
||
5909 | mov eax,dword ptr [offset _null]{}@@Col1: |
||
5910 | mov edx,dword ptr [offset _null]{}@@Col2: |
||
5911 | shr eax,8 |
||
5912 | shr edx,8 |
||
5913 | and eax,$00FF00FF |
||
5914 | and edx,$00FF00FF |
||
5915 | imul eax,ebx |
||
5916 | imul edx,ebp |
||
5917 | add eax,edx |
||
5918 | mov dword ptr [offset _null],eax{}@@Dest: |
||
5919 | @@EndCode: |
||
5920 | {$I DXRender.inc} |
||
5921 | { @@Col1 } |
||
5922 | mov eax,Col1 |
||
5923 | mov edx,offset @@Col1-4 |
||
5924 | sub edx,offset @@StartCode |
||
5925 | mov dword ptr [ecx+edx],eax |
||
5926 | |||
5927 | { @@Col2 } |
||
5928 | mov eax,Col2 |
||
5929 | mov edx,offset @@Col2-4 |
||
5930 | sub edx,offset @@StartCode |
||
5931 | mov dword ptr [ecx+edx],eax |
||
5932 | |||
5933 | { @@Dest } |
||
5934 | mov eax,Dest |
||
5935 | mov edx,offset @@Dest-4 |
||
5936 | sub edx,offset @@StartCode |
||
5937 | mov dword ptr [ecx+edx],eax |
||
5938 | end; |
||
5939 | end else |
||
5940 | begin |
||
5941 | if chRed in EnableChannels then |
||
5942 | begin |
||
5943 | asm |
||
5944 | jmp @@EndCode |
||
5945 | @@StartCode: |
||
5946 | movzx eax,byte ptr [offset _null]{}@@Col1: |
||
5947 | movzx edx,byte ptr [offset _null]{}@@Col2: |
||
5948 | sub eax,edx |
||
5949 | imul eax,ebx |
||
5950 | shr eax,8 |
||
5951 | add eax,edx |
||
5952 | mov byte ptr [offset _null],al{}@@Dest: |
||
5953 | @@EndCode: |
||
5954 | {$I DXRender.inc} |
||
5955 | { @@Col1 } |
||
5956 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.R+1) |
||
5957 | mov edx,offset @@Col1-4 |
||
5958 | sub edx,offset @@StartCode |
||
5959 | mov dword ptr [ecx+edx],eax |
||
5960 | |||
5961 | { @@Col2 } |
||
5962 | mov eax,Col2; add eax,BYTE(TDXRMachine_Color.R+1) |
||
5963 | mov edx,offset @@Col2-4 |
||
5964 | sub edx,offset @@StartCode |
||
5965 | mov dword ptr [ecx+edx],eax |
||
5966 | |||
5967 | { @@Dest } |
||
5968 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R+1) |
||
5969 | mov edx,offset @@Dest-4 |
||
5970 | sub edx,offset @@StartCode |
||
5971 | mov dword ptr [ecx+edx],eax |
||
5972 | end; |
||
5973 | end; |
||
5974 | |||
5975 | if chGreen in EnableChannels then |
||
5976 | begin |
||
5977 | asm |
||
5978 | jmp @@EndCode |
||
5979 | @@StartCode: |
||
5980 | movzx eax,byte ptr [offset _null]{}@@Col1: |
||
5981 | movzx edx,byte ptr [offset _null]{}@@Col2: |
||
5982 | sub eax,edx |
||
5983 | imul eax,ebx |
||
5984 | shr eax,8 |
||
5985 | add eax,edx |
||
5986 | mov byte ptr [offset _null],al{}@@Dest: |
||
5987 | @@EndCode: |
||
5988 | {$I DXRender.inc} |
||
5989 | { @@Col1 } |
||
5990 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.G+1) |
||
5991 | mov edx,offset @@Col1-4 |
||
5992 | sub edx,offset @@StartCode |
||
5993 | mov dword ptr [ecx+edx],eax |
||
5994 | |||
5995 | { @@Col2 } |
||
5996 | mov eax,Col2; add eax,BYTE(TDXRMachine_Color.G+1) |
||
5997 | mov edx,offset @@Col2-4 |
||
5998 | sub edx,offset @@StartCode |
||
5999 | mov dword ptr [ecx+edx],eax |
||
6000 | |||
6001 | { @@Dest } |
||
6002 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G+1) |
||
6003 | mov edx,offset @@Dest-4 |
||
6004 | sub edx,offset @@StartCode |
||
6005 | mov dword ptr [ecx+edx],eax |
||
6006 | end; |
||
6007 | end; |
||
6008 | end; |
||
6009 | |||
6010 | if [chBlue, chAlpha]<=EnableChannels then |
||
6011 | begin |
||
6012 | asm |
||
6013 | jmp @@EndCode |
||
6014 | @@StartCode: |
||
6015 | mov eax,dword ptr [offset _null]{}@@Col1: |
||
6016 | mov edx,dword ptr [offset _null]{}@@Col2: |
||
6017 | shr eax,8 |
||
6018 | shr edx,8 |
||
6019 | and eax,$00FF00FF |
||
6020 | and edx,$00FF00FF |
||
6021 | imul eax,ebx |
||
6022 | imul edx,ebp |
||
6023 | add eax,edx |
||
6024 | mov dword ptr [offset _null],eax{}@@Dest: |
||
6025 | @@EndCode: |
||
6026 | {$I DXRender.inc} |
||
6027 | { @@Col1 } |
||
6028 | mov eax,Col1; add eax,4 |
||
6029 | mov edx,offset @@Col1-4 |
||
6030 | sub edx,offset @@StartCode |
||
6031 | mov dword ptr [ecx+edx],eax |
||
6032 | |||
6033 | { @@Col2 } |
||
6034 | mov eax,Col2; add eax,4 |
||
6035 | mov edx,offset @@Col2-4 |
||
6036 | sub edx,offset @@StartCode |
||
6037 | mov dword ptr [ecx+edx],eax |
||
6038 | |||
6039 | { @@Dest } |
||
6040 | mov eax,Dest; add eax,4 |
||
6041 | mov edx,offset @@Dest-4 |
||
6042 | sub edx,offset @@StartCode |
||
6043 | mov dword ptr [ecx+edx],eax |
||
6044 | end; |
||
6045 | end else |
||
6046 | begin |
||
6047 | if chBlue in EnableChannels then |
||
6048 | begin |
||
6049 | asm |
||
6050 | jmp @@EndCode |
||
6051 | @@StartCode: |
||
6052 | movzx eax,byte ptr [offset _null]{}@@Col1: |
||
6053 | movzx edx,byte ptr [offset _null]{}@@Col2: |
||
6054 | sub eax,edx |
||
6055 | imul eax,ebx |
||
6056 | shr eax,8 |
||
6057 | add eax,edx |
||
6058 | mov byte ptr [offset _null],al{}@@Dest: |
||
6059 | @@EndCode: |
||
6060 | {$I DXRender.inc} |
||
6061 | { @@Col1 } |
||
6062 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.B+1) |
||
6063 | mov edx,offset @@Col1-4 |
||
6064 | sub edx,offset @@StartCode |
||
6065 | mov dword ptr [ecx+edx],eax |
||
6066 | |||
6067 | { @@Col2 } |
||
6068 | mov eax,Col2; add eax,BYTE(TDXRMachine_Color.B+1) |
||
6069 | mov edx,offset @@Col2-4 |
||
6070 | sub edx,offset @@StartCode |
||
6071 | mov dword ptr [ecx+edx],eax |
||
6072 | |||
6073 | { @@Dest } |
||
6074 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B+1) |
||
6075 | mov edx,offset @@Dest-4 |
||
6076 | sub edx,offset @@StartCode |
||
6077 | mov dword ptr [ecx+edx],eax |
||
6078 | end; |
||
6079 | end; |
||
6080 | |||
6081 | if chAlpha in EnableChannels then |
||
6082 | begin |
||
6083 | asm |
||
6084 | jmp @@EndCode |
||
6085 | @@StartCode: |
||
6086 | movzx eax,byte ptr [offset _null]{}@@Col1: |
||
6087 | movzx edx,byte ptr [offset _null]{}@@Col2: |
||
6088 | sub eax,edx |
||
6089 | imul eax,ebx |
||
6090 | shr eax,8 |
||
6091 | add eax,edx |
||
6092 | mov byte ptr [offset _null],al{}@@Dest: |
||
6093 | @@EndCode: |
||
6094 | {$I DXRender.inc} |
||
6095 | { @@Col1 } |
||
6096 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.A+1) |
||
6097 | mov edx,offset @@Col1-4 |
||
6098 | sub edx,offset @@StartCode |
||
6099 | mov dword ptr [ecx+edx],eax |
||
6100 | |||
6101 | { @@Col2 } |
||
6102 | mov eax,Col2; add eax,BYTE(TDXRMachine_Color.A+1) |
||
6103 | mov edx,offset @@Col2-4 |
||
6104 | sub edx,offset @@StartCode |
||
6105 | mov dword ptr [ecx+edx],eax |
||
6106 | |||
6107 | { @@Dest } |
||
6108 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1) |
||
6109 | mov edx,offset @@Dest-4 |
||
6110 | sub edx,offset @@StartCode |
||
6111 | mov dword ptr [ecx+edx],eax |
||
6112 | end; |
||
6113 | end; |
||
6114 | end; |
||
6115 | end; |
||
6116 | |||
6117 | procedure genBlend_INVSRCALPHA1_ADD_SRCALPHA2(var Code: Pointer; Dest, Col1, Col2: PDXRMachine_Color; |
||
6118 | ConstChannels1, ConstChannels12: TDXRColorChannels); |
||
6119 | begin |
||
6120 | asm |
||
6121 | jmp @@EndCode |
||
6122 | @@StartCode: |
||
6123 | movzx ebp,byte ptr [offset _null]{}@@Col1A: |
||
6124 | mov ebx,ebp |
||
6125 | xor ebx,$FF |
||
6126 | @@EndCode: |
||
6127 | {$I DXRender.inc} |
||
6128 | { @@Col1A } |
||
6129 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.A+1) |
||
6130 | mov edx,offset @@Col1A-4 |
||
6131 | sub edx,offset @@StartCode |
||
6132 | mov dword ptr [ecx+edx],eax |
||
6133 | end; |
||
6134 | |||
6135 | if [chRed, chGreen]<=EnableChannels then |
||
6136 | begin |
||
6137 | asm |
||
6138 | jmp @@EndCode |
||
6139 | @@StartCode: |
||
6140 | mov eax,dword ptr [offset _null]{}@@Col1: |
||
6141 | mov edx,dword ptr [offset _null]{}@@Col2: |
||
6142 | shr eax,8 |
||
6143 | shr edx,8 |
||
6144 | and eax,$00FF00FF |
||
6145 | and edx,$00FF00FF |
||
6146 | imul eax,ebx |
||
6147 | imul edx,ebp |
||
6148 | add eax,edx |
||
6149 | mov dword ptr [offset _null],eax{}@@Dest: |
||
6150 | @@EndCode: |
||
6151 | {$I DXRender.inc} |
||
6152 | { @@Col1 } |
||
6153 | mov eax,Col1 |
||
6154 | mov edx,offset @@Col1-4 |
||
6155 | sub edx,offset @@StartCode |
||
6156 | mov dword ptr [ecx+edx],eax |
||
6157 | |||
6158 | { @@Col2 } |
||
6159 | mov eax,Col2 |
||
6160 | mov edx,offset @@Col2-4 |
||
6161 | sub edx,offset @@StartCode |
||
6162 | mov dword ptr [ecx+edx],eax |
||
6163 | |||
6164 | { @@Dest } |
||
6165 | mov eax,Dest |
||
6166 | mov edx,offset @@Dest-4 |
||
6167 | sub edx,offset @@StartCode |
||
6168 | mov dword ptr [ecx+edx],eax |
||
6169 | end; |
||
6170 | end else |
||
6171 | begin |
||
6172 | if chRed in EnableChannels then |
||
6173 | begin |
||
6174 | asm |
||
6175 | jmp @@EndCode |
||
6176 | @@StartCode: |
||
6177 | movzx eax,byte ptr [offset _null]{}@@Col1: |
||
6178 | movzx edx,byte ptr [offset _null]{}@@Col2: |
||
6179 | sub eax,edx |
||
6180 | imul eax,ebx |
||
6181 | shr eax,8 |
||
6182 | add eax,edx |
||
6183 | mov byte ptr [offset _null],al{}@@Dest: |
||
6184 | @@EndCode: |
||
6185 | {$I DXRender.inc} |
||
6186 | { @@Col1 } |
||
6187 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.R+1) |
||
6188 | mov edx,offset @@Col1-4 |
||
6189 | sub edx,offset @@StartCode |
||
6190 | mov dword ptr [ecx+edx],eax |
||
6191 | |||
6192 | { @@Col2 } |
||
6193 | mov eax,Col2; add eax,BYTE(TDXRMachine_Color.R+1) |
||
6194 | mov edx,offset @@Col2-4 |
||
6195 | sub edx,offset @@StartCode |
||
6196 | mov dword ptr [ecx+edx],eax |
||
6197 | |||
6198 | { @@Dest } |
||
6199 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R+1) |
||
6200 | mov edx,offset @@Dest-4 |
||
6201 | sub edx,offset @@StartCode |
||
6202 | mov dword ptr [ecx+edx],eax |
||
6203 | end; |
||
6204 | end; |
||
6205 | |||
6206 | if chGreen in EnableChannels then |
||
6207 | begin |
||
6208 | asm |
||
6209 | jmp @@EndCode |
||
6210 | @@StartCode: |
||
6211 | movzx eax,byte ptr [offset _null]{}@@Col1: |
||
6212 | movzx edx,byte ptr [offset _null]{}@@Col2: |
||
6213 | sub eax,edx |
||
6214 | imul eax,ebx |
||
6215 | shr eax,8 |
||
6216 | add eax,edx |
||
6217 | mov byte ptr [offset _null],al{}@@Dest: |
||
6218 | @@EndCode: |
||
6219 | {$I DXRender.inc} |
||
6220 | { @@Col1 } |
||
6221 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.G+1) |
||
6222 | mov edx,offset @@Col1-4 |
||
6223 | sub edx,offset @@StartCode |
||
6224 | mov dword ptr [ecx+edx],eax |
||
6225 | |||
6226 | { @@Col2 } |
||
6227 | mov eax,Col2; add eax,BYTE(TDXRMachine_Color.G+1) |
||
6228 | mov edx,offset @@Col2-4 |
||
6229 | sub edx,offset @@StartCode |
||
6230 | mov dword ptr [ecx+edx],eax |
||
6231 | |||
6232 | { @@Dest } |
||
6233 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G+1) |
||
6234 | mov edx,offset @@Dest-4 |
||
6235 | sub edx,offset @@StartCode |
||
6236 | mov dword ptr [ecx+edx],eax |
||
6237 | end; |
||
6238 | end; |
||
6239 | end; |
||
6240 | |||
6241 | if [chBlue, chAlpha]<=EnableChannels then |
||
6242 | begin |
||
6243 | asm |
||
6244 | jmp @@EndCode |
||
6245 | @@StartCode: |
||
6246 | mov eax,dword ptr [offset _null]{}@@Col1: |
||
6247 | mov edx,dword ptr [offset _null]{}@@Col2: |
||
6248 | shr eax,8 |
||
6249 | shr edx,8 |
||
6250 | and eax,$00FF00FF |
||
6251 | and edx,$00FF00FF |
||
6252 | imul eax,ebx |
||
6253 | imul edx,ebp |
||
6254 | add eax,edx |
||
6255 | mov dword ptr [offset _null],eax{}@@Dest: |
||
6256 | @@EndCode: |
||
6257 | {$I DXRender.inc} |
||
6258 | { @@Col1 } |
||
6259 | mov eax,Col1; add eax,4 |
||
6260 | mov edx,offset @@Col1-4 |
||
6261 | sub edx,offset @@StartCode |
||
6262 | mov dword ptr [ecx+edx],eax |
||
6263 | |||
6264 | { @@Col2 } |
||
6265 | mov eax,Col2; add eax,4 |
||
6266 | mov edx,offset @@Col2-4 |
||
6267 | sub edx,offset @@StartCode |
||
6268 | mov dword ptr [ecx+edx],eax |
||
6269 | |||
6270 | { @@Dest } |
||
6271 | mov eax,Dest; add eax,4 |
||
6272 | mov edx,offset @@Dest-4 |
||
6273 | sub edx,offset @@StartCode |
||
6274 | mov dword ptr [ecx+edx],eax |
||
6275 | end; |
||
6276 | end else |
||
6277 | begin |
||
6278 | if chBlue in EnableChannels then |
||
6279 | begin |
||
6280 | asm |
||
6281 | jmp @@EndCode |
||
6282 | @@StartCode: |
||
6283 | movzx eax,byte ptr [offset _null]{}@@Col1: |
||
6284 | movzx edx,byte ptr [offset _null]{}@@Col2: |
||
6285 | sub eax,edx |
||
6286 | imul eax,ebx |
||
6287 | shr eax,8 |
||
6288 | add eax,edx |
||
6289 | mov byte ptr [offset _null],al{}@@Dest: |
||
6290 | @@EndCode: |
||
6291 | {$I DXRender.inc} |
||
6292 | { @@Col1 } |
||
6293 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.B+1) |
||
6294 | mov edx,offset @@Col1-4 |
||
6295 | sub edx,offset @@StartCode |
||
6296 | mov dword ptr [ecx+edx],eax |
||
6297 | |||
6298 | { @@Col2 } |
||
6299 | mov eax,Col2; add eax,BYTE(TDXRMachine_Color.B+1) |
||
6300 | mov edx,offset @@Col2-4 |
||
6301 | sub edx,offset @@StartCode |
||
6302 | mov dword ptr [ecx+edx],eax |
||
6303 | |||
6304 | { @@Dest } |
||
6305 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B+1) |
||
6306 | mov edx,offset @@Dest-4 |
||
6307 | sub edx,offset @@StartCode |
||
6308 | mov dword ptr [ecx+edx],eax |
||
6309 | end; |
||
6310 | end; |
||
6311 | |||
6312 | if chAlpha in EnableChannels then |
||
6313 | begin |
||
6314 | asm |
||
6315 | jmp @@EndCode |
||
6316 | @@StartCode: |
||
6317 | movzx eax,byte ptr [offset _null]{}@@Col1: |
||
6318 | movzx edx,byte ptr [offset _null]{}@@Col2: |
||
6319 | sub eax,edx |
||
6320 | imul eax,ebx |
||
6321 | shr eax,8 |
||
6322 | add eax,edx |
||
6323 | mov byte ptr [offset _null],al{}@@Dest: |
||
6324 | @@EndCode: |
||
6325 | {$I DXRender.inc} |
||
6326 | { @@Col1 } |
||
6327 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.A+1) |
||
6328 | mov edx,offset @@Col1-4 |
||
6329 | sub edx,offset @@StartCode |
||
6330 | mov dword ptr [ecx+edx],eax |
||
6331 | |||
6332 | { @@Col2 } |
||
6333 | mov eax,Col2; add eax,BYTE(TDXRMachine_Color.A+1) |
||
6334 | mov edx,offset @@Col2-4 |
||
6335 | sub edx,offset @@StartCode |
||
6336 | mov dword ptr [ecx+edx],eax |
||
6337 | |||
6338 | { @@Dest } |
||
6339 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1) |
||
6340 | mov edx,offset @@Dest-4 |
||
6341 | sub edx,offset @@StartCode |
||
6342 | mov dword ptr [ecx+edx],eax |
||
6343 | end; |
||
6344 | end; |
||
6345 | end; |
||
6346 | end; |
||
6347 | |||
6348 | procedure genBlend_DECALALPHA(var Code: Pointer; Dest, Col1, Col2: PDXRMachine_Color; |
||
6349 | ConstChannels1, ConstChannels12: TDXRColorChannels); |
||
6350 | begin |
||
6351 | if ([chRed, chGreen, chBlue]<=EnableChannels) and (Dest<>Col1) then |
||
6352 | begin |
||
6353 | if UseMMX then |
||
6354 | begin |
||
6355 | FMMXUsed := True; |
||
6356 | asm |
||
6357 | jmp @@EndCode |
||
6358 | @@StartCode: |
||
6359 | db $0F,$6F,$05,$11,$11,$11,$11///movq mm0,qword ptr [$11111111] |
||
6360 | @@Col1: |
||
6361 | db $0F,$7F,$05,$11,$11,$11,$11///movq qword ptr [$11111111],mm0 |
||
6362 | @@Dest: |
||
6363 | @@EndCode: |
||
6364 | {$I DXRender.inc} |
||
6365 | { @@Col1 } |
||
6366 | mov eax,Col1 |
||
6367 | mov edx,offset @@Col1-4 |
||
6368 | sub edx,offset @@StartCode |
||
6369 | mov dword ptr [ecx+edx],eax |
||
6370 | |||
6371 | { @@Dest } |
||
6372 | mov eax,Dest |
||
6373 | mov edx,offset @@Dest-4 |
||
6374 | sub edx,offset @@StartCode |
||
6375 | mov dword ptr [ecx+edx],eax |
||
6376 | end; |
||
6377 | end else |
||
6378 | begin |
||
6379 | asm |
||
6380 | jmp @@EndCode |
||
6381 | @@StartCode: |
||
6382 | mov eax,dword ptr [offset _null]{}@@Col1: |
||
6383 | mov edx,dword ptr [offset _null]{}@@Col1_2: |
||
6384 | mov dword ptr [offset _null],eax{}@@Dest: |
||
6385 | mov dword ptr [offset _null],edx{}@@Dest2: |
||
6386 | @@EndCode: |
||
6387 | {$I DXRender.inc} |
||
6388 | { @@Col1 } |
||
6389 | mov eax,Col1 |
||
6390 | mov edx,offset @@Col1-4 |
||
6391 | sub edx,offset @@StartCode |
||
6392 | mov dword ptr [ecx+edx],eax |
||
6393 | |||
6394 | { @@Col1_2 } |
||
6395 | mov eax,Col1; add eax,4 |
||
6396 | mov edx,offset @@Col1_2-4 |
||
6397 | sub edx,offset @@StartCode |
||
6398 | mov dword ptr [ecx+edx],eax |
||
6399 | |||
6400 | { @@Dest } |
||
6401 | mov eax,Dest |
||
6402 | mov edx,offset @@Dest-4 |
||
6403 | sub edx,offset @@StartCode |
||
6404 | mov dword ptr [ecx+edx],eax |
||
6405 | |||
6406 | { @@Dest2 } |
||
6407 | mov eax,Dest; add eax,4 |
||
6408 | mov edx,offset @@Dest2-4 |
||
6409 | sub edx,offset @@StartCode |
||
6410 | mov dword ptr [ecx+edx],eax |
||
6411 | end; |
||
6412 | end; |
||
6413 | end; |
||
6414 | |||
6415 | if chAlpha in EnableChannels then |
||
6416 | begin |
||
6417 | asm |
||
6418 | jmp @@EndCode |
||
6419 | @@StartCode: |
||
6420 | mov al,byte ptr [offset _null]{}@@Col2: |
||
6421 | mov byte ptr [offset _null],al{}@@Dest: |
||
6422 | @@EndCode: |
||
6423 | {$I DXRender.inc} |
||
6424 | { @@Col2 } |
||
6425 | mov eax,Col2; add eax,BYTE(TDXRMachine_Color.A+1) |
||
6426 | mov edx,offset @@Col2-4 |
||
6427 | sub edx,offset @@StartCode |
||
6428 | mov dword ptr [ecx+edx],eax |
||
6429 | |||
6430 | { @@Dest } |
||
6431 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1) |
||
6432 | mov edx,offset @@Dest-4 |
||
6433 | sub edx,offset @@StartCode |
||
6434 | mov dword ptr [ecx+edx],eax |
||
6435 | end; |
||
6436 | end; |
||
6437 | end; |
||
6438 | |||
6439 | procedure genBlend_MODULATE_RGBONLY(var Code: Pointer; Dest, Col1, Col2: PDXRMachine_Color; |
||
6440 | ConstChannels1, ConstChannels12: TDXRColorChannels); |
||
6441 | begin |
||
6442 | if chRed in EnableChannels then |
||
6443 | begin |
||
6444 | asm |
||
6445 | jmp @@EndCode |
||
6446 | @@StartCode: |
||
6447 | mov al,byte ptr [offset offset _null]{}@@Col1: |
||
6448 | mul byte ptr [offset offset _null] {}@@Col2: |
||
6449 | mov byte ptr [offset offset _null],ah{}@@Dest: |
||
6450 | @@EndCode: |
||
6451 | {$I DXRender.inc} |
||
6452 | { @@Col1 } |
||
6453 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.R+1) |
||
6454 | mov edx,offset @@Col1-4 |
||
6455 | sub edx,offset @@StartCode |
||
6456 | mov dword ptr [ecx+edx],eax |
||
6457 | |||
6458 | { @@Col2 } |
||
6459 | mov eax,Col2; add eax,BYTE(TDXRMachine_Color.R+1) |
||
6460 | mov edx,offset @@Col2-4 |
||
6461 | sub edx,offset @@StartCode |
||
6462 | mov dword ptr [ecx+edx],eax |
||
6463 | |||
6464 | { @@Dest } |
||
6465 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R+1) |
||
6466 | mov edx,offset @@Dest-4 |
||
6467 | sub edx,offset @@StartCode |
||
6468 | mov dword ptr [ecx+edx],eax |
||
6469 | end; |
||
6470 | end; |
||
6471 | |||
6472 | if chGreen in EnableChannels then |
||
6473 | begin |
||
6474 | asm |
||
6475 | jmp @@EndCode |
||
6476 | @@StartCode: |
||
6477 | mov al,byte ptr [offset offset _null]{}@@Col1: |
||
6478 | mul byte ptr [offset offset _null] {}@@Col2: |
||
6479 | mov byte ptr [offset offset _null],ah{}@@Dest: |
||
6480 | @@EndCode: |
||
6481 | {$I DXRender.inc} |
||
6482 | { @@Col1 } |
||
6483 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.G+1) |
||
6484 | mov edx,offset @@Col1-4 |
||
6485 | sub edx,offset @@StartCode |
||
6486 | mov dword ptr [ecx+edx],eax |
||
6487 | |||
6488 | { @@Col2 } |
||
6489 | mov eax,Col2; add eax,BYTE(TDXRMachine_Color.G+1) |
||
6490 | mov edx,offset @@Col2-4 |
||
6491 | sub edx,offset @@StartCode |
||
6492 | mov dword ptr [ecx+edx],eax |
||
6493 | |||
6494 | { @@Dest } |
||
6495 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G+1) |
||
6496 | mov edx,offset @@Dest-4 |
||
6497 | sub edx,offset @@StartCode |
||
6498 | mov dword ptr [ecx+edx],eax |
||
6499 | end; |
||
6500 | end; |
||
6501 | |||
6502 | if chBlue in EnableChannels then |
||
6503 | begin |
||
6504 | asm |
||
6505 | jmp @@EndCode |
||
6506 | @@StartCode: |
||
6507 | mov al,byte ptr [offset offset _null]{}@@Col1: |
||
6508 | mul byte ptr [offset offset _null] {}@@Col2: |
||
6509 | mov byte ptr [offset offset _null],ah{}@@Dest: |
||
6510 | @@EndCode: |
||
6511 | {$I DXRender.inc} |
||
6512 | { @@Col1 } |
||
6513 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.B+1) |
||
6514 | mov edx,offset @@Col1-4 |
||
6515 | sub edx,offset @@StartCode |
||
6516 | mov dword ptr [ecx+edx],eax |
||
6517 | |||
6518 | { @@Col2 } |
||
6519 | mov eax,Col2; add eax,BYTE(TDXRMachine_Color.B+1) |
||
6520 | mov edx,offset @@Col2-4 |
||
6521 | sub edx,offset @@StartCode |
||
6522 | mov dword ptr [ecx+edx],eax |
||
6523 | |||
6524 | { @@Dest } |
||
6525 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B+1) |
||
6526 | mov edx,offset @@Dest-4 |
||
6527 | sub edx,offset @@StartCode |
||
6528 | mov dword ptr [ecx+edx],eax |
||
6529 | end; |
||
6530 | end; |
||
6531 | |||
6532 | if (chAlpha in EnableChannels) or (Dest<>Col1) then |
||
6533 | begin |
||
6534 | asm |
||
6535 | jmp @@EndCode |
||
6536 | @@StartCode: |
||
6537 | mov al,byte ptr [offset _null]{}@@Col1: |
||
6538 | mov byte ptr [offset _null],al{}@@Dest: |
||
6539 | @@EndCode: |
||
6540 | {$I DXRender.inc} |
||
6541 | { @@Col1 } |
||
6542 | mov eax,Col1; add eax,BYTE(TDXRMachine_Color.A+1) |
||
6543 | mov edx,offset @@Col1-4 |
||
6544 | sub edx,offset @@StartCode |
||
6545 | mov dword ptr [ecx+edx],eax |
||
6546 | |||
6547 | { @@Dest } |
||
6548 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1) |
||
6549 | mov edx,offset @@Dest-4 |
||
6550 | sub edx,offset @@StartCode |
||
6551 | mov dword ptr [ecx+edx],eax |
||
6552 | end; |
||
6553 | end; |
||
6554 | end; |
||
6555 | |||
6556 | procedure genBlend_ADD(var Code: Pointer; Dest, Col1, Col2: PDXRMachine_Color; |
||
6557 | ConstChannels1, ConstChannels12: TDXRColorChannels); |
||
6558 | begin |
||
6559 | if UseMMX then |
||
6560 | begin |
||
6561 | FMMXUsed := True; |
||
6562 | asm |
||
6563 | jmp @@EndCode |
||
6564 | @@StartCode: |
||
6565 | db $0F,$6F,$05,$11,$11,$11,$11///movq mm0,qword ptr [$11111111] |
||
6566 | @@Col1: |
||
6567 | db $0F,$6F,$0D,$11,$11,$11,$11///movq mm1,qword ptr [$11111111] |
||
6568 | @@Col2: |
||
6569 | db $0F,$DD,$C1 ///paddusw mm0,mm1 |
||
6570 | db $0F,$7F,$05,$11,$11,$11,$11///movq qword ptr [$11111111],mm0 |
||
6571 | @@Dest: |
||
6572 | @@EndCode: |
||
6573 | {$I DXRender.inc} |
||
6574 | { @@Col1 } |
||
6575 | mov eax,Col1 |
||
6576 | mov edx,offset @@Col1-4 |
||
6577 | sub edx,offset @@StartCode |
||
6578 | mov dword ptr [ecx+edx],eax |
||
6579 | |||
6580 | { @@Col2 } |
||
6581 | mov eax,Col2 |
||
6582 | mov edx,offset @@Col2-4 |
||
6583 | sub edx,offset @@StartCode |
||
6584 | mov dword ptr [ecx+edx],eax |
||
6585 | |||
6586 | { @@Dest } |
||
6587 | mov eax,Dest |
||
6588 | mov edx,offset @@Dest-4 |
||
6589 | sub edx,offset @@StartCode |
||
6590 | mov dword ptr [ecx+edx],eax |
||
6591 | end; |
||
6592 | |||
6593 | { Alpha Channel } |
||
6594 | if chAlpha in EnableChannels then |
||
6595 | begin |
||
6596 | asm |
||
6597 | jmp @@EndCode |
||
6598 | @@StartCode: |
||
6599 | mov al,byte ptr [offset _null]{}@@Col2: |
||
6600 | mov byte ptr [offset _null],al{}@@Dest: |
||
6601 | @@EndCode: |
||
6602 | {$I DXRender.inc} |
||
6603 | { @@Col2 } |
||
6604 | mov eax,Col2; add eax,BYTE(TDXRMachine_Color.A+1) |
||
6605 | mov edx,offset @@Col2-4 |
||
6606 | sub edx,offset @@StartCode |
||
6607 | mov dword ptr [ecx+edx],eax |
||
6608 | |||
6609 | { @@Dest } |
||
6610 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1) |
||
6611 | mov edx,offset @@Dest-4 |
||
6612 | sub edx,offset @@StartCode |
||
6613 | mov dword ptr [ecx+edx],eax |
||
6614 | end; |
||
6615 | end; |
||
6616 | end else |
||
6617 | begin |
||
6618 | { Red Channel } |
||
6619 | if chRed in EnableChannels then |
||
6620 | begin |
||
6621 | if chRed in ConstChannels1 then |
||
6622 | begin |
||
6623 | Func_col1_Add_const2(Code, @Dest.R, @Col2.R, @Col1.R); |
||
6624 | end else |
||
6625 | if chRed in ConstChannels2 then |
||
6626 | begin |
||
6627 | Func_col1_Add_const2(Code, @Dest.R, @Col1.R, @Col2.R); |
||
6628 | end else |
||
6629 | Func_col1_Add_col2(Code, @Dest.R, @Col1.R, @Col2.R); |
||
6630 | end; |
||
6631 | |||
6632 | { Green Channel } |
||
6633 | if chGreen in EnableChannels then |
||
6634 | begin |
||
6635 | if chRed in ConstChannels1 then |
||
6636 | begin |
||
6637 | Func_col1_Add_const2(Code, @Dest.G, @Col2.G, @Col1.G); |
||
6638 | end else |
||
6639 | if chRed in ConstChannels2 then |
||
6640 | begin |
||
6641 | Func_col1_Add_const2(Code, @Dest.G, @Col1.G, @Col2.G); |
||
6642 | end else |
||
6643 | Func_col1_Add_col2(Code, @Dest.G, @Col1.G, @Col2.G); |
||
6644 | end; |
||
6645 | |||
6646 | { Blue Channel } |
||
6647 | if chBlue in EnableChannels then |
||
6648 | begin |
||
6649 | if chRed in ConstChannels1 then |
||
6650 | begin |
||
6651 | Func_col1_Add_const2(Code, @Dest.B, @Col2.B, @Col1.B); |
||
6652 | end else |
||
6653 | if chRed in ConstChannels2 then |
||
6654 | begin |
||
6655 | Func_col1_Add_const2(Code, @Dest.B, @Col1.B, @Col2.B); |
||
6656 | end else |
||
6657 | Func_col1_Add_col2(Code, @Dest.B, @Col1.B, @Col2.B); |
||
6658 | end; |
||
6659 | |||
6660 | { Alpha Channel } |
||
6661 | if (chAlpha in EnableChannels) and (Col2<>Dest) then |
||
6662 | begin |
||
6663 | asm |
||
6664 | jmp @@EndCode |
||
6665 | @@StartCode: |
||
6666 | mov al,byte ptr [offset _null]{}@@Col2: |
||
6667 | mov byte ptr [offset _null],al{}@@Dest: |
||
6668 | @@EndCode: |
||
6669 | {$I DXRender.inc} |
||
6670 | { @@Col2 } |
||
6671 | mov eax,Col2; add eax,BYTE(TDXRMachine_Color.A+1) |
||
6672 | mov edx,offset @@Col2-4 |
||
6673 | sub edx,offset @@StartCode |
||
6674 | mov dword ptr [ecx+edx],eax |
||
6675 | |||
6676 | { @@Dest } |
||
6677 | mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1) |
||
6678 | mov edx,offset @@Dest-4 |
||
6679 | sub edx,offset @@StartCode |
||
6680 | mov dword ptr [ecx+edx],eax |
||
6681 | end; |
||
6682 | end; |
||
6683 | end; |
||
6684 | end; |
||
6685 | |||
6686 | begin |
||
6687 | if EnableChannels=[] then Exit; |
||
6688 | |||
6689 | case Blend of |
||
6690 | DXR_BLEND_ZERO : genBlend_ZERO(Code, Dest); |
||
6691 | DXR_BLEND_ONE1 : genBlend_ONE1(Code, Dest, Col1, ConstChannels1); |
||
6692 | DXR_BLEND_ONE2 : genBlend_ONE1(Code, Dest, Col2, ConstChannels2); |
||
6693 | DXR_BLEND_ONE1_ADD_ONE2 : genBlend_ONE1_ADD_ONE2(Code, Dest, Col1, Col2, ConstChannels1, ConstChannels2); |
||
6694 | DXR_BLEND_ONE1_SUB_ONE2 : genBlend_ONE1_SUB_ONE2(Code, Dest, Col1, Col2, ConstChannels1, ConstChannels2); |
||
6695 | DXR_BLEND_ONE2_SUB_ONE1 : genBlend_ONE1_SUB_ONE2(Code, Dest, Col2, Col1, ConstChannels2, ConstChannels1); |
||
6696 | DXR_BLEND_ONE1_MUL_ONE2 : genBlend_ONE1_MUL_ONE2(Code, Dest, Col1, Col2, ConstChannels1, ConstChannels2); |
||
6697 | DXR_BLEND_SRCALPHA1 : genBlend_SRCALPHA1(Code, Dest, Col1, ConstChannels1); |
||
6698 | DXR_BLEND_SRCALPHA1_ADD_ONE2 : genBlend_SRCALPHA1_ADD_ONE2(Code, Dest, Col1, Col2, ConstChannels1, ConstChannels2); |
||
6699 | DXR_BLEND_ONE2_SUB_SRCALPHA1 : genBlend_ONE2_SUB_SRCALPHA1(Code, Dest, Col1, Col2, ConstChannels1, ConstChannels2); |
||
6700 | DXR_BLEND_SRCALPHA1_ADD_INVSRCALPHA2: genBlend_SRCALPHA1_ADD_INVSRCALPHA2(Code, Dest, Col1, Col2, ConstChannels1, ConstChannels2); |
||
6701 | DXR_BLEND_INVSRCALPHA1_ADD_SRCALPHA2: genBlend_INVSRCALPHA1_ADD_SRCALPHA2(Code, Dest, Col1, Col2, ConstChannels1, ConstChannels2); |
||
6702 | DXR_BLEND_DECALALPHA : genBlend_DECALALPHA(Code, Dest, Col1, Col2, ConstChannels1, ConstChannels2); |
||
6703 | DXR_BLEND_MODULATE : genBlend_MODULATE_RGBONLY(Code, Dest, Col1, Col2, ConstChannels1, ConstChannels2); |
||
6704 | DXR_BLEND_ADD : genBlend_ADD(Code, Dest, Col1, Col2, ConstChannels1, ConstChannels2); |
||
6705 | end; |
||
6706 | end; |
||
6707 | |||
6708 | var |
||
6709 | StackPoint: Integer; |
||
6710 | |||
6711 | function NewWorkColor: PDXRMachine_Color; |
||
6712 | begin |
||
6713 | Result := @FStack[StackPoint]; Inc(StackPoint); |
||
6714 | end; |
||
6715 | |||
6716 | function GenerateCode2(var Code: Pointer; Tree: PDXRMachine_Tree): PDXRMachine_Color; |
||
6717 | var |
||
6718 | Col1, Col2: PDXRMachine_Color; |
||
6719 | ConstChannels1, ConstChannels2: TDXRColorChannels; |
||
6720 | ch: TDXRColorChannels; |
||
6721 | begin |
||
6722 | Result := NewWorkColor; |
||
6723 | case Tree.Typ of |
||
6724 | DXR_TREETYPE_LOADBLACK: |
||
6725 | begin |
||
6726 | genBlend(Code, DXR_BLEND_ZERO, Result, nil, nil, Tree.Channels, [], []); |
||
6727 | end; |
||
6728 | DXR_TREETYPE_LOADCOLOR: |
||
6729 | begin |
||
6730 | genBlend(Code, DXR_BLEND_ONE1, Result, @ColorList[Tree.Color].nColor, nil, Tree.Channels, [], []); |
||
6731 | end; |
||
6732 | DXR_TREETYPE_LOADCONSTCOLOR: |
||
6733 | begin |
||
6734 | genBlend(Code, DXR_BLEND_ONE1, Result, @Tree.ConstColor, nil, Tree.Channels, |
||
6735 | [chRed, chGreen, chBlue, chAlpha], []); |
||
6736 | end; |
||
6737 | DXR_TREETYPE_LOADTEXTURE: |
||
6738 | begin |
||
6739 | genReadTexture(Code, Result, TextureList[Tree.Texture], Tree.Channels); |
||
6740 | end; |
||
6741 | DXR_TREETYPE_LOADDESTPIXEL: |
||
6742 | begin |
||
6743 | genReadDestPixel(Code); |
||
6744 | genDecodeColor(Code, Dest^, Result, Tree.Channels, _BlackColor); |
||
6745 | end; |
||
6746 | DXR_TREETYPE_BLEND: |
||
6747 | begin |
||
6748 | // Blend color |
||
6749 | Col1 := nil; |
||
6750 | Col2 := nil; |
||
6751 | |||
6752 | ConstChannels1 := []; |
||
6753 | ConstChannels2 := []; |
||
6754 | |||
6755 | if (Tree.BlendTree1<>nil) and (Tree.BlendTree1.Typ=DXR_TREETYPE_LOADBLACK) then |
||
6756 | begin |
||
6757 | Col1 := @_BlackColor; |
||
6758 | end else |
||
6759 | if (Tree.BlendTree1<>nil) and (Tree.BlendTree1.Typ=DXR_TREETYPE_LOADCOLOR) then |
||
6760 | begin |
||
6761 | Col1 := @ColorList[Tree.BlendTree1.Color].nColor; |
||
6762 | end else |
||
6763 | if (Tree.BlendTree1<>nil) and (Tree.BlendTree1.Typ=DXR_TREETYPE_LOADCONSTCOLOR) then |
||
6764 | begin |
||
6765 | Col1 := @Tree.BlendTree1.ConstColor; |
||
6766 | ConstChannels1 := [chRed, chGreen, chBlue, chAlpha]; |
||
6767 | end else |
||
6768 | if (Tree.BlendTree1<>nil) and (Tree.BlendTree1.Typ=DXR_TREETYPE_LOADTEXTURE) then |
||
6769 | begin |
||
6770 | ch := TextureList[Tree.BlendTree1.Texture].EnableChannels; |
||
6771 | |||
6772 | if (chRed in Tree.BlendTree1.Channels) and (not (chRed in ch)) then |
||
6773 | begin |
||
6774 | ConstChannels1 := ConstChannels1 + [chRed]; |
||
6775 | Tree.BlendTree1.Channels := Tree.BlendTree1.Channels - [chRed]; |
||
6776 | end; |
||
6777 | |||
6778 | if (chGreen in Tree.BlendTree1.Channels) and (not (chGreen in ch)) then |
||
6779 | begin |
||
6780 | ConstChannels1 := ConstChannels1 + [chGreen]; |
||
6781 | Tree.BlendTree1.Channels := Tree.BlendTree1.Channels - [chGreen]; |
||
6782 | end; |
||
6783 | |||
6784 | if (chBlue in Tree.BlendTree1.Channels) and (not (chBlue in ch)) then |
||
6785 | begin |
||
6786 | ConstChannels1 := ConstChannels1 + [chBlue]; |
||
6787 | Tree.BlendTree1.Channels := Tree.BlendTree1.Channels - [chBlue]; |
||
6788 | end; |
||
6789 | |||
6790 | if (chAlpha in Tree.BlendTree1.Channels) and (not (chAlpha in ch)) then |
||
6791 | begin |
||
6792 | ConstChannels1 := ConstChannels1 + [chAlpha]; |
||
6793 | Tree.BlendTree1.Channels := Tree.BlendTree1.Channels - [chAlpha]; |
||
6794 | end; |
||
6795 | |||
6796 | Col1 := GenerateCode2(Code, Tree.BlendTree1); |
||
6797 | |||
6798 | if chRed in ConstChannels1 then |
||
6799 | Col1.R := TextureList[Tree.BlendTree1.Texture].DefaultColor.R; |
||
6800 | |||
6801 | if chGreen in ConstChannels1 then |
||
6802 | Col1.G := TextureList[Tree.BlendTree1.Texture].DefaultColor.G; |
||
6803 | |||
6804 | if chBlue in ConstChannels1 then |
||
6805 | Col1.B := TextureList[Tree.BlendTree1.Texture].DefaultColor.B; |
||
6806 | |||
6807 | if chAlpha in ConstChannels1 then |
||
6808 | Col1.A := TextureList[Tree.BlendTree1.Texture].DefaultColor.A; |
||
6809 | end else |
||
6810 | if Tree.BlendTree1<>nil then |
||
6811 | begin |
||
6812 | Col1 := GenerateCode2(Code, Tree.BlendTree1); |
||
6813 | end; |
||
6814 | |||
6815 | if (Tree.BlendTree2<>nil) and (Tree.BlendTree2.Typ=DXR_TREETYPE_LOADBLACK) then |
||
6816 | begin |
||
6817 | Col2 := @_BlackColor; |
||
6818 | end else |
||
6819 | if (Tree.BlendTree2<>nil) and (Tree.BlendTree2.Typ=DXR_TREETYPE_LOADCOLOR) then |
||
6820 | begin |
||
6821 | Col2 := @ColorList[Tree.BlendTree2.Color].nColor; |
||
6822 | end else |
||
6823 | if (Tree.BlendTree2<>nil) and (Tree.BlendTree2.Typ=DXR_TREETYPE_LOADCONSTCOLOR) then |
||
6824 | begin |
||
6825 | Col2 := @Tree.BlendTree2.ConstColor; |
||
6826 | ConstChannels2 := [chRed, chGreen, chBlue, chAlpha]; |
||
6827 | end else |
||
6828 | if (Tree.BlendTree2<>nil) and (Tree.BlendTree2.Typ=DXR_TREETYPE_LOADTEXTURE) then |
||
6829 | begin |
||
6830 | ch := TextureList[Tree.BlendTree2.Texture].EnableChannels; |
||
6831 | |||
6832 | if (chRed in Tree.BlendTree2.Channels) and (not (chRed in ch)) then |
||
6833 | begin |
||
6834 | ConstChannels2 := ConstChannels2 + [chRed]; |
||
6835 | Tree.BlendTree2.Channels := Tree.BlendTree2.Channels - [chRed]; |
||
6836 | end; |
||
6837 | |||
6838 | if (chGreen in Tree.BlendTree2.Channels) and (not (chGreen in ch)) then |
||
6839 | begin |
||
6840 | ConstChannels2 := ConstChannels2 + [chGreen]; |
||
6841 | Tree.BlendTree2.Channels := Tree.BlendTree2.Channels - [chGreen]; |
||
6842 | end; |
||
6843 | |||
6844 | if (chBlue in Tree.BlendTree2.Channels) and (not (chBlue in ch)) then |
||
6845 | begin |
||
6846 | ConstChannels2 := ConstChannels2 + [chBlue]; |
||
6847 | Tree.BlendTree2.Channels := Tree.BlendTree2.Channels - [chBlue]; |
||
6848 | end; |
||
6849 | |||
6850 | if (chAlpha in Tree.BlendTree2.Channels) and (not (chAlpha in ch)) then |
||
6851 | begin |
||
6852 | ConstChannels2 := ConstChannels2 + [chAlpha]; |
||
6853 | Tree.BlendTree2.Channels := Tree.BlendTree2.Channels - [chAlpha]; |
||
6854 | end; |
||
6855 | |||
6856 | Col2 := GenerateCode2(Code, Tree.BlendTree2); |
||
6857 | |||
6858 | if chRed in ConstChannels2 then |
||
6859 | Col2.R := TextureList[Tree.BlendTree2.Texture].DefaultColor.R; |
||
6860 | |||
6861 | if chGreen in ConstChannels2 then |
||
6862 | Col2.G := TextureList[Tree.BlendTree2.Texture].DefaultColor.G; |
||
6863 | |||
6864 | if chBlue in ConstChannels2 then |
||
6865 | Col2.B := TextureList[Tree.BlendTree2.Texture].DefaultColor.B; |
||
6866 | |||
6867 | if chAlpha in ConstChannels2 then |
||
6868 | Col2.A := TextureList[Tree.BlendTree2.Texture].DefaultColor.A; |
||
6869 | end else |
||
6870 | if Tree.BlendTree2<>nil then |
||
6871 | begin |
||
6872 | Col2 := GenerateCode2(Code, Tree.BlendTree2); |
||
6873 | end; |
||
6874 | |||
6875 | genBlend(Code, Tree.Blend, Result, Col1, Col2, Tree.Channels, |
||
6876 | ConstChannels1, ConstChannels2); |
||
6877 | end; |
||
6878 | end; |
||
6879 | end; |
||
6880 | |||
6881 | var |
||
6882 | ExitAddress, MainCode: Pointer; |
||
6883 | Col: PDXRMachine_Color; |
||
6884 | begin |
||
6885 | if (Tree.Typ=DXR_TREETYPE_LOADCOLOR) and (not ColorList[Tree.Color].Gouraud) and |
||
6886 | (not Dither.Enable) and (Dest.BitCount in [16, 32]) then |
||
6887 | begin |
||
6888 | FCall := Code; |
||
6889 | genInitDestAddress(Code); |
||
6890 | genEncodeColor(Code, Dest^, @ColorList[Tree.Color].nColor, Tree.Channels); |
||
6891 | |||
6892 | case Dest.BitCount of |
||
6893 | 16: begin |
||
6894 | asm |
||
6895 | jmp @@EndCode |
||
6896 | @@StartCode: |
||
6897 | mov edx,eax |
||
6898 | rol eax,16 |
||
6899 | mov ax,dx |
||
6900 | |||
6901 | { DWORD arrangement } |
||
6902 | mov edx,edi |
||
6903 | and edx,3 |
||
6904 | shr edx,1 |
||
6905 | jz @@dwordarray_skip |
||
6906 | |||
6907 | @@dwordarray_loop: |
||
6908 | mov word ptr [edi],ax |
||
6909 | add edi,2 |
||
6910 | dec ecx |
||
6911 | jz @@Exit |
||
6912 | dec edx |
||
6913 | jmp @@dwordarray_loop |
||
6914 | @@dwordarray_skip: |
||
6915 | |||
6916 | { DWORD } |
||
6917 | mov edx,ecx |
||
6918 | shr edx,1 |
||
6919 | jz @@dword_skip |
||
6920 | @@dword_loop: |
||
6921 | mov dword ptr [edi],eax |
||
6922 | add edi,4 |
||
6923 | dec edx |
||
6924 | jnz @@dword_loop |
||
6925 | |||
6926 | and ecx,1 |
||
6927 | jz @@Exit |
||
6928 | @@dword_skip: |
||
6929 | |||
6930 | { WORD } |
||
6931 | mov word ptr [edi],ax |
||
6932 | @@Exit: |
||
6933 | ret |
||
6934 | @@EndCode: |
||
6935 | {$I DXRender.inc} |
||
6936 | end; |
||
6937 | end; |
||
6938 | 32: begin |
||
6939 | asm |
||
6940 | jmp @@EndCode |
||
6941 | @@StartCode: |
||
6942 | { DWORD } |
||
6943 | dec ecx |
||
6944 | @@loop: |
||
6945 | mov dword ptr [edi+ecx*4],eax |
||
6946 | dec ecx |
||
6947 | jnl @@loop |
||
6948 | ret |
||
6949 | @@EndCode: |
||
6950 | {$I DXRender.inc} |
||
6951 | end; |
||
6952 | end; |
||
6953 | end; |
||
6954 | |||
6955 | Exit; |
||
6956 | end; |
||
6957 | |||
6958 | { ----------- Exit ----------- } |
||
6959 | ExitAddress := Code; |
||
6960 | |||
6961 | asm |
||
6962 | jmp @@EndCode |
||
6963 | @@StartCode: |
||
6964 | ret |
||
6965 | @@EndCode: |
||
6966 | {$I DXRender.inc} |
||
6967 | end; |
||
6968 | |||
6969 | { ----------- Loop ----------- } |
||
6970 | SkipAddress := Code; |
||
6971 | |||
6972 | genUpdateAxis(Code); |
||
6973 | genUpdateColor(Code); |
||
6974 | genUpdateTextureAxis(Code); |
||
6975 | genUpdateDestAddress(Code); |
||
6976 | |||
6977 | asm |
||
6978 | jmp @@EndCode |
||
6979 | @@StartCode: |
||
6980 | dec ecx |
||
6981 | @@EndCode: |
||
6982 | {$I DXRender.inc} |
||
6983 | end; |
||
6984 | genCmpFunc(Code, DXR_CMPFUNC_LESSEQUAL, ExitAddress); |
||
6985 | |||
6986 | { ----------- Main ----------- } |
||
6987 | MainCode := Code; |
||
6988 | |||
6989 | if Tree.Typ=DXR_TREETYPE_LOADCOLOR then |
||
6990 | begin |
||
6991 | genEncodeColor2(Code, Dest^, @ColorList[Tree.Color].nColor, Tree.Channels); |
||
6992 | genWriteDestPixel(Code); |
||
6993 | end else |
||
6994 | if (Tree.Typ=DXR_TREETYPE_LOADTEXTURE) and (not Dither.Enable) and |
||
6995 | (TextureList[Tree.Texture].Filter in [DXR_TEXTUREFILTER_NEAREST]) and |
||
6996 | (dxrCompareSurface(Dest^, TextureList[Tree.Texture].Surface^)) then |
||
6997 | begin |
||
6998 | genReadSurfacePixel(Code, TextureList[Tree.Texture], @TextureList[Tree.Texture].nAxis); |
||
6999 | genColorKey(Code, TextureList[Tree.Texture]); |
||
7000 | genWriteDestPixel(Code); |
||
7001 | end else |
||
7002 | begin |
||
7003 | StackPoint := 0; Col := GenerateCode2(Code, Tree); |
||
7004 | genEncodeColor2(Code, Dest^, Col, Tree.Channels); |
||
7005 | genWriteDestPixel(Code); |
||
7006 | end; |
||
7007 | |||
7008 | genCmpFunc(Code, DXR_CMPFUNC_ALWAYS, SkipAddress); |
||
7009 | |||
7010 | { ----------- Initialize ----------- } |
||
7011 | FCall := Code; |
||
7012 | |||
7013 | genInitDestAddress(Code); |
||
7014 | |||
7015 | genCmpFunc(Code, DXR_CMPFUNC_ALWAYS, MainCode); |
||
7016 | end; |
||
7017 | |||
7018 | procedure TDXRMachine.Run(Count: Integer); |
||
7019 | var |
||
7020 | P: Pointer; |
||
7021 | begin |
||
7022 | if Count<=0 then Exit; |
||
7023 | if FCall=nil then Exit; |
||
7024 | |||
7025 | P := FCall; |
||
7026 | |||
7027 | asm |
||
7028 | push edi |
||
7029 | push esi |
||
7030 | push ebx |
||
7031 | push ebp |
||
7032 | push eax |
||
7033 | push edx |
||
7034 | mov ecx,Count |
||
7035 | mov eax,P |
||
7036 | call eax |
||
7037 | pop edx |
||
7038 | pop eax |
||
7039 | pop ebp |
||
7040 | pop ebx |
||
7041 | pop esi |
||
7042 | pop edi |
||
7043 | end; |
||
7044 | |||
7045 | if FMMXUsed then |
||
7046 | begin |
||
7047 | asm |
||
7048 | db $0F,$77 ///emms |
||
7049 | end; |
||
7050 | end; |
||
7051 | end; |
||
7052 | |||
7053 | var |
||
7054 | FDXRMachine: TDXRMachine; |
||
7055 | |||
7056 | function DXRMachine: TDXRMachine; |
||
7057 | begin |
||
7058 | if FDXRMachine=nil then |
||
7059 | FDXRMachine := TDXRMachine.Create; |
||
7060 | Result := FDXRMachine; |
||
7061 | end; |
||
7062 | |||
7063 | procedure dxrDefRenderStates(var States: TDXR_RenderStates); |
||
7064 | var |
||
7065 | i: Integer; |
||
7066 | begin |
||
7067 | FillChar(States, SizeOf(States), 0); |
||
7068 | |||
7069 | with States do |
||
7070 | begin |
||
7071 | DitherEnable := False; |
||
7072 | SpecularEnable := True; |
||
7073 | CullMode := DXR_CULL_CCW; |
||
7074 | Shade := DXR_SHADEMODE_GOURAUD; |
||
7075 | TexBlend := DXR_BLEND_MODULATE; |
||
7076 | Blend := DXR_BLEND_ONE1; |
||
7077 | TextureFilter := DXR_TEXTUREFILTER_NEAREST; |
||
7078 | EnableDrawLine := $FFFFFFFF; |
||
7079 | end; |
||
7080 | |||
7081 | for i:=0 to DXR_MAXTEXTURE-1 do |
||
7082 | with States.TextureList[i] do |
||
7083 | begin |
||
7084 | LayerBlend := DXR_TEXTURELAYERBLEND_TEXTURE; |
||
7085 | Blend := DXR_BLEND_ONE1; |
||
7086 | Surface := nil; |
||
7087 | ColorKeyEnable := False; |
||
7088 | ColorKey := 0; |
||
7089 | TextureAddress := DXR_TEXTUREADDRESS_TILE; |
||
7090 | end; |
||
7091 | end; |
||
7092 | |||
7093 | { Draw primitive } |
||
7094 | |||
7095 | type |
||
7096 | PArrayDXR_Vertex = ^TArrayDXR_Vertex; |
||
7097 | TArrayDXR_Vertex = array[0..0] of TDXR_Vertex; |
||
7098 | |||
7099 | PArrayPDXR_Vertex = ^TArrayPDXR_Vertex; |
||
7100 | TArrayPDXR_Vertex = array[0..0] of PDXR_Vertex; |
||
7101 | |||
7102 | TDXR_Triangle = array[0..2] of PDXR_Vertex; |
||
7103 | |||
7104 | PArrayDWORD = ^TArrayDWORD; |
||
7105 | TArrayDWORD = array[0..2] of DWORD; |
||
7106 | |||
7107 | procedure dxrDrawTriangle(const Dest: TDXR_Surface; const States: TDXR_RenderStates; const Tri: TDXR_Triangle); |
||
7108 | |||
7109 | function InitGenerator_MakeTree_LoadTexture(Texture: Integer): PDXRMachine_Tree; |
||
7110 | begin |
||
7111 | Result := DXRMachine.CreateTree_LoadTexture(Texture); |
||
7112 | end; |
||
7113 | |||
7114 | function InitGenerator_MakeTree: PDXRMachine_Tree; |
||
7115 | var |
||
7116 | i: Integer; |
||
7117 | Layer: PDXR_TextureLayer; |
||
7118 | begin |
||
7119 | if States.TextureEnable then |
||
7120 | begin |
||
7121 | { Load texel } |
||
7122 | Result := DXRMachine.CreateTree2(DXR_TREETYPE_LOADBLACK); |
||
7123 | |||
7124 | if States.TextureEnable then |
||
7125 | for i:=Low(States.TextureList) to High(States.TextureList) do |
||
7126 | begin |
||
7127 | Layer := @States.TextureList[i]; |
||
7128 | if (Layer.Surface<>nil) and (Layer.LayerBlend=DXR_TEXTURELAYERBLEND_TEXTURE) then |
||
7129 | begin |
||
7130 | Result := DXRMachine.CreateTree_Blend(Layer.Blend, InitGenerator_MakeTree_LoadTexture(i), Result); |
||
7131 | end; |
||
7132 | end; |
||
7133 | |||
7134 | { Lighting } |
||
7135 | Result := DXRMachine.CreateTree_Blend(States.TexBlend, Result, DXRMachine.CreateTree_LoadColor(0)); |
||
7136 | |||
7137 | { Blend after lighting is given } |
||
7138 | for i:=Low(States.TextureList) to High(States.TextureList) do |
||
7139 | begin |
||
7140 | Layer := @States.TextureList[i]; |
||
7141 | if (Layer.Surface<>nil) and (Layer.LayerBlend=DXR_TEXTURELAYERBLEND_LAST) then |
||
7142 | begin |
||
7143 | Result := DXRMachine.CreateTree_Blend(Layer.Blend, InitGenerator_MakeTree_LoadTexture(i), Result); |
||
7144 | end; |
||
7145 | end; |
||
7146 | end else |
||
7147 | begin |
||
7148 | Result := DXRMachine.CreateTree_LoadColor(0); |
||
7149 | end; |
||
7150 | |||
7151 | { Blend with Dest pixel } |
||
7152 | Result := DXRMachine.CreateTree_Blend(States.Blend, Result, DXRMachine.CreateTree2(DXR_TREETYPE_LOADDESTPIXEL)); |
||
7153 | |||
7154 | { Specular generation } |
||
7155 | if States.SpecularEnable then |
||
7156 | begin |
||
7157 | Result := DXRMachine.CreateTree_Blend(DXR_BLEND_ONE1_ADD_ONE2, Result, DXRMachine.CreateTree_LoadColor(1)); |
||
7158 | end; |
||
7159 | end; |
||
7160 | |||
7161 | procedure InitGenerator; |
||
7162 | |||
7163 | function Hypot(X, Y: Extended): Extended; |
||
7164 | begin |
||
7165 | Result := Sqrt(X*X + Y*Y); |
||
7166 | end; |
||
7167 | |||
7168 | var |
||
7169 | i: Integer; |
||
7170 | Layer: PDXR_TextureLayer; |
||
7171 | begin |
||
7172 | DXRMachine.Initialize; |
||
7173 | |||
7174 | { Parameter setting } |
||
7175 | DXRMachine.Dest := @Dest; |
||
7176 | DXRMachine.Dither.Enable := States.DitherEnable; |
||
7177 | |||
7178 | DXRMachine.ColorList[0].Gouraud := States.Shade=DXR_SHADEMODE_GOURAUD; |
||
7179 | DXRMachine.ColorList[1].Gouraud := States.Shade=DXR_SHADEMODE_GOURAUD; |
||
7180 | |||
7181 | if States.TextureEnable then |
||
7182 | for i:=Low(States.TextureList) to High(States.TextureList) do |
||
7183 | begin |
||
7184 | Layer := @States.TextureList[i]; |
||
7185 | |||
7186 | if States.TextureList[i].Surface<>nil then |
||
7187 | begin |
||
7188 | with DXRMachine.TextureList[i] do |
||
7189 | begin |
||
7190 | ColorKeyEnable := Layer.ColorKeyEnable; |
||
7191 | ColorKey := Layer.ColorKey; |
||
7192 | Surface := Layer.Surface; |
||
7193 | Filter := States.TextureFilter; |
||
7194 | TextureAddress := Layer.TextureAddress; |
||
7195 | end; |
||
7196 | end; |
||
7197 | end; |
||
7198 | |||
7199 | { Tree making } |
||
7200 | DXRMachine.Compile(InitGenerator_MakeTree); |
||
7201 | end; |
||
7202 | |||
7203 | type |
||
7204 | TCol64Array = array[0..1] of TDXRMachine_Color; |
||
7205 | T2DAxis64Array = array[0..DXR_MAXTEXTURE-1] of TDXRMachine_Axis; |
||
7206 | |||
7207 | const |
||
7208 | Int32Value = 65536.0*65536.0; |
||
7209 | |||
7210 | var |
||
7211 | TexXFloat, TexYFloat: array[0..DXR_MAXTEXTURE-1] of DWORD; |
||
7212 | |||
7213 | function Comp2DWORD(c: Comp): DWORD; |
||
7214 | begin |
||
7215 | Result := PDWORD(@c)^; |
||
7216 | end; |
||
7217 | |||
7218 | function FloatToIntFloat(d: Extended): Comp; |
||
7219 | begin |
||
7220 | Result := d*Int32Value; |
||
7221 | end; |
||
7222 | |||
7223 | function FloatToColorFloat(d: Extended): Word; |
||
7224 | begin |
||
7225 | Result := Trunc(d*255); |
||
7226 | end; |
||
7227 | |||
7228 | function FloatToTextureFloatX(i: Integer; d: Extended): DWORD; |
||
7229 | begin |
||
7230 | Result := Comp2DWORD(d*TexXFloat[i]); |
||
7231 | end; |
||
7232 | |||
7233 | function FloatToTextureFloatY(i: Integer; d: Double): DWORD; |
||
7234 | begin |
||
7235 | Result := Comp2DWORD(d*TexYFloat[i]); |
||
7236 | end; |
||
7237 | |||
7238 | procedure drawline(x1, x2, y: Integer; |
||
7239 | const x_ntex1, x_ntex2: T2DAxis64Array; |
||
7240 | const x_nc1, x_nc2: TCol64Array); |
||
7241 | var |
||
7242 | i, xcount, xcount2, ofs: Integer; |
||
7243 | begin |
||
7244 | xcount := x2-x1; |
||
7245 | xcount2 := xcount; |
||
7246 | |||
7247 | { Clipping } |
||
7248 | ofs := 0; |
||
7249 | |||
7250 | if x1<0 then |
||
7251 | begin |
||
7252 | i := -x1; |
||
7253 | Inc(ofs, i); |
||
7254 | Inc(x1, i); |
||
7255 | Dec(xcount2, i); |
||
7256 | end; |
||
7257 | |||
7258 | if x1+xcount2>=Integer(Dest.Width) then |
||
7259 | begin |
||
7260 | i := (x1+xcount2)-Integer(Dest.Width); |
||
7261 | Dec(xcount2, i); |
||
7262 | end; |
||
7263 | |||
7264 | if xcount2<=0 then Exit; |
||
7265 | |||
7266 | DXRMachine.Axis.Axis.X := x1; |
||
7267 | DXRMachine.Axis.Axis.Y := y; |
||
7268 | |||
7269 | for i:=0 to DXRMachine.TextureIndexCount-1 do |
||
7270 | with DXRMachine.TextureList[DXRMachine.TextureIndex[i]] do |
||
7271 | begin |
||
7272 | nAxis := x_ntex1[i]; |
||
7273 | iAxis.X := Integer(x_ntex2[i].X-x_ntex1[i].X) div xcount; |
||
7274 | iAxis.Y := Integer(x_ntex2[i].Y-x_ntex1[i].Y) div xcount; |
||
7275 | |||
7276 | if TextureAddress=DXR_TEXTUREADDRESS_DONOTCLIP then |
||
7277 | begin |
||
7278 | if (DWORD(nAxis.X) shr 16>DXRMachine.TextureList[DXRMachine.TextureIndex[i]].Surface.Width) or |
||
7279 | (DWORD(nAxis.Y) shr 16>DXRMachine.TextureList[DXRMachine.TextureIndex[i]].Surface.Height) then Exit; |
||
7280 | |||
7281 | if ((DWORD(nAxis.X+iAxis.X*(xcount)-1)) shr 16>DXRMachine.TextureList[DXRMachine.TextureIndex[i]].Surface.Width) or |
||
7282 | ((DWORD(nAxis.Y+iAxis.Y*(xcount)-1)) shr 16>DXRMachine.TextureList[DXRMachine.TextureIndex[i]].Surface.Height) then Exit; |
||
7283 | end; |
||
7284 | |||
7285 | if ofs<>0 then |
||
7286 | begin |
||
7287 | nAxis.X := nAxis.X + iAxis.X*ofs; |
||
7288 | nAxis.Y := nAxis.Y + iAxis.Y*ofs; |
||
7289 | end; |
||
7290 | end; |
||
7291 | |||
7292 | for i:=0 to DXRMachine.ColorIndexCount-1 do |
||
7293 | with DXRMachine.ColorList[DXRMachine.ColorIndex[i]] do |
||
7294 | begin |
||
7295 | if Gouraud then |
||
7296 | begin |
||
7297 | nColor := x_nc1[i]; |
||
7298 | |||
7299 | iColor.R := Integer(x_nc2[i].R-x_nc1[i].R) div xcount; |
||
7300 | iColor.G := Integer(x_nc2[i].G-x_nc1[i].G) div xcount; |
||
7301 | iColor.B := Integer(x_nc2[i].B-x_nc1[i].B) div xcount; |
||
7302 | iColor.A := Integer(x_nc2[i].A-x_nc1[i].A) div xcount; |
||
7303 | |||
7304 | if ofs<>0 then |
||
7305 | begin |
||
7306 | nColor.R := nColor.R + iColor.R*ofs; |
||
7307 | nColor.G := nColor.G + iColor.G*ofs; |
||
7308 | nColor.B := nColor.B + iColor.B*ofs; |
||
7309 | nColor.A := nColor.A + iColor.A*ofs; |
||
7310 | end; |
||
7311 | end; |
||
7312 | end; |
||
7313 | |||
7314 | DXRMachine.Run(xcount2); |
||
7315 | end; |
||
7316 | |||
7317 | procedure draw(p1, pt1, p2, pt2: PDXR_Vertex; starty, ycount, y1, y2, ofs1, ofs2: Integer); |
||
7318 | var |
||
7319 | i, j, y: Integer; |
||
7320 | c1, c2, c2_1, c2_2: TDXR_Color; |
||
7321 | y_nx1, y_nx2, y_ix1, y_ix2: Comp; |
||
7322 | y_ntex1, y_ntex2, y_itex1, y_itex2: T2DAxis64Array; |
||
7323 | y_nc1, y_nc2, y_ic1, y_ic2: TCol64Array; |
||
7324 | begin |
||
7325 | if ycount<=0 then Exit; |
||
7326 | if y1=0 then Exit; |
||
7327 | if y2=0 then Exit; |
||
7328 | |||
7329 | { Clipping } |
||
7330 | if starty<0 then |
||
7331 | begin |
||
7332 | i := -starty; |
||
7333 | |||
7334 | Inc(ofs1, i); |
||
7335 | Inc(ofs2, i); |
||
7336 | |||
7337 | Inc(starty, i); |
||
7338 | Dec(ycount, i); |
||
7339 | end; |
||
7340 | |||
7341 | if starty+ycount>=Integer(Dest.Height) then |
||
7342 | begin |
||
7343 | i := (starty+ycount)-Integer(Dest.Height); |
||
7344 | Dec(ycount, i); |
||
7345 | end; |
||
7346 | |||
7347 | if ycount<=0 then Exit; |
||
7348 | |||
7349 | y_nx1 := FloatToIntFloat(Trunc(p1.sx)); |
||
7350 | y_nx2 := FloatToIntFloat(Trunc(p2.sx)); |
||
7351 | y_ix1 := FloatToIntFloat((Trunc(pt1.sx)-Trunc(p1.sx))/y1); |
||
7352 | y_ix2 := FloatToIntFloat((Trunc(pt2.sx)-Trunc(p2.sx))/y2); |
||
7353 | |||
7354 | if ofs1<>0 then |
||
7355 | y_nx1 := y_nx1 + y_ix1*ofs1; |
||
7356 | |||
7357 | if ofs2<>0 then |
||
7358 | y_nx2 := y_nx2 + y_ix2*ofs2; |
||
7359 | |||
7360 | for i:=0 to DXRMachine.TextureIndexCount-1 do |
||
7361 | begin |
||
7362 | j := DXRMachine.TextureIndex[i]; |
||
7363 | |||
7364 | y_itex1[i].X := FloatToTextureFloatX(i, (pt1.tu[j]-p1.tu[j])/y1); |
||
7365 | y_itex1[i].Y := FloatToTextureFloatY(i, (pt1.tv[j]-p1.tv[j])/y1); |
||
7366 | y_itex2[i].X := FloatToTextureFloatX(i, (pt2.tu[j]-p2.tu[j])/y2); |
||
7367 | y_itex2[i].Y := FloatToTextureFloatY(i, (pt2.tv[j]-p2.tv[j])/y2); |
||
7368 | |||
7369 | y_ntex1[i].X := FloatToTextureFloatX(i, p1.tu[j]); |
||
7370 | y_ntex1[i].Y := FloatToTextureFloatY(i, p1.tv[j]); |
||
7371 | y_ntex2[i].X := FloatToTextureFloatX(i, p2.tu[j]); |
||
7372 | y_ntex2[i].Y := FloatToTextureFloatY(i, p2.tv[j]); |
||
7373 | |||
7374 | if ofs1<>0 then |
||
7375 | begin |
||
7376 | y_ntex1[i].X := y_ntex1[i].X + y_itex1[i].X*ofs1; |
||
7377 | y_ntex1[i].Y := y_ntex1[i].Y + y_itex1[i].Y*ofs1; |
||
7378 | end; |
||
7379 | |||
7380 | if ofs2<>0 then |
||
7381 | begin |
||
7382 | y_ntex2[i].X := y_ntex2[i].X + y_itex2[i].X*ofs2; |
||
7383 | y_ntex2[i].Y := y_ntex2[i].Y + y_itex2[i].Y*ofs2; |
||
7384 | end; |
||
7385 | end; |
||
7386 | |||
7387 | for i:=0 to DXRMachine.ColorIndexCount-1 do |
||
7388 | if DXRMachine.ColorList[i].Gouraud then |
||
7389 | begin |
||
7390 | if DXRMachine.ColorIndex[i]=0 then |
||
7391 | begin |
||
7392 | c1 := p1.color; |
||
7393 | c2 := p2.color; |
||
7394 | c2_1 := pt1.color; |
||
7395 | c2_2 := pt2.color; |
||
7396 | end else |
||
7397 | begin |
||
7398 | c1 := p1.specular; |
||
7399 | c2 := p2.specular; |
||
7400 | c2_1 := pt1.specular; |
||
7401 | c2_2 := pt2.specular; |
||
7402 | end; |
||
7403 | |||
7404 | y_nc1[i].R := FloatToColorFloat(RGBA_GETRED(c1)); |
||
7405 | y_nc1[i].G := FloatToColorFloat(RGBA_GETGREEN(c1)); |
||
7406 | y_nc1[i].B := FloatToColorFloat(RGBA_GETBLUE(c1)); |
||
7407 | y_nc1[i].A := FloatToColorFloat(RGBA_GETALPHA(c1)); |
||
7408 | y_nc2[i].R := FloatToColorFloat(RGBA_GETRED(c2)); |
||
7409 | y_nc2[i].G := FloatToColorFloat(RGBA_GETGREEN(c2)); |
||
7410 | y_nc2[i].B := FloatToColorFloat(RGBA_GETBLUE(c2)); |
||
7411 | y_nc2[i].A := FloatToColorFloat(RGBA_GETALPHA(c2)); |
||
7412 | |||
7413 | y_ic1[i].R := FloatToColorFloat((RGBA_GETRED(c2_1)-RGBA_GETRED(c1))/y1); |
||
7414 | y_ic1[i].G := FloatToColorFloat((RGBA_GETGREEN(c2_1)-RGBA_GETGREEN(c1))/y1); |
||
7415 | y_ic1[i].B := FloatToColorFloat((RGBA_GETBLUE(c2_1)-RGBA_GETBLUE(c1))/y1); |
||
7416 | y_ic1[i].A := FloatToColorFloat((RGBA_GETALPHA(c2_1)-RGBA_GETALPHA(c1))/y1); |
||
7417 | y_ic2[i].R := FloatToColorFloat((RGBA_GETRED(c2_2)-RGBA_GETRED(c2))/y2); |
||
7418 | y_ic2[i].G := FloatToColorFloat((RGBA_GETGREEN(c2_2)-RGBA_GETGREEN(c2))/y2); |
||
7419 | y_ic2[i].B := FloatToColorFloat((RGBA_GETBLUE(c2_2)-RGBA_GETBLUE(c2))/y2); |
||
7420 | y_ic2[i].A := FloatToColorFloat((RGBA_GETALPHA(c2_2)-RGBA_GETALPHA(c2))/y2); |
||
7421 | |||
7422 | if ofs1<>0 then |
||
7423 | begin |
||
7424 | y_nc1[i].R := y_nc1[i].R + y_ic1[i].R*ofs1; |
||
7425 | y_nc1[i].G := y_nc1[i].G + y_ic1[i].G*ofs1; |
||
7426 | y_nc1[i].B := y_nc1[i].B + y_ic1[i].B*ofs1; |
||
7427 | y_nc1[i].A := y_nc1[i].A + y_ic1[i].A*ofs1; |
||
7428 | end; |
||
7429 | |||
7430 | if ofs2<>0 then |
||
7431 | begin |
||
7432 | y_nc2[i].R := y_nc2[i].R + y_ic2[i].R*ofs2; |
||
7433 | y_nc2[i].G := y_nc2[i].G + y_ic2[i].G*ofs2; |
||
7434 | y_nc2[i].B := y_nc2[i].B + y_ic2[i].B*ofs2; |
||
7435 | y_nc2[i].A := y_nc2[i].A + y_ic2[i].A*ofs2; |
||
7436 | end; |
||
7437 | end; |
||
7438 | |||
7439 | for y:=starty to starty+ycount-1 do |
||
7440 | begin |
||
7441 | if States.EnableDrawLine and (1 shl (y and 31))<>0 then |
||
7442 | if PInteger(Integer(@y_nx1)+4)^<PInteger(Integer(@y_nx2)+4)^ then |
||
7443 | begin |
||
7444 | drawline( |
||
7445 | PInteger(Integer(@y_nx1)+4)^, PInteger(Integer(@y_nx2)+4)^, y, |
||
7446 | y_ntex1, y_ntex2, |
||
7447 | y_nc1, y_nc2 |
||
7448 | ); |
||
7449 | end else if PInteger(Integer(@y_nx1)+4)^>PInteger(Integer(@y_nx2)+4)^ then |
||
7450 | begin |
||
7451 | drawline( |
||
7452 | PInteger(Integer(@y_nx2)+4)^, PInteger(Integer(@y_nx1)+4)^, y, |
||
7453 | y_ntex2, y_ntex1, |
||
7454 | y_nc2, y_nc1 |
||
7455 | ); |
||
7456 | end; |
||
7457 | |||
7458 | y_nx1 := y_nx1 + y_ix1; |
||
7459 | y_nx2 := y_nx2 + y_ix2; |
||
7460 | |||
7461 | for i:=0 to DXRMachine.TextureIndexCount-1 do |
||
7462 | with DXRMachine.TextureList[DXRMachine.TextureIndex[i]] do |
||
7463 | begin |
||
7464 | y_ntex1[i].X := y_ntex1[i].X + y_itex1[i].X; |
||
7465 | y_ntex1[i].Y := y_ntex1[i].Y + y_itex1[i].Y; |
||
7466 | y_ntex2[i].X := y_ntex2[i].X + y_itex2[i].X; |
||
7467 | y_ntex2[i].Y := y_ntex2[i].Y + y_itex2[i].Y; |
||
7468 | end; |
||
7469 | |||
7470 | for i:=0 to DXRMachine.ColorIndexCount-1 do |
||
7471 | with DXRMachine.ColorList[DXRMachine.ColorIndex[i]] do |
||
7472 | begin |
||
7473 | if Gouraud then |
||
7474 | begin |
||
7475 | y_nc1[i].R := y_nc1[i].R + y_ic1[i].R; |
||
7476 | y_nc1[i].G := y_nc1[i].G + y_ic1[i].G; |
||
7477 | y_nc1[i].B := y_nc1[i].B + y_ic1[i].B; |
||
7478 | y_nc1[i].A := y_nc1[i].A + y_ic1[i].A; |
||
7479 | y_nc2[i].R := y_nc2[i].R + y_ic2[i].R; |
||
7480 | y_nc2[i].G := y_nc2[i].G + y_ic2[i].G; |
||
7481 | y_nc2[i].B := y_nc2[i].B + y_ic2[i].B; |
||
7482 | y_nc2[i].A := y_nc2[i].A + y_ic2[i].A; |
||
7483 | end; |
||
7484 | end; |
||
7485 | end; |
||
7486 | end; |
||
7487 | |||
7488 | var |
||
7489 | p: array[0..2] of PDXR_Vertex; |
||
7490 | tmp: Pointer; |
||
7491 | y1, y2, y3, i: Integer; |
||
7492 | begin |
||
7493 | { Cull } |
||
7494 | case States.CullMode of |
||
7495 | DXR_CULL_NONE: |
||
7496 | begin |
||
7497 | end; |
||
7498 | DXR_CULL_CW: |
||
7499 | begin |
||
7500 | if (Tri[1].sx-Tri[0].sx)*(Tri[2].sy-Tri[0].sy)-(Tri[1].sy-Tri[0].sy)*(Tri[2].sx-Tri[0].sx)>0 then Exit; |
||
7501 | end; |
||
7502 | DXR_CULL_CCW: |
||
7503 | begin |
||
7504 | if (Tri[1].sx-Tri[0].sx)*(Tri[2].sy-Tri[0].sy)-(Tri[1].sy-Tri[0].sy)*(Tri[2].sx-Tri[0].sx)<0 then Exit; |
||
7505 | end; |
||
7506 | end; |
||
7507 | |||
7508 | Inc(RenderPrimitiveCount); |
||
7509 | |||
7510 | { p[0]=Top vertex of Y axis } |
||
7511 | { p[1]=Center vertex of Y axis } |
||
7512 | { p[2]=Bottom vertex of Y axis } |
||
7513 | p[0]:=Tri[0]; p[1]:=Tri[1]; p[2]:=Tri[2]; |
||
7514 | if p[0].sy>p[1].sy then begin tmp:=p[0]; p[0]:=p[1]; p[1]:=tmp end; |
||
7515 | if p[0].sy>p[2].sy then begin tmp:=p[0]; p[0]:=p[2]; p[2]:=tmp end; |
||
7516 | if p[1].sy>p[2].sy then begin tmp:=p[1]; p[1]:=p[2]; p[2]:=tmp end; |
||
7517 | |||
7518 | if (p[2].sy<=p[0].sy) then Exit; |
||
7519 | if (p[2].sy<=0) or (p[0].sy>=Dest.Height) then Exit; |
||
7520 | if (p[0].sx<0) and (p[1].sx<0) and (p[2].sx<0) then Exit; |
||
7521 | if (p[0].sx>=Dest.Width) and (p[1].sx>=Dest.Width) and (p[2].sx>=Dest.Width) then Exit; |
||
7522 | |||
7523 | { Generate code } |
||
7524 | if not DXRMachine.Compiled then |
||
7525 | InitGenerator; |
||
7526 | |||
7527 | y1 := Trunc(p[1].sy)-Trunc(p[0].sy); |
||
7528 | y2 := Trunc(p[2].sy)-Trunc(p[1].sy); |
||
7529 | y3 := Trunc(p[2].sy)-Trunc(p[0].sy); |
||
7530 | |||
7531 | for i:=0 to DXRMachine.TextureIndexCount-1 do |
||
7532 | with DXRMachine.TextureList[DXRMachine.TextureIndex[i]] do |
||
7533 | begin |
||
7534 | case TextureAddress of |
||
7535 | DXR_TEXTUREADDRESS_TILE: |
||
7536 | begin |
||
7537 | TexXFloat[i] := Surface.Width2 * TextureAxisFloat; |
||
7538 | TexYFloat[i] := Surface.Height2 * TextureAxisFloat; |
||
7539 | end; |
||
7540 | DXR_TEXTUREADDRESS_DONOTCLIP: |
||
7541 | begin |
||
7542 | TexXFloat[i] := (Surface.Width-1) * TextureAxisFloat; |
||
7543 | TexYFloat[i] := (Surface.Height-1) * TextureAxisFloat; |
||
7544 | end; |
||
7545 | end; |
||
7546 | end; |
||
7547 | |||
7548 | with DXRMachine.ColorList[0] do |
||
7549 | if Enable and (not Gouraud) then |
||
7550 | begin |
||
7551 | nColor.R := RGBA_GETRED(Tri[0].color)*ColorFloat; |
||
7552 | nColor.G := RGBA_GETGREEN(Tri[0].color)*ColorFloat; |
||
7553 | nColor.B := RGBA_GETBLUE(Tri[0].color)*ColorFloat; |
||
7554 | nColor.A := RGBA_GETALPHA(Tri[0].color)*ColorFloat; |
||
7555 | end; |
||
7556 | |||
7557 | with DXRMachine.ColorList[1] do |
||
7558 | if Enable and (not Gouraud) then |
||
7559 | begin |
||
7560 | nColor.R := RGBA_GETRED(Tri[0].specular)*ColorFloat; |
||
7561 | nColor.G := RGBA_GETGREEN(Tri[0].specular)*ColorFloat; |
||
7562 | nColor.B := RGBA_GETBLUE(Tri[0].specular)*ColorFloat; |
||
7563 | nColor.A := RGBA_GETALPHA(Tri[0].specular)*ColorFloat; |
||
7564 | end; |
||
7565 | |||
7566 | { p[0] - p[1] } |
||
7567 | draw(p[0], p[1], p[0], p[2], Trunc(p[0].sy), y1, y1, y3, 0, 0); |
||
7568 | |||
7569 | { p[1] - p[2] } |
||
7570 | draw(p[1], p[2], p[0], p[2], Trunc(p[1].sy), y2, y2, y3, 0, y1); |
||
7571 | end; |
||
7572 | |||
7573 | procedure dxrDrawPrimitive(const Dest: TDXR_Surface; const States: TDXR_RenderStates; PrimitiveType: TDXR_PrimitiveType; |
||
7574 | VertexList: PDXR_Vertex; VertexCount: DWORD); |
||
7575 | var |
||
7576 | i: Integer; |
||
7577 | Tri: TDXR_Triangle; |
||
7578 | begin |
||
7579 | if not (PrimitiveType in [DXR_PRIMITIVETYPE_TRIANGLELIST, DXR_PRIMITIVETYPE_TRIANGLESTRIP]) then Exit; |
||
7580 | |||
7581 | DXRMachine.Compiled := False; |
||
7582 | |||
7583 | case PrimitiveType of |
||
7584 | DXR_PRIMITIVETYPE_TRIANGLELIST: |
||
7585 | begin |
||
7586 | for i:=0 to VertexCount div 3-1 do |
||
7587 | begin |
||
7588 | Tri[0] := @PArrayDXR_Vertex(VertexList)[i*3]; |
||
7589 | Tri[1] := @PArrayDXR_Vertex(VertexList)[i*3+1]; |
||
7590 | Tri[2] := @PArrayDXR_Vertex(VertexList)[i*3+2]; |
||
7591 | dxrDrawTriangle(Dest, States, Tri); |
||
7592 | end; |
||
7593 | end; |
||
7594 | DXR_PRIMITIVETYPE_TRIANGLESTRIP: |
||
7595 | begin |
||
7596 | for i:=2 to VertexCount-1 do |
||
7597 | begin |
||
7598 | Tri[0] := @PArrayDXR_Vertex(VertexList)[i-2]; |
||
7599 | Tri[1] := @PArrayDXR_Vertex(VertexList)[i-1]; |
||
7600 | Tri[2] := @PArrayDXR_Vertex(VertexList)[i]; |
||
7601 | dxrDrawTriangle(Dest, States, Tri); |
||
7602 | end; |
||
7603 | end; |
||
7604 | end; |
||
7605 | end; |
||
7606 | |||
7607 | procedure dxrDrawPointeredPrimitive(const Dest: TDXR_Surface; const States: TDXR_RenderStates; PrimitiveType: TDXR_PrimitiveType; |
||
7608 | VertexList: PPDXR_Vertex; VertexCount: DWORD); |
||
7609 | var |
||
7610 | i: Integer; |
||
7611 | Tri: TDXR_Triangle; |
||
7612 | begin |
||
7613 | if not (PrimitiveType in [DXR_PRIMITIVETYPE_TRIANGLELIST, DXR_PRIMITIVETYPE_TRIANGLESTRIP]) then Exit; |
||
7614 | |||
7615 | DXRMachine.Compiled := False; |
||
7616 | |||
7617 | case PrimitiveType of |
||
7618 | DXR_PRIMITIVETYPE_TRIANGLELIST: |
||
7619 | begin |
||
7620 | for i:=0 to VertexCount div 3-1 do |
||
7621 | begin |
||
7622 | Tri[0] := PArrayPDXR_Vertex(VertexList)[i*3]; |
||
7623 | Tri[1] := PArrayPDXR_Vertex(VertexList)[i*3+1]; |
||
7624 | Tri[2] := PArrayPDXR_Vertex(VertexList)[i*3+2]; |
||
7625 | dxrDrawTriangle(Dest, States, Tri); |
||
7626 | end; |
||
7627 | end; |
||
7628 | DXR_PRIMITIVETYPE_TRIANGLESTRIP: |
||
7629 | begin |
||
7630 | for i:=2 to VertexCount-1 do |
||
7631 | begin |
||
7632 | Tri[0] := PArrayPDXR_Vertex(VertexList)[i-2]; |
||
7633 | Tri[1] := PArrayPDXR_Vertex(VertexList)[i-1]; |
||
7634 | Tri[2] := PArrayPDXR_Vertex(VertexList)[i]; |
||
7635 | dxrDrawTriangle(Dest, States, Tri); |
||
7636 | end; |
||
7637 | end; |
||
7638 | end; |
||
7639 | end; |
||
7640 | |||
7641 | procedure dxrDrawIndexedPrimitive(const Dest: TDXR_Surface; const States: TDXR_RenderStates; PrimitiveType: TDXR_PrimitiveType; |
||
7642 | VertexList: PDXR_Vertex; VertexCount: DWORD; IndexList: PDWORD; IndexCount: DWORD); |
||
7643 | var |
||
7644 | i: Integer; |
||
7645 | Tri: TDXR_Triangle; |
||
7646 | begin |
||
7647 | if not (PrimitiveType in [DXR_PRIMITIVETYPE_TRIANGLELIST, DXR_PRIMITIVETYPE_TRIANGLESTRIP]) then Exit; |
||
7648 | |||
7649 | DXRMachine.Compiled := False; |
||
7650 | |||
7651 | case PrimitiveType of |
||
7652 | DXR_PRIMITIVETYPE_TRIANGLELIST: |
||
7653 | begin |
||
7654 | for i:=0 to IndexCount div 3-1 do |
||
7655 | begin |
||
7656 | Tri[0] := @PArrayDXR_Vertex(VertexList)[PArrayDWORD(IndexList)[i*3]]; |
||
7657 | Tri[1] := @PArrayDXR_Vertex(VertexList)[PArrayDWORD(IndexList)[i*3+1]]; |
||
7658 | Tri[2] := @PArrayDXR_Vertex(VertexList)[PArrayDWORD(IndexList)[i*3+2]]; |
||
7659 | dxrDrawTriangle(Dest, States, Tri); |
||
7660 | end; |
||
7661 | end; |
||
7662 | DXR_PRIMITIVETYPE_TRIANGLESTRIP: |
||
7663 | begin |
||
7664 | for i:=2 to IndexCount-1 do |
||
7665 | begin |
||
7666 | Tri[0] := @PArrayDXR_Vertex(VertexList)[PArrayDWORD(IndexList)[i-2]]; |
||
7667 | Tri[1] := @PArrayDXR_Vertex(VertexList)[PArrayDWORD(IndexList)[i-1]]; |
||
7668 | Tri[2] := @PArrayDXR_Vertex(VertexList)[PArrayDWORD(IndexList)[i]]; |
||
7669 | dxrDrawTriangle(Dest, States, Tri); |
||
7670 | end; |
||
7671 | end; |
||
7672 | end; |
||
7673 | end; |
||
7674 | |||
7675 | function MulDiv64(a, b, c: Integer): Integer; assembler; |
||
7676 | asm |
||
7677 | mov eax, a |
||
7678 | imul b |
||
7679 | idiv c |
||
7680 | end; |
||
7681 | |||
7682 | function Max(B1, B2: Integer): Integer; |
||
7683 | begin |
||
7684 | if B1>=B2 then Result := B1 else Result := B2; |
||
7685 | end; |
||
7686 | |||
7687 | function Min(B1, B2: Integer): Integer; |
||
7688 | begin |
||
7689 | if B1<=B2 then Result := B1 else Result := B2; |
||
7690 | end; |
||
7691 | |||
7692 | function BltClipX(const Dest, Src: TDXR_Surface; |
||
7693 | var StartX, EndX, StartSrcX: Integer): Boolean; |
||
7694 | begin |
||
7695 | if StartX<0 then |
||
7696 | begin |
||
7697 | StartSrcX := StartSrcX-StartX; |
||
7698 | StartX := 0; |
||
7699 | end; |
||
7700 | |||
7701 | EndX := Min(EndX, Dest.Width); |
||
7702 | |||
7703 | Result := (EndX>0) and (EndX-StartX>0); |
||
7704 | end; |
||
7705 | |||
7706 | function BltClipY(const Dest, Src: TDXR_Surface; |
||
7707 | var StartY, EndY, StartSrcY: Integer): Boolean; |
||
7708 | begin |
||
7709 | if StartY<0 then |
||
7710 | begin |
||
7711 | StartSrcY := StartSrcY-StartY; |
||
7712 | StartY := 0; |
||
7713 | end; |
||
7714 | |||
7715 | EndY := Min(EndY, Dest.Height); |
||
7716 | |||
7717 | Result := (EndY>0) and (EndY-StartY>0); |
||
7718 | end; |
||
7719 | |||
7720 | function BltClip(const Dest, Src: TDXR_Surface; |
||
7721 | var StartX, StartY, EndX, EndY, StartSrcX, StartSrcY: Integer): Boolean; |
||
7722 | begin |
||
7723 | Result := BltClipX(Dest, Src, StartX, EndX, StartSrcX) and |
||
7724 | BltClipY(Dest, Src, StartY, EndY, StartSrcY); |
||
7725 | end; |
||
7726 | |||
7727 | function FillClip(const Dest: TDXR_Surface; |
||
7728 | var StartX, StartY, EndX, EndY: Integer): Boolean; |
||
7729 | begin |
||
7730 | StartX := Max(StartX, 0); |
||
7731 | StartY := Max(StartY, 0); |
||
7732 | EndX := Min(EndX, Dest.Width); |
||
7733 | EndY := Min(EndY, Dest.Height); |
||
7734 | |||
7735 | Result := (StartX<EndX) and (StartY<EndY); |
||
7736 | end; |
||
7737 | |||
7738 | var |
||
7739 | CosinTable: array[0..255] of Double; |
||
7740 | |||
7741 | procedure InitCosinTable; |
||
7742 | var |
||
7743 | i: Integer; |
||
7744 | begin |
||
7745 | for i:=Low(CosinTable) to High(CosinTable) do |
||
7746 | CosinTable[i] := Cos((i/256)*2*PI); |
||
7747 | end; |
||
7748 | |||
7749 | function Cos256(i: Integer): Double; |
||
7750 | begin |
||
7751 | Result := CosinTable[i and 255]; |
||
7752 | end; |
||
7753 | |||
7754 | function Sin256(i: Integer): Double; |
||
7755 | begin |
||
7756 | Result := CosinTable[(i+192) and 255]; |
||
7757 | end; |
||
7758 | |||
7759 | function RotationClip(const Dest, Src: TDXR_Surface; |
||
7760 | X, Y, Width, Height: Integer; CenterX, CenterY: Double; Angle: Integer; |
||
7761 | var StartX, StartY, EndX, EndY: Integer): Boolean; |
||
7762 | |||
7763 | function RotatePoint(ax, ay: Integer): TPoint; |
||
7764 | var |
||
7765 | c, s: Double; |
||
7766 | begin |
||
7767 | ax := Trunc(ax - Width*CenterX); |
||
7768 | ay := Trunc(ay - Height*CenterY); |
||
7769 | c := Cos256(Angle); |
||
7770 | s := Sin256(Angle); |
||
7771 | Result.X := X+Trunc(ax * c - ay * s); |
||
7772 | Result.Y := Y+Trunc(ax * s + ay * c); |
||
7773 | end; |
||
7774 | |||
7775 | var |
||
7776 | i: Integer; |
||
7777 | Points: array[0..3] of TPoint; |
||
7778 | begin |
||
7779 | Points[0] := RotatePoint(0, 0); |
||
7780 | Points[1] := RotatePoint(Width, 0); |
||
7781 | Points[2] := RotatePoint(0, Height); |
||
7782 | Points[3] := RotatePoint(Width, Height); |
||
7783 | |||
7784 | StartX := Points[0].X; |
||
7785 | StartY := Points[0].Y; |
||
7786 | EndX := StartX; |
||
7787 | EndY := StartY; |
||
7788 | |||
7789 | for i:=1 to 3 do |
||
7790 | with Points[i] do |
||
7791 | begin |
||
7792 | StartX := Min(StartX, X); |
||
7793 | StartY := Min(StartY, Y); |
||
7794 | EndX := Max(EndX, X); |
||
7795 | EndY := Max(EndY, Y); |
||
7796 | end; |
||
7797 | |||
7798 | StartX := Max(StartX, 0); |
||
7799 | StartY := Max(StartY, 0); |
||
7800 | EndX := Min(EndX, Dest.Width); |
||
7801 | EndY := Min(EndY, Dest.Height); |
||
7802 | |||
7803 | Result := (StartX<=Integer(Dest.Width)) and (EndX>0) and (EndX-StartX>0) and |
||
7804 | (StartY<=Integer(Dest.Height)) and (EndY>0) and (EndY-StartY>0); |
||
7805 | end; |
||
7806 | |||
7807 | procedure CopyXLineInitialize(const Dest, Src: TDXR_Surface; |
||
7808 | const Blend: TDXR_Blend; Alpha: Integer; |
||
7809 | IncX, IncY: Integer; |
||
7810 | ColorKeyEnable: Boolean; ColorKey: DWORD); |
||
7811 | var |
||
7812 | Tree: PDXRMachine_Tree; |
||
7813 | begin |
||
7814 | DXRMachine.Initialize; |
||
7815 | |||
7816 | { Parameter setting } |
||
7817 | DXRMachine.Dest := @Dest; |
||
7818 | DXRMachine.TextureList[0].ColorKeyEnable := ColorKeyEnable; |
||
7819 | DXRMachine.TextureList[0].ColorKey := ColorKey; |
||
7820 | DXRMachine.TextureList[0].Surface := @Src; |
||
7821 | DXRMachine.TextureList[0].TextureAddress := DXR_TEXTUREADDRESS_DONOTCLIP; |
||
7822 | DXRMachine.TextureList[0].iAxis.X := IncX; |
||
7823 | DXRMachine.TextureList[0].iAxis.Y := IncY; |
||
7824 | DXRMachine.TextureList[0].iAxisConstant := True; |
||
7825 | DXRMachine.TextureList[0].DefaultColor.R := Alpha*ColorFloat; |
||
7826 | DXRMachine.TextureList[0].DefaultColor.G := Alpha*ColorFloat; |
||
7827 | DXRMachine.TextureList[0].DefaultColor.B := Alpha*ColorFloat; |
||
7828 | DXRMachine.TextureList[0].DefaultColor.A := Alpha*ColorFloat; |
||
7829 | |||
7830 | { Tree making } |
||
7831 | Tree := DXRMachine.CreateTree_Blend(Blend, DXRMachine.CreateTree_LoadTexture(0), DXRMachine.CreateTree2(DXR_TREETYPE_LOADDESTPIXEL)); |
||
7832 | |||
7833 | DXRMachine.Compile(Tree); |
||
7834 | end; |
||
7835 | |||
7836 | procedure dxrCopyRectBlend(const Dest, Src: TDXR_Surface; |
||
7837 | const DestRect, SrcRect: TRect; Blend: TDXR_Blend; Alpha: Integer; |
||
7838 | ColorKeyEnable: Boolean; ColorKey: DWORD); |
||
7839 | var |
||
7840 | StartX, StartY, EndX, EndY, StartSrcX, StartSrcY: Integer; |
||
7841 | dy, sx, sy: Integer; |
||
7842 | IncX, IncY: Integer; |
||
7843 | begin |
||
7844 | { Clipping } |
||
7845 | if (DestRect.Left>=DestRect.Right) or (DestRect.Top>=DestRect.Bottom) then Exit; |
||
7846 | |||
7847 | if (SrcRect.Left<0) or (SrcRect.Top<0) or |
||
7848 | (SrcRect.Right>Integer(Src.Width)) or (SrcRect.Bottom>Integer(Src.Height)) or |
||
7849 | (SrcRect.Left>=SrcRect.Right) or (SrcRect.Top>=SrcRect.Bottom) then Exit; |
||
7850 | |||
7851 | StartX := DestRect.Left; |
||
7852 | StartY := DestRect.Top; |
||
7853 | EndX := DestRect.Right; |
||
7854 | EndY := DestRect.Bottom; |
||
7855 | StartSrcX := 0; |
||
7856 | StartSrcY := 0; |
||
7857 | if not BltClip(Dest, Src, StartX, StartY, EndX, EndY, StartSrcX, StartSrcY) then Exit; |
||
7858 | |||
7859 | IncX := MulDiv64(SrcRect.Right-SrcRect.Left, TextureAxisFloat, DestRect.Right-DestRect.Left); |
||
7860 | IncY := MulDiv64(SrcRect.Bottom-SrcRect.Top, TextureAxisFloat, DestRect.Bottom-DestRect.Top); |
||
7861 | |||
7862 | sx := StartSrcX * IncX + SrcRect.Left*TextureAxisFloat; |
||
7863 | sy := StartSrcY * IncY + SrcRect.Top*TextureAxisFloat; |
||
7864 | |||
7865 | if (sx<0) or (sy<0) or ((sx+(EndX-StartX)*IncX) shr 16>Integer(Src.Width)) or |
||
7866 | ((sy+(EndY-StartY)*IncY) shr 16>Integer(Src.Height)) then Exit; |
||
7867 | |||
7868 | { Compile } |
||
7869 | CopyXLineInitialize(Dest, Src, Blend, Alpha, IncX, 0, ColorKeyEnable, ColorKey); |
||
7870 | |||
7871 | { Run } |
||
7872 | for dy:=StartY to EndY-1 do |
||
7873 | begin |
||
7874 | DXRMachine.Axis.Axis.X := StartX; |
||
7875 | DXRMachine.Axis.Axis.Y := dy; |
||
7876 | DXRMachine.TextureList[0].nAxis.X := sx; |
||
7877 | DXRMachine.TextureList[0].nAxis.Y := sy; |
||
7878 | DXRMachine.Run(EndX-StartX); |
||
7879 | Inc(sy, IncY); |
||
7880 | end; |
||
7881 | end; |
||
7882 | |||
7883 | procedure dxrFillRectColorBlend(const Dest: TDXR_Surface; |
||
7884 | const DestRect: TRect; Blend: TDXR_Blend; Col: COLORREF); |
||
7885 | var |
||
7886 | dy, StartX, StartY, EndX, EndY: Integer; |
||
7887 | Tree: PDXRMachine_Tree; |
||
7888 | begin |
||
7889 | { Clipping } |
||
7890 | if (DestRect.Left>=DestRect.Right) or (DestRect.Top>=DestRect.Bottom) then Exit; |
||
7891 | |||
7892 | StartX := DestRect.Left; |
||
7893 | StartY := DestRect.Top; |
||
7894 | EndX := DestRect.Right; |
||
7895 | EndY := DestRect.Bottom; |
||
7896 | if not FillClip(Dest, StartX, StartY, EndX, EndY) then Exit; |
||
7897 | |||
7898 | { Compile } |
||
7899 | DXRMachine.Initialize; |
||
7900 | DXRMachine.Dest := @Dest; |
||
7901 | Tree := DXRMachine.CreateTree_Blend(Blend, |
||
7902 | DXRMachine.CreateTree_LoadConstColor(Byte(Col), Byte(Col shr 8), Byte(Col shr 16), Byte(Col shr 24)), |
||
7903 | DXRMachine.CreateTree2(DXR_TREETYPE_LOADDESTPIXEL)); |
||
7904 | DXRMachine.Compile(Tree); |
||
7905 | |||
7906 | { Run } |
||
7907 | for dy:=StartY to EndY-1 do |
||
7908 | begin |
||
7909 | DXRMachine.Axis.Axis.X := StartX; |
||
7910 | DXRMachine.Axis.Axis.Y := dy; |
||
7911 | DXRMachine.Run(EndX-StartX); |
||
7912 | end; |
||
7913 | end; |
||
7914 | |||
7915 | procedure dxrDrawWaveXBlend(const Dest, Src: TDXR_Surface; |
||
7916 | X, Y, Width, Height: Integer; const SrcRect: TRect; amp, Len, ph: Integer; |
||
7917 | Blend: TDXR_Blend; Alpha: Integer; |
||
7918 | ColorKeyEnable: Boolean; ColorKey: DWORD); |
||
7919 | var |
||
7920 | StartX, StartY, EndX, EndY, StartSrcX, StartSrcY: Integer; |
||
7921 | sx, sy: Integer; |
||
7922 | dy, IncX, IncY, i, IncPh: Integer; |
||
7923 | begin |
||
7924 | { Clipping } |
||
7925 | if (Width=0) or (Height=0) then Exit; |
||
7926 | |||
7927 | if (SrcRect.Left<0) or (SrcRect.Top<0) or |
||
7928 | (SrcRect.Right>Integer(Src.Width)) or (SrcRect.Bottom>Integer(Src.Height)) or |
||
7929 | (SrcRect.Left>=SrcRect.Right) or (SrcRect.Top>=SrcRect.Bottom) then Exit; |
||
7930 | |||
7931 | StartY := Y; |
||
7932 | EndY := Y+Height; |
||
7933 | StartSrcY := 0; |
||
7934 | if not BltClipY(Dest, Src, StartY, EndY, StartSrcY) then Exit; |
||
7935 | |||
7936 | IncX := MulDiv64(SrcRect.Right-SrcRect.Left, TextureAxisFloat, Width); |
||
7937 | IncY := MulDiv64(SrcRect.Bottom-SrcRect.Top, TextureAxisFloat, Height); |
||
7938 | |||
7939 | if Len=0 then |
||
7940 | begin |
||
7941 | IncPh := 0; |
||
7942 | end else |
||
7943 | IncPh := MulDiv64(256, 65536, Len); |
||
7944 | i := ph*65536+StartSrcY*IncPh; |
||
7945 | |||
7946 | sy := StartSrcY * IncY + SrcRect.Top*TextureAxisFloat; |
||
7947 | |||
7948 | if ((sy+(EndY-StartY)*IncY) shr 16>Integer(Src.Height)) then Exit; |
||
7949 | |||
7950 | { Compile } |
||
7951 | CopyXLineInitialize(Dest, Src, Blend, Alpha, IncX, 0, ColorKeyEnable, ColorKey); |
||
7952 | |||
7953 | { Run } |
||
7954 | for dy:=StartY to EndY-1 do |
||
7955 | begin |
||
7956 | { X clipping } |
||
7957 | StartX := X+Round(Sin256(i div 65536)*amp); |
||
7958 | EndX := StartX+Width; |
||
7959 | StartSrcX := 0; |
||
7960 | |||
7961 | if BltClipX(Dest, Src, StartX, EndX, StartSrcX) then |
||
7962 | begin |
||
7963 | sx := StartSrcX * IncX + SrcRect.Left*TextureAxisFloat; |
||
7964 | if (sx<0) or (sy<0) or ((sx+(EndX-StartX)*IncX) shr 16>Integer(Src.Width)) then Exit; |
||
7965 | DXRMachine.Axis.Axis.X := StartX; |
||
7966 | DXRMachine.Axis.Axis.Y := dy; |
||
7967 | DXRMachine.TextureList[0].nAxis.X := sx; |
||
7968 | DXRMachine.TextureList[0].nAxis.Y := sy; |
||
7969 | DXRMachine.Run(EndX-StartX); |
||
7970 | end; |
||
7971 | |||
7972 | Inc(i, IncPh); |
||
7973 | Inc(sy, IncY); |
||
7974 | end; |
||
7975 | end; |
||
7976 | |||
7977 | procedure dxrDrawRotateBlend(const Dest, Src: TDXR_Surface; |
||
7978 | X, Y, Width, Height: Integer; const SrcRect: TRect; CenterX, CenterY: Double; |
||
7979 | Angle: Integer; Blend: TDXR_Blend; Alpha: Integer; |
||
7980 | ColorKeyEnable: Boolean; ColorKey: DWORD); |
||
7981 | var |
||
7982 | StartX, EndX, StartY, EndY: Integer; |
||
7983 | dy, sx, sy: Integer; |
||
7984 | c, s, xIncX, xIncY, yIncX, yIncY: Integer; |
||
7985 | pSkip, pCount: Integer; |
||
7986 | gStartX, gStartY: Integer; |
||
7987 | begin |
||
7988 | { Clipping } |
||
7989 | if (Width=0) or (Height=0) then Exit; |
||
7990 | |||
7991 | if (SrcRect.Left<0) or (SrcRect.Top<0) or |
||
7992 | (SrcRect.Right>Integer(Src.Width)) or (SrcRect.Bottom>Integer(Src.Height)) or |
||
7993 | (SrcRect.Left>=SrcRect.Right) or (SrcRect.Top>=SrcRect.Bottom) then Exit; |
||
7994 | |||
7995 | if not RotationClip(Dest, Src, X, Y, Width, Height, CenterX, CenterY, Angle, |
||
7996 | StartX, StartY, EndX, EndY) then Exit; |
||
7997 | |||
7998 | c := Trunc(Cos256(-Angle)*TextureAxisFloat); |
||
7999 | s := Trunc(Sin256(-Angle)*TextureAxisFloat); |
||
8000 | |||
8001 | xIncX := MulDiv64(SrcRect.Right-SrcRect.Left, c, Width); |
||
8002 | xIncY := MulDiv64(SrcRect.Bottom-SrcRect.Top, s, Height); |
||
8003 | |||
8004 | yIncX := MulDiv64(SrcRect.Right-SrcRect.Left, s, Width); |
||
8005 | yIncY := MulDiv64(SrcRect.Bottom-SrcRect.Top, c, Height); |
||
8006 | |||
8007 | sx := (-X+StartX) * xIncX + (Y-StartY) * yIncX + Trunc((SrcRect.Right-SrcRect.Left)*CenterX*TextureAxisFloat) + SrcRect.Left*TextureAxisFloat; |
||
8008 | sy := (-X+StartX) * xIncY - (Y-StartY) * yIncY + Trunc((SrcRect.Bottom-SrcRect.Top)*CenterY*TextureAxisFloat) + SrcRect.Top*TextureAxisFloat; |
||
8009 | |||
8010 | { Compile } |
||
8011 | CopyXLineInitialize(Dest, Src, Blend, Alpha, xIncX, xIncY, ColorKeyEnable, ColorKey); |
||
8012 | |||
8013 | { Run } |
||
8014 | for dy := StartY to EndY-1 do |
||
8015 | begin |
||
8016 | gStartX := sx; |
||
8017 | gStartY := sy; |
||
8018 | |||
8019 | { X clipping } |
||
8020 | pSkip := 0; |
||
8021 | if xIncX>0 then |
||
8022 | begin |
||
8023 | if gStartX<SrcRect.Left*TextureAxisFloat then |
||
8024 | pSkip := (SrcRect.Left*TextureAxisFloat-gStartX+xIncX-1) div xIncX; |
||
8025 | end else if xIncX<0 then |
||
8026 | begin |
||
8027 | if gStartX>=SrcRect.Right*TextureAxisFloat then |
||
8028 | pSkip := (SrcRect.Right*TextureAxisFloat-gStartX+xIncX) div xIncX; |
||
8029 | end; |
||
8030 | |||
8031 | if xIncY>0 then |
||
8032 | begin |
||
8033 | if gStartY<SrcRect.Top*TextureAxisFloat then |
||
8034 | pSkip := Max((SrcRect.Top*TextureAxisFloat-gStartY+xIncY-1) div xIncY, pSkip); |
||
8035 | end else if xIncY<0 then |
||
8036 | begin |
||
8037 | if gStartY>=SrcRect.Bottom*TextureAxisFloat then |
||
8038 | pSkip := Max((SrcRect.Bottom*TextureAxisFloat-gStartY+xIncY) div xIncY, pSkip); |
||
8039 | end; |
||
8040 | |||
8041 | gStartX := gStartX + pSkip*xIncX; |
||
8042 | gStartY := gStartY + pSkip*xIncY; |
||
8043 | |||
8044 | { X clipping } |
||
8045 | if xIncX>=0 then |
||
8046 | begin |
||
8047 | pCount := (SrcRect.Right*TextureAxisFloat-gStartX) div Max(xIncX, 1); |
||
8048 | end else |
||
8049 | begin |
||
8050 | pCount := (gStartX-SrcRect.Left*TextureAxisFloat) div (-xIncX); |
||
8051 | end; |
||
8052 | |||
8053 | if xIncY>=0 then |
||
8054 | begin |
||
8055 | pCount := Min((SrcRect.Bottom*TextureAxisFloat-gStartY) div Max(xIncY, 1), pCount); |
||
8056 | end else |
||
8057 | begin |
||
8058 | pCount := Min((gStartY-SrcRect.Top*TextureAxisFloat) div (-xIncY), pCount); |
||
8059 | end; |
||
8060 | |||
8061 | pCount := Min(Integer(Dest.Width)-(StartX+pSkip), pCount); |
||
8062 | |||
8063 | { Run } |
||
8064 | DXRMachine.Axis.Axis.X := StartX + pSkip; |
||
8065 | DXRMachine.Axis.Axis.Y := dy; |
||
8066 | DXRMachine.TextureList[0].nAxis.X := gStartX; |
||
8067 | DXRMachine.TextureList[0].nAxis.Y := gStartY; |
||
8068 | DXRMachine.Run(pCount); |
||
8069 | |||
8070 | sx := sx - yIncX; |
||
8071 | sy := sy + yIncY; |
||
8072 | end; |
||
8073 | end; |
||
8074 | |||
8075 | initialization |
||
8076 | ReadCPUID; |
||
8077 | Init; |
||
8078 | InitCosinTable; |
||
8079 | finalization |
||
8080 | FDXRMachine.Free; |
||
8081 | end. |