PcxPalette.cpp
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:5k
源码类别:

图形图象

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "PcxDeclare.h"
  3. #include "PcxError.h"
  4. #include "PcxModule.h"
  5. #include "PcxPalette.h"
  6. extern  HGLOBAL hImgInfo = NULL;
  7. struct PcxImgInfo * SetPcxImgInfo(INFOSTR * pInfo ,PCXFILEHEADER *pFileheader)
  8. {
  9. struct PcxImgInfo * pImgInfo = NULL;
  10. DWORD dwBitCount = pInfo->imginfo.bitcount;//位深度
  11. BYTE byUsedAdd256Pal = 0;//是否使用了附加的256调色板//1 使用 //0 NONE
  12. DWORD dwPalAccount = 0;
  13. if(dwBitCount <= 8 )
  14. {
  15. dwPalAccount = 1 << dwBitCount;
  16. if(dwBitCount == 8 )
  17. {
  18. byUsedAdd256Pal = 1;
  19. }
  20. else
  21. {
  22. byUsedAdd256Pal = 0;
  23. }
  24. }
  25. else
  26. {
  27. dwPalAccount = 0;
  28. byUsedAdd256Pal = 0;
  29. }
  30. DWORD dwSize =0;
  31. if(byUsedAdd256Pal == 1)
  32. {
  33. // dwSize = sizeof(PcxImgInfo) + (256 -1)* sizeof(PcxPalette) +3;//768 - 3;//3 for 安全
  34. dwSize = sizeof(PcxImgInfo) + 768 +3;//768 - 3;//3 for 安全
  35. }
  36. else
  37. {
  38. dwSize = sizeof(PcxImgInfo);
  39. }
  40. pImgInfo = (PcxImgInfo *)::GlobalAlloc(GPTR, dwSize);
  41. if (pImgInfo == NULL)
  42. {
  43. pInfo->result = ER_MEMORYERR;
  44. ApiMyThrowMem(); // 内存不足
  45. }
  46. /*
  47. pImgInfo = (struct PcxImgInfo *)GlobalLock(hImgInfo);
  48. if (pImgInfo == NULL)
  49. {
  50. pInfo->result = ER_MEMORYERR;
  51. ApiMyThrowMem(); // 内存不足
  52. }
  53. */
  54. pImgInfo->dwInfoSize=dwSize;
  55. pImgInfo->byUsedAdd256PAL = byUsedAdd256Pal;
  56. pImgInfo->dwPalAccount = dwPalAccount;
  57. memcpy(&pImgInfo->pcxFileheader, pFileheader, (size_t)sizeof(PCXFILEHEADER));
  58. // 下面的读取函数需要该指针,所以在此处赋值
  59. pInfo->pImgInfo = pImgInfo;
  60. //don't delete ();
  61. return pImgInfo;
  62. };
  63. void GetPcxPalette(PcxImgInfo *pPcxInfo, void ** ppRgb,DWORD * pdwPalAccount)
  64. {
  65. if(pPcxInfo == NULL)
  66. {
  67. (*ppRgb) = NULL;
  68. (*pdwPalAccount) =0;
  69. return;
  70. }
  71. (*pdwPalAccount) = pPcxInfo->dwPalAccount;
  72. if(*pdwPalAccount == 256)
  73. ASSERT(pPcxInfo->byUsedAdd256PAL);
  74. if((*pdwPalAccount) != 0)
  75. {
  76. if(1 == pPcxInfo->byUsedAdd256PAL)//or|| dwPalAccount == 256
  77. {
  78. (*ppRgb) = pPcxInfo->pcxFileheader.byPalette;
  79. }
  80. else
  81. {
  82. (*ppRgb) = pPcxInfo->pcxPal;
  83. }
  84. }
  85. else
  86. {
  87. (*ppRgb) =NULL;
  88. }
  89. return;
  90. };
  91. void SetDefGrayPal(struct PcxImgInfo * pImgInfo, LPCSTR lpData, int iDataSize)
  92. {
  93. DWORD dwPalAccount = 0;
  94. BYTE * pRgb = NULL;
  95. GetPcxPalette(pImgInfo,(void **)&pRgb, & dwPalAccount);
  96. BYTE * dest = pRgb;
  97. unsigned int bt;
  98. switch(dwPalAccount)
  99. {
  100. case 2://1
  101. memset(dest, 0, (size_t) 3);
  102. memset(dest, 0xFF, (size_t) 3);
  103. break;
  104. case 16://4
  105. case 256://8
  106. for(bt=0;bt<dwPalAccount;bt++)
  107. {
  108. //加监测
  109. memset(dest, bt, (size_t) 3);
  110. dest +=3;
  111. }
  112. break;
  113. default://24, (//16)
  114. return;
  115. }
  116. return;
  117. };
  118. void SetDefSystemPal(struct PcxImgInfo * pImgInfo, LPCSTR lpData, int iDataSize)
  119. {
  120. // BYTE bt;
  121. DWORD dwPalAccount = 0;
  122. BYTE * pRgb = NULL;
  123. GetPcxPalette(pImgInfo,(void **)&pRgb,& dwPalAccount);
  124. BYTE * dest = pRgb;
  125. HDC hdc;
  126. DWORD i;
  127. // unsigned int bt;
  128. switch(dwPalAccount)
  129. {
  130. case 2://1
  131. memset(dest, 0, (size_t) 3);
  132. memset(dest, 0xFF, (size_t) 3);
  133. break;
  134. case 16://4
  135. case 256://8
  136. {
  137. LPPALETTEENTRY pColor;
  138. pColor = new PALETTEENTRY[dwPalAccount];
  139. hdc = ::GetDC(NULL);
  140. ::GetSystemPaletteEntries(hdc,0,dwPalAccount,pColor);//RGB+FLAG //BYTE
  141. ::ReleaseDC(NULL,hdc);
  142. BYTE * src;
  143. src =(BYTE *)pColor;
  144. for(i=0;(i<dwPalAccount);i++)
  145. {
  146. //bt = pClrBGR[i].rgbBlue;
  147. //pClrBGR[i].rgbBlue = pClrBGR[i].rgbRed;
  148. //pClrBGR[i].rgbRed = bt;
  149. memcpy(dest, src, 3);//RGB+FLAG //BYTE//rgb 的顺序
  150. dest +=3;
  151. src += sizeof(PALETTEENTRY);
  152. }
  153. delete pColor;
  154. }
  155. break;
  156. default://24, (//16)
  157. return;
  158. }
  159. return;
  160. };
  161. void PcxDoWithPalette(INFOSTR * pInfo, LPCSTR lpData, int iDataSize)
  162. {
  163. DWORD dwColorHeight = pInfo->imginfo.bitcount;
  164. DWORD dwPalAccount;
  165. if(dwColorHeight <= 8 )
  166. dwPalAccount = 1 << dwColorHeight;
  167. else
  168. {
  169. dwPalAccount =0;
  170. //return;
  171. }
  172. struct PcxImgInfo * pImgInfo;
  173. pImgInfo = SetPcxImgInfo(pInfo, (struct pcxheader *)lpData);//may be throw;
  174. BYTE * pRgb = NULL;
  175. GetPcxPalette(pImgInfo, (void**)&pRgb, &dwPalAccount);
  176. TRACE1("pRgb is %Xn",(int)pRgb);
  177. TRACE1("palAccount is %Xn",(int)dwPalAccount);
  178. if(dwPalAccount ==0)
  179. return;
  180. PCXFILEHEADER *pFlhd=(PCXFILEHEADER*)lpData;
  181. BYTE byVersion = pFlhd->byVersion;
  182. bool bGray = (pFlhd->wPaletteType == 2 )?true:false;//是否灰度图像
  183. if(dwColorHeight<=8)// = PCXFH.byBits*PCXFH.byPlanes;//
  184. {
  185. if(byVersion==3)//缺省调色板
  186. {
  187. if(bGray)
  188. {
  189. SetDefGrayPal(pImgInfo, lpData, iDataSize);
  190. }
  191. else
  192. {
  193. SetDefSystemPal(pImgInfo, lpData, iDataSize);
  194. }
  195. }
  196. else
  197. {
  198. switch(dwColorHeight)// wColorHeight = PCXFH.byBits*PCXFH.byPlanes;
  199. {
  200. case 1://2 color//已经copy了PcxFileHeader,包含在其中
  201. break;//ok
  202. case 4://16 color
  203. break;//ok
  204. case 8://256 color
  205. const BYTE * pColor;
  206. pColor = (const BYTE * )(lpData + iDataSize);//Eof?//End of file;
  207. pColor -= 768;//(256 * 3) start or 256 PcxPalette;
  208. pColor -= 1;//Flag
  209. //fseek(f1,-769,SEEK_END);
  210. //fread(pColor, 769,1,f1);
  211. ASSERT((*pColor)==0x0C);//0x0C 是256色调色板开始标志
  212. //if(0)
  213. //{
  214. // //throw;
  215. //}
  216. pColor++;//start or 256 PcxPalette;
  217. memcpy(pRgb, pColor, 768);//256 * sizeof(PcxPalette);
  218. break;
  219. default:
  220. break;
  221. }
  222. }
  223. }
  224. };