wbmp.c
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:2k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <errno.h>
  5. #include "gwlib/gwlib.h"
  6. #include "wbmp.h"
  7. /* create empty WBMP */
  8. WBMP *wbmp_create_empty(void)
  9. {
  10.     WBMP *new;
  11.     new = gw_malloc(sizeof(WBMP));
  12.     memset(new, 0, sizeof(WBMP));
  13.     return new;
  14. }
  15. /* delete a WBMP, freeing everything */
  16. void wbmp_delete(WBMP *pic)
  17. {
  18.     gw_free(pic->ext_header_field);
  19.     gw_free(pic->main_image);
  20.     if (pic->animated_image) {
  21. int i;
  22. for(i=0; i < pic->animimg_count; i++)
  23.     gw_free(pic->animated_image[i]);
  24. gw_free(pic->animated_image);
  25.     }
  26.     gw_free(pic);
  27. }
  28. WBMP *wbmp_create(int type, int width, int height, Octet *data, int flags)
  29. {
  30.     WBMP *new;
  31.     int i, siz;
  32.     Octet val;
  33.     
  34.     new = wbmp_create_empty();
  35.     new->type_field = type;
  36.     if (type == 0) {
  37. new->fix_header_field = 0x00;
  38.     } else {
  39. error(0, "WBMP type %d not supported", type);
  40. return NULL;
  41.     }
  42.     new->width = width;
  43.     new->height = height;
  44.     siz = (width+7)/8 * height;
  45.     
  46.     new->main_image = gw_malloc(siz);
  47.     for(i=0; i < siz; i++) {
  48. if (flags & REVERSE) val = reverse_octet(data[i]);
  49. else val = data[i];
  50. if (flags & NEGATIVE) val = ~val;
  51. new->main_image[i] = val;
  52.     }    
  53.     return new;
  54. }
  55. /* create Octet stream from given WBMP */
  56. int wbmp_create_stream(WBMP *pic, Octet **stream)
  57. {
  58.     Octet tmp_w[30], tmp_h[30];
  59.     int wl, hl, pic_size;
  60.     
  61.     wl = write_variable_value(pic->width, tmp_w);
  62.     hl = write_variable_value(pic->height, tmp_h);
  63.     pic_size = ((pic->width+7)/8) * pic->height;
  64.     if (pic->type_field != 0) {
  65. error(0, "Unknown WBMP type %d, cannot convert", pic->type_field);
  66. return -1;
  67.     }
  68.     *stream = gw_malloc(2+wl+hl+pic_size);
  69.     sprintf(*stream, "%c%c", 0x00, 0x00); 
  70.     memcpy(*stream+2, tmp_w, wl);
  71.     memcpy(*stream+2+wl, tmp_h, hl);
  72.     memcpy(*stream+2+wl+hl, pic->main_image, pic_size);
  73.     debug("util", 0, "picture %d x %d, stream length %d",
  74.   pic->width, pic->height, 2+wl+hl+pic_size);
  75.     
  76.     return (2+wl+hl+pic_size);
  77. }