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

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.  *  bmp2ems.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.  * removed!
  79.  * removed!
  80.  * removed!
  81.  *
  82.  *------------------------------------------------------------------------------
  83.  * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! 
  84.  *==============================================================================
  85.  *******************************************************************************/
  86. #include <stdio.h>
  87. #include <stdlib.h>
  88. #include "ResDevice.h"
  89. #include "ResBytestream.h"
  90. #include "ImgDecoderDef.h"
  91. #include "mmi_features.h"
  92. extern FILE *dest_file;
  93. extern int toolFlag;
  94. U8 binary_mode = 0;
  95. U8 verbose_mode = 0;
  96. FILE *out_file = NULL;
  97. #ifdef __MMI_RESOURCE_ENFB_SUPPORT__
  98. extern FILE *enfb_img_data_file;
  99. extern int enfbFlag;
  100. extern U32 enfb_offset;
  101. extern U32 enfb_size;
  102. extern MMI_BOOL ENFBAssociatedIDAdded;
  103. #include "ImageGetDimension.h"
  104. #endif
  105. extern S32 g_ressize;
  106. /*****************************************************************************
  107.  * FUNCTION
  108.  *  EMS_load
  109.  * DESCRIPTION
  110.  *  
  111.  * PARAMETERS
  112.  *  file            [?]     
  113.  *  filename        [?]     
  114.  * RETURNS
  115.  *  
  116.  *****************************************************************************/
  117. U8 EMS_load(bytestream *file, char *filename)
  118. {
  119.     /*----------------------------------------------------------------*/
  120.     /* Local Variables                                                */
  121.     /*----------------------------------------------------------------*/
  122.     bitmap_file_header file_header;
  123.     bitmap_info_header info_header;
  124.     S32 i, j, k;
  125.     S32 bits_per_pixel, width, height, PDU_length;
  126.     U8 buffer[2048];
  127.     U8 mask;
  128.     U8 data;
  129.     char cmdbuf[1024];
  130.     FILE *file_ptr;
  131.     S32 file_length;
  132.     U8 *file_buffer;
  133.     bytestream *rgb_image;
  134.     U8 scale_data;
  135. #ifdef __MMI_RESOURCE_ENFB_SUPPORT__
  136.     U32 enfb_width, enfb_height;
  137.     S32 enfb_ret;
  138. #endif
  139.     /*----------------------------------------------------------------*/
  140.     /* Code Body                                                      */
  141.     /*----------------------------------------------------------------*/
  142.     BMP_load_file_header(&file_header, file);
  143.     if ((file_header.file_type & 0xff) != 'B')
  144.     {
  145.         printf("nNot a valid BMP file");
  146.         return (0);
  147.     }
  148.     if ((file_header.file_type >> 8) != 'M')
  149.     {
  150.         printf("nNot a valid BMP file");
  151.         return (0);
  152.     }
  153.     BMP_load_info_header(&info_header, file);
  154.     width = info_header.width;
  155.     height = info_header.height;
  156.     if (info_header.bits_per_pixel == 1)
  157.     {
  158.         bits_per_pixel = 1;
  159.         PDU_length = ((width * height) + 7) >> 3;
  160.     }
  161.     else if (info_header.bits_per_pixel == 4)
  162.     {
  163.         bits_per_pixel = 2;
  164.         PDU_length = (((width * height) << 1) + 7) >> 3;
  165.     }
  166.     else if (info_header.bits_per_pixel == 8)
  167.     {
  168.         bits_per_pixel = 6;
  169.         PDU_length = (((width * height) * 6) + 7) >> 3;
  170.     }
  171.     else
  172.     {
  173.         return (0);
  174.     }
  175.     g_ressize = PDU_length;
  176.     bytestream_fseek(file, file_header.bitmap_offset, SEEK_SET);
  177.     sprintf(cmdbuf, "%s %s %s", "..\..\Customer\ResGenerator\convert.exe", filename, "temp.rgb");
  178.     system(cmdbuf);
  179.     file_ptr = fopen("temp.rgb", "rb");
  180.     fseek(file_ptr, 0, SEEK_END);
  181.     file_length = ftell(file_ptr);
  182.     fseek(file_ptr, 0, SEEK_SET);
  183.     file_buffer = (U8*) malloc(file_length);
  184.     fread(file_buffer, 1, file_length, file_ptr);
  185.     fclose(file_ptr);
  186.     bytestream_initialize(&rgb_image, file_buffer, file_length);
  187.     free(file_buffer);
  188.     if (binary_mode)
  189.     {
  190.         if (bits_per_pixel == 1)
  191.         {
  192.             for (i = 0; i < PDU_length; i++)
  193.             {
  194.                 buffer[i] = 0x00;
  195.                 for (k = 8; k; k--)
  196.                 {
  197.                     data =
  198.                         (bytestream_fgetbyte(&rgb_image) + bytestream_fgetbyte(&rgb_image) +
  199.                          bytestream_fgetbyte(&rgb_image)) / 3;
  200.                     if (data >= 0 && data < 128)
  201.                     {
  202.                         scale_data = 0x01;
  203.                     }
  204.                     else
  205.                     {
  206.                         scale_data = 0x00;
  207.                     }
  208.                     buffer[i] |= scale_data << (k - 1);
  209.                 }
  210.             }
  211.         }
  212.         else if (bits_per_pixel == 2)
  213.         {
  214.             for (i = 0; i < PDU_length; i++)
  215.             {
  216.                 buffer[i] = 0x00;
  217.                 for (k = 8; k; k = k - 2)
  218.                 {
  219.                     data =
  220.                         (bytestream_fgetbyte(&rgb_image) + bytestream_fgetbyte(&rgb_image) +
  221.                          bytestream_fgetbyte(&rgb_image)) / 3;
  222.                     if (data >= 0 && data < 64)
  223.                     {
  224.                         scale_data = 0x00;
  225.                     }
  226.                     else if (data >= 64 && data < 128)
  227.                     {
  228.                         scale_data = 0x01;
  229.                     }
  230.                     else if (data >= 128 && data < 192)
  231.                     {
  232.                         scale_data = 0x02;
  233.                     }
  234.                     else
  235.                     {
  236.                         scale_data = 0x03;
  237.                     }
  238.                     buffer[i] |= scale_data << (k - 2);
  239.                 }
  240.             }
  241.         }
  242.         else if (bits_per_pixel == 6)
  243.         {
  244.             for (i = 0; i < PDU_length; i++)
  245.             {
  246.                 buffer[i] = 0x00;
  247.                 for (k = 8; k; k = k - 2)
  248.                 {
  249.                     data = bytestream_fgetbyte(&rgb_image);
  250.                     if (data >= 0 && data < 64)
  251.                     {
  252.                         scale_data = 0x00;
  253.                     }
  254.                     else if (data >= 64 && data < 128)
  255.                     {
  256.                         scale_data = 0x01;
  257.                     }
  258.                     else if (data >= 128 && data < 192)
  259.                     {
  260.                         scale_data = 0x02;
  261.                     }
  262.                     else
  263.                     {
  264.                         scale_data = 0x03;
  265.                     }
  266.                     buffer[i] |= scale_data << (k - 2);
  267.                 }
  268.             }
  269.         }
  270.     #ifdef __MMI_RESOURCE_ENFB_SUPPORT__
  271.         enfb_ret = Image_Test(filename, &enfb_width, &enfb_height);
  272.         if (enfb_ret != ENFB_IMAGE_NONE)
  273.         {
  274.             enfbFlag = 1;
  275.             if (enfb_ret == ENFB_IMAGE_ASSOCIATE)
  276.             {
  277.                 ENFBAssociatedIDAdded = MMI_TRUE;
  278.             }
  279.         }
  280.     #endif
  281.         if (toolFlag == 1)  /* Write to file in binary format */
  282.         {
  283.             fprintf(
  284.                 dest_file,
  285.                 "%c%c%c%c%c%c%c%c%c",
  286.                 (U8) 1,
  287.                 (U8) bits_per_pixel,
  288.                 (U8) 0,
  289.                 (U8) (width & 0xff),
  290.                 (U8) ((width >> 8) & 0xff),
  291.                 (U8) (height & 0xff),
  292.                 (U8) ((height >> 8) & 0xff),
  293.                 (U8) ((PDU_length) & 0xff),
  294.                 (U8) ((PDU_length) >> 8) & 0xff);
  295.             for (i = 0; i < PDU_length; i++)
  296.             {
  297.                 fprintf(dest_file, "%c", buffer[i]);
  298.             }
  299.         }
  300.     #ifdef __MMI_RESOURCE_ENFB_SUPPORT__
  301.         else if (enfbFlag == 1) /* write ENFB header to CustImgDataxxx.h and image header/data to ENFB image data file */
  302.         {
  303.             enfb_size = 9 + PDU_length;
  304.             
  305.             /* write ENFB header to CustImgDataxxx.h */
  306.             fprintf(
  307.                 out_file,
  308.                 "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",
  309.                 (U8) 255,//type
  310.                 (U8) ENFBAssociatedIDAdded,//associated id
  311.                 (U8) 0,//reserved
  312.                 (U8) 0,//reserved
  313.                 (U8) (enfb_offset & 0xff),
  314.                 (U8) ((enfb_offset >> 8) & 0xff),
  315.                 (U8) ((enfb_offset >> 16) & 0xff),
  316.                 (U8) ((enfb_offset >> 24) & 0xff),
  317.                 (U8) (enfb_size & 0xff),
  318.                 (U8) ((enfb_size >> 8) & 0xff),
  319.                 (U8) ((enfb_size >> 16) & 0xff),
  320.                 (U8) ((enfb_size >> 24) & 0xff));
  321.             
  322.             /* image header/data to ENFB image data file */
  323.             fprintf(
  324.                 enfb_img_data_file,
  325.                 "%c%c%c%c%c%c%c%c%c",
  326.                 (U8) 1,
  327.                 (U8) bits_per_pixel,
  328.                 (U8) 0,
  329.                 (U8) (width & 0xff),
  330.                 (U8) ((width >> 8) & 0xff),
  331.                 (U8) (height & 0xff),
  332.                 (U8) ((height >> 8) & 0xff),
  333.                 (U8) ((PDU_length) & 0xff),
  334.                 (U8) ((PDU_length) >> 8) & 0xff);
  335.             for (i = 0; i < PDU_length; i++)
  336.             {
  337.                 fprintf(enfb_img_data_file, "%c", buffer[i]);
  338.             }
  339.             
  340.             enfb_offset += enfb_size;
  341.             enfbFlag = 0;
  342.         }
  343.     #endif
  344.         else    /* Write to .c .h file */
  345.         {
  346.             fprintf(
  347.                 out_file,
  348.                 "n{t0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X,",
  349.                 (U8) 1,
  350.                 (U8) bits_per_pixel,
  351.                 (U8) 0,
  352.                 (U8) (width & 0xff),
  353.                 (U8) ((width >> 8) & 0xff),
  354.                 (U8) (height & 0xff),
  355.                 (U8) ((height >> 8) & 0xff),
  356.                 (U8) ((PDU_length) & 0xff),
  357.                 (U8) ((PDU_length) >> 8) & 0xff);
  358.             for (i = 0; i < PDU_length; i++)
  359.             {
  360.                 if ((i % 16) == 0)
  361.                 {
  362.                     fprintf(out_file, "nt");
  363.                 }
  364.                 fprintf(out_file, "0x%02X, ", buffer[i]);
  365.             }
  366.             fprintf(out_file, "n};n");
  367.         }
  368.     }
  369.     else
  370.     {
  371.         if (verbose_mode)
  372.         {
  373.             printf("nWidth=%d, Height=%d, Size=%d bytes", width, height, PDU_length);
  374.         }
  375.         if (bits_per_pixel == 1)
  376.         {
  377.             for (i = 0; i < PDU_length; i++)
  378.             {
  379.                 buffer[i] = 0x00;
  380.                 for (k = 8; k; k--)
  381.                 {
  382.                     data =
  383.                         (bytestream_fgetbyte(&rgb_image) + bytestream_fgetbyte(&rgb_image) +
  384.                          bytestream_fgetbyte(&rgb_image)) / 3;
  385.                     if (data >= 0 && data < 128)
  386.                     {
  387.                         scale_data = 0x01;
  388.                     }
  389.                     else
  390.                     {
  391.                         scale_data = 0x00;
  392.                     }
  393.                     buffer[i] |= scale_data << (k - 1);
  394.                 }
  395.             }
  396.         }
  397.         else if (bits_per_pixel == 2)
  398.         {
  399.             for (i = 0; i < PDU_length; i++)
  400.             {
  401.                 buffer[i] = 0x00;
  402.                 for (k = 8; k; k = k - 2)
  403.                 {
  404.                     data =
  405.                         (bytestream_fgetbyte(&rgb_image) + bytestream_fgetbyte(&rgb_image) +
  406.                          bytestream_fgetbyte(&rgb_image)) / 3;
  407.                     if (data >= 0 && data < 64)
  408.                     {
  409.                         scale_data = 0x00;
  410.                     }
  411.                     else if (data >= 64 && data < 128)
  412.                     {
  413.                         scale_data = 0x01;
  414.                     }
  415.                     else if (data >= 128 && data < 192)
  416.                     {
  417.                         scale_data = 0x02;
  418.                     }
  419.                     else
  420.                     {
  421.                         scale_data = 0x03;
  422.                     }
  423.                     buffer[i] |= scale_data << (k - 2);
  424.                 }
  425.             }
  426.         }
  427.         else if (bits_per_pixel == 6)
  428.         {
  429.             for (i = 0; i < PDU_length; i++)
  430.             {
  431.                 buffer[i] = 0x00;
  432.                 for (k = 8; k; k = k - 2)
  433.                 {
  434.                     data = bytestream_fgetbyte(&rgb_image);
  435.                     if (data >= 0 && data < 64)
  436.                     {
  437.                         scale_data = 0x00;
  438.                     }
  439.                     else if (data >= 64 && data < 128)
  440.                     {
  441.                         scale_data = 0x01;
  442.                     }
  443.                     else if (data >= 128 && data < 192)
  444.                     {
  445.                         scale_data = 0x02;
  446.                     }
  447.                     else
  448.                     {
  449.                         scale_data = 0x03;
  450.                     }
  451.                     buffer[i] |= scale_data << (k - 2);
  452.                 }
  453.             }
  454.         }
  455.         if (verbose_mode)
  456.         {
  457.             printf("nImage Data:");
  458.         }
  459.         printf(
  460.             "n{t0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X,",
  461.             (U8) 1,
  462.             (U8) bits_per_pixel,
  463.             (U8) 0,
  464.             (U8) (width & 0xff),
  465.             (U8) ((width >> 8) & 0xff),
  466.             (U8) (height & 0xff),
  467.             (U8) ((height >> 8) & 0xff),
  468.             (U8) ((PDU_length) & 0xff),
  469.             (U8) ((PDU_length) >> 8) & 0xff);
  470.     }
  471.     if (verbose_mode)
  472.     {
  473.         printf("nConvert OKn");
  474.     }
  475.     return (1);
  476. }
  477. /*****************************************************************************
  478.  * FUNCTION
  479.  *  bmp2ems
  480.  * DESCRIPTION
  481.  *  
  482.  * PARAMETERS
  483.  *  in_filename         [?]         
  484.  *  out_filename        [?]         
  485.  *  binary_flag         [IN]        
  486.  *  verbose_flag        [IN]        
  487.  * RETURNS
  488.  *  
  489.  *****************************************************************************/
  490. int bmp2ems(char *in_filename, char *out_filename, int binary_flag, int verbose_flag)
  491. {
  492.     /*----------------------------------------------------------------*/
  493.     /* Local Variables                                                */
  494.     /*----------------------------------------------------------------*/
  495.     FILE *infile;
  496.     bytestream inimage;
  497.     S32 file_length;
  498.     U8 *buffer;
  499.     S32 i, bitmap_size, total_data_size;
  500.     int ret;
  501.     /*----------------------------------------------------------------*/
  502.     /* Code Body                                                      */
  503.     /*----------------------------------------------------------------*/
  504.     infile = fopen(in_filename, "rb");
  505.     if (infile == NULL)
  506.     {
  507.         printf("nError opening %s", in_filename);
  508.         return 0;
  509.     }
  510.     if (binary_flag == 1)
  511.     {
  512.         out_file = fopen(out_filename, "ab");
  513.         while (!out_file)
  514.         {
  515.             //printf("nError opening output file %s. Dumping image data to console ...", out_filename);
  516.             Sleep(50);
  517.             out_file = fopen(out_filename, "ab");
  518.         }
  519.         #if 0
  520. /* under construction !*/
  521. /* under construction !*/
  522. /* under construction !*/
  523. /* under construction !*/
  524. /* under construction !*/
  525. /* under construction !*/
  526. /* under construction !*/
  527. /* under construction !*/
  528.         #endif
  529.         binary_mode = 1;
  530.     }
  531.     if (verbose_flag == 1)
  532.     {
  533.         verbose_mode = 1;
  534.     }
  535.     if (verbose_mode)
  536.     {
  537.         printf("nBMP to EMS PDU converter");
  538.         printf("n(c) 2003 Pixtel communications Inc.");
  539.     }
  540.     fseek(infile, 0, SEEK_END);
  541.     file_length = ftell(infile);
  542.     fseek(infile, 0, SEEK_SET);
  543.     buffer = (U8*) malloc(file_length);
  544.     if (buffer == NULL)
  545.     {
  546.         if (binary_mode)
  547.         {
  548.             fclose(out_file);
  549.         }
  550.         printf("nError allocating memory of size %d bytes", file_length);
  551.         fclose(infile);
  552.         return 0;
  553.     }
  554.     fread(buffer, 1, file_length, infile);
  555.     fclose(infile);
  556.     bytestream_initialize(&inimage, buffer, file_length);
  557.     ret = EMS_load(&inimage, in_filename);
  558.     free(buffer);
  559.     if (binary_mode)
  560.     {
  561.         fclose(out_file);
  562.     }
  563.     return ret;
  564. }