Esempio n. 1
0
int
swf_tag_shape_apply_matrix_factor(void *detail, int shape_id,
                                  double scale_x, double scale_y,
                                  double rotate_rad,
                                  signed int trans_x,
                                  signed int trans_y) {
    int i;
    swf_tag_shape_detail_t *swf_tag_shape = (swf_tag_shape_detail_t *) detail;
    swf_fill_style_t *fill_style;
    if (detail == NULL) {
        fprintf(stderr, "swf_tag_shape_apply_matrix_factor: detail == NULL\n");
        return 1;
    }
    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
              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
              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;
        }
    }
    return 0;
}
Esempio n. 2
0
int
swf_tag_shape_apply_matrix_factor(void *detail, int shape_id, int bitmap_id,
                                  double scale_x, double scale_y,
                                  double rotate_rad,
                                  signed int trans_x,
                                  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;
    }
    if (shape_id != swf_tag_shape->shape_id) {
        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;
            case 0x00: // solid
                // nothing to do
                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;
}