From e2593e2efe140d47870b0c511cbf5160db080edd Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Fri, 12 Feb 2021 04:44:15 -0500 Subject: [PATCH] Move QPDFMatrix into the public API --- ChangeLog | 4 ++ include/qpdf/QPDFMatrix.hh | 95 ++++++++++++++++++++++++++++++++++++++ libqpdf/QPDFMatrix.cc | 3 -- libqpdf/qpdf/QPDFMatrix.hh | 53 --------------------- manual/qpdf-manual.xml | 9 ++++ 5 files changed, 108 insertions(+), 56 deletions(-) create mode 100644 include/qpdf/QPDFMatrix.hh delete mode 100644 libqpdf/qpdf/QPDFMatrix.hh diff --git a/ChangeLog b/ChangeLog index ec8fe4bd..b9f44077 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2021-02-12 Jay Berkenbilt + * Move formerly internal QPDFMatrix class to the public API. This + class provides convenience methods for working with transformation + matrices. + * QUtil::double_to_string: trim trailing zeroes by default, and add option to not trim trailing zeroes. This causes a syntactic but semantically preserving change in output when doubles are diff --git a/include/qpdf/QPDFMatrix.hh b/include/qpdf/QPDFMatrix.hh new file mode 100644 index 00000000..85f42af7 --- /dev/null +++ b/include/qpdf/QPDFMatrix.hh @@ -0,0 +1,95 @@ +// Copyright (c) 2005-2021 Jay Berkenbilt +// +// This file is part of qpdf. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Versions of qpdf prior to version 7 were released under the terms +// of version 2.0 of the Artistic License. At your option, you may +// continue to consider qpdf to be licensed under those terms. Please +// see the manual for additional information. + +#ifndef QPDFMATRIX_HH +#define QPDFMATRIX_HH + +#include +#include +#include + +// This class represents a PDF transformation matrix using a tuple +// such that +// +// ┌ ┐ +// │ a b 0 │ +// (a, b, c, d, e, f) = │ c d 0 │ +// │ e f 1 │ +// └ ┘ + +class QPDFMatrix +{ + public: + QPDF_DLL + QPDFMatrix(); + QPDF_DLL + QPDFMatrix(double a, double b, double c, + double d, double e, double f); + QPDF_DLL + QPDFMatrix(QPDFObjectHandle::Matrix const&); + + // Returns the six values separated by spaces as real numbers with + // trimmed zeroes. + QPDF_DLL + std::string unparse() const; + + QPDF_DLL + QPDFObjectHandle::Matrix getAsMatrix() const; + + // Replace this with other * this + QPDF_DLL + void concat(QPDFMatrix const& other); + + // Same as concat(sx, 0, 0, sy, 0, 0) + QPDF_DLL + void scale(double sx, double sy); + + // Same as concat(1, 0, 0, 1, tx, ty); + QPDF_DLL + void translate(double tx, double ty); + + // Any value other than 90, 180, or 270 is ignored + QPDF_DLL + void rotatex90(int angle); + + // Transform a point. The underlying operation is to take + // [x y 1] * this + // and take the first and second rows of the result as xp and yp. + QPDF_DLL + void transform(double x, double y, double& xp, double& yp); + + // Transform a rectangle by creating a new rectangle that tightly + // bounds the polygon resulting from transforming the four + // corners. + QPDF_DLL + QPDFObjectHandle::Rectangle transformRectangle( + QPDFObjectHandle::Rectangle r); + + private: + double a; + double b; + double c; + double d; + double e; + double f; +}; + +#endif // QPDFMATRIX_HH diff --git a/libqpdf/QPDFMatrix.cc b/libqpdf/QPDFMatrix.cc index c78154aa..18122d72 100644 --- a/libqpdf/QPDFMatrix.cc +++ b/libqpdf/QPDFMatrix.cc @@ -118,9 +118,6 @@ QPDFMatrix::transform(double x, double y, double& xp, double& yp) QPDFObjectHandle::Rectangle QPDFMatrix::transformRectangle(QPDFObjectHandle::Rectangle r) { - // Transform a rectangle by creating a new rectangle the tightly - // bounds the polygon resulting from transforming the four - // corners. std::vector tx(4); std::vector ty(4); transform(r.llx, r.lly, tx.at(0), ty.at(0)); diff --git a/libqpdf/qpdf/QPDFMatrix.hh b/libqpdf/qpdf/QPDFMatrix.hh deleted file mode 100644 index 7b19a665..00000000 --- a/libqpdf/qpdf/QPDFMatrix.hh +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef QPDFMATRIX_HH -#define QPDFMATRIX_HH - -#include -#include -#include - -class QPDFMatrix -{ - public: - QPDF_DLL - QPDFMatrix(); - QPDF_DLL - QPDFMatrix(double a, double b, double c, - double d, double e, double f); - QPDF_DLL - QPDFMatrix(QPDFObjectHandle::Matrix const&); - - QPDF_DLL - std::string unparse() const; - - QPDF_DLL - QPDFObjectHandle::Matrix getAsMatrix() const; - - // This is not part of the public API. Just provide the methods we - // need as we need them. - QPDF_DLL - void concat(QPDFMatrix const& other); - QPDF_DLL - void scale(double sx, double sy); - QPDF_DLL - void translate(double tx, double ty); - // Any value other than 90, 180, or 270 is ignored - QPDF_DLL - void rotatex90(int angle); - - QPDF_DLL - void transform(double x, double y, double& xp, double& yp); - - QPDF_DLL - QPDFObjectHandle::Rectangle transformRectangle( - QPDFObjectHandle::Rectangle r); - - private: - double a; - double b; - double c; - double d; - double e; - double f; -}; - -#endif // QPDFMATRIX_HH diff --git a/manual/qpdf-manual.xml b/manual/qpdf-manual.xml index 241431b9..58012e30 100644 --- a/manual/qpdf-manual.xml +++ b/manual/qpdf-manual.xml @@ -5220,6 +5220,15 @@ print "\n"; rotations. + + + The QPDFMatrix class, formerly a + private, internal class, has been added to the public API. + See include/qpdf/QPDFMatrix.hh for + details. This class is for working with transformation + matrices. + +