GSLocalMemory.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:17k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2005 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  */
  21. #pragma once
  22. #pragma warning(disable: 4244) // warning C4244: '=' : conversion from 'const UINT64' to 'int', possible loss of data
  23. #include "GS.h"
  24. #include "GSTables.h"
  25. class GSLocalMemory
  26. {
  27. public:
  28. typedef DWORD (__fastcall *pixelAddress)(int x, int y, DWORD bp, DWORD bw);
  29. typedef void (GSLocalMemory::*writePixel)(int x, int y, DWORD c, DWORD bp, DWORD bw);
  30. typedef void (GSLocalMemory::*writeFrame)(int x, int y, DWORD c, DWORD bp, DWORD bw);
  31. typedef DWORD (GSLocalMemory::*readPixel)(int x, int y, DWORD bp, DWORD bw);
  32. typedef DWORD (GSLocalMemory::*readTexel)(int x, int y, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  33. typedef void (GSLocalMemory::*writePixelAddr)(DWORD addr, DWORD c);
  34. typedef void (GSLocalMemory::*writeFrameAddr)(DWORD addr, DWORD c);
  35. typedef DWORD (GSLocalMemory::*readPixelAddr)(DWORD addr);
  36. typedef DWORD (GSLocalMemory::*readTexelAddr)(DWORD addr, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  37. typedef void (GSLocalMemory::*SwizzleTexture)(int& tx, int& ty, BYTE* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG);
  38. typedef void (GSLocalMemory::*unSwizzleTexture)(const CRect& r, BYTE* dst, int dstpitch, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  39. typedef void (GSLocalMemory::*readTexture)(const CRect& r, BYTE* dst, int dstpitch, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA, GIFRegCLAMP& CLAMP);
  40. typedef union 
  41. {
  42. struct
  43. {
  44. pixelAddress pa, ba, pga;
  45. readPixel rp;
  46. readPixelAddr rpa;
  47. writePixel wp;
  48. writePixelAddr wpa;
  49. readTexel rt, rtP, rtNP;
  50. readTexelAddr rta;
  51. writeFrameAddr wfa;
  52. SwizzleTexture st;
  53. unSwizzleTexture ust, ustP, ustNP;
  54. DWORD bpp, pal, trbpp; 
  55. CSize bs;
  56. int* rowOffset[8];
  57. };
  58. BYTE dummy[128];
  59. } psmtbl_t;
  60. static psmtbl_t m_psmtbl[64];
  61. protected:
  62. static DWORD pageOffset32[32][32][64];
  63. static DWORD pageOffset32Z[32][32][64];
  64. static DWORD pageOffset16[32][64][64];
  65. static DWORD pageOffset16S[32][64][64];
  66. static DWORD pageOffset16Z[32][64][64];
  67. static DWORD pageOffset16SZ[32][64][64];
  68. static DWORD pageOffset8[32][64][128];
  69. static DWORD pageOffset4[32][128][128];
  70. static int rowOffset32[2048];
  71. static int rowOffset32Z[2048];
  72. static int rowOffset16[2048];
  73. static int rowOffset16S[2048];
  74. static int rowOffset16Z[2048];
  75. static int rowOffset16SZ[2048];
  76. static int rowOffset8[2][2048];
  77. static int rowOffset4[2][2048];
  78. union {BYTE* m_vm8; WORD* m_vm16; DWORD* m_vm32;};
  79. DWORD m_CBP[2];
  80. WORD* m_pCLUT;
  81. DWORD* m_pCLUT32;
  82. UINT64* m_pCLUT64;
  83. GIFRegTEX0 m_prevTEX0;
  84. GIFRegTEXCLUT m_prevTEXCLUT;
  85. bool m_fCLUTMayBeDirty;
  86. public:
  87. GSLocalMemory();
  88. virtual ~GSLocalMemory();
  89. static void RoundDown(CSize& s, CSize bs);
  90. static void RoundUp(CSize& s, CSize bs);
  91. static DWORD Expand24To32(DWORD c, BYTE TCC, GIFRegTEXA& TEXA)
  92. {
  93. BYTE A = (!TEXA.AEM|(c&0xffffff)) ? TEXA.TA0 : 0;
  94. return (A<<24) | (c&0xffffff);
  95. }
  96. static DWORD Expand16To32(WORD c, GIFRegTEXA& TEXA)
  97. {
  98. BYTE A = (c&0x8000) ? TEXA.TA1 : (!TEXA.AEM|c) ? TEXA.TA0 : 0;
  99. return (A << 24) | ((c&0x7c00) << 9) | ((c&0x03e0) << 6) | ((c&0x001f) << 3);
  100. }
  101. BYTE* GetVM() {return m_vm8;}
  102. // address
  103. static DWORD __fastcall pageAddress32(int x, int y, DWORD bp, DWORD bw);
  104. static DWORD __fastcall pageAddress16(int x, int y, DWORD bp, DWORD bw);
  105. static DWORD __fastcall pageAddress8(int x, int y, DWORD bp, DWORD bw);
  106. static DWORD __fastcall pageAddress4(int x, int y, DWORD bp, DWORD bw);
  107. static DWORD __fastcall blockAddress32(int x, int y, DWORD bp, DWORD bw);
  108. static DWORD __fastcall blockAddress16(int x, int y, DWORD bp, DWORD bw);
  109. static DWORD __fastcall blockAddress16S(int x, int y, DWORD bp, DWORD bw);
  110. static DWORD __fastcall blockAddress8(int x, int y, DWORD bp, DWORD bw);
  111. static DWORD __fastcall blockAddress4(int x, int y, DWORD bp, DWORD bw);
  112. static DWORD __fastcall blockAddress32Z(int x, int y, DWORD bp, DWORD bw);
  113. static DWORD __fastcall blockAddress16Z(int x, int y, DWORD bp, DWORD bw);
  114. static DWORD __fastcall blockAddress16SZ(int x, int y, DWORD bp, DWORD bw);
  115. static DWORD __fastcall pixelAddressOrg32(int x, int y, DWORD bp, DWORD bw);
  116. static DWORD __fastcall pixelAddressOrg16(int x, int y, DWORD bp, DWORD bw);
  117. static DWORD __fastcall pixelAddressOrg16S(int x, int y, DWORD bp, DWORD bw);
  118. static DWORD __fastcall pixelAddressOrg8(int x, int y, DWORD bp, DWORD bw);
  119. static DWORD __fastcall pixelAddressOrg4(int x, int y, DWORD bp, DWORD bw);
  120. static DWORD __fastcall pixelAddressOrg32Z(int x, int y, DWORD bp, DWORD bw);
  121. static DWORD __fastcall pixelAddressOrg16Z(int x, int y, DWORD bp, DWORD bw);
  122. static DWORD __fastcall pixelAddressOrg16SZ(int x, int y, DWORD bp, DWORD bw);
  123. static DWORD __fastcall pixelAddress32(int x, int y, DWORD bp, DWORD bw);
  124. static DWORD __fastcall pixelAddress16(int x, int y, DWORD bp, DWORD bw);
  125. static DWORD __fastcall pixelAddress16S(int x, int y, DWORD bp, DWORD bw);
  126. static DWORD __fastcall pixelAddress8(int x, int y, DWORD bp, DWORD bw);
  127. static DWORD __fastcall pixelAddress4(int x, int y, DWORD bp, DWORD bw);
  128. static DWORD __fastcall pixelAddress32Z(int x, int y, DWORD bp, DWORD bw);
  129. static DWORD __fastcall pixelAddress16Z(int x, int y, DWORD bp, DWORD bw);
  130. static DWORD __fastcall pixelAddress16SZ(int x, int y, DWORD bp, DWORD bw);
  131. // raw pixel R/W
  132. void writePixel32(int x, int y, DWORD c, DWORD bp, DWORD bw);
  133. void writePixel24(int x, int y, DWORD c, DWORD bp, DWORD bw);
  134. void writePixel16(int x, int y, DWORD c, DWORD bp, DWORD bw);
  135. void writePixel16S(int x, int y, DWORD c, DWORD bp, DWORD bw);
  136. void writePixel8(int x, int y, DWORD c, DWORD bp, DWORD bw);
  137. void writePixel8H(int x, int y, DWORD c, DWORD bp, DWORD bw);
  138. void writePixel4(int x, int y, DWORD c, DWORD bp, DWORD bw);
  139.     void writePixel4HL(int x, int y, DWORD c, DWORD bp, DWORD bw);
  140. void writePixel4HH(int x, int y, DWORD c, DWORD bp, DWORD bw);
  141. void writePixel32Z(int x, int y, DWORD c, DWORD bp, DWORD bw);
  142. void writePixel24Z(int x, int y, DWORD c, DWORD bp, DWORD bw);
  143. void writePixel16Z(int x, int y, DWORD c, DWORD bp, DWORD bw);
  144. void writePixel16SZ(int x, int y, DWORD c, DWORD bp, DWORD bw);
  145. void writeFrame16(int x, int y, DWORD c, DWORD bp, DWORD bw);
  146. void writeFrame16S(int x, int y, DWORD c, DWORD bp, DWORD bw);
  147. DWORD readPixel32(int x, int y, DWORD bp, DWORD bw);
  148. DWORD readPixel24(int x, int y, DWORD bp, DWORD bw);
  149. DWORD readPixel16(int x, int y, DWORD bp, DWORD bw);
  150. DWORD readPixel16S(int x, int y, DWORD bp, DWORD bw);
  151. DWORD readPixel8(int x, int y, DWORD bp, DWORD bw);
  152. DWORD readPixel8H(int x, int y, DWORD bp, DWORD bw);
  153. DWORD readPixel4(int x, int y, DWORD bp, DWORD bw);
  154. DWORD readPixel4HL(int x, int y, DWORD bp, DWORD bw);
  155. DWORD readPixel4HH(int x, int y, DWORD bp, DWORD bw);
  156. DWORD readPixel32Z(int x, int y, DWORD bp, DWORD bw);
  157. DWORD readPixel24Z(int x, int y, DWORD bp, DWORD bw);
  158. DWORD readPixel16Z(int x, int y, DWORD bp, DWORD bw);
  159. DWORD readPixel16SZ(int x, int y, DWORD bp, DWORD bw);
  160. void writePixel32(DWORD addr, DWORD c) {m_vm32[addr] = c;}
  161. void writePixel24(DWORD addr, DWORD c) {m_vm32[addr] = (m_vm32[addr] & 0xff000000) | (c & 0x00ffffff);}
  162. void writePixel16(DWORD addr, DWORD c) {m_vm16[addr] = (WORD)c;}
  163. void writePixel16S(DWORD addr, DWORD c) {m_vm16[addr] = (WORD)c;}
  164. void writePixel8(DWORD addr, DWORD c) {m_vm8[addr] = (BYTE)c;}
  165. void writePixel8H(DWORD addr, DWORD c) {m_vm32[addr] = (m_vm32[addr] & 0x00ffffff) | (c << 24);}
  166. void writePixel4(DWORD addr, DWORD c) {int shift = (addr&1) << 2; addr >>= 1; m_vm8[addr] = (BYTE)((m_vm8[addr] & (0xf0 >> shift)) | ((c & 0x0f) << shift));}
  167. void writePixel4HL(DWORD addr, DWORD c) {m_vm32[addr] = (m_vm32[addr] & 0xf0ffffff) | ((c & 0x0f) << 24);}
  168. void writePixel4HH(DWORD addr, DWORD c) {m_vm32[addr] = (m_vm32[addr] & 0x0fffffff) | ((c & 0x0f) << 28);}
  169. void writePixel32Z(DWORD addr, DWORD c) {m_vm32[addr] = c;}
  170. void writePixel24Z(DWORD addr, DWORD c) {m_vm32[addr] = (m_vm32[addr] & 0xff000000) | (c & 0x00ffffff);}
  171. void writePixel16Z(DWORD addr, DWORD c) {m_vm16[addr] = (WORD)c;}
  172. void writePixel16SZ(DWORD addr, DWORD c) {m_vm16[addr] = (WORD)c;}
  173. void writeFrame16(DWORD addr, DWORD c) {writePixel16(addr, ((c>>16)&0x8000)|((c>>9)&0x7c00)|((c>>6)&0x03e0)|((c>>3)&0x001f));}
  174. void writeFrame16S(DWORD addr, DWORD c) {writePixel16S(addr, ((c>>16)&0x8000)|((c>>9)&0x7c00)|((c>>6)&0x03e0)|((c>>3)&0x001f));}
  175. DWORD readPixel32(DWORD addr) {return m_vm32[addr];}
  176. DWORD readPixel24(DWORD addr) {return m_vm32[addr] & 0x00ffffff;}
  177. DWORD readPixel16(DWORD addr) {return (DWORD)m_vm16[addr];}
  178. DWORD readPixel16S(DWORD addr) {return (DWORD)m_vm16[addr];}
  179. DWORD readPixel8(DWORD addr) {return (DWORD)m_vm8[addr];}
  180. DWORD readPixel8H(DWORD addr) {return m_vm32[addr] >> 24;}
  181. DWORD readPixel4(DWORD addr) {return (m_vm8[addr>>1] >> ((addr&1) << 2)) & 0x0f;}
  182. DWORD readPixel4HL(DWORD addr) {return (m_vm32[addr] >> 24) & 0x0f;}
  183. DWORD readPixel4HH(DWORD addr) {return (m_vm32[addr] >> 28) & 0x0f;}
  184. DWORD readPixel32Z(DWORD addr) {return m_vm32[addr];}
  185. DWORD readPixel24Z(DWORD addr) {return m_vm32[addr] & 0x00ffffff;}
  186. DWORD readPixel16Z(DWORD addr) {return (DWORD)m_vm16[addr];}
  187. DWORD readPixel16SZ(DWORD addr) {return (DWORD)m_vm16[addr];}
  188. // FillRect
  189. bool FillRect(CRect& r, DWORD c, DWORD psm, DWORD fbp, DWORD fbw);
  190. // CLUT
  191. void InvalidateCLUT() {m_fCLUTMayBeDirty = true;}
  192. void WriteCLUT(GIFRegTEX0 TEX0, GIFRegTEXCLUT TEXCLUT);
  193. void ReadCLUT(GIFRegTEX0 TEX0, GIFRegTEXA TEXA, DWORD* pCLUT32);
  194. void SetupCLUT(GIFRegTEX0 TEX0, GIFRegTEXA TEXA);
  195. // expands 16->32
  196. void ReadCLUT32(GIFRegTEX0 TEX0, GIFRegTEXA TEXA, DWORD* pCLUT32);
  197. void SetupCLUT32(GIFRegTEX0 TEX0, GIFRegTEXA TEXA);
  198. void CopyCLUT32(DWORD* pCLUT32, int nPaletteEntries);
  199. // 32-only
  200. DWORD readTexel32(int x, int y, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  201. DWORD readTexel24(int x, int y, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  202. DWORD readTexel16(int x, int y, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  203. DWORD readTexel16S(int x, int y, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  204. DWORD readTexel8(int x, int y, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  205. DWORD readTexel8H(int x, int y, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  206. DWORD readTexel4(int x, int y, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  207. DWORD readTexel4HL(int x, int y, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  208. DWORD readTexel4HH(int x, int y, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  209. DWORD readTexel32(DWORD addr, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA) {return m_vm32[addr];}
  210. DWORD readTexel24(DWORD addr, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA) {return Expand24To32(m_vm32[addr], TEX0.ai32[1]&4, TEXA);}
  211. DWORD readTexel16(DWORD addr, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA) {return Expand16To32(m_vm16[addr], TEXA);}
  212. DWORD readTexel16S(DWORD addr, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA) {return Expand16To32(m_vm16[addr], TEXA);}
  213. DWORD readTexel8(DWORD addr, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA) {return m_pCLUT32[readPixel8(addr)];}
  214. DWORD readTexel8H(DWORD addr, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA) {return m_pCLUT32[readPixel8H(addr)];}
  215. DWORD readTexel4(DWORD addr, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA) {return m_pCLUT32[readPixel4(addr)];}
  216. DWORD readTexel4HL(DWORD addr, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA) {return m_pCLUT32[readPixel4HL(addr)];}
  217. DWORD readTexel4HH(DWORD addr, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA) {return m_pCLUT32[readPixel4HH(addr)];}
  218. void SwizzleTexture32(int& tx, int& ty, BYTE* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG);
  219. void SwizzleTexture24(int& tx, int& ty, BYTE* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG);
  220. void SwizzleTexture16(int& tx, int& ty, BYTE* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG);
  221. void SwizzleTexture16S(int& tx, int& ty, BYTE* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG);
  222. void SwizzleTexture8(int& tx, int& ty, BYTE* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG);
  223. void SwizzleTexture8H(int& tx, int& ty, BYTE* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG);
  224. void SwizzleTexture4(int& tx, int& ty, BYTE* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG);
  225. void SwizzleTexture4HL(int& tx, int& ty, BYTE* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG);
  226. void SwizzleTexture4HH(int& tx, int& ty, BYTE* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG);
  227. void SwizzleTextureX(int& tx, int& ty, BYTE* src, int len, GIFRegBITBLTBUF& BITBLTBUF, GIFRegTRXPOS& TRXPOS, GIFRegTRXREG& TRXREG);
  228. void unSwizzleTexture32(const CRect& r, BYTE* dst, int dstpitch, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  229. void unSwizzleTexture24(const CRect& r, BYTE* dst, int dstpitch, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  230. void unSwizzleTexture16(const CRect& r, BYTE* dst, int dstpitch, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  231. void unSwizzleTexture16S(const CRect& r, BYTE* dst, int dstpitch, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  232. void unSwizzleTexture8(const CRect& r, BYTE* dst, int dstpitch, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  233. void unSwizzleTexture8H(const CRect& r, BYTE* dst, int dstpitch, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  234. void unSwizzleTexture4(const CRect& r, BYTE* dst, int dstpitch, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  235. void unSwizzleTexture4HL(const CRect& r, BYTE* dst, int dstpitch, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  236. void unSwizzleTexture4HH(const CRect& r, BYTE* dst, int dstpitch, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  237. void ReadTexture(const CRect& r, BYTE* dst, int dstpitch, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA, GIFRegCLAMP& CLAMP);
  238. // 32/16/8P
  239. DWORD readTexel16P(int x, int y, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  240. DWORD readTexel16SP(int x, int y, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  241. DWORD readTexel8P(int x, int y, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  242. DWORD readTexel8HP(int x, int y, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  243. DWORD readTexel4P(int x, int y, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  244. DWORD readTexel4HLP(int x, int y, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  245. DWORD readTexel4HHP(int x, int y, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  246. void unSwizzleTexture16P(const CRect& r, BYTE* dst, int dstpitch, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  247. void unSwizzleTexture16SP(const CRect& r, BYTE* dst, int dstpitch, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  248. void unSwizzleTexture8P(const CRect& r, BYTE* dst, int dstpitch, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  249. void unSwizzleTexture8HP(const CRect& r, BYTE* dst, int dstpitch, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  250. void unSwizzleTexture4P(const CRect& r, BYTE* dst, int dstpitch, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  251. void unSwizzleTexture4HLP(const CRect& r, BYTE* dst, int dstpitch, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  252. void unSwizzleTexture4HHP(const CRect& r, BYTE* dst, int dstpitch, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  253. void ReadTextureP(const CRect& r, BYTE* dst, int dstpitch, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA, GIFRegCLAMP& CLAMP);
  254. // 32/16
  255. void unSwizzleTexture8NP(const CRect& r, BYTE* dst, int dstpitch, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  256. void unSwizzleTexture8HNP(const CRect& r, BYTE* dst, int dstpitch, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  257. void unSwizzleTexture4NP(const CRect& r, BYTE* dst, int dstpitch, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  258. void unSwizzleTexture4HLNP(const CRect& r, BYTE* dst, int dstpitch, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  259. void unSwizzleTexture4HHNP(const CRect& r, BYTE* dst, int dstpitch, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA);
  260. void ReadTextureNP(const CRect& r, BYTE* dst, int dstpitch, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA, GIFRegCLAMP& CLAMP);
  261. //
  262. static DWORD m_xtbl[1024], m_ytbl[1024]; 
  263. template<typename DstT> 
  264. void ReadTexture(const CRect& r, BYTE* dst, int dstpitch, GIFRegTEX0& TEX0, GIFRegTEXA& TEXA, GIFRegCLAMP& CLAMP, readTexel rt, unSwizzleTexture st);
  265. // 
  266. HRESULT SaveBMP(IDirect3DDevice9* pDev, LPCTSTR fn, DWORD bp, DWORD bw, DWORD psm, int w, int h);
  267. };
  268. #pragma warning(default: 4244)