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)26std::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)62std::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()68BC_TYPE CFX_Barcode::GetType() { 69 return m_pBCEngine ? m_pBCEngine->GetType() : BC_TYPE::kUnknown; 70 } 71 SetCharEncoding(BC_CHAR_ENCODING encoding)72void CFX_Barcode::SetCharEncoding(BC_CHAR_ENCODING encoding) { 73 if (m_pBCEngine) 74 m_pBCEngine->SetCharEncoding(encoding); 75 } 76 SetModuleHeight(int32_t moduleHeight)77bool CFX_Barcode::SetModuleHeight(int32_t moduleHeight) { 78 return m_pBCEngine && m_pBCEngine->SetModuleHeight(moduleHeight); 79 } 80 SetModuleWidth(int32_t moduleWidth)81bool CFX_Barcode::SetModuleWidth(int32_t moduleWidth) { 82 return m_pBCEngine && m_pBCEngine->SetModuleWidth(moduleWidth); 83 } 84 SetHeight(int32_t height)85void CFX_Barcode::SetHeight(int32_t height) { 86 if (m_pBCEngine) 87 m_pBCEngine->SetHeight(height); 88 } 89 SetWidth(int32_t width)90void CFX_Barcode::SetWidth(int32_t width) { 91 if (m_pBCEngine) 92 m_pBCEngine->SetWidth(width); 93 } 94 SetPrintChecksum(bool checksum)95bool 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)115bool 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)135bool 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)155bool 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)174bool 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)194bool 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)214void CFX_Barcode::SetTextLocation(BC_TEXT_LOC location) { 215 if (m_pBCEngine) 216 m_pBCEngine->SetTextLocation(location); 217 } 218 SetWideNarrowRatio(int8_t ratio)219bool CFX_Barcode::SetWideNarrowRatio(int8_t ratio) { 220 return m_pBCEngine && m_pBCEngine->SetWideNarrowRatio(ratio); 221 } 222 SetStartChar(char start)223bool CFX_Barcode::SetStartChar(char start) { 224 return m_pBCEngine && m_pBCEngine->SetStartChar(start); 225 } 226 SetEndChar(char end)227bool CFX_Barcode::SetEndChar(char end) { 228 return m_pBCEngine && m_pBCEngine->SetEndChar(end); 229 } 230 SetErrorCorrectionLevel(int32_t level)231bool CFX_Barcode::SetErrorCorrectionLevel(int32_t level) { 232 return m_pBCEngine && m_pBCEngine->SetErrorCorrectionLevel(level); 233 } 234 Encode(WideStringView contents)235bool CFX_Barcode::Encode(WideStringView contents) { 236 return m_pBCEngine && m_pBCEngine->Encode(contents); 237 } 238 RenderDevice(CFX_RenderDevice * device,const CFX_Matrix & matrix)239bool CFX_Barcode::RenderDevice(CFX_RenderDevice* device, 240 const CFX_Matrix& matrix) { 241 return m_pBCEngine && m_pBCEngine->RenderDevice(device, matrix); 242 } 243