OTAbitmap.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 "OTAbitmap.h"
  7. /* create empty OTAbitmap */
  8. OTAbitmap *OTAbitmap_create_empty(void)
  9. {
  10.     OTAbitmap *new;
  11.     new = gw_malloc(sizeof(OTAbitmap));
  12.     memset(new, 0, sizeof(OTAbitmap));
  13.     return new;
  14. }
  15. void OTAbitmap_delete(OTAbitmap *pic)
  16. {
  17.     gw_free(pic->ext_fields);
  18.     gw_free(pic->main_image);
  19.     if (pic->animated_image) {
  20. int i;
  21. for(i=0; i < pic->animimg_count; i++)
  22.     gw_free(pic->animated_image[i]);
  23. gw_free(pic->animated_image);
  24.     }
  25.     gw_free(pic);
  26. }
  27. OTAbitmap *OTAbitmap_create(int width, int height, int depth,
  28.     Octet *data, int flags)
  29. {
  30.     OTAbitmap *new;
  31.     int i, j, siz, osiz;
  32.     Octet val;
  33.     
  34.     new = OTAbitmap_create_empty();
  35.     if (width > 255 || height > 255)
  36. new->infofield = 0x10; /* set bit */
  37.     else
  38. new->infofield = 0x00;
  39.     
  40.     new->width = width;
  41.     new->height = height;
  42.     siz = (width * height + 7)/8;
  43.     
  44.     new->main_image = gw_malloc(siz);
  45.     osiz = (width+7)/8 * height;
  46.     for(i=j=0; i<osiz; i++, j+=8) {
  47. val = data[i];
  48. if (flags & REVERSE) val = reverse_octet(val);
  49. if (flags & NEGATIVE) val = ~val;
  50. if (i > 0 && i % ((width+7)/8) == 0 && width % 8 > 0)
  51.     j -= 8 + width % 8;
  52. if (j % 8 == 0) {
  53.     new->main_image[j/8] = val;
  54. }
  55. else {
  56.     new->main_image[j/8] |= val >> (j % 8);
  57.     new->main_image[j/8 + 1] = val << (8 - j % 8);
  58. }     
  59.     }
  60.     /* no palette nor animated images, yet */
  61.     
  62.     return new;
  63. }
  64. /* create Octet stream from given OTAbitmap */
  65. int OTAbitmap_create_stream(OTAbitmap *pic, Octet **stream)
  66. {
  67.     Octet tmp_header[10];
  68.     int hdr_len;
  69.     int pic_size;
  70.     if (pic->infofield & 0x10) {
  71. sprintf(tmp_header, "%c%c%c%c%c%c", pic->infofield, pic->width/256,
  72. pic->width%256, pic->height/256, pic->height%256, pic->depth); 
  73. hdr_len = 6;
  74.     } else {
  75. sprintf(tmp_header, "%c%c%c%c", pic->infofield,
  76. pic->width, pic->height, pic->depth);
  77. hdr_len = 4;
  78.     }
  79.     
  80.     pic_size = (pic->width * pic->height + 7)/8;
  81.     *stream = gw_malloc(pic_size+pic_size);
  82.     memcpy(*stream, tmp_header, hdr_len);
  83.     memcpy(*stream + hdr_len, pic->main_image, pic_size);
  84.     debug("util", 0, "picture %d x %d, stream length %d",
  85.   pic->width, pic->height, hdr_len + pic_size);
  86.     
  87.     return (hdr_len + pic_size);
  88. }