• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 The PDFium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 
7 #include "fxbarcode/cfx_barcode.h"
8 
9 #include <memory>
10 
11 #include "core/fxcrt/notreached.h"
12 #include "core/fxcrt/ptr_util.h"
13 #include "fxbarcode/cbc_codabar.h"
14 #include "fxbarcode/cbc_code128.h"
15 #include "fxbarcode/cbc_code39.h"
16 #include "fxbarcode/cbc_codebase.h"
17 #include "fxbarcode/cbc_datamatrix.h"
18 #include "fxbarcode/cbc_ean13.h"
19 #include "fxbarcode/cbc_ean8.h"
20 #include "fxbarcode/cbc_pdf417i.h"
21 #include "fxbarcode/cbc_qrcode.h"
22 #include "fxbarcode/cbc_upca.h"
23 
24 namespace {
25 
CreateBarCodeEngineObject(BC_TYPE type)26 std::unique_ptr<CBC_CodeBase> CreateBarCodeEngineObject(BC_TYPE type) {
27   switch (type) {
28     case BC_TYPE::kCode39:
29       return std::make_unique<CBC_Code39>();
30     case BC_TYPE::kCodabar:
31       return std::make_unique<CBC_Codabar>();
32     case BC_TYPE::kCode128:
33       return std::make_unique<CBC_Code128>(BC_TYPE::kCode128B);
34     case BC_TYPE::kCode128B:
35       return std::make_unique<CBC_Code128>(BC_TYPE::kCode128B);
36     case BC_TYPE::kCode128C:
37       return std::make_unique<CBC_Code128>(BC_TYPE::kCode128C);
38     case BC_TYPE::kEAN8:
39       return std::make_unique<CBC_EAN8>();
40     case BC_TYPE::kUPCA:
41       return std::make_unique<CBC_UPCA>();
42     case BC_TYPE::kEAN13:
43       return std::make_unique<CBC_EAN13>();
44     case BC_TYPE::kQRCode:
45       return std::make_unique<CBC_QRCode>();
46     case BC_TYPE::kPDF417:
47       return std::make_unique<CBC_PDF417I>();
48     case BC_TYPE::kDataMatrix:
49       return std::make_unique<CBC_DataMatrix>();
50     case BC_TYPE::kUnknown:
51       return nullptr;
52   }
53   NOTREACHED_NORETURN();
54 }
55 
56 }  // namespace
57 
58 CFX_Barcode::CFX_Barcode() = default;
59 
60 CFX_Barcode::~CFX_Barcode() = default;
61 
Create(BC_TYPE type)62 std::unique_ptr<CFX_Barcode> CFX_Barcode::Create(BC_TYPE type) {
63   auto barcode = pdfium::WrapUnique(new CFX_Barcode());  // Private ctor.
64   barcode->m_pBCEngine = CreateBarCodeEngineObject(type);
65   return barcode;
66 }
67 
GetType()68 BC_TYPE CFX_Barcode::GetType() {
69   return m_pBCEngine ? m_pBCEngine->GetType() : BC_TYPE::kUnknown;
70 }
71 
SetModuleHeight(int32_t moduleHeight)72 bool CFX_Barcode::SetModuleHeight(int32_t moduleHeight) {
73   return m_pBCEngine && m_pBCEngine->SetModuleHeight(moduleHeight);
74 }
75 
SetModuleWidth(int32_t moduleWidth)76 bool CFX_Barcode::SetModuleWidth(int32_t moduleWidth) {
77   return m_pBCEngine && m_pBCEngine->SetModuleWidth(moduleWidth);
78 }
79 
SetHeight(int32_t height)80 void CFX_Barcode::SetHeight(int32_t height) {
81   if (m_pBCEngine)
82     m_pBCEngine->SetHeight(height);
83 }
84 
SetWidth(int32_t width)85 void CFX_Barcode::SetWidth(int32_t width) {
86   if (m_pBCEngine)
87     m_pBCEngine->SetWidth(width);
88 }
89 
SetPrintChecksum(bool checksum)90 bool CFX_Barcode::SetPrintChecksum(bool checksum) {
91   if (!m_pBCEngine)
92     return false;
93 
94   switch (GetType()) {
95     case BC_TYPE::kCode39:
96     case BC_TYPE::kCodabar:
97     case BC_TYPE::kCode128:
98     case BC_TYPE::kCode128B:
99     case BC_TYPE::kCode128C:
100     case BC_TYPE::kEAN8:
101     case BC_TYPE::kEAN13:
102     case BC_TYPE::kUPCA:
103       static_cast<CBC_OneCode*>(m_pBCEngine.get())->SetPrintChecksum(checksum);
104       return true;
105     default:
106       return false;
107   }
108 }
109 
SetDataLength(int32_t length)110 bool CFX_Barcode::SetDataLength(int32_t length) {
111   if (!m_pBCEngine)
112     return false;
113 
114   switch (GetType()) {
115     case BC_TYPE::kCode39:
116     case BC_TYPE::kCodabar:
117     case BC_TYPE::kCode128:
118     case BC_TYPE::kCode128B:
119     case BC_TYPE::kCode128C:
120     case BC_TYPE::kEAN8:
121     case BC_TYPE::kEAN13:
122     case BC_TYPE::kUPCA:
123       static_cast<CBC_OneCode*>(m_pBCEngine.get())->SetDataLength(length);
124       return true;
125     default:
126       return false;
127   }
128 }
129 
SetCalChecksum(bool state)130 bool CFX_Barcode::SetCalChecksum(bool state) {
131   if (!m_pBCEngine)
132     return false;
133 
134   switch (GetType()) {
135     case BC_TYPE::kCode39:
136     case BC_TYPE::kCodabar:
137     case BC_TYPE::kCode128:
138     case BC_TYPE::kCode128B:
139     case BC_TYPE::kCode128C:
140     case BC_TYPE::kEAN8:
141     case BC_TYPE::kEAN13:
142     case BC_TYPE::kUPCA:
143       static_cast<CBC_OneCode*>(m_pBCEngine.get())->SetCalChecksum(state);
144       return true;
145     default:
146       return false;
147   }
148 }
149 
SetFont(CFX_Font * pFont)150 bool CFX_Barcode::SetFont(CFX_Font* pFont) {
151   if (!m_pBCEngine)
152     return false;
153 
154   switch (GetType()) {
155     case BC_TYPE::kCode39:
156     case BC_TYPE::kCodabar:
157     case BC_TYPE::kCode128:
158     case BC_TYPE::kCode128B:
159     case BC_TYPE::kCode128C:
160     case BC_TYPE::kEAN8:
161     case BC_TYPE::kEAN13:
162     case BC_TYPE::kUPCA:
163       return static_cast<CBC_OneCode*>(m_pBCEngine.get())->SetFont(pFont);
164     default:
165       return false;
166   }
167 }
168 
SetFontSize(float size)169 bool CFX_Barcode::SetFontSize(float size) {
170   if (!m_pBCEngine)
171     return false;
172 
173   switch (GetType()) {
174     case BC_TYPE::kCode39:
175     case BC_TYPE::kCodabar:
176     case BC_TYPE::kCode128:
177     case BC_TYPE::kCode128B:
178     case BC_TYPE::kCode128C:
179     case BC_TYPE::kEAN8:
180     case BC_TYPE::kEAN13:
181     case BC_TYPE::kUPCA:
182       static_cast<CBC_OneCode*>(m_pBCEngine.get())->SetFontSize(size);
183       return true;
184     default:
185       return false;
186   }
187 }
188 
SetFontColor(FX_ARGB color)189 bool CFX_Barcode::SetFontColor(FX_ARGB color) {
190   if (!m_pBCEngine)
191     return false;
192 
193   switch (GetType()) {
194     case BC_TYPE::kCode39:
195     case BC_TYPE::kCodabar:
196     case BC_TYPE::kCode128:
197     case BC_TYPE::kCode128B:
198     case BC_TYPE::kCode128C:
199     case BC_TYPE::kEAN8:
200     case BC_TYPE::kEAN13:
201     case BC_TYPE::kUPCA:
202       static_cast<CBC_OneCode*>(m_pBCEngine.get())->SetFontColor(color);
203       return true;
204     default:
205       return false;
206   }
207 }
208 
SetTextLocation(BC_TEXT_LOC location)209 void CFX_Barcode::SetTextLocation(BC_TEXT_LOC location) {
210   if (m_pBCEngine)
211     m_pBCEngine->SetTextLocation(location);
212 }
213 
SetWideNarrowRatio(int8_t ratio)214 bool CFX_Barcode::SetWideNarrowRatio(int8_t ratio) {
215   return m_pBCEngine && m_pBCEngine->SetWideNarrowRatio(ratio);
216 }
217 
SetStartChar(char start)218 bool CFX_Barcode::SetStartChar(char start) {
219   return m_pBCEngine && m_pBCEngine->SetStartChar(start);
220 }
221 
SetEndChar(char end)222 bool CFX_Barcode::SetEndChar(char end) {
223   return m_pBCEngine && m_pBCEngine->SetEndChar(end);
224 }
225 
SetErrorCorrectionLevel(int32_t level)226 bool CFX_Barcode::SetErrorCorrectionLevel(int32_t level) {
227   return m_pBCEngine && m_pBCEngine->SetErrorCorrectionLevel(level);
228 }
229 
Encode(WideStringView contents)230 bool CFX_Barcode::Encode(WideStringView contents) {
231   return m_pBCEngine && m_pBCEngine->Encode(contents);
232 }
233 
RenderDevice(CFX_RenderDevice * device,const CFX_Matrix & matrix)234 bool CFX_Barcode::RenderDevice(CFX_RenderDevice* device,
235                                const CFX_Matrix& matrix) {
236   return m_pBCEngine && m_pBCEngine->RenderDevice(device, matrix);
237 }
238