Subversion Repositories spacemission

Rev

Rev 4 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  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.
  8082.