Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fxbarcode / src / BC_PDF417BarcodeMatrix.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_PDF417BarcodeRow.h"\r
9 #include "include/BC_PDF417BarcodeMatrix.h"\r
10 CBC_BarcodeMatrix::CBC_BarcodeMatrix(FX_INT32 height, FX_INT32 width)\r
11 {\r
12     m_matrix.SetSize(height + 2);\r
13     for (FX_INT32 i = 0, matrixLength = m_matrix.GetSize(); i < matrixLength; i++) {\r
14         m_matrix[i] = FX_NEW CBC_BarcodeRow((width + 4) * 17 + 1);\r
15     }\r
16     m_width = width * 17;\r
17     m_height = height + 2;\r
18     m_currentRow = 0;\r
19     m_outHeight = 0;\r
20     m_outWidth = 0;\r
21 }\r
22 CBC_BarcodeMatrix::~CBC_BarcodeMatrix()\r
23 {\r
24     for (FX_INT32 i = 0; i < m_matrix.GetSize(); i++) {\r
25         delete (CBC_BarcodeRow*)m_matrix.GetAt(i);\r
26     }\r
27     m_matrix.RemoveAll();\r
28     m_matrixOut.RemoveAll();\r
29 }\r
30 void CBC_BarcodeMatrix::set(FX_INT32 x, FX_INT32 y, FX_BYTE value)\r
31 {\r
32     ((CBC_BarcodeRow*)m_matrix[y])->set(x, value);\r
33 }\r
34 void CBC_BarcodeMatrix::setMatrix(FX_INT32 x, FX_INT32 y, FX_BOOL black)\r
35 {\r
36     set(x, y, (FX_BYTE) (black ? 1 : 0));\r
37 }\r
38 void CBC_BarcodeMatrix::startRow()\r
39 {\r
40     ++m_currentRow;\r
41 }\r
42 CBC_BarcodeRow* CBC_BarcodeMatrix::getCurrentRow()\r
43 {\r
44     return (CBC_BarcodeRow*)m_matrix[m_currentRow];\r
45 }\r
46 FX_INT32 CBC_BarcodeMatrix::getWidth()\r
47 {\r
48     return m_outWidth;\r
49 }\r
50 FX_INT32 CBC_BarcodeMatrix::getHeight()\r
51 {\r
52     return m_outHeight;\r
53 }\r
54 CFX_ByteArray& CBC_BarcodeMatrix::getMatrix()\r
55 {\r
56     return getScaledMatrix(1, 1);\r
57 }\r
58 CFX_ByteArray& CBC_BarcodeMatrix::getScaledMatrix(FX_INT32 scale)\r
59 {\r
60     return getScaledMatrix(scale, scale);\r
61 }\r
62 CFX_ByteArray& CBC_BarcodeMatrix::getScaledMatrix(FX_INT32 xScale, FX_INT32 yScale)\r
63 {\r
64     FX_INT32 yMax = m_height * yScale;\r
65     CFX_ByteArray bytearray;\r
66     bytearray.Copy(((CBC_BarcodeRow*)m_matrix[0])->getScaledRow(xScale));\r
67     FX_INT32 xMax = bytearray.GetSize();\r
68     m_matrixOut.SetSize(xMax * yMax);\r
69     m_outWidth = xMax;\r
70     m_outHeight = yMax;\r
71     FX_INT32 k = 0;\r
72     for (FX_INT32 i = 0; i < yMax; i++) {\r
73         if (i != 0) {\r
74             bytearray.Copy(((CBC_BarcodeRow*)m_matrix[i / yScale])->getScaledRow(xScale));\r
75         }\r
76         k = i * xMax;\r
77         for (FX_INT32 l = 0; l < xMax; l++) {\r
78             m_matrixOut[k + l] = bytearray.GetAt(l);\r
79         }\r
80     }\r
81     return m_matrixOut;\r
82 }\r