OSDN Git Service

replace{PNG|Jpeg}Data で BitsLossless と BitsJPEG をお互いに変更できるように改良。
authoryoya <yoya@7c90b180-03d5-4157-b861-58a559ae9d1e>
Tue, 14 Oct 2008 18:15:52 +0000 (18:15 +0000)
committeryoya <yoya@7c90b180-03d5-4157-b861-58a559ae9d1e>
Tue, 14 Oct 2008 18:15:52 +0000 (18:15 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/swfed/trunk@75 7c90b180-03d5-4157-b861-58a559ae9d1e

src/swf_tag.c
src/swf_tag_jpeg.c
src/swf_tag_lossless.c

index c6b0f31..e91bf77 100644 (file)
@@ -319,30 +319,37 @@ swf_tag_replace_jpeg_data(swf_tag_t *tag, int image_id,
                           unsigned char *alpha_data,
                           unsigned long alpha_data_len) {
     swf_tag_info_t *tag_info;
+    swf_tag_detail_handler_t * detail_handler;
     int result;
     if (tag == NULL) {
         fprintf(stderr, "swf_tag_replace_jpeg_data: tag == NULL\n");
         return 1;
     }
-    if ((tag->tag != 6) && (tag->tag != 21) && (tag->tag != 35)) { // DefineBitsJPEG or 2 or 3
+    // DefineBitsJPEG or 2 or 3
+    // BitsLossless or 2
+    if ((tag->tag != 6) && (tag->tag != 21) && (tag->tag != 35) &&
+        (tag->tag != 20) && (tag->tag != 36)) {
         return 1;
     }
     tag_info = get_swf_tag_info(tag->tag);
-    if (tag_info && tag_info->detail_handler) {
-        swf_tag_detail_handler_t * detail_handler = tag_info->detail_handler();
-        if (detail_handler->identity) {
-            if (detail_handler->identity(tag->data, image_id, tag)) {
-                return 1;
-            }
-        }
+    detail_handler = tag_info->detail_handler();
+    if (detail_handler->identity(tag->data, image_id, tag)) {
+        return 1;
     }
-    if (! tag->detail) {
-        swf_tag_create_input_detail(tag, NULL);
+    if (tag->detail) {
+        detail_handler->destroy(tag->detail);
+        tag->detail = NULL;
     }
-    if (! tag->detail) {
-        fprintf(stderr, "swf_tag_replace_jpeg_data: Can't create tag\n");
-        return 1;
+    if (alpha_data && (alpha_data_len > 0)) {
+        tag->tag = 35;
+    } else {
+        if (tag->tag != 6) {
+            tag->tag = 21;
+        }
     }
+    tag_info = get_swf_tag_info(tag->tag);
+    detail_handler = tag_info->detail_handler();
+    tag->detail = detail_handler->create();
     result= swf_tag_jpeg_replace_jpeg_data(tag->detail, image_id,
                                            jpeg_data, jpeg_data_len,
                                            alpha_data, alpha_data_len, tag);
@@ -350,7 +357,10 @@ swf_tag_replace_jpeg_data(swf_tag_t *tag, int image_id,
         free(tag->data);
         tag->data = NULL;
         tag->length = 0;
-    }
+    } else {
+        detail_handler->destroy(tag->detail);
+        tag->detail = NULL;
+    } 
     return result;
 }
 
@@ -381,36 +391,45 @@ swf_tag_replace_png_data(swf_tag_t *tag, int image_id,
                          unsigned char *png_data,
                          unsigned long png_data_len) {
     swf_tag_info_t *tag_info;
+    swf_tag_detail_handler_t *detail_handler;
     int result;
     if (tag == NULL) {
         fprintf(stderr, "swf_tag_replace_png_data: tag == NULL\n");
         return 1;
     }
-    if ((tag->tag != 20) && (tag->tag != 36)) { // DefineBitsLossless or 2
+    // DefineBitsJPEG or 2 or 3
+    // BitsLossless or 2
+    if ((tag->tag != 6) && (tag->tag != 21) && (tag->tag != 35) &&
+        (tag->tag != 20) && (tag->tag != 36)) {
         return 1;
     }
     tag_info = get_swf_tag_info(tag->tag);
-    if (tag_info && tag_info->detail_handler) {
-        swf_tag_detail_handler_t * detail_handler = tag_info->detail_handler();
-        if (detail_handler->identity) {
-            if (detail_handler->identity(tag->data, image_id, tag)) {
-                return 1;
-            }
-        }
+    detail_handler = tag_info->detail_handler();
+    if (detail_handler->identity(tag->data, image_id, tag)) {
+        return 1;
     }
-    if (! tag->detail) {
-        swf_tag_create_input_detail(tag, NULL);
+    if (tag->detail) {
+        detail_handler->destroy(tag->detail);
+        tag->detail = NULL;
     }
-    if (! tag->detail) {
-        fprintf(stderr, "swf_tag_replace_png_data: Can't create tag\n");
-        return 1;
+    if (tag->tag == 20) {
+        tag->tag = 20;
+    } else {
+        tag->tag = 36;
     }
+    
+    tag_info = get_swf_tag_info(tag->tag);
+    detail_handler = tag_info->detail_handler();
+    tag->detail = detail_handler->create();
     result= swf_tag_lossless_replace_png_data(tag->detail, image_id,
                                               png_data, png_data_len, tag);
     if (result == 0) {
         free(tag->data);
         tag->data = NULL;
         tag->length = 0;
+    } else {
+        detail_handler->destroy(tag->detail);
+        tag->detail = NULL;
     }
     return result;
 }
index 11fe180..6a7ab8c 100644 (file)
@@ -46,9 +46,10 @@ swf_tag_jpeg_create_detail(void) {
         fprintf(stderr, "ERROR: swf_tag_jpeg_create_detail: can't calloc\n");
         return NULL;
     }
-    swf_tag_jpeg->image_id = -1;
+    swf_tag_jpeg->image_id = 0;
     swf_tag_jpeg->jpeg_data = NULL;
     swf_tag_jpeg->jpeg_data_len = 0;
+    swf_tag_jpeg->offset_to_alpha = 0;
     swf_tag_jpeg->alpha_data = NULL;
     swf_tag_jpeg->alpha_data_len = 0;
     return (void *) swf_tag_jpeg;
@@ -306,9 +307,7 @@ swf_tag_jpeg_replace_jpeg_data(void *detail, int image_id,
         fprintf(stderr, "swf_tag_jpeg_replace_jpeg_data: detail == NULL\n");
         return 1;
     }
-    if (swf_tag_jpeg->image_id != image_id) {
-        return 1;
-    }
+    swf_tag_jpeg->image_id = image_id;
     if (tag->tag == 6) { // DefineBitsJPEG
         free(swf_tag_jpeg->jpeg_data);
         swf_tag_jpeg->jpeg_data = malloc(jpeg_data_len);
@@ -329,6 +328,5 @@ swf_tag_jpeg_replace_jpeg_data(void *detail, int image_id,
             swf_tag_jpeg->alpha_data_len = alpha_data_len;
         }
     }
-
     return 0;
 }
index 2091a90..63a5b48 100644 (file)
@@ -33,6 +33,16 @@ swf_tag_lossless_create_detail(void) {
         fprintf(stderr, "swf_tag_lossless_create_detail: can't calloc swf_tag_lossless\n");
         return NULL;
     }
+    swf_tag_lossless->image_id = 0;
+    swf_tag_lossless->format = 0;
+    swf_tag_lossless->width  = 0;
+    swf_tag_lossless->height = 0;
+    swf_tag_lossless->colormap_count = 0;
+    swf_tag_lossless->colormap  = NULL;
+    swf_tag_lossless->colormap2 = NULL;
+    swf_tag_lossless->indices   = NULL;
+    swf_tag_lossless->bitmap  = NULL;
+    swf_tag_lossless->bitmap2 = NULL;
     return swf_tag_lossless;
 }
 
@@ -377,9 +387,7 @@ swf_tag_lossless_replace_png_data(void *detail, int image_id,
         fprintf(stderr, "swf_tag_lossless_replace_lossless_data: detail == NULL at line(%d)\n", __LINE__);
         return 1;
     }
-    if (swf_tag_lossless->image_id != image_id) {
-        return 1;
-    }
+    swf_tag_lossless->image_id = image_id;
     result_data = pngconv_png2lossless(png_data, png_data_len,
                                        &tag_no, &format,
                                        &width, &height,