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-