Subversion Repositories spacemission

Rev

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.