Coverage Report

Created: 2026-11-12 07:07

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/mupdf/source/pdf/pdf-xobject.c
Line
Count
Source
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
5.08k
{
29
5.08k
  return pdf_dict_get(ctx, xobj, PDF_NAME(Resources));
30
5.08k
}
31
32
fz_rect
33
pdf_xobject_bbox(fz_context *ctx, pdf_obj *xobj)
34
7.67k
{
35
7.67k
  return pdf_dict_get_rect(ctx, xobj, PDF_NAME(BBox));
36
7.67k
}
37
38
fz_matrix
39
pdf_xobject_matrix(fz_context *ctx, pdf_obj *xobj)
40
7.67k
{
41
7.67k
  return pdf_dict_get_matrix(ctx, xobj, PDF_NAME(Matrix));
42
7.67k
}
43
44
int pdf_xobject_isolated(fz_context *ctx, pdf_obj *xobj)
45
4.07k
{
46
4.07k
  pdf_obj *group = pdf_dict_get(ctx, xobj, PDF_NAME(Group));
47
4.07k
  if (group)
48
4.07k
    return pdf_dict_get_bool(ctx, group, PDF_NAME(I));
49
0
  return 0;
50
4.07k
}
51
52
int pdf_xobject_knockout(fz_context *ctx, pdf_obj *xobj)
53
4.07k
{
54
4.07k
  pdf_obj *group = pdf_dict_get(ctx, xobj, PDF_NAME(Group));
55
4.07k
  if (group)
56
4.07k
    return pdf_dict_get_bool(ctx, group, PDF_NAME(K));
57
0
  return 0;
58
4.07k
}
59
60
int pdf_xobject_transparency(fz_context *ctx, pdf_obj *xobj)
61
4.69k
{
62
4.69k
  pdf_obj *group = pdf_dict_get(ctx, xobj, PDF_NAME(Group));
63
4.69k
  if (group)
64
4.09k
    if (pdf_name_eq(ctx, pdf_dict_get(ctx, group, PDF_NAME(S)), PDF_NAME(Transparency)))
65
4.07k
      return 1;
66
625
  return 0;
67
4.69k
}
68
69
fz_colorspace *
70
pdf_xobject_colorspace(fz_context *ctx, pdf_obj *xobj)
71
5.40k
{
72
5.40k
  pdf_obj *group = pdf_dict_get(ctx, xobj, PDF_NAME(Group));
73
5.40k
  if (group)
74
5.40k
  {
75
5.40k
    pdf_obj *cs = pdf_dict_get(ctx, group, PDF_NAME(CS));
76
5.40k
    if (cs)
77
5.40k
    {
78
5.40k
      fz_colorspace *colorspace = NULL;
79
10.8k
      fz_try(ctx)
80
10.8k
        colorspace = pdf_load_colorspace(ctx, cs);
81
10.8k
      fz_catch(ctx)
82
0
      {
83
0
        fz_rethrow_if(ctx, FZ_ERROR_TRYLATER);
84
0
        fz_rethrow_if(ctx, FZ_ERROR_SYSTEM);
85
0
        fz_report_error(ctx);
86
0
        fz_warn(ctx, "Ignoring XObject blending colorspace.");
87
0
      }
88
89
5.40k
      if (!fz_is_valid_blend_colorspace(ctx, colorspace))
90
0
      {
91
0
        fz_warn(ctx, "Ignoring invalid XObject blending colorspace: %s.", fz_colorspace_name(ctx, colorspace));
92
0
        fz_drop_colorspace(ctx, colorspace);
93
0
        return NULL;
94
0
      }
95
5.40k
      return colorspace;
96
5.40k
    }
97
5.40k
  }
98
0
  return NULL;
99
5.40k
}
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
184
{
104
184
  pdf_obj *ind = NULL;
105
184
  pdf_obj *form = pdf_new_dict(ctx, doc, 5);
106
368
  fz_try(ctx)
107
368
  {
108
184
    pdf_dict_put(ctx, form, PDF_NAME(Type), PDF_NAME(XObject));
109
184
    pdf_dict_put(ctx, form, PDF_NAME(Subtype), PDF_NAME(Form));
110
184
    pdf_dict_put_rect(ctx, form, PDF_NAME(BBox), bbox);
111
184
    pdf_dict_put_matrix(ctx, form, PDF_NAME(Matrix), matrix);
112
184
    if (res)
113
170
      pdf_dict_put(ctx, form, PDF_NAME(Resources), res);
114
184
    ind = pdf_add_stream(ctx, doc, contents, form, 0);
115
184
  }
116
368
  fz_always(ctx)
117
184
    pdf_drop_obj(ctx, form);
118
184
  fz_catch(ctx)
119
0
    fz_rethrow(ctx);
120
184
  return ind;
121
184
}
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
0
{
126
0
  pdf_dict_put_rect(ctx, form, PDF_NAME(BBox), bbox);
127
0
  pdf_dict_put_matrix(ctx, form, PDF_NAME(Matrix), matrix);
128
0
  if (res)
129
0
    pdf_dict_put(ctx, form, PDF_NAME(Resources), res);
130
0
  else
131
0
    pdf_dict_del(ctx, form, PDF_NAME(Resources));
132
0
  pdf_update_stream(ctx, doc, form, contents, 0);
133
0
}