OSDN Git Service

2つ目の new styles 以降の edge の parse が出来ない問題の修正
authoryoya <yoya@7c90b180-03d5-4157-b861-58a559ae9d1e>
Sat, 2 Oct 2010 20:13:26 +0000 (20:13 +0000)
committeryoya <yoya@7c90b180-03d5-4157-b861-58a559ae9d1e>
Sat, 2 Oct 2010 20:13:26 +0000 (20:13 +0000)
edge の fill_style0, fill_style1, line_style で、
shape with style の 〜_bits_count を決め内で使っていたが、これは間違い。
(tag オブジェクトに parse context として 〜_bits_count を記憶して)
edge では直前で定義した _bits_count を使うようにした。

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

src/swf_morph_shape_with_style.c
src/swf_shape_record.c
src/swf_shape_record_setup.c
src/swf_shape_record_setup.h
src/swf_shape_with_style.c
src/swf_styles.c
src/swf_styles_count.c
src/swf_tag_shape.h

index 9f371b6..c236846 100644 (file)
@@ -1,16 +1,21 @@
 #include <stdio.h>
 #include "bitstream.h"
 #include "swf_morph_shape_with_style.h"
+#include "swf_tag_shape.h"
 
 int
 swf_morph_shape_with_style_parse(bitstream_t *bs,
                                  swf_morph_shape_with_style_t *morph_shape_with_style,
                                  swf_tag_t *tag) {
+    swf_tag_shape_detail_t *swf_tag_shape = (swf_tag_shape_detail_t *) tag->detail;
     swf_styles_parse(bs, &(morph_shape_with_style->styles), tag);
+    swf_tag_shape->_current_styles_count = morph_shape_with_style->styles.styles_count; // XXX
     swf_shape_record_parse(bs, &(morph_shape_with_style->shape_records), tag,
                            &(morph_shape_with_style->styles.styles_count));
     bitstream_align(bs);
     swf_styles_count_parse(bs, &(morph_shape_with_style->styles_count));
+
+    swf_tag_shape->_current_styles_count = morph_shape_with_style->styles_count; // XXX
     swf_shape_record_parse(bs, &(morph_shape_with_style->shape_records_morph),
                            tag, &(morph_shape_with_style->styles_count));
     return 0;
index f6a334d..21ba1f1 100644 (file)
@@ -25,7 +25,7 @@ swf_shape_record_parse(bitstream_t *bs, swf_shape_record_t *shape_record,
             break;
         } if (first_bit == 0) {
             swf_shape_record_setup_parse(bs, &(current_record->shape.shape_setup),
-                                         tag, count);
+                                         tag);
 } else {
             swf_shape_record_edge_parse(bs, &(current_record->shape.shape_edge));
         }
index 4b8e387..8d5c299 100644 (file)
@@ -1,12 +1,14 @@
 #include <stdio.h>
 #include "bitstream.h"
 #include "swf_shape_record_setup.h"
+#include "swf_tag_shape.h"
 
 int
 swf_shape_record_setup_parse(bitstream_t *bs,
                              swf_shape_record_setup_t *shape_record_setup,
-                             swf_tag_t *tag, swf_styles_count_t *count) {
+                             swf_tag_t *tag) {
     int shape_move_size;
+    swf_tag_shape_detail_t *swf_tag_shape = (swf_tag_shape_detail_t *) tag->detail;
     shape_record_setup->shape_record_type = bitstream_getbit(bs);
     shape_record_setup->shape_has_new_styles = bitstream_getbit(bs);
     shape_record_setup->shape_has_line_style = bitstream_getbit(bs);
@@ -20,18 +22,18 @@ swf_shape_record_setup_parse(bitstream_t *bs,
         shape_record_setup->shape_move_y = bitstream_getbits(bs, shape_move_size);
     }
     if (shape_record_setup->shape_has_fill_style0) {
-        shape_record_setup->shape_fill_style0 = bitstream_getbits(bs, count->fill_bits_count);
+        shape_record_setup->shape_fill_style0 = bitstream_getbits(bs, swf_tag_shape->_current_styles_count.fill_bits_count);
 
     }
     if (shape_record_setup->shape_has_fill_style1) {
-        shape_record_setup->shape_fill_style1 = bitstream_getbits(bs, count->fill_bits_count);
-
+        shape_record_setup->shape_fill_style1 = bitstream_getbits(bs, swf_tag_shape->_current_styles_count.fill_bits_count);
     }
     if (shape_record_setup->shape_has_line_style) {
-        shape_record_setup->shape_line_style = bitstream_getbits(bs, count->line_bits_count);
+        shape_record_setup->shape_line_style = bitstream_getbits(bs, swf_tag_shape->_current_styles_count.line_bits_count);
     }
     if (shape_record_setup->shape_has_new_styles) {
         swf_styles_parse(bs, &(shape_record_setup->styles), tag);
+       swf_tag_shape->_current_styles_count = shape_record_setup->styles.styles_count;
     }
     return 0;
 }
index 6780634..2511f17 100644 (file)
@@ -28,8 +28,7 @@ typedef struct swf_shape_record_setup_ {
 
 extern int swf_shape_record_setup_parse(bitstream_t *bs,
                                         swf_shape_record_setup_t *setup,
-                                        swf_tag_t *tag,
-                                        swf_styles_count_t *count);
+                                        swf_tag_t *tag);
 extern int swf_shape_record_setup_build(bitstream_t *bs,
                                         swf_shape_record_setup_t *setup,
                                         swf_tag_t *tag,
index 515f701..1855442 100644 (file)
@@ -1,16 +1,19 @@
 #include <stdio.h>
 #include "bitstream.h"
 #include "swf_shape_with_style.h"
+#include "swf_tag_shape.h"
 
 int
 swf_shape_with_style_parse(bitstream_t *bs,
                            swf_shape_with_style_t *shape_with_style,
                            swf_tag_t *tag) {
     int result;
+    swf_tag_shape_detail_t *swf_tag_shape = (swf_tag_shape_detail_t *) tag->detail;
     result = swf_styles_parse(bs, &(shape_with_style->styles), tag);
     if (result) {
         return result;
     }
+    swf_tag_shape->_current_styles_count = shape_with_style->styles.styles_count; // XXX
     result = swf_shape_record_parse(bs, &(shape_with_style->shape_records),
                                     tag,
                                     &(shape_with_style->styles.styles_count));
index f745736..31015a7 100644 (file)
@@ -17,6 +17,10 @@ swf_styles_parse(bitstream_t *bs, swf_styles_t *shape_with_style,
         return result;
     }
     result = swf_styles_count_parse(bs, &(shape_with_style->styles_count));
+    if (result) {
+        return result;
+    }
+
     return result;
 }
 
index ebf2361..97a0a1a 100644 (file)
@@ -1,6 +1,7 @@
 #include <stdio.h>
 #include "bitstream.h"
 #include "swf_styles_count.h"
+#include "swf_tag_shape.h"
 
 int
 swf_styles_count_parse(bitstream_t *bs, swf_styles_count_t *styles_count) {
index a0b6d28..6e4d0b0 100644 (file)
@@ -33,6 +33,10 @@ typedef struct swf_tag_shape_detail_ {
      swf_morph_shape_with_style_t  morph_shape_with_style;
     // else
     swf_shape_with_style_t  shape_with_style;
+  /*
+   * parse context
+   */ 
+  swf_styles_count_t _current_styles_count;
 } swf_tag_shape_detail_t;
 
 extern swf_tag_detail_handler_t *swf_tag_shape_detail_handler(void);