xref: /aosp_15_r20/external/pdfium/fxbarcode/cfx_barcode.cpp (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
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 "fxbarcode/cbc_codabar.h"
12 #include "fxbarcode/cbc_code128.h"
13 #include "fxbarcode/cbc_code39.h"
14 #include "fxbarcode/cbc_codebase.h"
15 #include "fxbarcode/cbc_datamatrix.h"
16 #include "fxbarcode/cbc_ean13.h"
17 #include "fxbarcode/cbc_ean8.h"
18 #include "fxbarcode/cbc_pdf417i.h"
19 #include "fxbarcode/cbc_qrcode.h"
20 #include "fxbarcode/cbc_upca.h"
21 #include "third_party/base/memory/ptr_util.h"
22 #include "third_party/base/notreached.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 
SetCharEncoding(BC_CHAR_ENCODING encoding)72 void CFX_Barcode::SetCharEncoding(BC_CHAR_ENCODING encoding) {
73   if (m_pBCEngine)
74     m_pBCEngine->SetCharEncoding(encoding);
75 }
76 
SetModuleHeight(int32_t moduleHeight)77 bool CFX_Barcode::SetModuleHeight(int32_t moduleHeight) {
78   return m_pBCEngine && m_pBCEngine->SetModuleHeight(moduleHeight);
79 }
80 
SetModuleWidth(int32_t moduleWidth)81 bool CFX_Barcode::SetModuleWidth(int32_t moduleWidth) {
82   return m_pBCEngine && m_pBCEngine->SetModuleWidth(moduleWidth);
83 }
84 
SetHeight(int32_t height)85 void CFX_Barcode::SetHeight(int32_t height) {
86   if (m_pBCEngine)
87     m_pBCEngine->SetHeight(height);
88 }
89 
SetWidth(int32_t width)90 void CFX_Barcode::SetWidth(int32_t width) {
91   if (m_pBCEngine)
92     m_pBCEngine->SetWidth(width);
93 }
94 
SetPrintChecksum(bool checksum)95 bool CFX_Barcode::SetPrintChecksum(bool checksum) {
96   if (!m_pBCEngine)
97     return false;
98 
99   switch (GetType()) {
100     case BC_TYPE::kCode39:
101     case BC_TYPE::kCodabar:
102     case BC_TYPE::kCode128:
103     case BC_TYPE::kCode128B:
104     case BC_TYPE::kCode128C:
105     case BC_TYPE::kEAN8:
106     case BC_TYPE::kEAN13:
107     case BC_TYPE::kUPCA:
108       static_cast<CBC_OneCode*>(m_pBCEngine.get())->SetPrintChecksum(checksum);
109       return true;
110     default:
111       return false;
112   }
113 }
114 
SetDataLength(int32_t length)115 bool CFX_Barcode::SetDataLength(int32_t length) {
116   if (!m_pBCEngine)
117     return false;
118 
119   switch (GetType()) {
120     case BC_TYPE::kCode39:
121     case BC_TYPE::kCodabar:
122     case BC_TYPE::kCode128:
123     case BC_TYPE::kCode128B:
124     case BC_TYPE::kCode128C:
125     case BC_TYPE::kEAN8:
126     case BC_TYPE::kEAN13:
127     case BC_TYPE::kUPCA:
128       static_cast<CBC_OneCode*>(m_pBCEngine.get())->SetDataLength(length);
129       return true;
130     default:
131       return false;
132   }
133 }
134 
SetCalChecksum(bool state)135 bool CFX_Barcode::SetCalChecksum(bool state) {
136   if (!m_pBCEngine)
137     return false;
138 
139   switch (GetType()) {
140     case BC_TYPE::kCode39:
141     case BC_TYPE::kCodabar:
142     case BC_TYPE::kCode128:
143     case BC_TYPE::kCode128B:
144     case BC_TYPE::kCode128C:
145     case BC_TYPE::kEAN8:
146     case BC_TYPE::kEAN13:
147     case BC_TYPE::kUPCA:
148       static_cast<CBC_OneCode*>(m_pBCEngine.get())->SetCalChecksum(state);
149       return true;
150     default:
151       return false;
152   }
153 }
154 
SetFont(CFX_Font * pFont)155 bool CFX_Barcode::SetFont(CFX_Font* pFont) {
156   if (!m_pBCEngine)
157     return false;
158 
159   switch (GetType()) {
160     case BC_TYPE::kCode39:
161     case BC_TYPE::kCodabar:
162     case BC_TYPE::kCode128:
163     case BC_TYPE::kCode128B:
164     case BC_TYPE::kCode128C:
165     case BC_TYPE::kEAN8:
166     case BC_TYPE::kEAN13:
167     case BC_TYPE::kUPCA:
168       return static_cast<CBC_OneCode*>(m_pBCEngine.get())->SetFont(pFont);
169     default:
170       return false;
171   }
172 }
173 
SetFontSize(float size)174 bool CFX_Barcode::SetFontSize(float size) {
175   if (!m_pBCEngine)
176     return false;
177 
178   switch (GetType()) {
179     case BC_TYPE::kCode39:
180     case BC_TYPE::kCodabar:
181     case BC_TYPE::kCode128:
182     case BC_TYPE::kCode128B:
183     case BC_TYPE::kCode128C:
184     case BC_TYPE::kEAN8:
185     case BC_TYPE::kEAN13:
186     case BC_TYPE::kUPCA:
187       static_cast<CBC_OneCode*>(m_pBCEngine.get())->SetFontSize(size);
188       return true;
189     default:
190       return false;
191   }
192 }
193 
SetFontColor(FX_ARGB color)194 bool CFX_Barcode::SetFontColor(FX_ARGB color) {
195   if (!m_pBCEngine)
196     return false;
197 
198   switch (GetType()) {
199     case BC_TYPE::kCode39:
200     case BC_TYPE::kCodabar:
201     case BC_TYPE::kCode128:
202     case BC_TYPE::kCode128B:
203     case BC_TYPE::kCode128C:
204     case BC_TYPE::kEAN8:
205     case BC_TYPE::kEAN13:
206     case BC_TYPE::kUPCA:
207       static_cast<CBC_OneCode*>(m_pBCEngine.get())->SetFontColor(color);
208       return true;
209     default:
210       return false;
211   }
212 }
213 
SetTextLocation(BC_TEXT_LOC location)214 void CFX_Barcode::SetTextLocation(BC_TEXT_LOC location) {
215   if (m_pBCEngine)
216     m_pBCEngine->SetTextLocation(location);
217 }
218 
SetWideNarrowRatio(int8_t ratio)219 bool CFX_Barcode::SetWideNarrowRatio(int8_t ratio) {
220   return m_pBCEngine && m_pBCEngine->SetWideNarrowRatio(ratio);
221 }
222 
SetStartChar(char start)223 bool CFX_Barcode::SetStartChar(char start) {
224   return m_pBCEngine && m_pBCEngine->SetStartChar(start);
225 }
226 
SetEndChar(char end)227 bool CFX_Barcode::SetEndChar(char end) {
228   return m_pBCEngine && m_pBCEngine->SetEndChar(end);
229 }
230 
SetErrorCorrectionLevel(int32_t level)231 bool CFX_Barcode::SetErrorCorrectionLevel(int32_t level) {
232   return m_pBCEngine && m_pBCEngine->SetErrorCorrectionLevel(level);
233 }
234 
Encode(WideStringView contents)235 bool CFX_Barcode::Encode(WideStringView contents) {
236   return m_pBCEngine && m_pBCEngine->Encode(contents);
237 }
238 
RenderDevice(CFX_RenderDevice * device,const CFX_Matrix & matrix)239 bool CFX_Barcode::RenderDevice(CFX_RenderDevice* device,
240                                const CFX_Matrix& matrix) {
241   return m_pBCEngine && m_pBCEngine->RenderDevice(device, matrix);
242 }
243