OSDN Git Service

setShapeAdjustMode の PNG, GIF 対応
authoryoya <yoya@7c90b180-03d5-4157-b861-58a559ae9d1e>
Thu, 28 Oct 2010 14:04:55 +0000 (14:04 +0000)
committeryoya <yoya@7c90b180-03d5-4157-b861-58a559ae9d1e>
Thu, 28 Oct 2010 14:04:55 +0000 (14:04 +0000)
- replaceGIFData, replacePNGData に shape_adjust_mode の処理を入れる
- 画像サイズ取得を swf_tag_get_bitmap_size にまとめる

git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/swfed/trunk@318 7c90b180-03d5-4157-b861-58a559ae9d1e

src/swf_object.c
src/swf_tag.c
src/swf_tag.h

index 237b960..453ca0d 100644 (file)
@@ -385,11 +385,9 @@ swf_object_replace_jpegdata(swf_object_t *swf, int image_id,
         fprintf(stderr, "swf_object_replace_jpegdata: tag == NULL\n");
         return 1;
     }
-    swf_tag_create_input_detail(tag, swf);
     if (swf->shape_adjust_mode) {
-        swf_tag_jpeg_detail_t *swf_tag_jpeg = (swf_tag_jpeg_detail_t *) tag->detail;
-        jpeg_size(swf_tag_jpeg->jpeg_data, swf_tag_jpeg->jpeg_data_len,
-                  &old_width, &old_height);
+        swf_tag_create_input_detail(tag, swf);
+        swf_tag_get_bitmap_size(tag, &old_width, &old_height);
         jpeg_size(jpeg_data, jpeg_data_len, &new_width, &new_height);
     }
     result = swf_tag_replace_jpeg_data(tag, image_id,
@@ -437,6 +435,7 @@ swf_object_replace_pngdata(swf_object_t *swf, int image_id,
                             unsigned long png_data_len) {
     int result = 1;
     swf_tag_t *tag;
+    int old_width, old_height, new_width, new_height;
     if (swf == NULL) {
         fprintf(stderr, "swf_object_replace_pngdata: swf == NULL\n");
         return 1;
@@ -446,9 +445,22 @@ swf_object_replace_pngdata(swf_object_t *swf, int image_id,
         fprintf(stderr, "swf_object_replace_pngdata: tag == NULL\n");
         return 1;
     }
-    
+    if (swf->shape_adjust_mode) {
+        swf_tag_create_input_detail(tag, swf);
+        swf_tag_get_bitmap_size(tag, &old_width, &old_height);
+        png_size(png_data, png_data_len, &new_width, &new_height);
+    }
     result = swf_tag_replace_png_data(tag, image_id,
                                       png_data, png_data_len);
+    if (result) {
+        fprintf(stderr, "swf_object_replace_pngdata: swf_tag_replace_png_data failed\n");
+        return result;
+    }
+    if (swf->shape_adjust_mode) {
+        swf_object_adjust_shapebitmap(swf, image_id,
+                                      old_width, old_height,
+                                      new_width, new_height);
+    }
     return result;
 }
 
@@ -463,6 +475,7 @@ swf_object_replace_gifdata(swf_object_t *swf, int image_id,
                             unsigned long gif_data_len) {
     int result = 1;
     swf_tag_t *tag;
+    int old_width, old_height, new_width, new_height;
     if (swf == NULL) {
         fprintf(stderr, "swf_object_replace_gifdata: swf == NULL\n");
         return 1;
@@ -472,9 +485,22 @@ swf_object_replace_gifdata(swf_object_t *swf, int image_id,
         fprintf(stderr, "swf_object_replace_gifdata: tag == NULL\n");
         return 1;
     }
-
+    if (swf->shape_adjust_mode) {
+        swf_tag_create_input_detail(tag, swf);
+        swf_tag_get_bitmap_size(tag, &old_width, &old_height);
+        gif_size(gif_data, gif_data_len, &new_width, &new_height);
+    }
     result = swf_tag_replace_gif_data(tag, image_id,
                                       gif_data, gif_data_len);
+    if (result) {
+        fprintf(stderr, "swf_object_replace_pngdata: swf_tag_replace_png_data failed\n");
+        return result;
+    }
+    if (swf->shape_adjust_mode) {
+        swf_object_adjust_shapebitmap(swf, image_id,
+                                      old_width, old_height,
+                                      new_width, new_height);
+    }
     return result;
 }
 
index 84437d8..4c62612 100644 (file)
@@ -282,6 +282,35 @@ swf_tag_identity(swf_tag_t *tag, int cid) {
     return 1; // no match - no identity method
 }
 
+/* bitmap */
+
+int
+swf_tag_get_bitmap_size(swf_tag_t *tag,
+                        int *width, int *height) {
+    int ret = 0;
+    if (tag == NULL) {
+        fprintf(stderr, "swf_tag_get_bitmap_size: tag == NULL\n");
+        return 1;
+    }
+    if (! tag->detail) {
+        fprintf(stderr, "swf_tag_get_bitmap_size: tag->detail == NULL\n");
+        return 1;
+    }
+
+    if (isBitsJPEGTag(tag->tag)) {
+        swf_tag_jpeg_detail_t *swf_tag_jpeg = (swf_tag_jpeg_detail_t *) tag->detail;
+        ret = jpeg_size(swf_tag_jpeg->jpeg_data, swf_tag_jpeg->jpeg_data_len,
+                  width, height);
+    } else if (isBitsLosslessTag(tag->tag)) {
+        swf_tag_lossless_detail_t *swf_tag_lossless = (swf_tag_lossless_detail_t *) tag->detail;
+        *width  = swf_tag_lossless->width;
+        *height = swf_tag_lossless->height;
+    }
+    return ret;
+
+}
+
+
 unsigned char *
 swf_tag_get_jpeg_data(swf_tag_t *tag, unsigned long *length, int image_id, swf_tag_t *tag_jpegtables) {
     swf_tag_info_t *tag_info;
index 8b6daf5..1059f69 100644 (file)
@@ -49,6 +49,9 @@ extern int swf_tag_identity(swf_tag_t *tag, int cid);
 
 /* image */
 
+extern int swf_tag_get_bitmap_size(swf_tag_t *tag,
+                                   int *width, int *height);
+
 extern unsigned char *swf_tag_get_jpeg_data(swf_tag_t *tag, unsigned long *length, int image_id, swf_tag_t *tag_jpegtables);
 extern unsigned char *swf_tag_get_alpha_data(swf_tag_t *tag, unsigned long *length, int image_id);
 extern int swf_tag_replace_jpeg_data(swf_tag_t *tag, int image_id,