BMPLoader.c
上传用户:lqx1163
上传日期:2014-08-13
资源大小:9183k
文件大小:32k
源码类别:

MTK

开发平台:

C/C++

  1. /*****************************************************************************
  2. *  Copyright Statement:
  3. *  --------------------
  4. *  This software is protected by Copyright and the information contained
  5. *  herein is confidential. The software may not be copied and the information
  6. *  contained herein may not be used or disclosed except with the written
  7. *  permission of MediaTek Inc. (C) 2005
  8. *
  9. *  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  10. *  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  11. *  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
  12. *  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  13. *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  14. *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  15. *  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  16. *  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  17. *  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
  18. *  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
  19. *  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
  20. *  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
  21. *
  22. *  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
  23. *  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  24. *  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  25. *  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
  26. *  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
  27. *
  28. *  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
  29. *  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
  30. *  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
  31. *  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
  32. *  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
  33. *
  34. *****************************************************************************/
  35. /*******************************************************************************
  36.  * Filename:
  37.  * ---------
  38.  *  BMPLoader.c
  39.  *
  40.  * Project:
  41.  * --------
  42.  *  MAUI
  43.  *
  44.  * Description:
  45.  * ------------
  46.  *  
  47.  *
  48.  * Author:
  49.  * -------
  50.  *  
  51.  *
  52.  *==============================================================================
  53.  *             HISTORY
  54.  * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! 
  55.  *------------------------------------------------------------------------------
  56.  * removed!
  57.  *
  58.  * removed!
  59.  * removed!
  60.  * removed!
  61.  *
  62.  * removed!
  63.  * removed!
  64.  * removed!
  65.  *
  66.  * removed!
  67.  * removed!
  68.  * removed!
  69.  *
  70.  * removed!
  71.  * removed!
  72.  * removed!
  73.  *
  74.  * removed!
  75.  * removed!
  76.  * removed!
  77.  *
  78.  *------------------------------------------------------------------------------
  79.  * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! 
  80.  *==============================================================================
  81.  *******************************************************************************/
  82. #include <stdio.h>
  83. #include <stdlib.h>
  84. #include "ResDevice.h"
  85. #include "ResBytestream.h"
  86. #include "ImgDecoderDef.h"
  87. // #include "lcd_sw_rnd.h"
  88. #include "mmi_features.h"
  89. #include "gui_config.h"
  90. extern FILE *dest_file;
  91. extern int toolFlag;
  92. #ifdef __MMI_RESOURCE_ENFB_SUPPORT__
  93. extern FILE *enfb_img_data_file;
  94. extern int enfbFlag;
  95. extern U32 enfb_offset;
  96. extern U32 enfb_size;
  97. extern MMI_BOOL ENFBAssociatedIDAdded;
  98. #include "ImageGetDimension.h"
  99. #endif
  100. extern S32 g_ressize;
  101. U32 image_static_row_data[(IMAGE_STATIC_ROW_DATA_SIZE + 3) / 4];
  102. U32 image_static_palette[(IMAGE_STATIC_PALETTE_SIZE + 3) / 4];
  103. U32 image_static_buffer[(IMAGE_STATIC_BUFFER_SIZE + 3) / 4];
  104. #if(!WINGUI_DIRECT_IMAGE_DISPLAY)
  105. S32 BMP_write_color(
  106.         U8 *start,
  107.         U8 A,
  108.         U8 R,
  109.         U8 G,
  110.         U8 B,
  111.         S8 dest_color_depth,
  112.         U8 transparent)
  113. {
  114.     switch (dest_color_depth)
  115.     {
  116.         case 32:
  117.         {   
  118.             U32 *color = (U32 *)start;
  119.             if (transparent)
  120.             {
  121.                 *color = (U32)RGB_TRANSPARENT_COLOR_32;
  122.             }
  123.             else
  124.             {
  125.                 *color = (U32)MMI_RGB_TO_HW_FORMAT_32(A,R,G,B);
  126.             }
  127.             return 4;
  128.             break;
  129.         }
  130.             
  131.         case 24:
  132.         {
  133.             if (transparent)
  134.             {
  135.                 *start = (U8)0x56;
  136.                 *(start+1) = (U8)0x34;
  137.                 *(start+2) = (U8)0x12;
  138.             }
  139.             else
  140.             {
  141.                 *start = B;
  142.                 *(start+1) = G;
  143.                 *(start+2) = R;
  144.             }
  145.             return 3;
  146.             break;
  147.         }
  148.             
  149.         case 16:
  150.         default:
  151.         {
  152.             U16 *color = (U16 *)start;
  153.             if (transparent)
  154.             {
  155.                 *color = (U16)RGB_TRANSPARENT_COLOR_16;
  156.             }
  157.             else
  158.             {
  159.                 *color = (U16)MMI_RGB_TO_HW_FORMAT_16(A,R,G,B);
  160.             }
  161.             return 2;
  162.             break;
  163.         }
  164.     }
  165. }
  166. /*****************************************************************************
  167.  * FUNCTION
  168.  *  BMP_write_line
  169.  * DESCRIPTION
  170.  *  
  171.  * PARAMETERS
  172.  *  b               [?]         
  173.  *  buffer          [?]         
  174.  *  row_bytes       [IN]        
  175.  *  color_depth     [IN]        
  176.  *  dest_color_depth[IN]        
  177.  *  width           [IN]        
  178.  *  y               [IN]        
  179.  *  palette         [?]         
  180.  * RETURNS
  181.  *  void
  182.  *****************************************************************************/
  183. #if 1
  184. void BMP_write_line(
  185.         bitmap *b,
  186.         U8 *buffer,
  187.         long int row_bytes,
  188.         S8 color_depth,
  189.         S8 dest_color_depth,
  190.         long int width,
  191.         long int y,
  192.         U8 palette[][3])
  193. {
  194.     /*----------------------------------------------------------------*/
  195.     /* Local Variables                                                */
  196.     /*----------------------------------------------------------------*/
  197.     U32 offset;
  198.     U32 boffset = 0;
  199.     U8 color_index;
  200.     U8 data;
  201.     S32 w;
  202.     U8 A, R, G, B;
  203.     U8 transparent = 0;
  204.     /*----------------------------------------------------------------*/
  205.     /* Code Body                                                      */
  206.     /*----------------------------------------------------------------*/
  207.     UI_UNUSED_PARAMETER(row_bytes);
  208.     {
  209.         S32 i, j;
  210.         U8 *bitmap_data = b->data;
  211.         U16 d;
  212.         S32 ret;
  213.         offset = y * b->row_bytes;
  214.         switch (color_depth)
  215.         {
  216.             case 32:
  217.                 for (i = 0; i < width; i++)
  218.                 {
  219.                     transparent = 0;
  220.                     B = buffer[boffset++];
  221.                     G = buffer[boffset++];
  222.                     R = buffer[boffset++];
  223.                     A = buffer[boffset++];
  224.                     if ((A == 0xFF) && (R == 0x0A) && (G == 0x0B) && (B == 0x0C))
  225.                     {
  226.                         transparent = 1;
  227.                     }
  228.                     ret = BMP_write_color(bitmap_data+offset, A, R, G, B, dest_color_depth, transparent);
  229.                     offset += ret;
  230.                 }
  231.                 break;
  232.             case 24:
  233.                 for (i = 0; i < width; i++)
  234.                 {
  235.                     transparent = 0;
  236.                     B = buffer[boffset++];
  237.                     G = buffer[boffset++];
  238.                     R = buffer[boffset++];
  239.                     A = 255;
  240.                     if ((R == 0x0A) && (G == 0x0B) && (B == 0x0C))
  241.                     {
  242.                         transparent = 1;
  243.                     }
  244.                     ret = BMP_write_color(bitmap_data+offset, A, R, G, B, dest_color_depth, transparent);
  245.                     offset += ret;
  246.                 }
  247.                 break;
  248.             case 8:
  249.                 for (i = 0; i < width; i++)
  250.                 {
  251.                     transparent = 0;
  252.                     color_index = buffer[boffset++];
  253.                     B = palette[color_index][2];
  254.                     G = palette[color_index][1];
  255.                     R = palette[color_index][0];
  256.                     A = 255;
  257.                     if (color_index == 0x00)
  258.                     {
  259.                         transparent = 1;
  260.                     }
  261.                     ret = BMP_write_color(bitmap_data+offset, A, R, G, B, dest_color_depth, transparent);
  262.                     offset += ret;
  263.                 }
  264.                 break;
  265.             case 4:
  266.                 w = (width >> 1);
  267.                 if (width & 1)
  268.                 {
  269.                     w++;
  270.                 }
  271.                 for (i = 0; i < w; i++)
  272.                 {
  273.                     data = buffer[boffset++];
  274.                     for (j = 0; j < 2; j++)
  275.                     {
  276.                         if (((i << 1) + j) >= width)
  277.                         {
  278.                             break;
  279.                         }
  280.                         transparent = 0;
  281.                         color_index = (U8) ((data >> ((1 - j) << 2)) & 0xf);
  282.                         B = palette[color_index][2];
  283.                         G = palette[color_index][1];
  284.                         R = palette[color_index][0];
  285.                         A = 255;
  286.                         if (color_index == 0x00)
  287.                         {
  288.                             transparent = 1;
  289.                         }
  290.                         ret = BMP_write_color(bitmap_data+offset, A, R, G, B, dest_color_depth, transparent);
  291.                         offset += ret;
  292.                     }
  293.                 }
  294.                 break;
  295.             case 1:
  296.                 w = (width >> 3);
  297.                 if (width & 7)
  298.                 {
  299.                     w++;
  300.                 }
  301.                 for (i = 0; i < w; i++)
  302.                 {
  303.                     data = buffer[boffset++];
  304.                     for (j = 0; j < 8; j++)
  305.                     {
  306.                         if (((i << 3) + j) >= width)
  307.                         {
  308.                             break;
  309.                         }
  310.                         if (data & (1 << (7 - j)))
  311.                         {
  312.                             transparent = 0;
  313.                             B = 255;
  314.                             G = 255;
  315.                             R = 255;
  316.                             A = 255;
  317.                             ret = BMP_write_color(bitmap_data+offset, A, R, G, B, dest_color_depth, transparent);
  318.                             offset += ret;
  319.                         }
  320.                         else
  321.                         {
  322.                             transparent = 0;
  323.                             B = 0;
  324.                             G = 0;
  325.                             R = 0;
  326.                             A = 0;
  327.                             ret = BMP_write_color(bitmap_data+offset, A, R, G, B, dest_color_depth, transparent);
  328.                             offset += ret;
  329.                         }
  330.                     }
  331.                 }
  332.                 break;
  333.         }
  334.     }
  335. }
  336. #else
  337. /* under construction !*/
  338. /* under construction !*/
  339. /* under construction !*/
  340. /* under construction !*/
  341. /* under construction !*/
  342. /* under construction !*/
  343. /* under construction !*/
  344. /* under construction !*/
  345. /* under construction !*/
  346. /* under construction !*/
  347. /* under construction !*/
  348. /* under construction !*/
  349. /* under construction !*/
  350. /* under construction !*/
  351. /* under construction !*/
  352. /* under construction !*/
  353. /* under construction !*/
  354. /* under construction !*/
  355. /* under construction !*/
  356. /* under construction !*/
  357. /* under construction !*/
  358. /* under construction !*/
  359. /* under construction !*/
  360. /* under construction !*/
  361. /* under construction !*/
  362. /* under construction !*/
  363. /* under construction !*/
  364. /* under construction !*/
  365. /* under construction !*/
  366. /* under construction !*/
  367. /* under construction !*/
  368. /* under construction !*/
  369. /* under construction !*/
  370. /* under construction !*/
  371. /* under construction !*/
  372. /* under construction !*/
  373. /* under construction !*/
  374. /* under construction !*/
  375. /* under construction !*/
  376. /* under construction !*/
  377. /* under construction !*/
  378. /* under construction !*/
  379. /* under construction !*/
  380. /* under construction !*/
  381. /* under construction !*/
  382. /* under construction !*/
  383. /* under construction !*/
  384. /* under construction !*/
  385. /* under construction !*/
  386. /* under construction !*/
  387. /* under construction !*/
  388. /* under construction !*/
  389. /* under construction !*/
  390. /* under construction !*/
  391. /* under construction !*/
  392. /* under construction !*/
  393. /* under construction !*/
  394. /* under construction !*/
  395. /* under construction !*/
  396. /* under construction !*/
  397. /* under construction !*/
  398. /* under construction !*/
  399. /* under construction !*/
  400. /* under construction !*/
  401. /* under construction !*/
  402. /* under construction !*/
  403. /* under construction !*/
  404. /* under construction !*/
  405. /* under construction !*/
  406. /* under construction !*/
  407. /* under construction !*/
  408. /* under construction !*/
  409. /* under construction !*/
  410. /* under construction !*/
  411. /* under construction !*/
  412. /* under construction !*/
  413. /* under construction !*/
  414. /* under construction !*/
  415. /* under construction !*/
  416. /* under construction !*/
  417. /* under construction !*/
  418. /* under construction !*/
  419. /* under construction !*/
  420. /* under construction !*/
  421. /* under construction !*/
  422. /* under construction !*/
  423. /* under construction !*/
  424. /* under construction !*/
  425. /* under construction !*/
  426. /* under construction !*/
  427. /* under construction !*/
  428. /* under construction !*/
  429. /* under construction !*/
  430. /* under construction !*/
  431. /* under construction !*/
  432. /* under construction !*/
  433. /* under construction !*/
  434. /* under construction !*/
  435. /* under construction !*/
  436. /* under construction !*/
  437. /* under construction !*/
  438. /* under construction !*/
  439. /* under construction !*/
  440. /* under construction !*/
  441. /* under construction !*/
  442. /* under construction !*/
  443. /* under construction !*/
  444. /* under construction !*/
  445. /* under construction !*/
  446. /* under construction !*/
  447. /* under construction !*/
  448. /* under construction !*/
  449. /* under construction !*/
  450. /* under construction !*/
  451. /* under construction !*/
  452. /* under construction !*/
  453. /* under construction !*/
  454. #endif
  455. #endif /* (!WINGUI_DIRECT_IMAGE_DISPLAY) */ 
  456. /*****************************************************************************
  457.  * FUNCTION
  458.  *  BMP_load_file_header
  459.  * DESCRIPTION
  460.  *  
  461.  * PARAMETERS
  462.  *  h           [?]     
  463.  *  file        [?]     
  464.  * RETURNS
  465.  *  void
  466.  *****************************************************************************/
  467. void BMP_load_file_header(bitmap_file_header *h, bytestream *file)
  468. {
  469.     /*----------------------------------------------------------------*/
  470.     /* Local Variables                                                */
  471.     /*----------------------------------------------------------------*/
  472.     /*----------------------------------------------------------------*/
  473.     /* Code Body                                                      */
  474.     /*----------------------------------------------------------------*/
  475.     h->file_type = bytestream_fgetword(file);
  476.     h->file_size = bytestream_fgetdword(file);
  477.     h->reserved1 = bytestream_fgetword(file);
  478.     h->reserved2 = bytestream_fgetword(file);
  479.     h->bitmap_offset = bytestream_fgetdword(file);
  480. }
  481. /*****************************************************************************
  482.  * FUNCTION
  483.  *  BMP_load_info_header
  484.  * DESCRIPTION
  485.  *  
  486.  * PARAMETERS
  487.  *  h           [?]     
  488.  *  file        [?]     
  489.  * RETURNS
  490.  *  void
  491.  *****************************************************************************/
  492. void BMP_load_info_header(bitmap_info_header *h, bytestream *file)
  493. {
  494.     /*----------------------------------------------------------------*/
  495.     /* Local Variables                                                */
  496.     /*----------------------------------------------------------------*/
  497.     /*----------------------------------------------------------------*/
  498.     /* Code Body                                                      */
  499.     /*----------------------------------------------------------------*/
  500.     h->header_size = bytestream_fgetdword(file);
  501.     h->width = bytestream_fgetdword(file);
  502.     h->height = bytestream_fgetdword(file);
  503.     h->number_of_colors = bytestream_fgetword(file);
  504.     h->bits_per_pixel = bytestream_fgetword(file);
  505.     h->compression = bytestream_fgetdword(file);
  506.     h->bitmap_size = bytestream_fgetdword(file);
  507.     h->device_width = bytestream_fgetdword(file);
  508.     h->device_height = bytestream_fgetdword(file);
  509.     h->number_of_colors = bytestream_fgetdword(file);
  510.     h->number_of_important_colors = bytestream_fgetdword(file);
  511. }
  512. /*****************************************************************************
  513.  * FUNCTION
  514.  *  Load_BMP
  515.  * DESCRIPTION
  516.  *  
  517.  * PARAMETERS
  518.  *  file        [?]     
  519.  * RETURNS
  520.  *  
  521.  *****************************************************************************/
  522. U8 Load_BMP(bytestream *file)
  523. {
  524.     /*----------------------------------------------------------------*/
  525.     /* Local Variables                                                */
  526.     /*----------------------------------------------------------------*/
  527.     bitmap_file_header file_header;
  528.     bitmap_info_header info_header;
  529.     S32 ncolors, i, j, width, height;
  530.     S32 bitmap_size, row_bytes, used_row_bytes, total_bits;
  531.     S32 dest_row_bytes = 0;
  532.     U8 *buffer;
  533.     U8 palette[256][3];
  534.     /*----------------------------------------------------------------*/
  535.     /* Code Body                                                      */
  536.     /*----------------------------------------------------------------*/
  537.     BMP_load_file_header(&file_header, file);
  538.     if ((file_header.file_type & 0xff) != 'B')
  539.     {
  540.         return (0);
  541.     }
  542.     if ((file_header.file_type >> 8) != 'M')
  543.     {
  544.         return (0);
  545.     }
  546.     BMP_load_info_header(&info_header, file);
  547.     /* info_header.bits_per_pixel; */
  548.     width = info_header.width;
  549.     height = info_header.height;
  550.     printf("Width:%d ,Height:%dn", width, height);
  551.     ncolors = 1 << info_header.bits_per_pixel;
  552.     printf("Number of Colors:%dn", ncolors);
  553.     if (info_header.bits_per_pixel == 24)
  554.     {
  555.         used_row_bytes = width * 3;
  556.     }
  557.     else
  558.     {
  559.         total_bits = width * info_header.bits_per_pixel;
  560.         used_row_bytes = total_bits >> 3;   /* total_bits/8   */
  561.         if ((total_bits % 8) > 0)
  562.         {
  563.             used_row_bytes += 1;    /*  total_bits%8   */
  564.         }
  565.     }
  566.     if ((used_row_bytes % 4) > 0)
  567.     {
  568.         row_bytes = used_row_bytes + (4 - (used_row_bytes % 4));
  569.     }
  570.     else
  571.     {
  572.         row_bytes = used_row_bytes;
  573.     }
  574.     if (info_header.bits_per_pixel <= 8)
  575.     {
  576.         for (i = 0; i < ncolors; i++)
  577.         {
  578.             palette[i][2] = bytestream_fgetbyte(file);
  579.             palette[i][1] = bytestream_fgetbyte(file);
  580.             palette[i][0] = bytestream_fgetbyte(file);
  581.             bytestream_fgetbyte(file);
  582.         }
  583.     }
  584.     printf("The first color in palette is (%d,%d,%d)n", palette[0][0], palette[0][1], palette[0][2]);
  585. }
  586. #if(!WINGUI_DIRECT_IMAGE_DISPLAY)
  587. /* file:       input bitmap file (ROM)
  588.    b:          output bitmap
  589.    color_depth:    output bitmap color depth   */
  590. /*****************************************************************************
  591.  * FUNCTION
  592.  *  BMP_load
  593.  * DESCRIPTION
  594.  *  
  595.  * PARAMETERS
  596.  *  file            [?]         
  597.  *  b               [?]         
  598.  *  color_depth     [IN]        
  599.  * RETURNS
  600.  *  
  601.  *****************************************************************************/
  602. U8 BMP_load(bytestream *file, bitmap *b, S8 color_depth)
  603. {
  604.     /*----------------------------------------------------------------*/
  605.     /* Local Variables                                                */
  606.     /*----------------------------------------------------------------*/
  607.     bitmap_file_header file_header;
  608.     bitmap_info_header info_header;
  609.     S32 ncolors, i, j, width, height;
  610.     S32 bitmap_size, row_bytes, used_row_bytes, total_bits;
  611.     S32 dest_row_bytes = 0;
  612.     U8 *buffer;
  613.     U8 palette[256][3];
  614.     U32 image_static_row_data[(IMAGE_STATIC_ROW_DATA_SIZE + 3) / 4];   /* Made image_static_row_data as automatic data *///070306 Alpha layer
  615.     /*----------------------------------------------------------------*/
  616.     /* Code Body                                                      */
  617.     /*----------------------------------------------------------------*/
  618.     BMP_load_file_header(&file_header, file);
  619.     if ((file_header.file_type & 0xff) != 'B')
  620.     {
  621.         return (0);
  622.     }
  623.     if ((file_header.file_type >> 8) != 'M')
  624.     {
  625.         return (0);
  626.     }
  627.     BMP_load_info_header(&info_header, file);
  628.     /* info_header.bits_per_pixel; */
  629.     width = info_header.width;
  630.     height = info_header.height;
  631.     ncolors = 1 << info_header.bits_per_pixel;
  632.     if (info_header.bits_per_pixel == 24)
  633.     {
  634.         used_row_bytes = width * 3;
  635.     }
  636.     else if (info_header.bits_per_pixel == 32)//070306 Alpha layer
  637.     {
  638.         used_row_bytes = width * 4;
  639.     }
  640.     else if (info_header.bits_per_pixel <= 8)
  641.     {
  642.         total_bits = width * info_header.bits_per_pixel;
  643.         used_row_bytes = total_bits >> 3;   /* total_bits/8   */
  644.         if ((total_bits % 8) > 0)
  645.         {
  646.             used_row_bytes += 1;    /*  total_bits%8   */
  647.         }
  648.     }
  649.     else
  650.     {
  651.         return (0);
  652.     }
  653.     if ((used_row_bytes % 4) > 0)
  654.     {
  655.         row_bytes = used_row_bytes + (4 - (used_row_bytes % 4));
  656.     }
  657.     else
  658.     {
  659.         row_bytes = used_row_bytes;
  660.     }
  661.     if (color_depth <= 8)
  662.     {
  663.         dest_row_bytes = width / (8 / color_depth);
  664.         if ((width % (8 / color_depth)) > 0)
  665.         {
  666.             dest_row_bytes++;
  667.         }
  668.     }
  669.     else
  670.     {
  671.         if (color_depth == 24)
  672.         {
  673.             dest_row_bytes = width * 3;
  674.         }
  675.         else if (color_depth == 32)
  676.         {
  677.             dest_row_bytes = width * 4;
  678.         }
  679.         else if ((color_depth == 12) || (color_depth == 16))
  680.         {
  681.             dest_row_bytes = width * 2;
  682.         }
  683.     }
  684.     bitmap_size = dest_row_bytes * height;
  685.     b->xsize = width;
  686.     b->ysize = height;
  687.     b->color_depth = color_depth;
  688.     b->row_bytes = dest_row_bytes;
  689.     if (color_depth <= 8)
  690.     {
  691.         b->palette = (U8*) image_static_palette;
  692.     }
  693.     else
  694.     {
  695.         b->palette = NULL;
  696.     }
  697.     b->data = (U8*) image_static_buffer;
  698.     if (info_header.bits_per_pixel <= 8)
  699.     {
  700.         for (i = 0; i < ncolors; i++)
  701.         {
  702.             palette[i][2] = bytestream_fgetbyte(file);
  703.             palette[i][1] = bytestream_fgetbyte(file);
  704.             palette[i][0] = bytestream_fgetbyte(file);
  705.             bytestream_fgetbyte(file);
  706.         }
  707.     }
  708.     bytestream_fseek(file, file_header.bitmap_offset, SEEK_SET);
  709.     buffer = (U8*) image_static_row_data;
  710.     for (j = height - 1; j >= 0; j--)
  711.     {
  712.         for (i = 0; i < row_bytes; i++)
  713.         {
  714.             buffer[i] = bytestream_fgetbyte(file);
  715.         }
  716.         //BMP_write_line(b, buffer, row_bytes, (S8) info_header.bits_per_pixel, width, j, palette);//070306 Alpha layer
  717.         BMP_write_line(b, buffer, row_bytes, (S8) info_header.bits_per_pixel, color_depth, width, j, palette);//070306 Alpha layer
  718.     }
  719.     return (1);
  720. }
  721. #endif /* (!WINGUI_DIRECT_IMAGE_DISPLAY) */ 
  722. /*****************************************************************************
  723.  * FUNCTION
  724.  *  BMPLoader
  725.  * DESCRIPTION
  726.  *  
  727.  * PARAMETERS
  728.  *  in_filename         [?]     
  729.  *  out_filename        [?]     
  730.  * RETURNS
  731.  *  
  732.  *****************************************************************************/
  733. int BMPLoader(char *in_filename, char *out_filename)
  734. {
  735.     /*----------------------------------------------------------------*/
  736.     /* Local Variables                                                */
  737.     /*----------------------------------------------------------------*/
  738.     bitmap outimage;
  739.     FILE *infile;
  740.     FILE *outfile;
  741.     bytestream inimage;
  742.     S32 file_length;
  743.     U8 *buffer;
  744.     S32 i, bitmap_size, total_data_size;
  745.     U8 ret;
  746. #ifdef __MMI_RESOURCE_ENFB_SUPPORT__
  747.     U32 enfb_width, enfb_height;
  748.     S32 enfb_ret;
  749. #endif
  750.     /*----------------------------------------------------------------*/
  751.     /* Code Body                                                      */
  752.     /*----------------------------------------------------------------*/
  753.     infile = fopen(in_filename, "rb");
  754.     if (infile == NULL)
  755.     {
  756.         printf("nError opening %s", in_filename);
  757.         return 0;
  758.     }
  759.     outfile = fopen(out_filename, "wb+");
  760.     if (outfile == NULL)
  761.     {
  762.         printf("nError creating %s", out_filename);
  763.         fclose(infile);
  764.         return 0;
  765.     }
  766.     fseek(infile, 0, SEEK_END);
  767.     file_length = ftell(infile);
  768.     fseek(infile, 0, SEEK_SET);
  769.     buffer = (U8*) malloc(file_length);
  770.     if (buffer == NULL)
  771.     {
  772.         printf("nError allocating memory of size %d bytes", file_length);
  773.         fclose(infile);
  774.         fclose(outfile);
  775.         return 0;
  776.     }
  777.     fread(buffer, 1, file_length, infile);
  778.     fclose(infile);
  779.     bytestream_initialize(&inimage, buffer, file_length);
  780. #if 1
  781.     //ret = BMP_load(&inimage, &outimage, DEVICE_COLOR_DEPTH);
  782.     ret = BMP_load(&inimage, &outimage, __MMI_DEVICE_BMP_FORMAT__);
  783.     //ret = BMP_load(&inimage, &outimage, 16);
  784.     if (ret == 0)
  785.     {
  786.         printf("nFormat not supported %s", in_filename);
  787.         free(buffer);
  788.         fclose(outfile);
  789.         return 0;
  790.     }
  791.     bitmap_size = outimage.row_bytes * outimage.ysize;
  792.     total_data_size = bitmap_size + 13;
  793. #ifdef __MMI_RESOURCE_ENFB_SUPPORT__
  794.     enfb_ret = Image_Test(in_filename, &enfb_width, &enfb_height);
  795.     if (enfb_ret != ENFB_IMAGE_NONE)
  796.     {
  797.         enfbFlag = 1;
  798.         if (enfb_ret == ENFB_IMAGE_ASSOCIATE)
  799.         {
  800.             ENFBAssociatedIDAdded = MMI_TRUE;
  801.         }
  802.     }
  803. #endif
  804.     g_ressize = total_data_size;
  805.     if (toolFlag == 1)  /* Write to file in binary */
  806.     {
  807.         fprintf(dest_file, "%c", 0x04);
  808.         fprintf(dest_file, "%c", 0x00);
  809.         total_data_size = bitmap_size + 13;
  810.         fprintf(
  811.             dest_file,
  812.             "%c%c%c%c",
  813.             (total_data_size & 0x000000ff),
  814.             (total_data_size & 0x0000ff00) >> 8,
  815.             (total_data_size & 0x00ff0000) >> 16,
  816.             (total_data_size & 0xff000000) >> 24);
  817.         fprintf(
  818.             dest_file,
  819.             "%c%c%c%c",
  820.             (outimage.xsize & 0x000000ff),
  821.             (outimage.xsize & 0x0000ff00) >> 8,
  822.             (outimage.xsize & 0x00ff0000) >> 16,
  823.             (outimage.xsize & 0xff000000) >> 24);
  824.         fprintf(
  825.             dest_file,
  826.             "%c%c%c%c",
  827.             (outimage.ysize & 0x000000ff),
  828.             (outimage.ysize & 0x0000ff00) >> 8,
  829.             (outimage.ysize & 0x00ff0000) >> 16,
  830.             (outimage.ysize & 0xff000000) >> 24);
  831.         fprintf(dest_file, "%c", outimage.color_depth);
  832.         fprintf(
  833.             dest_file,
  834.             "%c%c%c%c",
  835.             (outimage.row_bytes & 0x000000ff),
  836.             (outimage.row_bytes & 0x0000ff00) >> 8,
  837.             (outimage.row_bytes & 0x00ff0000) >> 16,
  838.             (outimage.row_bytes & 0xff000000) >> 24);
  839.         for (i = 0; i < bitmap_size; i++)
  840.         {
  841.             fprintf(dest_file, "%c", outimage.data[i]);
  842.         }
  843.     }
  844. #ifdef __MMI_RESOURCE_ENFB_SUPPORT__
  845.     else if (enfbFlag == 1) /* write ENFB header to CustImgDataxxx.h and image header/data to ENFB image data file */
  846.     {
  847.         enfb_size = 19 + bitmap_size;
  848.         
  849.         /* write ENFB header to CustImgDataxxx.h */
  850.         fprintf(
  851.             outfile,
  852.             "n{t0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02Xt};n",
  853.             (U8) 255,//type
  854.             (U8) ENFBAssociatedIDAdded,//associated id
  855.             (U8) 0,//reserved
  856.             (U8) 0,//reserved
  857.             (U8) (enfb_offset & 0xff),
  858.             (U8) ((enfb_offset >> 8) & 0xff),
  859.             (U8) ((enfb_offset >> 16) & 0xff),
  860.             (U8) ((enfb_offset >> 24) & 0xff),
  861.             (U8) (enfb_size & 0xff),
  862.             (U8) ((enfb_size >> 8) & 0xff),
  863.             (U8) ((enfb_size >> 16) & 0xff),
  864.             (U8) ((enfb_size >> 24) & 0xff));
  865.         
  866.         /* image header/data to ENFB image data file */
  867.         fprintf(enfb_img_data_file, "%c", 0x04);
  868.         fprintf(enfb_img_data_file, "%c", 0x00);
  869.         total_data_size = bitmap_size + 13;
  870.         fprintf(
  871.             enfb_img_data_file,
  872.             "%c%c%c%c",
  873.             (total_data_size & 0x000000ff),
  874.             (total_data_size & 0x0000ff00) >> 8,
  875.             (total_data_size & 0x00ff0000) >> 16,
  876.             (total_data_size & 0xff000000) >> 24);
  877.         fprintf(
  878.             enfb_img_data_file,
  879.             "%c%c%c%c",
  880.             (outimage.xsize & 0x000000ff),
  881.             (outimage.xsize & 0x0000ff00) >> 8,
  882.             (outimage.xsize & 0x00ff0000) >> 16,
  883.             (outimage.xsize & 0xff000000) >> 24);
  884.         fprintf(
  885.             enfb_img_data_file,
  886.             "%c%c%c%c",
  887.             (outimage.ysize & 0x000000ff),
  888.             (outimage.ysize & 0x0000ff00) >> 8,
  889.             (outimage.ysize & 0x00ff0000) >> 16,
  890.             (outimage.ysize & 0xff000000) >> 24);
  891.         fprintf(enfb_img_data_file, "%c", outimage.color_depth);
  892.         fprintf(
  893.             enfb_img_data_file,
  894.             "%c%c%c%c",
  895.             (outimage.row_bytes & 0x000000ff),
  896.             (outimage.row_bytes & 0x0000ff00) >> 8,
  897.             (outimage.row_bytes & 0x00ff0000) >> 16,
  898.             (outimage.row_bytes & 0xff000000) >> 24);
  899.         for (i = 0; i < bitmap_size; i++)
  900.         {
  901.             fprintf(enfb_img_data_file, "%c", outimage.data[i]);
  902.         }
  903.         
  904.         enfb_offset += enfb_size;
  905.         enfbFlag = 0;
  906.     }
  907. #endif
  908.     else    /* Write to .c .h file */
  909.     {
  910.         fprintf(outfile, "{nt");
  911.         fprintf(outfile, " 0x%02X,", 0x04);
  912.         fprintf(outfile, " 0x%02X,", 0x00);
  913.         total_data_size = bitmap_size + 13;
  914.         fprintf(
  915.             outfile,
  916.             " 0x%02X, 0x%02X, 0x%02X, 0x%02X,nt",
  917.             (total_data_size & 0x000000ff),
  918.             (total_data_size & 0x0000ff00) >> 8,
  919.             (total_data_size & 0x00ff0000) >> 16,
  920.             (total_data_size & 0xff000000) >> 24);
  921.         fprintf(
  922.             outfile,
  923.             " 0x%02X, 0x%02X, 0x%02X, 0x%02X,",
  924.             (outimage.xsize & 0x000000ff),
  925.             (outimage.xsize & 0x0000ff00) >> 8,
  926.             (outimage.xsize & 0x00ff0000) >> 16,
  927.             (outimage.xsize & 0xff000000) >> 24);
  928.         fprintf(
  929.             outfile,
  930.             " 0x%02X, 0x%02X, 0x%02X, 0x%02X,",
  931.             (outimage.ysize & 0x000000ff),
  932.             (outimage.ysize & 0x0000ff00) >> 8,
  933.             (outimage.ysize & 0x00ff0000) >> 16,
  934.             (outimage.ysize & 0xff000000) >> 24);
  935.         fprintf(outfile, " 0x%02X,", outimage.color_depth);
  936.         fprintf(
  937.             outfile,
  938.             " 0x%02X, 0x%02X, 0x%02X, 0x%02X,",
  939.             (outimage.row_bytes & 0x000000ff),
  940.             (outimage.row_bytes & 0x0000ff00) >> 8,
  941.             (outimage.row_bytes & 0x00ff0000) >> 16,
  942.             (outimage.row_bytes & 0xff000000) >> 24);
  943.         for (i = 0; i < bitmap_size; i++)
  944.         {
  945.             if ((i % 16) == 0)
  946.             {
  947.                 fprintf(outfile, "nt");
  948.             }
  949.             fprintf(outfile, " 0x%02X,", outimage.data[i]);
  950.         }
  951.         fprintf(outfile, "n};");
  952.     }
  953. #endif /* 1 */ 
  954.     fclose(outfile);
  955.     free(buffer);
  956.     return 1;
  957. }