00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 #include <stdio.h>
00058 #include <stdlib.h>
00059 #include <string.h>
00060 #include <errno.h>
00061
00062 #include "gwlib/gwlib.h"
00063 #include "wbmp.h"
00064
00065
00066
00067
00068
00069 WBMP *wbmp_create_empty(void)
00070 {
00071 WBMP *new;
00072
00073 new = gw_malloc(sizeof(WBMP));
00074 memset(new, 0, sizeof(WBMP));
00075 return new;
00076 }
00077
00078
00079
00080 void wbmp_delete(WBMP *pic)
00081 {
00082 gw_free(pic->ext_header_field);
00083 gw_free(pic->main_image);
00084 if (pic->animated_image) {
00085 int i;
00086 for(i=0; i < pic->animimg_count; i++)
00087 gw_free(pic->animated_image[i]);
00088 gw_free(pic->animated_image);
00089 }
00090 gw_free(pic);
00091 }
00092
00093
00094 WBMP *wbmp_create(int type, int width, int height, Octet *data, int flags)
00095 {
00096 WBMP *new;
00097 int i, siz;
00098 Octet val;
00099
00100 new = wbmp_create_empty();
00101
00102 new->type_field = type;
00103 if (type == 0) {
00104 new->fix_header_field = 0x00;
00105 } else {
00106 error(0, "WBMP type %d not supported", type);
00107 return NULL;
00108 }
00109 new->width = width;
00110 new->height = height;
00111 siz = (width+7)/8 * height;
00112
00113 new->main_image = gw_malloc(siz);
00114 for(i=0; i < siz; i++) {
00115 if (flags & REVERSE) val = reverse_octet(data[i]);
00116 else val = data[i];
00117 if (flags & NEGATIVE) val = ~val;
00118 new->main_image[i] = val;
00119 }
00120 return new;
00121 }
00122
00123
00124
00125
00126
00127 int wbmp_create_stream(WBMP *pic, Octet **stream)
00128 {
00129 Octet tmp_w[30], tmp_h[30];
00130 int wl, hl, pic_size;
00131
00132 wl = write_variable_value(pic->width, tmp_w);
00133 hl = write_variable_value(pic->height, tmp_h);
00134
00135 pic_size = ((pic->width+7)/8) * pic->height;
00136
00137 if (pic->type_field != 0) {
00138 error(0, "Unknown WBMP type %d, cannot convert", pic->type_field);
00139 return -1;
00140 }
00141 *stream = gw_malloc(2+wl+hl+pic_size);
00142 sprintf(*stream, "%c%c", 0x00, 0x00);
00143 memcpy(*stream+2, tmp_w, wl);
00144 memcpy(*stream+2+wl, tmp_h, hl);
00145 memcpy(*stream+2+wl+hl, pic->main_image, pic_size);
00146
00147 debug("util", 0, "picture %d x %d, stream length %d",
00148 pic->width, pic->height, 2+wl+hl+pic_size);
00149
00150 return (2+wl+hl+pic_size);
00151 }
See file LICENSE for details about the license agreement for using,
modifying, copying or deriving work from this software.