1 // Copyright 2014 PDFium Authors. All rights reserved. 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 "xfa/fwl/cfx_barcode.h" 8 9 #include "xfa/fxbarcode/cbc_codabar.h" 10 #include "xfa/fxbarcode/cbc_code128.h" 11 #include "xfa/fxbarcode/cbc_code39.h" 12 #include "xfa/fxbarcode/cbc_codebase.h" 13 #include "xfa/fxbarcode/cbc_datamatrix.h" 14 #include "xfa/fxbarcode/cbc_ean13.h" 15 #include "xfa/fxbarcode/cbc_ean8.h" 16 #include "xfa/fxbarcode/cbc_pdf417i.h" 17 #include "xfa/fxbarcode/cbc_qrcode.h" 18 #include "xfa/fxbarcode/cbc_upca.h" 19 #include "xfa/fxbarcode/utils.h" 20 21 namespace { 22 23 CBC_CodeBase* CreateBarCodeEngineObject(BC_TYPE type) { 24 switch (type) { 25 case BC_CODE39: 26 return new CBC_Code39(); 27 case BC_CODABAR: 28 return new CBC_Codabar(); 29 case BC_CODE128: 30 return new CBC_Code128(BC_CODE128_B); 31 case BC_CODE128_B: 32 return new CBC_Code128(BC_CODE128_B); 33 case BC_CODE128_C: 34 return new CBC_Code128(BC_CODE128_C); 35 case BC_EAN8: 36 return new CBC_EAN8(); 37 case BC_UPCA: 38 return new CBC_UPCA(); 39 case BC_EAN13: 40 return new CBC_EAN13(); 41 case BC_QR_CODE: 42 return new CBC_QRCode(); 43 case BC_PDF417: 44 return new CBC_PDF417I(); 45 case BC_DATAMATRIX: 46 return new CBC_DataMatrix(); 47 case BC_UNKNOWN: 48 default: 49 return nullptr; 50 } 51 } 52 53 } // namespace 54 55 CFX_Barcode::CFX_Barcode() {} 56 57 CFX_Barcode::~CFX_Barcode() {} 58 59 bool CFX_Barcode::Create(BC_TYPE type) { 60 m_pBCEngine.reset(CreateBarCodeEngineObject(type)); 61 return !!m_pBCEngine; 62 } 63 64 BC_TYPE CFX_Barcode::GetType() { 65 return m_pBCEngine ? m_pBCEngine->GetType() : BC_UNKNOWN; 66 } 67 68 bool CFX_Barcode::SetCharEncoding(BC_CHAR_ENCODING encoding) { 69 return m_pBCEngine ? m_pBCEngine->SetCharEncoding(encoding) : false; 70 } 71 72 bool CFX_Barcode::SetModuleHeight(int32_t moduleHeight) { 73 return m_pBCEngine ? m_pBCEngine->SetModuleHeight(moduleHeight) : false; 74 } 75 76 bool CFX_Barcode::SetModuleWidth(int32_t moduleWidth) { 77 return m_pBCEngine ? m_pBCEngine->SetModuleWidth(moduleWidth) : false; 78 } 79 80 bool CFX_Barcode::SetHeight(int32_t height) { 81 return m_pBCEngine ? m_pBCEngine->SetHeight(height) : false; 82 } 83 84 bool CFX_Barcode::SetWidth(int32_t width) { 85 return m_pBCEngine ? m_pBCEngine->SetWidth(width) : false; 86 } 87 88 bool CFX_Barcode::SetPrintChecksum(bool checksum) { 89 switch (GetType()) { 90 case BC_CODE39: 91 case BC_CODABAR: 92 case BC_CODE128: 93 case BC_CODE128_B: 94 case BC_CODE128_C: 95 case BC_EAN8: 96 case BC_EAN13: 97 case BC_UPCA: 98 return m_pBCEngine ? (static_cast<CBC_OneCode*>(m_pBCEngine.get()) 99 ->SetPrintChecksum(checksum), 100 true) 101 : false; 102 default: 103 return false; 104 } 105 } 106 107 bool CFX_Barcode::SetDataLength(int32_t length) { 108 switch (GetType()) { 109 case BC_CODE39: 110 case BC_CODABAR: 111 case BC_CODE128: 112 case BC_CODE128_B: 113 case BC_CODE128_C: 114 case BC_EAN8: 115 case BC_EAN13: 116 case BC_UPCA: 117 return m_pBCEngine ? (static_cast<CBC_OneCode*>(m_pBCEngine.get()) 118 ->SetDataLength(length), 119 true) 120 : false; 121 default: 122 return false; 123 } 124 } 125 126 bool CFX_Barcode::SetCalChecksum(bool state) { 127 switch (GetType()) { 128 case BC_CODE39: 129 case BC_CODABAR: 130 case BC_CODE128: 131 case BC_CODE128_B: 132 case BC_CODE128_C: 133 case BC_EAN8: 134 case BC_EAN13: 135 case BC_UPCA: 136 return m_pBCEngine ? (static_cast<CBC_OneCode*>(m_pBCEngine.get()) 137 ->SetCalChecksum(state), 138 true) 139 : false; 140 default: 141 return false; 142 } 143 } 144 145 bool CFX_Barcode::SetFont(CFX_Font* pFont) { 146 switch (GetType()) { 147 case BC_CODE39: 148 case BC_CODABAR: 149 case BC_CODE128: 150 case BC_CODE128_B: 151 case BC_CODE128_C: 152 case BC_EAN8: 153 case BC_EAN13: 154 case BC_UPCA: 155 return m_pBCEngine 156 ? static_cast<CBC_OneCode*>(m_pBCEngine.get())->SetFont(pFont) 157 : false; 158 default: 159 return false; 160 } 161 } 162 163 bool CFX_Barcode::SetFontSize(FX_FLOAT size) { 164 switch (GetType()) { 165 case BC_CODE39: 166 case BC_CODABAR: 167 case BC_CODE128: 168 case BC_CODE128_B: 169 case BC_CODE128_C: 170 case BC_EAN8: 171 case BC_EAN13: 172 case BC_UPCA: 173 return m_pBCEngine ? (static_cast<CBC_OneCode*>(m_pBCEngine.get()) 174 ->SetFontSize(size), 175 true) 176 : false; 177 default: 178 return false; 179 } 180 } 181 182 bool CFX_Barcode::SetFontColor(FX_ARGB color) { 183 switch (GetType()) { 184 case BC_CODE39: 185 case BC_CODABAR: 186 case BC_CODE128: 187 case BC_CODE128_B: 188 case BC_CODE128_C: 189 case BC_EAN8: 190 case BC_EAN13: 191 case BC_UPCA: 192 return m_pBCEngine ? (static_cast<CBC_OneCode*>(m_pBCEngine.get()) 193 ->SetFontColor(color), 194 true) 195 : false; 196 default: 197 return false; 198 } 199 } 200 201 bool CFX_Barcode::SetTextLocation(BC_TEXT_LOC location) { 202 typedef bool (CBC_CodeBase::*memptrtype)(BC_TEXT_LOC); 203 memptrtype memptr = nullptr; 204 switch (GetType()) { 205 case BC_CODE39: 206 memptr = (memptrtype)&CBC_Code39::SetTextLocation; 207 break; 208 case BC_CODABAR: 209 memptr = (memptrtype)&CBC_Codabar::SetTextLocation; 210 break; 211 case BC_CODE128: 212 case BC_CODE128_B: 213 case BC_CODE128_C: 214 memptr = (memptrtype)&CBC_Code128::SetTextLocation; 215 break; 216 default: 217 break; 218 } 219 return m_pBCEngine && memptr ? (m_pBCEngine.get()->*memptr)(location) : false; 220 } 221 222 bool CFX_Barcode::SetWideNarrowRatio(int32_t ratio) { 223 typedef bool (CBC_CodeBase::*memptrtype)(int32_t); 224 memptrtype memptr = nullptr; 225 switch (GetType()) { 226 case BC_CODE39: 227 memptr = (memptrtype)&CBC_Code39::SetWideNarrowRatio; 228 break; 229 case BC_CODABAR: 230 memptr = (memptrtype)&CBC_Codabar::SetWideNarrowRatio; 231 break; 232 default: 233 break; 234 } 235 return m_pBCEngine && memptr ? (m_pBCEngine.get()->*memptr)(ratio) : false; 236 } 237 238 bool CFX_Barcode::SetStartChar(FX_CHAR start) { 239 typedef bool (CBC_CodeBase::*memptrtype)(FX_CHAR); 240 memptrtype memptr = nullptr; 241 switch (GetType()) { 242 case BC_CODABAR: 243 memptr = (memptrtype)&CBC_Codabar::SetStartChar; 244 break; 245 default: 246 break; 247 } 248 return m_pBCEngine && memptr ? (m_pBCEngine.get()->*memptr)(start) : false; 249 } 250 251 bool CFX_Barcode::SetEndChar(FX_CHAR end) { 252 typedef bool (CBC_CodeBase::*memptrtype)(FX_CHAR); 253 memptrtype memptr = nullptr; 254 switch (GetType()) { 255 case BC_CODABAR: 256 memptr = (memptrtype)&CBC_Codabar::SetEndChar; 257 break; 258 default: 259 break; 260 } 261 return m_pBCEngine && memptr ? (m_pBCEngine.get()->*memptr)(end) : false; 262 } 263 264 bool CFX_Barcode::SetVersion(int32_t version) { 265 typedef bool (CBC_CodeBase::*memptrtype)(int32_t); 266 memptrtype memptr = nullptr; 267 switch (GetType()) { 268 case BC_QR_CODE: 269 memptr = (memptrtype)&CBC_QRCode::SetVersion; 270 break; 271 default: 272 break; 273 } 274 return m_pBCEngine && memptr ? (m_pBCEngine.get()->*memptr)(version) : false; 275 } 276 277 bool CFX_Barcode::SetErrorCorrectionLevel(int32_t level) { 278 typedef bool (CBC_CodeBase::*memptrtype)(int32_t); 279 memptrtype memptr = nullptr; 280 switch (GetType()) { 281 case BC_QR_CODE: 282 memptr = (memptrtype)&CBC_QRCode::SetErrorCorrectionLevel; 283 break; 284 case BC_PDF417: 285 memptr = (memptrtype)&CBC_PDF417I::SetErrorCorrectionLevel; 286 break; 287 default: 288 return false; 289 } 290 return m_pBCEngine && memptr ? (m_pBCEngine.get()->*memptr)(level) : false; 291 } 292 bool CFX_Barcode::SetTruncated(bool truncated) { 293 typedef void (CBC_CodeBase::*memptrtype)(bool); 294 memptrtype memptr = nullptr; 295 switch (GetType()) { 296 case BC_PDF417: 297 memptr = (memptrtype)&CBC_PDF417I::SetTruncated; 298 break; 299 default: 300 break; 301 } 302 return m_pBCEngine && memptr ? ((m_pBCEngine.get()->*memptr)(truncated), true) 303 : false; 304 } 305 306 bool CFX_Barcode::Encode(const CFX_WideStringC& contents, 307 bool isDevice, 308 int32_t& e) { 309 return m_pBCEngine && m_pBCEngine->Encode(contents, isDevice, e); 310 } 311 312 bool CFX_Barcode::RenderDevice(CFX_RenderDevice* device, 313 const CFX_Matrix* matrix, 314 int32_t& e) { 315 return m_pBCEngine && m_pBCEngine->RenderDevice(device, matrix, e); 316 } 317