pdf-xobject.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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. #include "mupdf/fitz.h"
  23. #include "mupdf/pdf.h"
  24. pdf_obj *
  25. pdf_xobject_resources(fz_context *ctx, pdf_obj *xobj)
  26. {
  27. return pdf_dict_get(ctx, xobj, PDF_NAME(Resources));
  28. }
  29. fz_rect
  30. pdf_xobject_bbox(fz_context *ctx, pdf_obj *xobj)
  31. {
  32. return pdf_dict_get_rect(ctx, xobj, PDF_NAME(BBox));
  33. }
  34. fz_matrix
  35. pdf_xobject_matrix(fz_context *ctx, pdf_obj *xobj)
  36. {
  37. return pdf_dict_get_matrix(ctx, xobj, PDF_NAME(Matrix));
  38. }
  39. int pdf_xobject_isolated(fz_context *ctx, pdf_obj *xobj)
  40. {
  41. pdf_obj *group = pdf_dict_get(ctx, xobj, PDF_NAME(Group));
  42. if (group)
  43. return pdf_dict_get_bool(ctx, group, PDF_NAME(I));
  44. return 0;
  45. }
  46. int pdf_xobject_knockout(fz_context *ctx, pdf_obj *xobj)
  47. {
  48. pdf_obj *group = pdf_dict_get(ctx, xobj, PDF_NAME(Group));
  49. if (group)
  50. return pdf_dict_get_bool(ctx, group, PDF_NAME(K));
  51. return 0;
  52. }
  53. int pdf_xobject_transparency(fz_context *ctx, pdf_obj *xobj)
  54. {
  55. pdf_obj *group = pdf_dict_get(ctx, xobj, PDF_NAME(Group));
  56. if (group)
  57. if (pdf_name_eq(ctx, pdf_dict_get(ctx, group, PDF_NAME(S)), PDF_NAME(Transparency)))
  58. return 1;
  59. return 0;
  60. }
  61. fz_colorspace *
  62. pdf_xobject_colorspace(fz_context *ctx, pdf_obj *xobj)
  63. {
  64. pdf_obj *group = pdf_dict_get(ctx, xobj, PDF_NAME(Group));
  65. if (group)
  66. {
  67. pdf_obj *cs = pdf_dict_get(ctx, group, PDF_NAME(CS));
  68. if (cs)
  69. {
  70. fz_colorspace *colorspace = NULL;
  71. fz_try(ctx)
  72. colorspace = pdf_load_colorspace(ctx, cs);
  73. fz_catch(ctx)
  74. {
  75. fz_rethrow_if(ctx, FZ_ERROR_TRYLATER);
  76. fz_rethrow_if(ctx, FZ_ERROR_SYSTEM);
  77. fz_report_error(ctx);
  78. fz_warn(ctx, "Ignoring XObject blending colorspace.");
  79. }
  80. if (!fz_is_valid_blend_colorspace(ctx, colorspace))
  81. {
  82. fz_warn(ctx, "Ignoring invalid XObject blending colorspace: %s.", fz_colorspace_name(ctx, colorspace));
  83. fz_drop_colorspace(ctx, colorspace);
  84. return NULL;
  85. }
  86. return colorspace;
  87. }
  88. }
  89. return NULL;
  90. }
  91. pdf_obj *
  92. pdf_new_xobject(fz_context *ctx, pdf_document *doc, fz_rect bbox, fz_matrix matrix, pdf_obj *res, fz_buffer *contents)
  93. {
  94. pdf_obj *ind = NULL;
  95. pdf_obj *form = pdf_new_dict(ctx, doc, 5);
  96. fz_try(ctx)
  97. {
  98. pdf_dict_put(ctx, form, PDF_NAME(Type), PDF_NAME(XObject));
  99. pdf_dict_put(ctx, form, PDF_NAME(Subtype), PDF_NAME(Form));
  100. pdf_dict_put_rect(ctx, form, PDF_NAME(BBox), bbox);
  101. pdf_dict_put_matrix(ctx, form, PDF_NAME(Matrix), matrix);
  102. if (res)
  103. pdf_dict_put(ctx, form, PDF_NAME(Resources), res);
  104. ind = pdf_add_stream(ctx, doc, contents, form, 0);
  105. }
  106. fz_always(ctx)
  107. pdf_drop_obj(ctx, form);
  108. fz_catch(ctx)
  109. fz_rethrow(ctx);
  110. return ind;
  111. }
  112. void
  113. pdf_update_xobject(fz_context *ctx, pdf_document *doc, pdf_obj *form, fz_rect bbox, fz_matrix matrix, pdf_obj *res, fz_buffer *contents)
  114. {
  115. pdf_dict_put_rect(ctx, form, PDF_NAME(BBox), bbox);
  116. pdf_dict_put_matrix(ctx, form, PDF_NAME(Matrix), matrix);
  117. if (res)
  118. pdf_dict_put(ctx, form, PDF_NAME(Resources), res);
  119. else
  120. pdf_dict_del(ctx, form, PDF_NAME(Resources));
  121. pdf_update_stream(ctx, doc, form, contents, 0);
  122. }