OSDN Git Service

- 色が一致するかの判定処理を修正
authorよや <yoya@awm.jp>
Wed, 22 Jun 2011 18:50:14 +0000 (03:50 +0900)
committerよや <yoya@awm.jp>
Wed, 22 Jun 2011 18:50:14 +0000 (03:50 +0900)
  - alpha 値の逆補正を追加
  - 色の一致に±10の幅を持たせる

src/swf_tag.c

index 798d1fd..2573c54 100644 (file)
@@ -515,9 +515,10 @@ swf_tag_get_bitmap_color1stpixel(swf_tag_t *tag,
             *green = swf_tag_lossless->colormap[color_index].green;
             *blue  = swf_tag_lossless->colormap[color_index].blue;
         } else { // Lossless2 => RGBA
-            *red   = swf_tag_lossless->colormap2[color_index].red;
-            *green = swf_tag_lossless->colormap2[color_index].green;
-            *blue  = swf_tag_lossless->colormap2[color_index].blue;
+            int alpha = swf_tag_lossless->colormap2[color_index].alpha;
+            *red   = swf_tag_lossless->colormap2[color_index].red * 255 / alpha;
+            *green = swf_tag_lossless->colormap2[color_index].green * 255 / alpha;
+            *blue  = swf_tag_lossless->colormap2[color_index].blue * 255 / alpha;
         }
         break;
     case 5:
@@ -526,9 +527,10 @@ swf_tag_get_bitmap_color1stpixel(swf_tag_t *tag,
             *green = swf_tag_lossless->bitmap[0].green;
             *blue  = swf_tag_lossless->bitmap[0].blue;
         } else { // Lossless2 => ARGB
-            *red   = swf_tag_lossless->bitmap2[0].red;
-            *green = swf_tag_lossless->bitmap2[0].green;
-            *blue  = swf_tag_lossless->bitmap2[0].blue;
+            int alpha = swf_tag_lossless->bitmap2[0].alpha;
+            *red   = swf_tag_lossless->bitmap2[0].red * 255 / alpha;
+            *green = swf_tag_lossless->bitmap2[0].green * 255 / alpha;
+            *blue  = swf_tag_lossless->bitmap2[0].blue * 255 / alpha;
         }
         break;
     default: // include 4 (15bit color)
@@ -1133,14 +1135,23 @@ swf_tag_search_cid_by_bitmap_condition(swf_tag_t *tag,
         ( (red >= 0) || (green >= 0) || (blue >= 0) ))  {
         int r, g, b;
         swf_tag_get_bitmap_color1stpixel(tag, &r, &g, &b);
-        if ((red >= 0) && (red != r)) {
-            return -1; // out
+        if (red >= 0) {
+            int red_diff = red - r;
+            if ((red_diff < -10) || (10 < red_diff)) {
+                return -1; // out
+            }
         }
-        if ((green >= 0) && (green != g)) {
-            return -1; // out
+        if (green >= 0) {
+            int green_diff = green - g;
+            if ((green_diff < -10) || (10 < green_diff)) {
+                return -1; // out
+            }
         }
-        if ((blue >= 0) && (blue != b)) {
-            return -1; // out
+        if (blue >= 0) {
+            int blue_diff = blue - b;
+            if ((blue_diff < -10) || (10 < blue_diff)) {
+                return -1; // out
+            }
         }
         cid = swf_tag_get_cid(tag);
     }