Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fxbarcode / src / BC_CommonPerspectiveTransform.cpp
1 // Copyright 2014 PDFium Authors. All rights reserved.\r
2 // Use of this source code is governed by a BSD-style license that can be\r
3 // found in the LICENSE file.\r
4 \r
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
6 \r
7 #include "barcode.h"\r
8 #include "include/BC_CommonPerspectiveTransform.h"\r
9 CBC_CommonPerspectiveTransform::CBC_CommonPerspectiveTransform(FX_FLOAT a11, FX_FLOAT a21, FX_FLOAT a31,\r
10         FX_FLOAT a12, FX_FLOAT a22, FX_FLOAT a32,\r
11         FX_FLOAT a13, FX_FLOAT a23, FX_FLOAT a33) :\r
12     m_a11(a11), m_a21(a21), m_a31(a31),\r
13     m_a12(a12), m_a22(a22), m_a32(a32),\r
14     m_a13(a13), m_a23(a23), m_a33(a33)\r
15 {\r
16 }\r
17 CBC_CommonPerspectiveTransform::~CBC_CommonPerspectiveTransform()\r
18 {\r
19 }\r
20 CBC_CommonPerspectiveTransform *CBC_CommonPerspectiveTransform::QuadrilateralToQuadrilateral(FX_FLOAT x0, FX_FLOAT y0,\r
21         FX_FLOAT x1, FX_FLOAT y1,\r
22         FX_FLOAT x2, FX_FLOAT y2,\r
23         FX_FLOAT x3, FX_FLOAT y3,\r
24         FX_FLOAT x0p, FX_FLOAT y0p,\r
25         FX_FLOAT x1p, FX_FLOAT y1p,\r
26         FX_FLOAT x2p, FX_FLOAT y2p,\r
27         FX_FLOAT x3p, FX_FLOAT y3p)\r
28 {\r
29     CBC_AutoPtr<CBC_CommonPerspectiveTransform> qToS(QuadrilateralToSquare(x0, y0, x1, y1, x2, y2, x3, y3));\r
30     CBC_AutoPtr<CBC_CommonPerspectiveTransform> sToQ(SquareToQuadrilateral(x0p, y0p, x1p, y1p, x2p, y2p, x3p, y3p));\r
31     return sToQ->Times(*(qToS.get()));\r
32 }\r
33 void CBC_CommonPerspectiveTransform::TransformPoints(CFX_FloatArray *points)\r
34 {\r
35     FX_INT32 max = points->GetSize();\r
36     FX_FLOAT a11 = m_a11;\r
37     FX_FLOAT a12 = m_a12;\r
38     FX_FLOAT a13 = m_a13;\r
39     FX_FLOAT a21 = m_a21;\r
40     FX_FLOAT a22 = m_a22;\r
41     FX_FLOAT a23 = m_a23;\r
42     FX_FLOAT a31 = m_a31;\r
43     FX_FLOAT a32 = m_a32;\r
44     FX_FLOAT a33 = m_a33;\r
45     FX_INT32 i;\r
46     for (i = 0; i < max; i += 2) {\r
47         FX_FLOAT x = (*points)[i];\r
48         FX_FLOAT y = (*points)[i + 1];\r
49         FX_FLOAT denominator = a13 * x + a23 * y + a33;\r
50         (*points)[i] = (a11 * x + a21 * y + a31) / denominator;\r
51         (*points)[i + 1] = (a12 * x + a22 * y + a32) / denominator;\r
52     }\r
53 }\r
54 CBC_CommonPerspectiveTransform *CBC_CommonPerspectiveTransform::SquareToQuadrilateral(FX_FLOAT x0, FX_FLOAT y0,\r
55         FX_FLOAT x1, FX_FLOAT y1,\r
56         FX_FLOAT x2, FX_FLOAT y2,\r
57         FX_FLOAT x3, FX_FLOAT y3)\r
58 {\r
59     FX_FLOAT dy2 = y3 - y2;\r
60     FX_FLOAT dy3 = y0 - y1 + y2 - y3;\r
61     if ((dy2 == 0.0f) && (dy3 == 0.0f)) {\r
62         return FX_NEW CBC_CommonPerspectiveTransform(x1 - x0, x2 - x1, x0,\r
63                 y1 - y0, y2 - y1, y0,\r
64                 0.0f, 0.0f, 1.0f);\r
65     } else {\r
66         FX_FLOAT dx1 = x1 - x2;\r
67         FX_FLOAT dx2 = x3 - x2;\r
68         FX_FLOAT dx3 = x0 - x1 + x2 - x3;\r
69         FX_FLOAT dy1 = y1 - y2;\r
70         FX_FLOAT denominator = dx1 * dy2 - dx2 * dy1;\r
71         FX_FLOAT a13 = (dx3 * dy2 - dx2 * dy3) / denominator;\r
72         FX_FLOAT a23 = (dx1 * dy3 - dx3 * dy1) / denominator;\r
73         return FX_NEW CBC_CommonPerspectiveTransform(x1 - x0 + a13 * x1, x3 - x0 + a23 * x3, x0,\r
74                 y1 - y0 + a13 * y1, y3 - y0 + a23 * y3, y0,\r
75                 a13, a23, 1.0f);\r
76     }\r
77 }\r
78 CBC_CommonPerspectiveTransform *CBC_CommonPerspectiveTransform::QuadrilateralToSquare(FX_FLOAT x0, FX_FLOAT y0,\r
79         FX_FLOAT x1, FX_FLOAT y1,\r
80         FX_FLOAT x2, FX_FLOAT y2,\r
81         FX_FLOAT x3, FX_FLOAT y3)\r
82 {\r
83     CBC_AutoPtr<CBC_CommonPerspectiveTransform> temp1(SquareToQuadrilateral(x0, y0, x1, y1, x2, y2, x3, y3));\r
84     return temp1->BuildAdjoint();\r
85 }\r
86 CBC_CommonPerspectiveTransform *CBC_CommonPerspectiveTransform::BuildAdjoint()\r
87 {\r
88     return FX_NEW CBC_CommonPerspectiveTransform(m_a22 * m_a33 - m_a23 * m_a32,\r
89             m_a23 * m_a31 - m_a21 * m_a33,\r
90             m_a21 * m_a32 - m_a22 * m_a31,\r
91             m_a13 * m_a32 - m_a12 * m_a33,\r
92             m_a11 * m_a33 - m_a13 * m_a31,\r
93             m_a12 * m_a31 - m_a11 * m_a32,\r
94             m_a12 * m_a23 - m_a13 * m_a22,\r
95             m_a13 * m_a21 - m_a11 * m_a23,\r
96             m_a11 * m_a22 - m_a12 * m_a21);\r
97 }\r
98 CBC_CommonPerspectiveTransform *CBC_CommonPerspectiveTransform::Times(CBC_CommonPerspectiveTransform &other)\r
99 {\r
100     return FX_NEW CBC_CommonPerspectiveTransform(m_a11 * other.m_a11 + m_a21 * other.m_a12 + m_a31 * other.m_a13,\r
101             m_a11 * other.m_a21 + m_a21 * other.m_a22 + m_a31 * other.m_a23,\r
102             m_a11 * other.m_a31 + m_a21 * other.m_a32 + m_a31 * other.m_a33,\r
103             m_a12 * other.m_a11 + m_a22 * other.m_a12 + m_a32 * other.m_a13,\r
104             m_a12 * other.m_a21 + m_a22 * other.m_a22 + m_a32 * other.m_a23,\r
105             m_a12 * other.m_a31 + m_a22 * other.m_a32 + m_a32 * other.m_a33,\r
106             m_a13 * other.m_a11 + m_a23 * other.m_a12 + m_a33 * other.m_a13,\r
107             m_a13 * other.m_a21 + m_a23 * other.m_a22 + m_a33 * other.m_a23,\r
108             m_a13 * other.m_a31 + m_a23 * other.m_a32 + m_a33 * other.m_a33);\r
109 }\r