Commit 8e8c0d8290409358488b2a04af81771989944552

Authored by Jay Berkenbilt
1 parent 61d41e2e

Add new placeFormXObject that takes a matrix reference

ChangeLog
  1 +2021-02-22 Jay Berkenbilt <ejb@ql.org>
  2 +
  3 + * Add a new version of QPDFPageObjectHelper::placeFormXObject that
  4 + initializes the transformation matrix that was used so you don't
  5 + have to call both placeFormXObject and
  6 + getMatrixForFormXObjectPlacement.
  7 +
1 8 2021-02-21 Jay Berkenbilt <ejb@ql.org>
2 9  
3 10 * From qpdf CLI, --overlay and --underlay will copy annotations
... ...
include/qpdf/QPDFPageObjectHelper.hh
... ... @@ -309,6 +309,17 @@ class QPDFPageObjectHelper: public QPDFObjectHelper
309 309 bool allow_shrink = true,
310 310 bool allow_expand = false);
311 311  
  312 + // Alternative version that also fills in the transformation
  313 + // matrix that was used.
  314 + QPDF_DLL
  315 + std::string placeFormXObject(
  316 + QPDFObjectHandle fo, std::string const& name,
  317 + QPDFObjectHandle::Rectangle rect,
  318 + QPDFMatrix& cm,
  319 + bool invert_transformations = true,
  320 + bool allow_shrink = true,
  321 + bool allow_expand = false);
  322 +
312 323 // Return the transformation matrix that translates from the given
313 324 // form XObject's coordinate system into the given rectangular
314 325 // region on the page. The parameters have the same meaning as for
... ...
libqpdf/QPDFPageObjectHelper.cc
... ... @@ -1070,7 +1070,22 @@ QPDFPageObjectHelper::placeFormXObject(
1070 1070 bool invert_transformations,
1071 1071 bool allow_shrink, bool allow_expand)
1072 1072 {
1073   - QPDFMatrix cm = getMatrixForFormXObjectPlacement(
  1073 + QPDFMatrix cm;
  1074 + return placeFormXObject(
  1075 + fo, name, rect, cm, invert_transformations,
  1076 + allow_shrink, allow_expand);
  1077 +}
  1078 +
  1079 +std::string
  1080 +QPDFPageObjectHelper::placeFormXObject(
  1081 + QPDFObjectHandle fo, std::string const& name,
  1082 + QPDFObjectHandle::Rectangle rect,
  1083 + QPDFMatrix& cm,
  1084 + bool invert_transformations,
  1085 + bool allow_shrink,
  1086 + bool allow_expand)
  1087 +{
  1088 + cm = getMatrixForFormXObjectPlacement(
1074 1089 fo, rect, invert_transformations, allow_shrink, allow_expand);
1075 1090 return (
1076 1091 "q\n" +
... ...
qpdf/qpdf.cc
... ... @@ -5191,20 +5191,18 @@ static void do_under_overlay_for_page(
5191 5191 pdf.copyForeignObject(
5192 5192 from_page.getFormXObjectForPage());
5193 5193 }
5194   - auto cm = dest_page.getMatrixForFormXObjectPlacement(
5195   - fo[from_pageno],
5196   - dest_page.getTrimBox().getArrayAsRectangle());
5197   - dest_page.copyAnnotations(
5198   - from_page, cm, dest_afdh, make_afdh(from_page));
5199 5194  
5200 5195 // If the same page is overlaid or underlaid multiple times,
5201 5196 // we'll generate multiple names for it, but that's harmless
5202 5197 // and also a pretty goofy case that's not worth coding
5203 5198 // around.
5204 5199 std::string name = resources.getUniqueResourceName("/Fx", min_suffix);
  5200 + QPDFMatrix cm;
5205 5201 std::string new_content = dest_page.placeFormXObject(
5206 5202 fo[from_pageno], name,
5207   - dest_page.getTrimBox().getArrayAsRectangle());
  5203 + dest_page.getTrimBox().getArrayAsRectangle(), cm);
  5204 + dest_page.copyAnnotations(
  5205 + from_page, cm, dest_afdh, make_afdh(from_page));
5208 5206 if (! new_content.empty())
5209 5207 {
5210 5208 resources.mergeResources(
... ...