comparison mupdf-source/source/pdf/pdf-xobject.c @ 2:b50eed0cc0ef upstream

ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4. The directory name has changed: no version number in the expanded directory now.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:43:07 +0200
parents
children
comparison
equal deleted inserted replaced
1:1d09e1dec1d9 2:b50eed0cc0ef
1 // Copyright (C) 2004-2024 Artifex Software, Inc.
2 //
3 // This file is part of MuPDF.
4 //
5 // MuPDF is free software: you can redistribute it and/or modify it under the
6 // terms of the GNU Affero General Public License as published by the Free
7 // Software Foundation, either version 3 of the License, or (at your option)
8 // any later version.
9 //
10 // MuPDF is distributed in the hope that it will be useful, but WITHOUT ANY
11 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12 // FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
13 // details.
14 //
15 // You should have received a copy of the GNU Affero General Public License
16 // along with MuPDF. If not, see <https://www.gnu.org/licenses/agpl-3.0.en.html>
17 //
18 // Alternative licensing terms are available from the licensor.
19 // For commercial licensing, see <https://www.artifex.com/> or contact
20 // Artifex Software, Inc., 39 Mesa Street, Suite 108A, San Francisco,
21 // CA 94129, USA, for further information.
22
23 #include "mupdf/fitz.h"
24 #include "mupdf/pdf.h"
25
26 pdf_obj *
27 pdf_xobject_resources(fz_context *ctx, pdf_obj *xobj)
28 {
29 return pdf_dict_get(ctx, xobj, PDF_NAME(Resources));
30 }
31
32 fz_rect
33 pdf_xobject_bbox(fz_context *ctx, pdf_obj *xobj)
34 {
35 return pdf_dict_get_rect(ctx, xobj, PDF_NAME(BBox));
36 }
37
38 fz_matrix
39 pdf_xobject_matrix(fz_context *ctx, pdf_obj *xobj)
40 {
41 return pdf_dict_get_matrix(ctx, xobj, PDF_NAME(Matrix));
42 }
43
44 int pdf_xobject_isolated(fz_context *ctx, pdf_obj *xobj)
45 {
46 pdf_obj *group = pdf_dict_get(ctx, xobj, PDF_NAME(Group));
47 if (group)
48 return pdf_dict_get_bool(ctx, group, PDF_NAME(I));
49 return 0;
50 }
51
52 int pdf_xobject_knockout(fz_context *ctx, pdf_obj *xobj)
53 {
54 pdf_obj *group = pdf_dict_get(ctx, xobj, PDF_NAME(Group));
55 if (group)
56 return pdf_dict_get_bool(ctx, group, PDF_NAME(K));
57 return 0;
58 }
59
60 int pdf_xobject_transparency(fz_context *ctx, pdf_obj *xobj)
61 {
62 pdf_obj *group = pdf_dict_get(ctx, xobj, PDF_NAME(Group));
63 if (group)
64 if (pdf_name_eq(ctx, pdf_dict_get(ctx, group, PDF_NAME(S)), PDF_NAME(Transparency)))
65 return 1;
66 return 0;
67 }
68
69 fz_colorspace *
70 pdf_xobject_colorspace(fz_context *ctx, pdf_obj *xobj)
71 {
72 pdf_obj *group = pdf_dict_get(ctx, xobj, PDF_NAME(Group));
73 if (group)
74 {
75 pdf_obj *cs = pdf_dict_get(ctx, group, PDF_NAME(CS));
76 if (cs)
77 {
78 fz_colorspace *colorspace = NULL;
79 fz_try(ctx)
80 colorspace = pdf_load_colorspace(ctx, cs);
81 fz_catch(ctx)
82 {
83 fz_rethrow_if(ctx, FZ_ERROR_TRYLATER);
84 fz_rethrow_if(ctx, FZ_ERROR_SYSTEM);
85 fz_report_error(ctx);
86 fz_warn(ctx, "Ignoring XObject blending colorspace.");
87 }
88
89 if (!fz_is_valid_blend_colorspace(ctx, colorspace))
90 {
91 fz_warn(ctx, "Ignoring invalid XObject blending colorspace: %s.", fz_colorspace_name(ctx, colorspace));
92 fz_drop_colorspace(ctx, colorspace);
93 return NULL;
94 }
95 return colorspace;
96 }
97 }
98 return NULL;
99 }
100
101 pdf_obj *
102 pdf_new_xobject(fz_context *ctx, pdf_document *doc, fz_rect bbox, fz_matrix matrix, pdf_obj *res, fz_buffer *contents)
103 {
104 pdf_obj *ind = NULL;
105 pdf_obj *form = pdf_new_dict(ctx, doc, 5);
106 fz_try(ctx)
107 {
108 pdf_dict_put(ctx, form, PDF_NAME(Type), PDF_NAME(XObject));
109 pdf_dict_put(ctx, form, PDF_NAME(Subtype), PDF_NAME(Form));
110 pdf_dict_put_rect(ctx, form, PDF_NAME(BBox), bbox);
111 pdf_dict_put_matrix(ctx, form, PDF_NAME(Matrix), matrix);
112 if (res)
113 pdf_dict_put(ctx, form, PDF_NAME(Resources), res);
114 ind = pdf_add_stream(ctx, doc, contents, form, 0);
115 }
116 fz_always(ctx)
117 pdf_drop_obj(ctx, form);
118 fz_catch(ctx)
119 fz_rethrow(ctx);
120 return ind;
121 }
122
123 void
124 pdf_update_xobject(fz_context *ctx, pdf_document *doc, pdf_obj *form, fz_rect bbox, fz_matrix matrix, pdf_obj *res, fz_buffer *contents)
125 {
126 pdf_dict_put_rect(ctx, form, PDF_NAME(BBox), bbox);
127 pdf_dict_put_matrix(ctx, form, PDF_NAME(Matrix), matrix);
128 if (res)
129 pdf_dict_put(ctx, form, PDF_NAME(Resources), res);
130 else
131 pdf_dict_del(ctx, form, PDF_NAME(Resources));
132 pdf_update_stream(ctx, doc, form, contents, 0);
133 }