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)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 SetModuleHeight(int32_t moduleHeight)72bool CFX_Barcode::SetModuleHeight(int32_t moduleHeight) { 73 return m_pBCEngine && m_pBCEngine->SetModuleHeight(moduleHeight); 74 } 75 SetModuleWidth(int32_t moduleWidth)76bool CFX_Barcode::SetModuleWidth(int32_t moduleWidth) { 77 return m_pBCEngine && m_pBCEngine->SetModuleWidth(moduleWidth); 78 } 79 SetHeight(int32_t height)80void CFX_Barcode::SetHeight(int32_t height) { 81 if (m_pBCEngine) 82 m_pBCEngine->SetHeight(height); 83 } 84 SetWidth(int32_t width)85void CFX_Barcode::SetWidth(int32_t width) { 86 if (m_pBCEngine) 87 m_pBCEngine->SetWidth(width); 88 } 89 SetPrintChecksum(bool checksum)90bool 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)110bool 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)130bool 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)150bool 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)169bool 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)189bool 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)209void CFX_Barcode::SetTextLocation(BC_TEXT_LOC location) { 210 if (m_pBCEngine) 211 m_pBCEngine->SetTextLocation(location); 212 } 213 SetWideNarrowRatio(int8_t ratio)214bool CFX_Barcode::SetWideNarrowRatio(int8_t ratio) { 215 return m_pBCEngine && m_pBCEngine->SetWideNarrowRatio(ratio); 216 } 217 SetStartChar(char start)218bool CFX_Barcode::SetStartChar(char start) { 219 return m_pBCEngine && m_pBCEngine->SetStartChar(start); 220 } 221 SetEndChar(char end)222bool CFX_Barcode::SetEndChar(char end) { 223 return m_pBCEngine && m_pBCEngine->SetEndChar(end); 224 } 225 SetErrorCorrectionLevel(int32_t level)226bool CFX_Barcode::SetErrorCorrectionLevel(int32_t level) { 227 return m_pBCEngine && m_pBCEngine->SetErrorCorrectionLevel(level); 228 } 229 Encode(WideStringView contents)230bool CFX_Barcode::Encode(WideStringView contents) { 231 return m_pBCEngine && m_pBCEngine->Encode(contents); 232 } 233 RenderDevice(CFX_RenderDevice * device,const CFX_Matrix & matrix)234bool CFX_Barcode::RenderDevice(CFX_RenderDevice* device, 235 const CFX_Matrix& matrix) { 236 return m_pBCEngine && m_pBCEngine->RenderDevice(device, matrix); 237 } 238