[Swfed-svn] swfed-svn [8] PNG から swf_xrgb , swf_argb 形式への変換ルーチンを追加

Back to archive index

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;
 }


Swfed-svn メーリングリストの案内
Back to archive index