// Copyright (c) 2005-2022 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) const; // ABI: delete non-const version 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) const; // ABI: delete non-const version QPDF_DLL QPDFObjectHandle::Rectangle transformRectangle( QPDFObjectHandle::Rectangle r); // operator== tests for exact equality, not considering deltas for // floating point. QPDF_DLL bool operator==(QPDFMatrix const& rhs) const; QPDF_DLL bool operator!=(QPDFMatrix const& rhs) const { return ! operator==(rhs); } double a; double b; double c; double d; double e; double f; }; #endif // QPDFMATRIX_HH