Bmp.c
上传用户:hjhsjcl
上传日期:2020-09-25
资源大小:11378k
文件大小:19k
源码类别:

压缩解压

开发平台:

C++ Builder

  1. /*==========================================================================
  2. Copyright (c) 2004 ALi Corporation. All Rights Reserved
  3. File: Bmp.c
  4. content:
  5. History: Created by Walace 2005/06/29
  6. ==========================================================================*/
  7. #define _BMP_H_
  8. #include <DP8051XP.H>
  9. #include "TypeDef.h"
  10. #include "Const.h"
  11. #include "Reg5661.h"
  12. #include "Common.h"
  13. #include "OledString.h"
  14. #include "Key.h"
  15. #include "Idma.h"
  16. #include "FileSystem.h"
  17. #include "OLED.h"
  18. #include "IconDefine.h"
  19. #if(PHOTO_SUPPORT_BMP||PHOTO_BMP_DSP_DECODE) //Walace061018#2 bmp dsp decode
  20. #include "Bmp.h"
  21. #include "UiPhoView.h"
  22. #include "VideoDsp.h" //Walace060313#1
  23. #include "UiCommon.h"
  24. #define BMP_HEAD_IDENTIFIER 0x00
  25. #define BMP_HEAD_FILE_SIZE   0x02
  26. #define BMP_HEAD_DATA_OFFSET 0x0A
  27. #define BMP_HEAD_HEAD_SIZE 0x0E
  28. #define BMP_HEAD_WIDTH 0x12
  29. #define BMP_HEAD_HEIGHT 0x16
  30. #define BMP_HEAD_PLANES 0x1A
  31. #define BMP_HEAD_PIXEL_BITS 0x1C
  32. #define BMP_HEAD_COMP_TYPE 0x1E
  33. #define BMP_HEAD_BMP_SIZE 0x22
  34. #define BMP_HEAD_HRESOLUTION 0x26
  35. #define BMP_HEAD_VRESOLUTION 0x2A
  36. #define BMP_HEAD_COLOR_USED 0x2E
  37. #define BMP_HEAD_COLOR_IMP 0x32
  38. #define BMP_HEAD_PALETTE 0x36
  39.  // Constants for the biCompression field...
  40. #define BMP_COMP_RGB       0             /* No compression - straight BGR data */
  41. #define BMP_COMP_RLE8      1             /* 8-bit run-length compression */
  42. #define BMP_COMP_RLE4      2             /* 4-bit run-length compression */
  43. #define BMP_COMP_BITFIELDS 3             /* RGB bitmap with RGB masks */
  44. #define IMG_PRC_ERR            0x00
  45. #define IMG_PRC_NOP            0x00
  46. #define IMG_PRC_SUCCESS    0x01
  47. #define IMG_PRC_COMPLETE  0x02
  48. #define SECTOR_SIZE 512
  49. #define FS_UNOPENED 0xFFFFFFFF
  50. typedef struct               
  51. {
  52.     DWORD dwRMask;
  53.     DWORD dwGMask;
  54.     DWORD dwBMask;
  55.     BYTE     bBOffset;
  56.     BYTE     bBLen;
  57.     BYTE     bGOffset;
  58.     BYTE     bGLen;
  59.     BYTE     bROffset;
  60.     BYTE     bRLen;
  61. }RGBMASK;
  62. #define BMP_COLOR_PATLETTE 0x00
  63. #define BMP_COLOR_MASK 0x01
  64. #define BMP_DIR_BOTTOM_TOP 0x00
  65. #define BMP_DIR_TOP_BOTTOM 0x01
  66. typedef struct                        /**** BMP file info structure ****/
  67. {
  68.    DWORD dwDataOffset;
  69.    WORD   wBitPerPixel;
  70.    DWORD dwColorUsed;
  71.    BYTE     bDataMask;
  72.    DWORD dwCompType;
  73.    BYTE     bColorMode;
  74.    BYTE     bStoreDir;  
  75.    
  76. }BMPHEADERINFO;
  77. #endif
  78. #if(PHOTO_SUPPORT_BMP)  //Walace061018#2 bmp dsp decode
  79. //3==== gxbBmpProcState ============
  80. #define BMP_PRC_IDLE 0x00
  81. #define BMP_PRC_INITIAL 0x01
  82. #define BMP_PRC_SHOW 0x04
  83. #define BMP_PRC_ERR 0x05
  84. #define BMP_PRC_END 0x06
  85. BMPHEADERINFO xdata stBmpHead;
  86. xdata RGBMASK* pMask; //Walace061208#1
  87. xdata PWORD gpwPalette; //Walace061208#1
  88. XBYTE gxbBmpProcState = BMP_PRC_IDLE;
  89. //Walace051214#FullScreen Remove
  90. //XDWORD gxdwFsByteIndex;
  91. //XWORD gxwLineIndex;
  92. #endif
  93. #if(PHOTO_SUPPORT_BMP|PHOTO_BMP_DSP_DECODE) //Walace061018#2 bmp dsp decode
  94. void ReverseHLSB(PBYTE pbData,BYTE bDataSize) 
  95. {
  96.      BYTE bBuff,bIndex;
  97.      for(bIndex=0;bIndex<bDataSize/2;bIndex++)
  98.      { 
  99.          bBuff=*(pbData+bIndex);
  100.   *(pbData+bIndex)=*(pbData+(bDataSize-bIndex-1));
  101.   *(pbData+(bDataSize-bIndex-1))=bBuff;
  102.      }
  103. }
  104. BOOL GetFsData(PBYTE pbTarget,DWORD dwFsByteIndex,PWORD pwDataLen) large //Walace061211#3
  105. {
  106. WORD wGetLen;
  107. WORD wIndex;
  108. WORD wByteIndex;
  109. WORD wDataLen;
  110. DWORD dwTagFileSector;
  111.        
  112. wDataLen = *pwDataLen;
  113. *pwDataLen=0;
  114. while(wDataLen)
  115. {
  116.         wByteIndex = dwFsByteIndex%SECTOR_SIZE;
  117. dwTagFileSector= dwFsByteIndex/SECTOR_SIZE;  
  118. if(dwTagFileSector!=gdwFileSector) //different to current sector
  119. {   
  120. GPIOA_ON(5);
  121. if(FsReadFileSectorNew(dwTagFileSector,FS_DATA_0_0))
  122. gdwFileSector=dwTagFileSector;
  123. else 
  124.       return FALSE;
  125. GPIOA_OFF(5);
  126. }
  127.    
  128.         if(wDataLen>(SECTOR_SIZE-wByteIndex))
  129.        wGetLen=SECTOR_SIZE-wByteIndex;        
  130. else
  131.        wGetLen=wDataLen;
  132.               if(pbTarget!=NULL)
  133.               {
  134. for(wIndex=0;wIndex<wGetLen;wIndex++)
  135. {
  136.     *pbTarget = *(gxbFsData+gxwOffsetDataSec+wIndex+wByteIndex);
  137. pbTarget++;
  138. }
  139.               }
  140.        dwFsByteIndex+=wGetLen;
  141. (*pwDataLen)+=wGetLen;
  142. wDataLen -=wGetLen;
  143. }
  144. return TRUE;
  145. }
  146. #endif
  147. #if(PHOTO_SUPPORT_BMP) //Walace061018#2 bmp dsp decode
  148. void GetSetBitOffset(DWORD dwData,PBYTE pbOffset,PBYTE pbLen) 
  149. {
  150. *pbOffset=0;
  151. *pbLen=0;
  152. while(!((dwData>>(*pbOffset))&0x01))
  153. (*pbOffset)++;
  154. while((dwData>>((*pbLen)+(*pbOffset)))&0x01)
  155. (*pbLen)++;
  156. }
  157. void GetPaletteForOled(void) large //Walace060614#3 use large
  158. {
  159.    BYTE dwColor[4];
  160.    WORD wLen;
  161.    WORD wIndex;
  162.    WORD wColorUsed;
  163.    if(stBmpHead.dwColorUsed!=0x0000)
  164.     wColorUsed = stBmpHead.dwColorUsed;
  165.    else
  166.     wColorUsed = 1<<(stBmpHead.wBitPerPixel);
  167.        
  168.    wLen=4;
  169.    
  170.    for(wIndex=0;wIndex<wColorUsed;wIndex++)
  171.   {       
  172.        GetFsData((PBYTE)dwColor,BMP_HEAD_PALETTE+wIndex*4,&wLen);
  173. *(gpwPalette+wIndex)=0x0000;                              // OLED 2 bytes per pixel   RGB = (5 6 5)
  174. *(gpwPalette+wIndex)|=(((WORD)dwColor[0])>>3)<<OLED_B_OFFSET;  // Bo = (B*2^5)/(2^8) << 11 
  175. *(gpwPalette+wIndex)|=(((WORD)dwColor[1])>>2)<<OLED_G_OFFSET;  // Go = (G*2^6)/(2^8) <<  5
  176.        *(gpwPalette+wIndex)|=(((WORD)dwColor[2])>>3)<<OLED_R_OFFSET; // Ro = (R*2^5)/(2^8) << 0
  177.    }
  178. }
  179. void GetRGBMask(RGBMASK* pMask) large
  180. {
  181. WORD wLen;
  182. if(stBmpHead.dwCompType==BMP_COMP_RGB)
  183. {
  184. switch(stBmpHead.wBitPerPixel)
  185. {
  186. case 16:
  187. pMask->dwRMask = 0x007C0000;
  188. pMask->dwGMask = 0xE0030000;
  189. pMask->dwBMask = 0x1F000000;
  190. break; 
  191. case 24:
  192. case 32:
  193. pMask->dwRMask = 0x0000FF00;
  194. pMask->dwGMask = 0x00FF0000;
  195. pMask->dwBMask = 0xFF000000;
  196. break;
  197. }
  198. }
  199. else // bit field
  200. {
  201. wLen=12; // RGB = 12 byte ( 3*sizeof(DWORD) )
  202. GetFsData((PBYTE)pMask,BMP_HEAD_PALETTE,&wLen);
  203. }
  204. ReverseHLSB((PBYTE)(&(pMask->dwRMask)),stBmpHead.wBitPerPixel/8);   
  205. ReverseHLSB((PBYTE)(&(pMask->dwGMask)),stBmpHead.wBitPerPixel/8);     
  206. ReverseHLSB((PBYTE)(&(pMask->dwBMask)),stBmpHead.wBitPerPixel/8); 
  207.        pMask->dwRMask = pMask->dwRMask>>(32-stBmpHead.wBitPerPixel);
  208. pMask->dwGMask = pMask->dwGMask>>(32-stBmpHead.wBitPerPixel);
  209. pMask->dwBMask = pMask->dwBMask>>(32-stBmpHead.wBitPerPixel);
  210.     GetSetBitOffset(pMask->dwRMask,&(pMask->bROffset),&(pMask->bRLen));
  211. GetSetBitOffset(pMask->dwGMask,&(pMask->bGOffset),&(pMask->bGLen));
  212. GetSetBitOffset(pMask->dwBMask,&(pMask->bBOffset),&(pMask->bBLen));      
  213. }
  214. BOOL  GetBmpConfig(void)  //Walace060817#2
  215. {
  216. DWORD dwBuff=0;
  217. INT iBuff;
  218. WORD wLen;
  219.    
  220. wLen=2;
  221. GetFsData((PBYTE)&dwBuff,BMP_HEAD_IDENTIFIER,&wLen);
  222.    
  223. if(dwBuff!=0x424D0000) // 'BM'=0x4d42 
  224. {
  225. gxbErrCode = ERR_PE_UNSUPPORT_FORMAT; //Walace060817#2
  226. return FALSE;  // only support microsoft type
  227. }
  228.        wLen=4;
  229.    
  230. GetFsData((PBYTE)&(stBmpHead.dwDataOffset),BMP_HEAD_DATA_OFFSET,&wLen);
  231. ReverseHLSB((PBYTE)(&(stBmpHead.dwDataOffset)),4);   
  232. GetFsData((PBYTE)&dwBuff,BMP_HEAD_WIDTH,&wLen);
  233.   ReverseHLSB((PBYTE)&dwBuff,4);
  234. gxwPhoWidth=(WORD)dwBuff;
  235. GetFsData((PBYTE)&dwBuff,BMP_HEAD_HEIGHT,&wLen);
  236. ReverseHLSB((PBYTE)&dwBuff,4);
  237. iBuff=(INT)dwBuff; 
  238. if(iBuff<0)
  239. { stBmpHead.bStoreDir = BMP_DIR_TOP_BOTTOM;
  240.        gxwPhoHeight = (WORD)(-iBuff);
  241. }
  242. else
  243. { stBmpHead.bStoreDir = BMP_DIR_BOTTOM_TOP;
  244.            gxwPhoHeight = (WORD)iBuff;
  245. }
  246. GetFsData((PBYTE)&(stBmpHead.dwColorUsed),BMP_HEAD_COLOR_USED,&wLen);
  247. ReverseHLSB((PBYTE)(&(stBmpHead.dwColorUsed)),4);   
  248. GetFsData((PBYTE)&(stBmpHead.dwCompType),BMP_HEAD_COMP_TYPE,&wLen);
  249. ReverseHLSB((PBYTE)(&(stBmpHead.dwCompType)),4);   
  250. wLen=2;
  251. GetFsData((PBYTE)&(stBmpHead.wBitPerPixel),BMP_HEAD_PIXEL_BITS,&wLen);
  252. ReverseHLSB((PBYTE)(&(stBmpHead.wBitPerPixel)),2);      
  253. /*
  254. =====================================================================
  255. 0x1c    0x1eh       COLOR       R_MASK        G_MASK        B_MASK      4_MASK      DATA
  256. -------------------------------------------------------------------------------------------
  257. 1                1      B_RGB      index   00 00 FF 00      00 FF 00 00    FF 00 00 00  .
  258. 4                4      B_RGB      index   00 00 FF 00      00 FF 00 00    FF 00 00 00                      X
  259. 4RLE           4      B_4RLE     index   00 00 FF 00      00 FF 00 00    FF 00 00 00                      RLE X  (not support)
  260. 8                8      B_RGB      index   00 00 FF 00      00 FF 00 00    FF 00 00 00                       XX
  261. 8RLE           8      B_8RLE     index   00 00 FF 00      00 FF 00 00    FF 00 00 00                      RLE XX (not support)
  262. 16X555     16      B_RGB      555      00 7C 00 00    E0 03 00 00    1F 00 00 00   NONE            XX XX
  263. 16A555     16      B_FIELED   555      00 7C 00 00    E0 03 00 00   1F 00 00 00   00 80 00 00    XX XX
  264. 16X444     16      B_FIELED   444      00 0F 00 00    F0 00 00 00    00 00 0F 00   00 00 00 00    XX XX
  265. 16A444     16      B_FIELED   444      00 0F 00 00    F0 00 00 00    00 00 0F 00   00 0F 00 00    XX XX
  266. 16X565     16      B_FIELED   565      00 F8 00 00    E0 07 00 00    1F 00 00 00   00 00 00 00    XX XX
  267. 24            24      B_RGB       888      00 00 FF 00    00 FF 00 00     FF 00 00 00   NONE             XX XX XX
  268. 32X888R   32      B_FIELED   888      00 00 00 FF    00 00 FF 00     00 FF 00 00   00 00 00 00    XX XX XX XX
  269. 32A888R   32      B_RGB       888      00 00 FF 00    00 FF 00 00     FF 00 00 00   NONE             XX XX XX XX
  270. ======================================================================
  271. OLED       16                                   00 1F             07 E0              F8 00                               XX
  272. ======================================================================
  273. */
  274. if(stBmpHead.wBitPerPixel<=8)
  275. {   
  276. if(stBmpHead.dwCompType==BMP_COMP_RLE4||stBmpHead.dwCompType==BMP_COMP_RLE8)
  277. {
  278. gxbErrCode = ERR_PE_UNSUPPORT_FORMAT; //Walace060817#2
  279. return FALSE; //not support
  280. }
  281.        stBmpHead.bDataMask=  (1<<stBmpHead.wBitPerPixel)-1;
  282. GetPaletteForOled();
  283. stBmpHead.bColorMode=BMP_COLOR_PATLETTE ;
  284. }
  285.        else
  286. {
  287.  GetRGBMask(pMask);
  288.  stBmpHead.bColorMode=BMP_COLOR_MASK;
  289. }
  290.    GetPhoCommonConfig();
  291.    
  292.    //Walace051214#FullScreen
  293.    gxwDwordPerLine = ((DWORD)gxwPhoWidth*stBmpHead.wBitPerPixel+0x1f)>>5;
  294.    return TRUE;
  295. }
  296. BOOL BmpInitial(void)  //Walace060817#2
  297. {
  298.    gdwFileSector=FS_UNOPENED;
  299.    gxbfRotPhoto=FALSE; //Walace070108#2
  300.    gxwYPixel=0; //Walace051214#FullScreen Remove
  301.    gxwLineIndex=0;
  302.    gxwYStep = 0 ; //Walace051214#FullScreen Remove
  303.    gpwPalette=(PWORD)(gxbPhoData+SRAM_BMP_PALETTE_OFFSET);
  304.    pMask=(RGBMASK*)(gxbPhoData+SRAM_BMP_PALETTE_OFFSET);
  305.    FuncProtectMachine(DSP_PROT_SET_ON); //Walace060313#1
  306.    FuncProtectMachine(MCU_PROT_WAIT_RESPONSE); //Walace060313#1
  307.    
  308.    if(!GetBmpConfig())
  309.     return FALSE;
  310.    gxdwFsByteIndex = stBmpHead.dwDataOffset;
  311.    
  312.    return TRUE;   
  313. }
  314. void TransferColorToOled(DWORD dwDataBuff,PWORD pwPixelData) large
  315. {
  316.        DWORD dwBuff;
  317. *pwPixelData=0x0000;          // OLED 2 bytes per pixel   RGB = (5 6 5)
  318. ReverseHLSB((PBYTE)&dwDataBuff,stBmpHead.wBitPerPixel/8); 
  319. dwDataBuff = dwDataBuff>>(32-stBmpHead.wBitPerPixel);
  320.        dwBuff = (dwDataBuff&pMask->dwBMask)>>pMask->bBOffset; 
  321. (*pwPixelData)|= ((dwBuff<<OLED_B_BITS)>>pMask->bBLen)<<OLED_B_OFFSET;    // Bo = (B*2^5)/(2^B-BITS) << 11 
  322.        dwBuff = (dwDataBuff&pMask->dwGMask)>>pMask->bGOffset;
  323. (*pwPixelData)|= ((dwBuff<<OLED_G_BITS)>>pMask->bGLen)<<OLED_G_OFFSET;     // Go = (G*2^6)/(2^G-BITS) << 5 
  324.        dwBuff = (dwDataBuff&pMask->dwRMask)>>pMask->bROffset;
  325. (*pwPixelData)|= ((dwBuff<<OLED_R_BITS)>>pMask->bRLen)<<OLED_R_OFFSET;  // Ro = (R*2^5)/(2^R-BITS) << 0                          
  326. }
  327. //Walace051214#FullScreen
  328. void BmpSendPixelToOled(WORD wCol,WORD wRow,WORD wPixelData)
  329. {
  330. if(gxbfRotPhoto) //Walace070108#2
  331.             RotToCenter(gxwPhotoDispWidth,gxwPhotoDispHeight,&wCol,&wRow);
  332. else 
  333.      MoveToCenter(gxwPhotoDispWidth,gxwPhotoDispHeight,&wCol,&wRow);
  334. if(stBmpHead.bStoreDir==BMP_DIR_BOTTOM_TOP)
  335.        wRow = UI_PHOTO_DISP_SIZE_ROW-1-wRow; //Walace060320#3
  336. if((wCol<UI_PHOTO_DISP_SIZE_COL)&&(wRow<UI_PHOTO_DISP_SIZE_ROW)) //Walace060320#3
  337. {
  338.  #if(LCD_TYPE==TFT_ORISE||LCD_TYPE==TFT_TOPPOLY||LCD_TYPE==TFT_SOLOMON)  // Jeff070125#2
  339.  OledDrawPoint(wCol,wRow,wPixelData);
  340.  #else
  341. OLED_WRITE(OLED_CMD_SET_COL_ADDR) ;
  342. OLED_WRITE(wCol);
  343. OLED_WRITE(wCol);
  344. OLED_WRITE(OLED_CMD_SET_ROW_ADDR) ;
  345. OLED_WRITE(wRow);
  346. OLED_WRITE(wRow);
  347. OLED_SET_DAT();
  348. OLED_WRITE_WDATA(wPixelData) ;
  349. OLED_SET_CMD();
  350. #endif
  351. }
  352. }
  353. //Walace051212#FullScreen start
  354. BYTE BmpShow()
  355. {
  356. BYTE bCount;
  357. DWORD dwDataBuff;
  358. DWORD dwGetIndexPerLine;
  359. WORD wPixelData;
  360.        WORD wGetDataUnit;  //can hold
  361. WORD wPhotoXIndex;
  362. gxwXPixel=0;
  363. gxwXStep=0;
  364. wPhotoXIndex=0;
  365. dwGetIndexPerLine=0;
  366. gxwYStep+=gxwSampleSize;
  367. gxwLineIndex ++;
  368. if(gxwLineIndex>gxwPhoHeight)
  369. return IMG_PRC_COMPLETE; 
  370. if(!(gxwYStep&0x8000))
  371. {
  372. gxdwFsByteIndex+=(gxwDwordPerLine<<2);
  373. return IMG_PRC_SUCCESS;
  374. }
  375. wGetDataUnit = stBmpHead.wBitPerPixel>>3; 
  376. if(!wGetDataUnit)
  377. wGetDataUnit=1;
  378. #if(LCD_TYPE==TFT_ORISE||LCD_TYPE==TFT_TOPPOLY||LCD_TYPE==TFT_SOLOMON) //Walace061020#1   // Jeff070125#2
  379. LCD_ROT90_DISPLAY_DIS();
  380. #endif      
  381. OledCtrlEn();
  382. while(TRUE)
  383. {
  384. OledCtrlDis();
  385. if(!GetFsData((PBYTE)&dwDataBuff,gxdwFsByteIndex+dwGetIndexPerLine,&wGetDataUnit))
  386. return IMG_PRC_ERR;
  387. dwGetIndexPerLine+=wGetDataUnit;
  388. OledCtrlEn();
  389.  
  390. if(stBmpHead.bColorMode==BMP_COLOR_PATLETTE)
  391. {
  392. for(bCount=1;bCount<=(8/stBmpHead.wBitPerPixel);bCount++)
  393. {
  394. wPhotoXIndex++;
  395. if(wPhotoXIndex>gxwPhoWidth)
  396. goto EndOfLine;
  397. gxwXStep+=gxwSampleSize; 
  398. if(!(gxwXStep&0x8000))
  399. continue;
  400. dwDataBuff = ((*(PBYTE)&dwDataBuff)>>(8-stBmpHead.wBitPerPixel*bCount))&stBmpHead.bDataMask;
  401. BmpSendPixelToOled(gxwXPixel,gxwYPixel,gpwPalette[dwDataBuff]);
  402. gxwXPixel++;
  403. gxwXStep&=(~0x8000);
  404. }
  405. }
  406. else
  407. {
  408. wPhotoXIndex++;
  409. if(wPhotoXIndex>gxwPhoWidth)        
  410. goto EndOfLine;
  411. gxwXStep+=gxwSampleSize; 
  412. if(!(gxwXStep&0x8000))
  413. continue;
  414. TransferColorToOled(dwDataBuff,&wPixelData);
  415. BmpSendPixelToOled(gxwXPixel,gxwYPixel,wPixelData);
  416. gxwXPixel++;
  417. gxwXStep&=(~0x8000);
  418. }  
  419. }
  420. EndOfLine:
  421. #if(LCD_TYPE==TFT_ORISE||LCD_TYPE==TFT_TOPPOLY||LCD_TYPE==TFT_SOLOMON) //Walace061020#1   // Jeff070125#2
  422. LCD_ROT90_DISPLAY_DIS();
  423. #endif      
  424. OledCtrlDis();
  425. gxwYPixel++;
  426. gxwYStep&=(~0x8000);
  427. gxdwFsByteIndex+=(gxwDwordPerLine<<2);
  428.    return IMG_PRC_SUCCESS;
  429. }
  430. //Walace051212#FullScreen end
  431. BYTE BmpDispProcess(BYTE bBmpCmd) 
  432. {
  433.    BYTE bRet;
  434.    
  435.    if(bBmpCmd==BMP_CMD_START)
  436.    { 
  437.     gxbBmpProcState = BMP_PRC_INITIAL;
  438.    }
  439.    
  440.   switch(gxbBmpProcState)
  441.   {
  442.    case BMP_PRC_IDLE:
  443.     break;
  444.    case BMP_PRC_INITIAL:
  445. if(BmpInitial())
  446.      gxbBmpProcState = BMP_PRC_SHOW;
  447. else
  448.      gxbBmpProcState = BMP_PRC_ERR;
  449.     break;
  450.    case BMP_PRC_SHOW:
  451.     bRet = BmpShow();
  452.     if(bRet == IMG_PRC_SUCCESS)
  453.    {     gxbBmpProcState = BMP_PRC_SHOW; }
  454. else if(bRet==IMG_PRC_COMPLETE)
  455. {     gxbBmpProcState = BMP_PRC_IDLE; }
  456. else
  457. {    
  458.      gxbBmpProcState = BMP_PRC_ERR;
  459. }
  460.     break;
  461.    case BMP_PRC_ERR:
  462.    gxbBmpProcState = BMP_PRC_IDLE;
  463.  return BMP_SHOW_RET_ERR;
  464.     //break; //Walace060817#4
  465.    case BMP_PRC_END:       
  466.      gxbBmpProcState = BMP_PRC_IDLE;
  467.  return BMP_SHOW_RET_END;
  468.     //break;  //Walace060816#4
  469.   }  
  470. }
  471. #endif //#if(PHOTO_SUPPORT_BMP)
  472. //Walace061018#2 bmp dsp decode
  473. #if(PHOTO_BMP_DSP_DECODE)
  474. BOOL  BmpFormatCheck(void)  
  475. {
  476. BMPHEADERINFO xdata stBmpHead;
  477. DWORD dwBuff=0;
  478. INT iBuff;
  479. WORD wLen;
  480. BOOL fRet;
  481. fRet=TRUE;
  482. dwBuff=0;
  483.    gdwFileSector=FS_UNOPENED;
  484. wLen=2;
  485. GetFsData((PBYTE)&dwBuff,BMP_HEAD_IDENTIFIER,&wLen);
  486.    
  487. if(dwBuff!=0x424D0000) // 'BM'=0x4d42 
  488. {
  489. gxbErrCode = ERR_PE_UNSUPPORT_FORMAT; //Walace060817#2
  490. fRet = FALSE;  // only support microsoft type
  491. goto END_OF_CEHCK_FORMAT;
  492. }
  493.        wLen=4; 
  494. GetFsData((PBYTE)&(stBmpHead.dwDataOffset),BMP_HEAD_DATA_OFFSET,&wLen);
  495. ReverseHLSB((PBYTE)(&(stBmpHead.dwDataOffset)),4);   
  496. GetFsData((PBYTE)&dwBuff,BMP_HEAD_WIDTH,&wLen);
  497.   ReverseHLSB((PBYTE)&dwBuff,4);
  498. gxwPhoWidth=(WORD)dwBuff;
  499. GetFsData((PBYTE)&dwBuff,BMP_HEAD_HEIGHT,&wLen);
  500. ReverseHLSB((PBYTE)&dwBuff,4);
  501. iBuff=(INT)dwBuff; 
  502. if(iBuff<0)
  503. { stBmpHead.bStoreDir = BMP_DIR_TOP_BOTTOM;
  504.        gxwPhoHeight = (WORD)(-iBuff);
  505. }
  506. else
  507. { stBmpHead.bStoreDir = BMP_DIR_BOTTOM_TOP;
  508.            gxwPhoHeight = (WORD)iBuff;
  509. }
  510. GetFsData((PBYTE)&(stBmpHead.dwCompType),BMP_HEAD_COMP_TYPE,&wLen);
  511. ReverseHLSB((PBYTE)(&(stBmpHead.dwCompType)),4);   
  512. wLen=2;
  513. GetFsData((PBYTE)&(stBmpHead.wBitPerPixel),BMP_HEAD_PIXEL_BITS,&wLen);
  514. ReverseHLSB((PBYTE)(&(stBmpHead.wBitPerPixel)),2);      
  515. /*
  516. =====================================================================
  517. 0x1c    0x1eh       COLOR       R_MASK        G_MASK        B_MASK      4_MASK      DATA
  518. -------------------------------------------------------------------------------------------
  519. 1                1      B_RGB      index   00 00 FF 00      00 FF 00 00    FF 00 00 00  .
  520. 4                4      B_RGB      index   00 00 FF 00      00 FF 00 00    FF 00 00 00                      X
  521. 4RLE           4      B_4RLE     index   00 00 FF 00      00 FF 00 00    FF 00 00 00                      RLE X  (not support)
  522. 8                8      B_RGB      index   00 00 FF 00      00 FF 00 00    FF 00 00 00                       XX
  523. 8RLE           8      B_8RLE     index   00 00 FF 00      00 FF 00 00    FF 00 00 00                      RLE XX (not support)
  524. 16X555     16      B_RGB      555      00 7C 00 00    E0 03 00 00    1F 00 00 00   NONE            XX XX
  525. 16A555     16      B_FIELED   555      00 7C 00 00    E0 03 00 00   1F 00 00 00   00 80 00 00    XX XX
  526. 16X444     16      B_FIELED   444      00 0F 00 00    F0 00 00 00    00 00 0F 00   00 00 00 00    XX XX
  527. 16A444     16      B_FIELED   444      00 0F 00 00    F0 00 00 00    00 00 0F 00   00 0F 00 00    XX XX
  528. 16X565     16      B_FIELED   565      00 F8 00 00    E0 07 00 00    1F 00 00 00   00 00 00 00    XX XX
  529. 24            24      B_RGB       888      00 00 FF 00    00 FF 00 00     FF 00 00 00   NONE             XX XX XX
  530. 32X888R   32      B_FIELED   888      00 00 00 FF    00 00 FF 00     00 FF 00 00   00 00 00 00    XX XX XX XX
  531. 32A888R   32      B_RGB       888      00 00 FF 00    00 FF 00 00     FF 00 00 00   NONE             XX XX XX XX
  532. ======================================================================
  533. OLED       16                                   00 1F             07 E0              F8 00                               XX
  534. ======================================================================
  535. */
  536. if(stBmpHead.wBitPerPixel<=8)
  537. {   
  538. if(stBmpHead.dwCompType==BMP_COMP_RLE4||stBmpHead.dwCompType==BMP_COMP_RLE8)
  539. {
  540. gxbErrCode = ERR_PE_UNSUPPORT_FORMAT; //Walace060817#2
  541. fRet = FALSE; //not support
  542. goto END_OF_CEHCK_FORMAT;
  543. }
  544. }
  545. END_OF_CEHCK_FORMAT:
  546.       return fRet;
  547. }
  548. #endif