diff options
| author | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2008-10-18 15:16:28 +0000 |
|---|---|---|
| committer | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2008-10-18 15:16:28 +0000 |
| commit | 9a80b9317de7f8ba7b592f3602dd7b5e8fa47f4c (patch) | |
| tree | 810bf139cca483efded28d7d54ae1c615ce5f975 /lib/gdi/epng.cpp | |
| parent | bdcd92b9a4723d0bb3c1769894a9e9476d786828 (diff) | |
| download | enigma2-9a80b9317de7f8ba7b592f3602dd7b5e8fa47f4c.tar.gz enigma2-9a80b9317de7f8ba7b592f3602dd7b5e8fa47f4c.zip | |
fixes by adenin
Diffstat (limited to 'lib/gdi/epng.cpp')
| -rw-r--r-- | lib/gdi/epng.cpp | 51 |
1 files changed, 32 insertions, 19 deletions
diff --git a/lib/gdi/epng.cpp b/lib/gdi/epng.cpp index 0f8ea568..d0da6032 100644 --- a/lib/gdi/epng.cpp +++ b/lib/gdi/epng.cpp @@ -229,6 +229,8 @@ int loadJPG(ePtr<gPixmap> &result, const char *filename, ePtr<gPixmap> alpha) int savePNG(const char *filename, gPixmap *pixmap) { + + eDebug("\33[33m %s \33[0m",filename); FILE *fp=fopen(filename, "wb"); if (!fp) return -1; @@ -254,6 +256,11 @@ int savePNG(const char *filename, gPixmap *pixmap) unlink(filename); return -3; } + + png_set_IHDR(png_ptr, info_ptr, surface->x, surface->y, surface->bpp/surface->bypp, + PNG_COLOR_TYPE_RGB_ALPHA, + PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); + if (setjmp(png_ptr->jmpbuf)) { eDebug("error :/"); @@ -266,29 +273,35 @@ int savePNG(const char *filename, gPixmap *pixmap) png_set_filter(png_ptr, 0, PNG_FILTER_NONE|PNG_FILTER_SUB|PNG_FILTER_PAETH); png_set_compression_level(png_ptr, Z_BEST_COMPRESSION); - png_set_IHDR(png_ptr, info_ptr, surface->x, surface->y, surface->bpp, - surface->clut.data ? PNG_COLOR_TYPE_PALETTE : PNG_COLOR_TYPE_GRAY, - PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); - if (surface->clut.data) + png_write_info(png_ptr, info_ptr); + png_set_packing(png_ptr); + + png_byte *row_pointer; + png_byte *cr = new png_byte[surface->y * surface->stride]; + if (cr == NULL) + { + printf("Error: malloc\n"); + return -5; + } + for (int i=0; i<surface->y; ++i) { - png_color palette[surface->clut.colors]; - png_byte trans[surface->clut.colors]; - for (int i=0; i<surface->clut.colors; ++i) + row_pointer=((png_byte*)surface->data)+i*surface->stride; + if (surface->bypp == 4) { - palette[i].red=surface->clut.data[i].r; - palette[i].green=surface->clut.data[i].g; - palette[i].blue=surface->clut.data[i].b; - trans[i]=255-surface->clut.data[i].a; + memcpy(cr, row_pointer, surface->stride); + for (int j=0; j<surface->stride; j+=4) + { + unsigned char tmp = cr[j]; + cr[j] = cr[j+2]; + cr[j+2]= tmp; + } + png_write_row(png_ptr, cr); } - png_set_PLTE(png_ptr, info_ptr, palette, surface->clut.colors); - png_set_tRNS(png_ptr, info_ptr, trans, surface->clut.colors, 0); + else + png_write_row(png_ptr, row_pointer); } - png_write_info(png_ptr, info_ptr); - png_set_packing(png_ptr); - png_byte *row_pointers[surface->y]; - for (int i=0; i<surface->y; ++i) - row_pointers[i]=((png_byte*)surface->data)+i*surface->stride; - png_write_image(png_ptr, row_pointers); + delete cr; + png_write_end(png_ptr, info_ptr); png_destroy_write_struct(&png_ptr, &info_ptr); fclose(fp); |
