summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/fpdfapi/page/cpdf_page.cpp29
-rw-r--r--core/fpdfapi/page/cpdf_page.h7
2 files changed, 35 insertions, 1 deletions
diff --git a/core/fpdfapi/page/cpdf_page.cpp b/core/fpdfapi/page/cpdf_page.cpp
index dfbd342f13..6213e5fccb 100644
--- a/core/fpdfapi/page/cpdf_page.cpp
+++ b/core/fpdfapi/page/cpdf_page.cpp
@@ -178,6 +178,35 @@ CFX_Matrix CPDF_Page::GetDisplayMatrix(int xPos,
return matrix;
}
+// This method follows the same apparent logic as GetDisplayMatrix(). For
+// example, consider point 0. First, take the top left coordinate of the
+// rectangle in the transformed space. Now, calculate what this point was in the
+// original space by inverting. Note that this is not necessarily the same as
+// the top left corner of the original rectangle.
+CFX_Matrix CPDF_Page::GetDisplayMatrixWithTransformation(
+ int xPos,
+ int yPos,
+ int xSize,
+ int ySize,
+ const CFX_Matrix& transformation) {
+ CFX_FloatRect rect(xPos, yPos, xPos + xSize, yPos + ySize);
+ rect = transformation.TransformRect(rect);
+ CFX_Matrix inverse = transformation.GetInverse();
+ CFX_PointF point0(rect.left, rect.top);
+ CFX_PointF point1(rect.left, rect.bottom);
+ CFX_PointF point2(rect.right, rect.top);
+ point0 = inverse.Transform(point0);
+ point1 = inverse.Transform(point1);
+ point2 = inverse.Transform(point2);
+
+ CFX_Matrix matrix = m_PageMatrix;
+ matrix.Concat(CFX_Matrix(
+ (point2.x - point0.x) / m_PageWidth, (point2.y - point0.y) / m_PageWidth,
+ (point1.x - point0.x) / m_PageHeight,
+ (point1.y - point0.y) / m_PageHeight, point0.x, point0.y));
+ return matrix;
+}
+
int CPDF_Page::GetPageRotation() const {
CPDF_Object* pRotate = GetPageAttr("Rotate");
int rotate = pRotate ? (pRotate->GetInteger() / 90) % 4 : 0;
diff --git a/core/fpdfapi/page/cpdf_page.h b/core/fpdfapi/page/cpdf_page.h
index 1891e651be..47fba3caec 100644
--- a/core/fpdfapi/page/cpdf_page.h
+++ b/core/fpdfapi/page/cpdf_page.h
@@ -38,11 +38,16 @@ class CPDF_Page : public CPDF_PageObjectHolder {
int xSize,
int ySize,
int iRotate) const;
+ CFX_Matrix GetDisplayMatrixWithTransformation(
+ int xPos,
+ int yPos,
+ int xSize,
+ int ySize,
+ const CFX_Matrix& transformation);
float GetPageWidth() const { return m_PageWidth; }
float GetPageHeight() const { return m_PageHeight; }
CFX_FloatRect GetPageBBox() const { return m_BBox; }
- const CFX_Matrix& GetPageMatrix() const { return m_PageMatrix; }
int GetPageRotation() const;
CPDF_PageRenderCache* GetRenderCache() const { return m_pPageRender.get(); }