svnno****@sourc*****
svnno****@sourc*****
2008年 8月 8日 (金) 01:54:05 JST
Revision: 8 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=swfed&view=rev&rev=8 Author: yoya Date: 2008-08-08 01:54:05 +0900 (Fri, 08 Aug 2008) Log Message: ----------- PNG から swf_xrgb, swf_argb 形式への変換ルーチンを追加 Modified Paths: -------------- src/swf_png.c -------------- next part -------------- Modified: src/swf_png.c =================================================================== --- src/swf_png.c 2008-08-07 13:13:01 UTC (rev 7) +++ src/swf_png.c 2008-08-07 16:54:05 UTC (rev 8) @@ -180,14 +180,87 @@ unsigned char * jpegconv_lossless2png(void *image_data, - unsigned long image_data_size, + unsigned short width, unsigned short height, int tag_no, int format, unsigned long *length) { + png_structp png_ptr; + png_infop info_ptr; + my_png_buffer png_buff; + png_uint_32 png_width, png_height; + int bpp, color_type; + png_bytepp png_data; + png_uint_32 x, y; if (format != 5) { fprintf(stderr, "jpegconv_lossless2png: format=%d not implemented yes.\n", format); return NULL; } - - - return NULL; + png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL,NULL,NULL); + if (! png_ptr) { + fprintf(stderr, "jpegconv_lossless2png: can't create write_struct\n"); + return NULL; + } + info_ptr = png_create_info_struct(png_ptr); + if (! info_ptr) { + fprintf(stderr, "jpegconv_lossless2png: can't create info_struct\n"); + png_destroy_write_struct (&png_ptr, NULL); + return NULL; + } + // + png_width = width; + png_height = height; + bpp = 8; + if (tag_no == 20) { /* DefineBitsLossless */ + color_type = PNG_COLOR_TYPE_RGB; + } else if (tag_no == 36) { /* DefineBitsLossless2 */ + color_type = PNG_COLOR_TYPE_RGB_ALPHA; + } else { + fprintf(stderr, "jpegconv_lossless2png: tag_no=%d not implemented.\n", + tag_no); + png_destroy_write_struct (&png_ptr, &info_ptr); + return NULL; + } + png_set_filter(png_ptr, 0, PNG_ALL_FILTERS); + png_set_compression_level(png_ptr, Z_BEST_COMPRESSION); + png_set_IHDR(png_ptr, info_ptr, + png_width, png_height, bpp, color_type, + PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, + PNG_FILTER_TYPE_DEFAULT); + png_set_gAMA(png_ptr, info_ptr, 1.0); + png_data = (png_bytepp) malloc(png_height * sizeof(png_bytep)); + if (color_type == PNG_COLOR_TYPE_RGB) { + swf_xrgb_t *xrgb_list = image_data; + for (y=0; y < png_height; y++) { + png_data[y] = (png_bytep) malloc(png_get_rowbytes(png_ptr, info_ptr)) \ + ; + for (x=0; x < png_width; x++) { + png_data[y][3*x] = xrgb_list[x+y*png_width].red; + png_data[y][3*x+1] = xrgb_list[x+y*png_width].green; + png_data[y][3*x+2] = xrgb_list[x+y*png_width].blue; + } + } + } else { + swf_argb_t *argb_list = image_data; + for (y=0; y < png_height; y++) { + png_data[y] = (png_bytep) malloc(png_get_rowbytes(png_ptr, info_ptr)); + for (x=0; x < png_width; x++) { + png_data[y][4*x] = argb_list[x+y*png_width].red; + png_data[y][4*x+1] = argb_list[x+y*png_width].green; + png_data[y][4*x+2] = argb_list[x+y*png_width].blue; + png_data[y][4*x+3] = argb_list[x+y*png_width].alpha; + } + } + + } + png_buff.data = NULL; + png_buff.data_len = 0; + png_buff.data_offset = 0; + png_data_write(png_ptr, &png_buff); + + png_write_info(png_ptr, info_ptr); + png_write_image(png_ptr, image_data); + png_write_end(png_ptr, info_ptr); + // + png_destroy_write_struct(&png_ptr, &info_ptr); + *length = png_buff.data_offset; + return png_buff.data; }