[Swfed-svn] swfed-svn [9] PHP と PNG2Lossless の bridge 処理を実装

Back to archive index

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;


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