From: Yoshihiro Yamazaki Date: Tue, 31 Jul 2012 12:44:40 +0000 (+0900) Subject: care newstyele on bitmapmatrix rescale. X-Git-Tag: v0_60~15 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=1e8ee436f774d12840d7f95d7608c59ee772f92c;p=swfed%2Fswfed.git care newstyele on bitmapmatrix rescale. --- diff --git a/src/swf_tag_shape.c b/src/swf_tag_shape.c index 0f2f315..95cb735 100644 --- a/src/swf_tag_shape.c +++ b/src/swf_tag_shape.c @@ -497,7 +497,10 @@ swf_tag_shape_apply_matrix_factor(void *detail, int shape_id, int bitmap_id, signed int trans_y) { int i; swf_tag_shape_detail_t *swf_tag_shape = (swf_tag_shape_detail_t *) detail; + swf_fill_style_array_t *fill_styles; swf_fill_style_t *fill_style; + swf_shape_record_t *shape_record = NULL; + if (detail == NULL) { fprintf(stderr, "swf_tag_shape_apply_matrix_factor: detail == NULL\n"); return 1; @@ -505,32 +508,60 @@ swf_tag_shape_apply_matrix_factor(void *detail, int shape_id, int bitmap_id, if (shape_id != swf_tag_shape->shape_id) { return 1; } - for (i = 0 ; i < swf_tag_shape->shape_with_style.styles.fill_styles.count ; i++) { - fill_style = &(swf_tag_shape->shape_with_style.styles.fill_styles.fill_style[i]); - switch (fill_style->type) { - case 0x10: // linear gradient fill - case 0x12: // radial gradient fill - case 0x13: // focal gradient fill - if (bitmap_id < 0) { - swf_matrix_apply_factor(&(fill_style->gradient.gradient_matrix), scale_x, scale_y, - rotate_rad, trans_x, trans_y); - } - break; - case 0x40: // tilled bitmap fill with smoothed edges - case 0x41: // clipped bitmap fill with smoothed edges - case 0x42: // tilled bitmap fill with hard edges - case 0x43: // clipped bitmap fill with hard edges - if ((bitmap_id < 0) || - (bitmap_id == fill_style->bitmap.bitmap_ref)) { - swf_matrix_apply_factor(&(fill_style->bitmap.bitmap_matrix), - scale_x, scale_y, rotate_rad, - trans_x, trans_y); - } - break; - default: - fprintf(stderr, "swf_tag_shape_apply_matrix_factor: unknown fill_style->type=%d\n", - fill_style->type); - return 1; + fill_styles = &(swf_tag_shape->shape_with_style.styles.fill_styles); + + if (! swf_tag_shape->is_morph) { + shape_record = &(swf_tag_shape->shape_with_style.shape_records); + } + + while (fill_styles) { + for (i = 0 ; i < fill_styles->count ; i++) { + fill_style = &(fill_styles->fill_style[i]); + switch (fill_style->type) { + case 0x10: // linear gradient fill + case 0x12: // radial gradient fill + case 0x13: // focal gradient fill + if (bitmap_id < 0) { + swf_matrix_apply_factor(&(fill_style->gradient.gradient_matrix), scale_x, scale_y, + rotate_rad, trans_x, trans_y); + } + break; + case 0x40: // tilled bitmap fill with smoothed edges + case 0x41: // clipped bitmap fill with smoothed edges + case 0x42: // tilled bitmap fill with hard edges + case 0x43: // clipped bitmap fill with hard edges + if ((bitmap_id < 0) || + (bitmap_id == fill_style->bitmap.bitmap_ref)) { + swf_matrix_apply_factor(&(fill_style->bitmap.bitmap_matrix), + scale_x, scale_y, rotate_rad, + trans_x, trans_y); + } + break; + default: + fprintf(stderr, "swf_tag_shape_apply_matrix_factor: unknown fill_style->type=%d\n", + fill_style->type); + return 1; + } + } + fill_styles = NULL; + while (shape_record) { + int first_bit = (shape_record->first_6bits >> 5) & 1; + int next_5bits = shape_record->first_6bits & 0x1f; + if (first_bit == 0) { + if ((next_5bits == 0)) { // end record + shape_record = NULL; + break; // end + } else { // setup record + if (shape_record->shape.shape_setup.shape_has_new_styles) { + fill_styles = &(shape_record->shape.shape_setup.styles.fill_styles); + shape_record = shape_record->next; + break; // next loop + } + shape_record = shape_record->next; + } + } else { // edge record + shape_record = shape_record->next; + } } } return 0;