From: よや Date: Tue, 21 Feb 2012 18:25:20 +0000 (+0900) Subject: PlaceObject CXFORM optional parser/build X-Git-Tag: v0_60~37 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=1ca2e3901c12923f47b86accff4314e672a7a797;p=swfed%2Fswfed.git PlaceObject CXFORM optional parser/build --- diff --git a/src/swf_tag_place.c b/src/swf_tag_place.c index 03da8d5..3953e5f 100644 --- a/src/swf_tag_place.c +++ b/src/swf_tag_place.c @@ -60,11 +60,18 @@ swf_tag_place_input_detail(swf_tag_t *tag, struct swf_object_ *swf) { bitstream_close(bs); return ret; } - ret = swf_cxform_parse(bs, &(swf_tag_place->color_transform)); - if (ret) { - fprintf(stderr, "ERROR: swf_tag_place_input_detail: swf_tag_place->color_transform parse failed. character_id=%d\n", swf_tag_place->character_id); - bitstream_close(bs); - return ret; + bitstream_align(bs); + if (bitstream_getbytepos(bs) < length) { // optional + ret = swf_cxform_parse(bs, &(swf_tag_place->color_transform)); + if (ret) { + fprintf(stderr, "ERROR: swf_tag_place_input_detail: swf_tag_place->color_transform parse failed. character_id=%d\n", swf_tag_place->character_id); + bitstream_close(bs); + return ret; + } + } else { + swf_tag_place->color_transform.has_add_terms = 0; + swf_tag_place->color_transform.has_mult_terms = 0; + swf_tag_place->color_transform.nbits = 0; } } else if (tag->code == 26) { // PlaceObject2 swf_tag_place->flag_has_clip_action = bitstream_getbit(bs); @@ -137,11 +144,14 @@ swf_tag_place_output_detail(swf_tag_t *tag, unsigned long *length, bitstream_close(bs); return NULL; } - ret = swf_cxform_build(bs, &(swf_tag_place->color_transform)); - if (ret) { - fprintf(stderr, "ERROR: swf_tag_place_output_detail: swf_tag_place->color_transform build failed. character_id=%d\n", swf_tag_place->character_id); - bitstream_close(bs); - return NULL; + if (swf_tag_place->color_transform.has_add_terms || + swf_tag_place->color_transform.has_mult_terms) { // optional + ret = swf_cxform_build(bs, &(swf_tag_place->color_transform)); + if (ret) { + fprintf(stderr, "ERROR: swf_tag_place_output_detail: swf_tag_place->color_transform build failed. character_id=%d\n", swf_tag_place->character_id); + bitstream_close(bs); + return NULL; + } } } else if (tag->code == 26) { // PlaceObject2 bitstream_putbit(bs, swf_tag_place->flag_has_clip_action);