Lines 186-198
Link Here
|
186 |
} |
186 |
} |
187 |
|
187 |
|
188 |
#ifdef CONFIG_PNG_OUTPUT |
188 |
#ifdef CONFIG_PNG_OUTPUT |
189 |
extern void png_write_init(); |
|
|
190 |
|
189 |
|
191 |
int png_save(QEditScreen *s, const char *filename) |
190 |
int png_save(QEditScreen *s, const char *filename) |
192 |
{ |
191 |
{ |
193 |
CFBContext *cfb = s->private; |
192 |
CFBContext *cfb = s->private; |
194 |
png_struct * volatile png_ptr = NULL; |
193 |
png_structp png_ptr = NULL; |
195 |
png_info * volatile info_ptr = NULL; |
194 |
png_infop info_ptr = NULL; |
196 |
png_byte *row_ptr, *row_pointers[1], *row = NULL; |
195 |
png_byte *row_ptr, *row_pointers[1], *row = NULL; |
197 |
int w, h, x, y; |
196 |
int w, h, x, y; |
198 |
unsigned int r, g, b, v; |
197 |
unsigned int r, g, b, v; |
Lines 202-233
Link Here
|
202 |
row = malloc(3 * s->width); |
201 |
row = malloc(3 * s->width); |
203 |
if (!row) |
202 |
if (!row) |
204 |
goto fail; |
203 |
goto fail; |
205 |
png_ptr = malloc(sizeof (png_struct)); |
204 |
png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); |
206 |
if (!png_ptr) |
205 |
if (!png_ptr) |
207 |
goto fail; |
206 |
goto fail; |
208 |
info_ptr = malloc(sizeof (png_info)); |
207 |
info_ptr = png_create_info_struct (png_ptr); |
209 |
if (!info_ptr) |
208 |
if (!info_ptr) { |
210 |
goto fail; |
209 |
png_destroy_write_struct(&png_ptr, (png_infopp)NULL); |
|
|
210 |
goto fail; |
211 |
} |
211 |
|
212 |
|
212 |
f = fopen(filename, "w"); |
213 |
f = fopen(filename, "w"); |
213 |
if (!f) |
214 |
if (!f) |
214 |
goto fail; |
215 |
goto fail; |
215 |
|
216 |
|
216 |
if (setjmp(png_ptr->jmpbuf)) { |
217 |
if (setjmp(png_ptr->jmpbuf)) { |
217 |
png_write_destroy(png_ptr); |
218 |
png_destroy_write_struct(&png_ptr, &info_ptr); |
218 |
fail: |
219 |
fail: |
219 |
/* free pointers before returning. Make sure you clean up |
220 |
/* free pointers before returning. Make sure you clean up |
220 |
anything else you've done. */ |
221 |
anything else you've done. */ |
221 |
free(png_ptr); |
|
|
222 |
free(info_ptr); |
223 |
free(row); |
222 |
free(row); |
224 |
if (f) |
223 |
if (f) |
225 |
fclose(f); |
224 |
fclose(f); |
226 |
return -1; |
225 |
return -1; |
227 |
} |
226 |
} |
228 |
|
227 |
|
229 |
png_info_init(info_ptr); |
|
|
230 |
png_write_init(png_ptr); |
231 |
png_init_io(png_ptr, f); |
228 |
png_init_io(png_ptr, f); |
232 |
|
229 |
|
233 |
data = (unsigned int *)cfb->base; |
230 |
data = (unsigned int *)cfb->base; |
Lines 259-268
Link Here
|
259 |
data = (void *)((char *)data + cfb->wrap); |
256 |
data = (void *)((char *)data + cfb->wrap); |
260 |
} |
257 |
} |
261 |
png_write_end(png_ptr, info_ptr); |
258 |
png_write_end(png_ptr, info_ptr); |
262 |
png_write_destroy(png_ptr); |
259 |
png_destroy_write_struct (&png_ptr, &info_ptr); |
263 |
|
260 |
|
264 |
free(png_ptr); |
|
|
265 |
free(info_ptr); |
266 |
free(row); |
261 |
free(row); |
267 |
fclose(f); |
262 |
fclose(f); |
268 |
return 0; |
263 |
return 0; |