svnno****@sourc*****
svnno****@sourc*****
2008年 8月 8日 (金) 02:17:07 JST
Revision: 9 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=swfed&view=rev&rev=9 Author: yoya Date: 2008-08-08 02:17:07 +0900 (Fri, 08 Aug 2008) Log Message: ----------- PHP と PNG2Lossless の bridge 処理を実装 Modified Paths: -------------- src/php_swfed.h src/swf_object.c src/swf_png.c src/swf_png.h src/swf_tag.c src/swf_tag.h src/swf_tag_lossless.c src/swf_tag_lossless.h src/swfed.c -------------- next part -------------- Modified: src/php_swfed.h =================================================================== --- src/php_swfed.h 2008-08-07 16:54:05 UTC (rev 8) +++ src/php_swfed.h 2008-08-07 17:17:07 UTC (rev 9) @@ -56,6 +56,7 @@ PHP_METHOD(swfed, getJpegData); PHP_METHOD(swfed, getJpegAlpha); PHP_METHOD(swfed, replaceJpegData); +PHP_METHOD(swfed, getPNGData); PHP_METHOD(swfed, replacePNGData); PHP_METHOD(swfed, getEditString); PHP_METHOD(swfed, replaceEditString); Modified: src/swf_object.c =================================================================== --- src/swf_object.c 2008-08-07 16:54:05 UTC (rev 8) +++ src/swf_object.c 2008-08-07 17:17:07 UTC (rev 9) @@ -255,6 +255,30 @@ return result; } + +unsigned char * +swf_object_get_pngdata(swf_object_t *swf, unsigned long *length, int image_id) { + swf_tag_t *tag; + unsigned char *data = NULL; + *length = 0; + if (swf == NULL) { + fprintf(stderr, "swf_object_get_pngdata: swf == NULL\n"); + return NULL; + } + for (tag = swf->tag; tag; tag = tag->next) { + // DefineBitsLossless(1),2 + if ((tag->tag != 20) && (tag->tag != 36)) { + continue; + } + data = swf_tag_get_png_data(tag, length, image_id); + if (data) { + break; + } + } + return data; +} + + int swf_object_replace_pngdata(swf_object_t *swf, int image_id, unsigned char *png_data, Modified: src/swf_png.c =================================================================== --- src/swf_png.c 2008-08-07 16:54:05 UTC (rev 8) +++ src/swf_png.c 2008-08-07 17:17:07 UTC (rev 9) @@ -179,7 +179,7 @@ } unsigned char * -jpegconv_lossless2png(void *image_data, +pngconv_lossless2png(void *image_data, unsigned short width, unsigned short height, int tag_no, int format, unsigned long *length) { Modified: src/swf_png.h =================================================================== --- src/swf_png.h 2008-08-07 16:54:05 UTC (rev 8) +++ src/swf_png.h 2008-08-07 17:17:07 UTC (rev 9) @@ -10,7 +10,7 @@ unsigned short *width, unsigned short *height); extern unsigned char * -jpegconv_lossless2png(void *image_data, - unsigned long image_data_size, +pngconv_lossless2png(void *image_data, + unsigned short width, unsigned short height, int tag, int format, unsigned long *length); Modified: src/swf_tag.c =================================================================== --- src/swf_tag.c 2008-08-07 16:54:05 UTC (rev 8) +++ src/swf_tag.c 2008-08-07 17:17:07 UTC (rev 9) @@ -347,6 +347,28 @@ return result; } +unsigned char * +swf_tag_get_png_data(swf_tag_t *tag, unsigned long *length, int image_id) { + swf_tag_info_t *tag_info; + *length = 0; + if (tag == NULL) { + fprintf(stderr, "swf_tag_get_png_data: tag == NULL\n"); + return NULL; + } + tag_info = get_swf_tag_info(tag->tag); + if ((tag->tag != 20) && (tag->tag != 36)) { + return NULL; + } + if (! tag->detail) { + swf_tag_create_detail(tag, NULL); + } + if (! tag->detail) { + fprintf(stderr, "Can't create tag\n"); + return NULL; + } + return swf_tag_lossless_get_png_data(tag->detail, length, image_id, tag); +} + int swf_tag_replace_png_data(swf_tag_t *tag, int image_id, unsigned char *png_data, Modified: src/swf_tag.h =================================================================== --- src/swf_tag.h 2008-08-07 16:54:05 UTC (rev 8) +++ src/swf_tag.h 2008-08-07 17:17:07 UTC (rev 9) @@ -59,6 +59,7 @@ unsigned char *alpha_data, unsigned long alpha_data_len); +extern unsigned char *swf_tag_get_png_data(swf_tag_t *tag, unsigned long *length, int image_id); extern int swf_tag_replace_png_data(swf_tag_t *tag, int image_id, unsigned char *png_data, unsigned long png_data_len); Modified: src/swf_tag_lossless.c =================================================================== --- src/swf_tag_lossless.c 2008-08-07 16:54:05 UTC (rev 8) +++ src/swf_tag_lossless.c 2008-08-07 17:17:07 UTC (rev 9) @@ -284,17 +284,33 @@ unsigned char *swf_tag_lossless_get_png_data(void *detail, unsigned long *length, - int image_id) { - swf_tag_lossless_detail_t *swf_tag_lossless = (swf_tag_lossless_detail_t *) detail; + int image_id, + swf_tag_t *tag) { + swf_tag_lossless_detail_t *swf_tag_lossless; unsigned char *data; *length = 0; + void *image_data; if (detail == NULL) { fprintf(stderr, "swf_tag_lossless_get_lossless_data: detail == NULL at line(%d)\n", __LINE__); } + swf_tag_lossless = (swf_tag_lossless_detail_t *) detail; if (swf_tag_lossless->image_id != image_id) { return NULL; } - data = NULL; // stub + if (tag->tag == 20) { + image_data = (void *) swf_tag_lossless->bitmap; + } else { + image_data = (void *) swf_tag_lossless->bitmap2; + } + if (image_data == NULL) { + fprintf(stderr, "swf_tag_lossless_get_lossless_data: image_data == NULL at line(%d)\n", __LINE__); + return NULL; + } + data = pngconv_lossless2png(image_data, + swf_tag_lossless->width, + swf_tag_lossless->height, + tag->tag, swf_tag_lossless->format, + length); return data; } Modified: src/swf_tag_lossless.h =================================================================== --- src/swf_tag_lossless.h 2008-08-07 16:54:05 UTC (rev 8) +++ src/swf_tag_lossless.h 2008-08-07 17:17:07 UTC (rev 9) @@ -57,7 +57,8 @@ extern unsigned char *swf_tag_lossless_get_png_data(void *detail, unsigned long *length, - int image_id); + int image_id, + swf_tag_t *tag); extern int swf_tag_lossless_replace_png_data(void *detail, int image_id, unsigned char *png_data, unsigned long png_data_len, Modified: src/swfed.c =================================================================== --- src/swfed.c 2008-08-07 16:54:05 UTC (rev 8) +++ src/swfed.c 2008-08-07 17:17:07 UTC (rev 9) @@ -60,6 +60,7 @@ PHP_ME(swfed, getJpegData, NULL, 0) PHP_ME(swfed, getJpegAlpha, NULL, 0) PHP_ME(swfed, replaceJpegData, NULL, 0) + PHP_ME(swfed, getPNGData, NULL, 0) PHP_ME(swfed, replacePNGData, NULL, 0) PHP_ME(swfed, getEditString, NULL, 0) PHP_ME(swfed, replaceEditString, NULL, 0) @@ -411,7 +412,6 @@ RETURN_FALSE; } - PHP_METHOD(swfed, getJpegData) { unsigned long image_id = 0; unsigned long len = 0; @@ -492,6 +492,32 @@ RETURN_TRUE; } +PHP_METHOD(swfed, getPNGData) { + unsigned long image_id = 0; + unsigned long len = 0; + unsigned char *data, *new_buff; + zval *obj = getThis(); + swf_object_t *swf; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, + "l", &image_id) == FAILURE) { + RETURN_FALSE; + } + swf = get_swf_object(getThis()); + data = swf_object_get_pngdata(swf, &len, image_id); + if (data == NULL) { + RETURN_FALSE; + } + new_buff = emalloc(len); + if (new_buff == NULL) { + fprintf(stderr, "getPNGData: Can't emalloc new_buff\n"); + free(data); + RETURN_FALSE; + } + memcpy(new_buff, data, len); + free(data); + RETURN_STRINGL(new_buff, (int) len, 1); +} + PHP_METHOD(swfed, replacePNGData) { char *data = NULL; int data_len = 0;