| 1 | #include "mupdf/fitz.h" |
| 2 | #include "mupdf/pdf.h" |
| 3 | |
| 4 | pdf_pattern * |
| 5 | pdf_keep_pattern(fz_context *ctx, pdf_pattern *pat) |
| 6 | { |
| 7 | return fz_keep_storable(ctx, &pat->storable); |
| 8 | } |
| 9 | |
| 10 | void |
| 11 | pdf_drop_pattern(fz_context *ctx, pdf_pattern *pat) |
| 12 | { |
| 13 | fz_drop_storable(ctx, &pat->storable); |
| 14 | } |
| 15 | |
| 16 | static void |
| 17 | pdf_drop_pattern_imp(fz_context *ctx, fz_storable *pat_) |
| 18 | { |
| 19 | pdf_pattern *pat = (pdf_pattern *)pat_; |
| 20 | pdf_drop_obj(ctx, pat->resources); |
| 21 | pdf_drop_obj(ctx, pat->contents); |
| 22 | fz_free(ctx, pat); |
| 23 | } |
| 24 | |
| 25 | static unsigned int |
| 26 | pdf_pattern_size(pdf_pattern *pat) |
| 27 | { |
| 28 | if (pat == NULL) |
| 29 | return 0; |
| 30 | return sizeof(*pat); |
| 31 | } |
| 32 | |
| 33 | pdf_pattern * |
| 34 | pdf_load_pattern(fz_context *ctx, pdf_document *doc, pdf_obj *dict) |
| 35 | { |
| 36 | pdf_pattern *pat; |
| 37 | |
| 38 | if ((pat = pdf_find_item(ctx, pdf_drop_pattern_imp, dict)) != NULL) |
| 39 | { |
| 40 | return pat; |
| 41 | } |
| 42 | |
| 43 | pat = fz_malloc_struct(ctx, pdf_pattern); |
| 44 | FZ_INIT_STORABLE(pat, 1, pdf_drop_pattern_imp); |
| 45 | pat->document = doc; |
| 46 | pat->resources = NULL; |
| 47 | pat->contents = NULL; |
| 48 | pat->id = pdf_to_num(ctx, dict); |
| 49 | |
| 50 | fz_try(ctx) |
| 51 | { |
| 52 | /* Store pattern now, to avoid possible recursion if objects refer back to this one */ |
| 53 | pdf_store_item(ctx, dict, pat, pdf_pattern_size(pat)); |
| 54 | |
| 55 | pat->ismask = pdf_dict_get_int(ctx, dict, PDF_NAME(PaintType)) == 2; |
| 56 | pat->xstep = pdf_dict_get_real(ctx, dict, PDF_NAME(XStep)); |
| 57 | pat->ystep = pdf_dict_get_real(ctx, dict, PDF_NAME(YStep)); |
| 58 | pat->bbox = pdf_dict_get_rect(ctx, dict, PDF_NAME(BBox)); |
| 59 | pat->matrix = pdf_dict_get_matrix(ctx, dict, PDF_NAME(Matrix)); |
| 60 | |
| 61 | pat->resources = pdf_dict_get(ctx, dict, PDF_NAME(Resources)); |
| 62 | if (pat->resources) |
| 63 | pdf_keep_obj(ctx, pat->resources); |
| 64 | |
| 65 | pat->contents = pdf_keep_obj(ctx, dict); |
| 66 | } |
| 67 | fz_catch(ctx) |
| 68 | { |
| 69 | pdf_remove_item(ctx, pdf_drop_pattern_imp, dict); |
| 70 | pdf_drop_pattern(ctx, pat); |
| 71 | fz_rethrow(ctx); |
| 72 | } |
| 73 | return pat; |
| 74 | } |
| 75 | |