… | |
… | |
53 | static int psiconv_encode_rle24(const psiconv_config config, |
53 | static int psiconv_encode_rle24(const psiconv_config config, |
54 | const psiconv_pixel_bytes plain_bytes, |
54 | const psiconv_pixel_bytes plain_bytes, |
55 | psiconv_pixel_bytes *encoded_bytes); |
55 | psiconv_pixel_bytes *encoded_bytes); |
56 | |
56 | |
57 | int psiconv_write_paint_data_section(const psiconv_config config, |
57 | int psiconv_write_paint_data_section(const psiconv_config config, |
58 | psiconv_buffer buf, |
58 | psiconv_buffer buf, int lev, |
59 | const psiconv_paint_data_section value, |
59 | const psiconv_paint_data_section value, |
60 | int is_clipart) |
60 | int is_clipart) |
61 | { |
61 | { |
62 | int res,colordepth,i; |
62 | int res,colordepth,i; |
63 | psiconv_pixel_ints ints; |
63 | psiconv_pixel_ints ints; |
64 | psiconv_pixel_floats_t floats,palet; |
64 | psiconv_pixel_floats_t floats,palet; |
65 | psiconv_list bytes,bytes_rle; |
65 | psiconv_list bytes,bytes_rle; |
66 | psiconv_u8 *byteptr,encoding; |
66 | psiconv_u8 *byteptr,encoding; |
67 | |
67 | |
|
|
68 | psiconv_progress(config,lev,0,"Writing paint data section"); |
|
|
69 | |
68 | /* First, we check whether we can cope with the current configuration. |
70 | /* First, we check whether we can cope with the current configuration. |
69 | If not, we stop at once */ |
71 | If not, we stop at once */ |
70 | if ((config->colordepth != 2) && (config->colordepth != 4) && |
72 | if ((config->colordepth != 2) && (config->colordepth != 4) && |
71 | (config->colordepth != 8) && (config->colordepth != 12) && |
73 | (config->colordepth != 8) && (config->colordepth != 12) && |
72 | (config->colordepth != 16) && (config->colordepth != 24)) { |
74 | (config->colordepth != 16) && (config->colordepth != 24)) { |
73 | psiconv_warn(config,0,psiconv_buffer_length(buf), |
75 | psiconv_error(config,0,psiconv_buffer_length(buf), |
74 | "Unsupported color depth (%d); try 2, 4, 8, 16 or 24", |
76 | "Unsupported color depth (%d); try 2, 4, 8, 16 or 24", |
75 | config->colordepth); |
77 | config->colordepth); |
76 | res = -PSICONV_E_GENERATE; |
78 | res = -PSICONV_E_GENERATE; |
77 | goto ERROR1; |
79 | goto ERROR1; |
78 | } |
80 | } |
79 | |
81 | |
80 | if ((config->color) && |
82 | if ((config->color) && |
81 | (config->bluebits || config->redbits || config->greenbits) && |
83 | (config->bluebits || config->redbits || config->greenbits) && |
82 | (config->bluebits+config->redbits+config->greenbits!=config->colordepth)) { |
84 | (config->bluebits+config->redbits+config->greenbits!=config->colordepth)) { |
83 | psiconv_warn(config,0,psiconv_buffer_length(buf), |
85 | psiconv_error(config,0,psiconv_buffer_length(buf), |
84 | "Sum of red (%d), green (%d) and blue (%d) bits should be " |
86 | "Sum of red (%d), green (%d) and blue (%d) bits should be " |
85 | "equal to the color depth (%d)", |
87 | "equal to the color depth (%d)", |
86 | config->redbits,config->greenbits,config->bluebits, |
88 | config->redbits,config->greenbits,config->bluebits, |
87 | config->colordepth); |
89 | config->colordepth); |
88 | res = -PSICONV_E_GENERATE; |
90 | res = -PSICONV_E_GENERATE; |
… | |
… | |
90 | } |
92 | } |
91 | |
93 | |
92 | if (config->color && |
94 | if (config->color && |
93 | !(config->redbits || config->greenbits || config->bluebits) && |
95 | !(config->redbits || config->greenbits || config->bluebits) && |
94 | (config->colordepth != 4) && (config->colordepth != 8)) { |
96 | (config->colordepth != 4) && (config->colordepth != 8)) { |
95 | psiconv_warn(config,0,psiconv_buffer_length(buf), |
97 | psiconv_error(config,0,psiconv_buffer_length(buf), |
96 | "Current color depth (%d) has no palet associated with it", |
98 | "Current color depth (%d) has no palet associated with it", |
97 | config->colordepth); |
99 | config->colordepth); |
98 | res = -PSICONV_E_GENERATE; |
100 | res = -PSICONV_E_GENERATE; |
99 | goto ERROR1; |
101 | goto ERROR1; |
100 | } |
102 | } |
… | |
… | |
103 | psiconv_warn(config,0,psiconv_buffer_length(buf), |
105 | psiconv_warn(config,0,psiconv_buffer_length(buf), |
104 | "All image types except 2-bit greyscale are experimental!"); |
106 | "All image types except 2-bit greyscale are experimental!"); |
105 | |
107 | |
106 | |
108 | |
107 | if (!value) { |
109 | if (!value) { |
108 | psiconv_warn(config,0,psiconv_buffer_length(buf),"Null paint data section"); |
110 | psiconv_error(config,0,psiconv_buffer_length(buf),"Null paint data section"); |
109 | res = -PSICONV_E_GENERATE; |
111 | res = -PSICONV_E_GENERATE; |
110 | goto ERROR1; |
112 | goto ERROR1; |
111 | } |
113 | } |
112 | |
114 | |
113 | floats.red = value->red; |
115 | floats.red = value->red; |
114 | floats.green = value->green; |
116 | floats.green = value->green; |
115 | floats.blue = value->blue; |
117 | floats.blue = value->blue; |
116 | floats.length = value->xsize * value->ysize; |
118 | floats.length = value->xsize * value->ysize; |
117 | |
119 | |
118 | palet = psiconv_palet_none; |
120 | palet = psiconv_palet_none; |
119 | if ((config->color) && (config->redbits == 0) && (config->greenbits == 0) &&\ |
121 | if ((config->color) && (config->redbits == 0) && (config->greenbits == 0) && |
120 | (config->bluebits == 0)) |
122 | (config->bluebits == 0)) |
121 | switch (config->colordepth) { |
123 | switch (config->colordepth) { |
122 | case 4: palet = psiconv_palet_color_4; break; |
124 | case 4: palet = psiconv_palet_color_4; break; |
123 | case 8: palet = psiconv_palet_color_8; break; |
125 | case 8: palet = psiconv_palet_color_8; break; |
124 | default: palet = psiconv_palet_none; break; |
126 | default: palet = psiconv_palet_none; break; |
… | |
… | |
126 | |
128 | |
127 | if ((res = psiconv_collect_pixel_data(&ints,value->xsize, |
129 | if ((res = psiconv_collect_pixel_data(&ints,value->xsize, |
128 | value->ysize,floats, |
130 | value->ysize,floats, |
129 | config->colordepth,config->color, |
131 | config->colordepth,config->color, |
130 | config->redbits,config->greenbits, |
132 | config->redbits,config->greenbits, |
131 | config->bluebits,palet))) |
133 | config->bluebits,palet))) { |
|
|
134 | psiconv_error(config,lev,0,"Error collecting pixel data"); |
132 | goto ERROR1; |
135 | goto ERROR1; |
|
|
136 | } |
133 | |
137 | |
134 | if ((res = psiconv_pixel_data_to_bytes(config,&bytes,value->xsize,value->ysize, |
138 | if ((res = psiconv_pixel_data_to_bytes(config,&bytes,value->xsize,value->ysize, |
135 | ints,config->colordepth))) |
139 | ints,config->colordepth))) { |
|
|
140 | psiconv_error(config,lev,0,"Error translating pixel data to bytes"); |
136 | goto ERROR2; |
141 | goto ERROR2; |
|
|
142 | } |
137 | |
143 | |
138 | |
144 | |
139 | switch (config->colordepth) { |
145 | switch (config->colordepth) { |
140 | case 2: |
146 | case 2: |
141 | case 4: |
147 | case 4: |
142 | case 8: |
148 | case 8: |
143 | encoding = 0x01; |
149 | encoding = 0x01; |
144 | if ((res = psiconv_encode_rle8(config,bytes,&bytes_rle))) |
150 | if ((res = psiconv_encode_rle8(config,bytes,&bytes_rle))) { |
|
|
151 | psiconv_error(config,lev,0,"Error encoding RLE8"); |
145 | goto ERROR3; |
152 | goto ERROR3; |
|
|
153 | } |
146 | break; |
154 | break; |
147 | case 12: |
155 | case 12: |
148 | encoding = 0x02; |
156 | encoding = 0x02; |
149 | if ((res = psiconv_encode_rle12(config,bytes,&bytes_rle))) |
157 | if ((res = psiconv_encode_rle12(config,bytes,&bytes_rle))) { |
|
|
158 | psiconv_error(config,lev,0,"Error encoding RLE12"); |
150 | goto ERROR3; |
159 | goto ERROR3; |
|
|
160 | } |
151 | break; |
161 | break; |
152 | case 16: |
162 | case 16: |
153 | encoding = 0x03; |
163 | encoding = 0x03; |
154 | if ((res = psiconv_encode_rle16(config,bytes,&bytes_rle))) |
164 | if ((res = psiconv_encode_rle16(config,bytes,&bytes_rle))) { |
|
|
165 | psiconv_error(config,lev,0,"Error encoding RLE16"); |
155 | goto ERROR3; |
166 | goto ERROR3; |
|
|
167 | } |
156 | break; |
168 | break; |
157 | case 24: |
169 | case 24: |
158 | encoding = 0x04; |
170 | encoding = 0x04; |
159 | if ((res = psiconv_encode_rle24(config,bytes,&bytes_rle))) |
171 | if ((res = psiconv_encode_rle24(config,bytes,&bytes_rle))) { |
|
|
172 | psiconv_error(config,lev,0,"Error encoding RLE24"); |
160 | goto ERROR3; |
173 | goto ERROR3; |
|
|
174 | } |
161 | break; |
175 | break; |
162 | default: |
176 | default: |
163 | encoding = 0x00; |
177 | encoding = 0x00; |
164 | } |
178 | } |
165 | if (encoding) { |
179 | if (encoding) { |
… | |
… | |
170 | psiconv_list_free(bytes_rle); |
184 | psiconv_list_free(bytes_rle); |
171 | encoding = 0x00; |
185 | encoding = 0x00; |
172 | } |
186 | } |
173 | } |
187 | } |
174 | |
188 | |
175 | if ((res = psiconv_write_u32(config,buf, |
189 | if ((res = psiconv_write_u32(config,buf,lev+1, |
176 | 0x28+psiconv_list_length(bytes)))) |
190 | 0x28+psiconv_list_length(bytes)))) |
177 | goto ERROR3; |
191 | goto ERROR3; |
178 | if ((res = psiconv_write_u32(config,buf,0x28))) |
192 | if ((res = psiconv_write_u32(config,buf,lev+1,0x28))) |
179 | goto ERROR3; |
193 | goto ERROR3; |
180 | if ((res = psiconv_write_u32(config,buf,value->xsize))) |
194 | if ((res = psiconv_write_u32(config,buf,lev+1,value->xsize))) |
181 | goto ERROR3; |
195 | goto ERROR3; |
182 | if ((res = psiconv_write_u32(config,buf,value->ysize))) |
196 | if ((res = psiconv_write_u32(config,buf,lev+1,value->ysize))) |
183 | goto ERROR3; |
197 | goto ERROR3; |
184 | if ((res = psiconv_write_length(config,buf,value->pic_xsize))) |
198 | if ((res = psiconv_write_length(config,buf,lev+1,value->pic_xsize))) |
185 | goto ERROR3; |
199 | goto ERROR3; |
186 | if ((res = psiconv_write_length(config,buf,value->pic_ysize))) |
200 | if ((res = psiconv_write_length(config,buf,lev+1,value->pic_ysize))) |
187 | goto ERROR3; |
201 | goto ERROR3; |
188 | colordepth = config->colordepth; |
202 | colordepth = config->colordepth; |
189 | if ((res = psiconv_write_u32(config,buf,colordepth))) |
203 | if ((res = psiconv_write_u32(config,buf,lev+1,colordepth))) |
190 | goto ERROR3; |
204 | goto ERROR3; |
191 | if ((res = psiconv_write_u32(config,buf,(config->color?1:0)))) |
205 | if ((res = psiconv_write_u32(config,buf,lev+1,(config->color?1:0)))) |
192 | goto ERROR3; |
206 | goto ERROR3; |
193 | if ((res = psiconv_write_u32(config,buf,0))) |
207 | if ((res = psiconv_write_u32(config,buf,lev+1,0))) |
194 | goto ERROR3; |
208 | goto ERROR3; |
195 | if ((res = psiconv_write_u32(config,buf,encoding))) |
209 | if ((res = psiconv_write_u32(config,buf,lev+1,encoding))) |
196 | goto ERROR3; |
210 | goto ERROR3; |
197 | if (is_clipart) { |
211 | if (is_clipart) { |
198 | if ((res = psiconv_write_u32(config,buf,0xffffffff))) |
212 | if ((res = psiconv_write_u32(config,buf,lev+1,0xffffffff))) |
199 | goto ERROR3; |
213 | goto ERROR3; |
200 | if ((res = psiconv_write_u32(config,buf,0x00000044))) |
214 | if ((res = psiconv_write_u32(config,buf,lev+1,0x00000044))) |
201 | goto ERROR3; |
215 | goto ERROR3; |
202 | } |
216 | } |
203 | for (i = 0; i < psiconv_list_length(bytes); i++) { |
217 | for (i = 0; i < psiconv_list_length(bytes); i++) { |
204 | if (!(byteptr = psiconv_list_get(bytes,i))) |
218 | if (!(byteptr = psiconv_list_get(bytes,i))) |
205 | goto ERROR3; |
219 | goto ERROR3; |
206 | if ((res = psiconv_write_u8(config,buf,*byteptr))) |
220 | if ((res = psiconv_write_u8(config,buf,lev+1,*byteptr))) |
207 | goto ERROR3; |
221 | goto ERROR3; |
208 | } |
222 | } |
209 | |
223 | |
210 | ERROR3: |
224 | ERROR3: |
211 | psiconv_list_free(bytes); |
225 | psiconv_list_free(bytes); |
… | |
… | |
287 | psiconv_u32 *pixelptr; |
301 | psiconv_u32 *pixelptr; |
288 | int inputbitsleft,outputbitnr,bitsfit,outputbytenr; |
302 | int inputbitsleft,outputbitnr,bitsfit,outputbytenr; |
289 | |
303 | |
290 | |
304 | |
291 | if (!bytes) { |
305 | if (!bytes) { |
292 | psiconv_warn(config,0,0,"NULL pixel data"); |
306 | psiconv_error(config,0,0,"NULL pixel data"); |
293 | res = -PSICONV_E_GENERATE; |
307 | res = -PSICONV_E_GENERATE; |
294 | goto ERROR1; |
308 | goto ERROR1; |
295 | } |
309 | } |
296 | if (!pixels) { |
310 | if (!pixels) { |
297 | psiconv_warn(config,0,0,"NULL pixel data"); |
311 | psiconv_error(config,0,0,"NULL pixel data"); |
298 | res = -PSICONV_E_GENERATE; |
312 | res = -PSICONV_E_GENERATE; |
299 | goto ERROR1; |
313 | goto ERROR1; |
300 | } |
314 | } |
301 | if (psiconv_list_length(pixels) != xsize * ysize) { |
315 | if (psiconv_list_length(pixels) != xsize * ysize) { |
302 | psiconv_warn(config,0,0,"Pixel number is not correct"); |
316 | psiconv_error(config,0,0,"Pixel number is not correct"); |
303 | res = -PSICONV_E_GENERATE; |
317 | res = -PSICONV_E_GENERATE; |
304 | goto ERROR1; |
318 | goto ERROR1; |
305 | } |
319 | } |
306 | |
320 | |
307 | if (!(*bytes = psiconv_list_new(sizeof(psiconv_u8)))) { |
321 | if (!(*bytes = psiconv_list_new(sizeof(psiconv_u8)))) { |
… | |
… | |
314 | outputbyte = 0; |
328 | outputbyte = 0; |
315 | for (y = 0; y < ysize; y++) { |
329 | for (y = 0; y < ysize; y++) { |
316 | outputbytenr = 0; |
330 | outputbytenr = 0; |
317 | for (x = 0; x < xsize; x++) { |
331 | for (x = 0; x < xsize; x++) { |
318 | if (!(pixelptr = psiconv_list_get(pixels,y*xsize+x))) { |
332 | if (!(pixelptr = psiconv_list_get(pixels,y*xsize+x))) { |
319 | psiconv_warn(config,0,0,"Massive internal corruption"); |
333 | psiconv_error(config,0,0,"Massive internal corruption"); |
320 | res = -PSICONV_E_NOMEM; |
334 | res = -PSICONV_E_NOMEM; |
321 | goto ERROR2; |
335 | goto ERROR2; |
322 | } |
336 | } |
323 | inputbitsleft = colordepth; |
337 | inputbitsleft = colordepth; |
324 | inputdata = *pixelptr; |
338 | inputdata = *pixelptr; |
… | |
… | |
395 | goto ERROR2; |
409 | goto ERROR2; |
396 | if ((res = psiconv_list_add(*encoded_bytes,next))) |
410 | if ((res = psiconv_list_add(*encoded_bytes,next))) |
397 | goto ERROR2; |
411 | goto ERROR2; |
398 | i +=2; |
412 | i +=2; |
399 | } else if (*next == *entry) { |
413 | } else if (*next == *entry) { |
400 | len = 0; |
414 | len = 1; |
401 | while ((*next == *entry) && |
415 | while ((*next == *entry) && |
402 | (i+len + 1 < psiconv_list_length(plain_bytes)) && |
416 | (i+len + 2 < psiconv_list_length(plain_bytes)) && |
403 | len < 0x80) { |
417 | len < 0x80) { |
404 | len ++; |
418 | len ++; |
405 | if (!(next = psiconv_list_get(plain_bytes,i+len))) { |
419 | if (!(next = psiconv_list_get(plain_bytes,i+len))) { |
406 | res = -PSICONV_E_NOMEM; |
420 | res = -PSICONV_E_NOMEM; |
407 | goto ERROR2; |
421 | goto ERROR2; |
… | |
… | |
817 | return res; |
831 | return res; |
818 | } |
832 | } |
819 | |
833 | |
820 | |
834 | |
821 | int psiconv_write_sketch_section(const psiconv_config config, |
835 | int psiconv_write_sketch_section(const psiconv_config config, |
822 | psiconv_buffer buf, |
836 | psiconv_buffer buf, int lev, |
823 | const psiconv_sketch_section value) |
837 | const psiconv_sketch_section value) |
824 | { |
838 | { |
825 | int res; |
839 | int res; |
826 | |
840 | |
|
|
841 | psiconv_progress(config,lev,0,"Writing sketch section"); |
827 | if (!value) { |
842 | if (!value) { |
828 | psiconv_warn(config,0,0,"NULL sketch section"); |
843 | psiconv_error(config,0,0,"NULL sketch section"); |
829 | res = -PSICONV_E_GENERATE; |
844 | res = -PSICONV_E_GENERATE; |
830 | goto ERROR1; |
845 | goto ERROR1; |
831 | } |
846 | } |
832 | |
847 | |
833 | if ((res = psiconv_write_u16(config,buf,value->displayed_xsize))) |
848 | if ((res = psiconv_write_u16(config,buf,lev+1,value->displayed_xsize))) |
834 | goto ERROR1; |
849 | goto ERROR1; |
835 | if ((res = psiconv_write_u16(config,buf,value->displayed_ysize))) |
850 | if ((res = psiconv_write_u16(config,buf,lev+1,value->displayed_ysize))) |
836 | goto ERROR1; |
851 | goto ERROR1; |
837 | if ((res = psiconv_write_u16(config,buf,value->picture_data_x_offset))) |
852 | if ((res = psiconv_write_u16(config,buf,lev+1,value->picture_data_x_offset))) |
838 | goto ERROR1; |
853 | goto ERROR1; |
839 | if ((res = psiconv_write_u16(config,buf,value->picture_data_y_offset))) |
854 | if ((res = psiconv_write_u16(config,buf,lev+1,value->picture_data_y_offset))) |
840 | goto ERROR1; |
855 | goto ERROR1; |
841 | if ((res = psiconv_write_u16(config,buf,value->displayed_size_x_offset))) |
856 | if ((res = psiconv_write_u16(config,buf,lev+1,value->displayed_size_x_offset))) |
842 | goto ERROR1; |
857 | goto ERROR1; |
843 | if ((res = psiconv_write_u16(config,buf,value->displayed_size_y_offset))) |
858 | if ((res = psiconv_write_u16(config,buf,lev+1,value->displayed_size_y_offset))) |
844 | goto ERROR1; |
859 | goto ERROR1; |
845 | if ((res = psiconv_write_u16(config,buf,value->form_xsize))) |
860 | if ((res = psiconv_write_u16(config,buf,lev+1,value->form_xsize))) |
846 | goto ERROR1; |
861 | goto ERROR1; |
847 | if ((res = psiconv_write_u16(config,buf,value->form_ysize))) |
862 | if ((res = psiconv_write_u16(config,buf,lev+1,value->form_ysize))) |
848 | goto ERROR1; |
863 | goto ERROR1; |
849 | if ((res = psiconv_write_u16(config,buf,0x0000))) |
864 | if ((res = psiconv_write_u16(config,buf,lev+1,0x0000))) |
850 | goto ERROR1; |
865 | goto ERROR1; |
851 | if ((res = psiconv_write_paint_data_section(config,buf,value->picture,0))) |
866 | if ((res = psiconv_write_paint_data_section(config,buf,lev+1,value->picture,0))) |
852 | goto ERROR1; |
867 | goto ERROR1; |
853 | if ((res = psiconv_write_u16(config,buf,value->magnification_x * 0x03e8))) |
868 | if ((res = psiconv_write_u16(config,buf,lev+1,value->magnification_x * 0x03e8))) |
854 | goto ERROR1; |
869 | goto ERROR1; |
855 | if ((res = psiconv_write_u16(config,buf,value->magnification_y * 0x03e8))) |
870 | if ((res = psiconv_write_u16(config,buf,lev+1,value->magnification_y * 0x03e8))) |
856 | goto ERROR1; |
871 | goto ERROR1; |
857 | if ((res = psiconv_write_u32(config,buf,value->cut_left * 0x0c * |
872 | if ((res = psiconv_write_u32(config,buf,lev+1,value->cut_left * 0x0c * |
858 | value->displayed_xsize))) |
873 | value->displayed_xsize))) |
859 | goto ERROR1; |
874 | goto ERROR1; |
860 | if ((res = psiconv_write_u32(config,buf,value->cut_right * 0x0c * |
875 | if ((res = psiconv_write_u32(config,buf,lev+1,value->cut_right * 0x0c * |
861 | value->displayed_xsize))) |
876 | value->displayed_xsize))) |
862 | goto ERROR1; |
877 | goto ERROR1; |
863 | if ((res = psiconv_write_u32(config,buf,value->cut_top * 0x0c * |
878 | if ((res = psiconv_write_u32(config,buf,lev+1,value->cut_top * 0x0c * |
864 | value->displayed_ysize))) |
879 | value->displayed_ysize))) |
865 | goto ERROR1; |
880 | goto ERROR1; |
866 | if ((res = psiconv_write_u32(config,buf,value->cut_bottom * 0x0c * |
881 | if ((res = psiconv_write_u32(config,buf,lev+1,value->cut_bottom * 0x0c * |
867 | value->displayed_ysize))) |
882 | value->displayed_ysize))) |
868 | goto ERROR1; |
883 | goto ERROR1; |
869 | |
884 | |
870 | ERROR1: |
885 | ERROR1: |
871 | return res; |
886 | return res; |
872 | } |
887 | } |
873 | |
888 | |
874 | int psiconv_write_clipart_section(const psiconv_config config, |
889 | int psiconv_write_clipart_section(const psiconv_config config, |
875 | psiconv_buffer buf, |
890 | psiconv_buffer buf, int lev, |
876 | const psiconv_clipart_section value) |
891 | const psiconv_clipart_section value) |
877 | { |
892 | { |
878 | int res; |
893 | int res; |
879 | |
894 | |
880 | |
895 | psiconv_progress(config,lev,0,"Writing clipart section"); |
881 | if (!value) { |
896 | if (!value) { |
882 | psiconv_warn(config,0,psiconv_buffer_length(buf), |
897 | psiconv_error(config,0,psiconv_buffer_length(buf), |
883 | "NULL Clipart Section"); |
898 | "NULL Clipart Section"); |
884 | res = -PSICONV_E_GENERATE; |
899 | res = -PSICONV_E_GENERATE; |
885 | goto ERROR; |
900 | goto ERROR; |
886 | } |
901 | } |
887 | if ((res = psiconv_write_u32(config,buf,PSICONV_ID_CLIPART_ITEM))) |
902 | if ((res = psiconv_write_u32(config,buf,lev+1,PSICONV_ID_CLIPART_ITEM))) |
888 | goto ERROR; |
903 | goto ERROR; |
889 | if ((res = psiconv_write_u32(config,buf,0x00000002))) |
904 | if ((res = psiconv_write_u32(config,buf,lev+1,0x00000002))) |
890 | goto ERROR; |
905 | goto ERROR; |
891 | if ((res = psiconv_write_u32(config,buf,0x00000000))) |
906 | if ((res = psiconv_write_u32(config,buf,lev+1,0x00000000))) |
892 | goto ERROR; |
907 | goto ERROR; |
893 | if ((res = psiconv_write_u32(config,buf,0x00000000))) |
908 | if ((res = psiconv_write_u32(config,buf,lev+1,0x00000000))) |
894 | goto ERROR; |
909 | goto ERROR; |
895 | if ((res = psiconv_write_u32(config,buf,0x0000000C))) |
910 | if ((res = psiconv_write_u32(config,buf,lev+1,0x0000000C))) |
896 | goto ERROR; |
911 | goto ERROR; |
897 | if ((res = psiconv_write_paint_data_section(config,buf,value->picture,1))) |
912 | if ((res = psiconv_write_paint_data_section(config,buf,lev+1,value->picture,1))) |
898 | goto ERROR; |
913 | goto ERROR; |
899 | |
914 | |
900 | ERROR: |
915 | ERROR: |
901 | return res; |
916 | return res; |
902 | } |
917 | } |
903 | |
918 | |
904 | int psiconv_write_jumptable_section(const psiconv_config config, |
919 | int psiconv_write_jumptable_section(const psiconv_config config, |
905 | psiconv_buffer buf, |
920 | psiconv_buffer buf, int lev, |
906 | const psiconv_jumptable_section value) |
921 | const psiconv_jumptable_section value) |
907 | { |
922 | { |
908 | int res,i; |
923 | int res,i; |
909 | psiconv_u32 *offset_ptr; |
924 | psiconv_u32 *offset_ptr; |
910 | |
925 | |
|
|
926 | psiconv_progress(config,lev,0,"Writing jumptable section"); |
911 | |
927 | |
912 | if (!value) { |
928 | if (!value) { |
913 | psiconv_warn(config,0,psiconv_buffer_length(buf), |
929 | psiconv_error(config,0,psiconv_buffer_length(buf), |
914 | "NULL Jumptable Section"); |
930 | "NULL Jumptable Section"); |
915 | res = -PSICONV_E_GENERATE; |
931 | res = -PSICONV_E_GENERATE; |
916 | goto ERROR; |
932 | goto ERROR; |
917 | } |
933 | } |
918 | if ((res = psiconv_write_u32(config,buf,psiconv_list_length(value)))) |
934 | if ((res = psiconv_write_u32(config,buf,lev+1,psiconv_list_length(value)))) |
919 | goto ERROR; |
935 | goto ERROR; |
920 | for (i = 0; i < psiconv_list_length(value); i++) { |
936 | for (i = 0; i < psiconv_list_length(value); i++) { |
921 | if (!(offset_ptr = psiconv_list_get(value,i))) { |
937 | if (!(offset_ptr = psiconv_list_get(value,i))) { |
922 | psiconv_warn(config,0,psiconv_buffer_length(buf), |
938 | psiconv_error(config,0,psiconv_buffer_length(buf), |
923 | "Massive memory corruption"); |
939 | "Massive memory corruption"); |
924 | res = -PSICONV_E_NOMEM; |
940 | res = -PSICONV_E_NOMEM; |
925 | goto ERROR; |
941 | goto ERROR; |
926 | } |
942 | } |
927 | if ((res = psiconv_write_offset(config,buf,*offset_ptr))) |
943 | if ((res = psiconv_write_offset(config,buf,lev+1,*offset_ptr))) |
928 | goto ERROR; |
944 | goto ERROR; |
929 | } |
945 | } |
930 | |
946 | |
931 | ERROR: |
947 | ERROR: |
932 | return res; |
948 | return res; |