1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2014 The PDFium Authors 2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file. 4*3ac0a46fSAndroid Build Coastguard Worker 5*3ac0a46fSAndroid Build Coastguard Worker // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6*3ac0a46fSAndroid Build Coastguard Worker 7*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_barcode.h" 8*3ac0a46fSAndroid Build Coastguard Worker 9*3ac0a46fSAndroid Build Coastguard Worker #include "fxbarcode/cfx_barcode.h" 10*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fgas/font/cfgas_gefont.h" 11*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_notedriver.h" 12*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_themepart.h" 13*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/ifwl_themeprovider.h" 14*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/theme/cfwl_utils.h" 15*3ac0a46fSAndroid Build Coastguard Worker CFWL_Barcode(CFWL_App * app)16*3ac0a46fSAndroid Build Coastguard WorkerCFWL_Barcode::CFWL_Barcode(CFWL_App* app) 17*3ac0a46fSAndroid Build Coastguard Worker : CFWL_Edit(app, Properties(), nullptr) {} 18*3ac0a46fSAndroid Build Coastguard Worker 19*3ac0a46fSAndroid Build Coastguard Worker CFWL_Barcode::~CFWL_Barcode() = default; 20*3ac0a46fSAndroid Build Coastguard Worker GetClassID() const21*3ac0a46fSAndroid Build Coastguard WorkerFWL_Type CFWL_Barcode::GetClassID() const { 22*3ac0a46fSAndroid Build Coastguard Worker return FWL_Type::Barcode; 23*3ac0a46fSAndroid Build Coastguard Worker } 24*3ac0a46fSAndroid Build Coastguard Worker Update()25*3ac0a46fSAndroid Build Coastguard Workervoid CFWL_Barcode::Update() { 26*3ac0a46fSAndroid Build Coastguard Worker if (IsLocked()) 27*3ac0a46fSAndroid Build Coastguard Worker return; 28*3ac0a46fSAndroid Build Coastguard Worker 29*3ac0a46fSAndroid Build Coastguard Worker CFWL_Edit::Update(); 30*3ac0a46fSAndroid Build Coastguard Worker GenerateBarcodeImageCache(); 31*3ac0a46fSAndroid Build Coastguard Worker } 32*3ac0a46fSAndroid Build Coastguard Worker DrawWidget(CFGAS_GEGraphics * pGraphics,const CFX_Matrix & matrix)33*3ac0a46fSAndroid Build Coastguard Workervoid CFWL_Barcode::DrawWidget(CFGAS_GEGraphics* pGraphics, 34*3ac0a46fSAndroid Build Coastguard Worker const CFX_Matrix& matrix) { 35*3ac0a46fSAndroid Build Coastguard Worker if (!pGraphics) 36*3ac0a46fSAndroid Build Coastguard Worker return; 37*3ac0a46fSAndroid Build Coastguard Worker 38*3ac0a46fSAndroid Build Coastguard Worker if ((m_Properties.m_dwStates & FWL_STATE_WGT_Focused) == 0) { 39*3ac0a46fSAndroid Build Coastguard Worker GenerateBarcodeImageCache(); 40*3ac0a46fSAndroid Build Coastguard Worker if (!m_pBarcodeEngine || m_eStatus != Status::kEncodeSuccess) 41*3ac0a46fSAndroid Build Coastguard Worker return; 42*3ac0a46fSAndroid Build Coastguard Worker 43*3ac0a46fSAndroid Build Coastguard Worker CFX_Matrix mt; 44*3ac0a46fSAndroid Build Coastguard Worker mt.e = GetRTClient().left; 45*3ac0a46fSAndroid Build Coastguard Worker mt.f = GetRTClient().top; 46*3ac0a46fSAndroid Build Coastguard Worker mt.Concat(matrix); 47*3ac0a46fSAndroid Build Coastguard Worker 48*3ac0a46fSAndroid Build Coastguard Worker // TODO(tsepez): Curious as to why |mt| is unused? 49*3ac0a46fSAndroid Build Coastguard Worker m_pBarcodeEngine->RenderDevice(pGraphics->GetRenderDevice(), matrix); 50*3ac0a46fSAndroid Build Coastguard Worker return; 51*3ac0a46fSAndroid Build Coastguard Worker } 52*3ac0a46fSAndroid Build Coastguard Worker CFWL_Edit::DrawWidget(pGraphics, matrix); 53*3ac0a46fSAndroid Build Coastguard Worker } 54*3ac0a46fSAndroid Build Coastguard Worker SetType(BC_TYPE type)55*3ac0a46fSAndroid Build Coastguard Workervoid CFWL_Barcode::SetType(BC_TYPE type) { 56*3ac0a46fSAndroid Build Coastguard Worker if (m_type == type) 57*3ac0a46fSAndroid Build Coastguard Worker return; 58*3ac0a46fSAndroid Build Coastguard Worker 59*3ac0a46fSAndroid Build Coastguard Worker m_pBarcodeEngine.reset(); 60*3ac0a46fSAndroid Build Coastguard Worker m_type = type; 61*3ac0a46fSAndroid Build Coastguard Worker m_eStatus = Status::kNeedUpdate; 62*3ac0a46fSAndroid Build Coastguard Worker } 63*3ac0a46fSAndroid Build Coastguard Worker SetText(const WideString & wsText)64*3ac0a46fSAndroid Build Coastguard Workervoid CFWL_Barcode::SetText(const WideString& wsText) { 65*3ac0a46fSAndroid Build Coastguard Worker m_pBarcodeEngine.reset(); 66*3ac0a46fSAndroid Build Coastguard Worker m_eStatus = Status::kNeedUpdate; 67*3ac0a46fSAndroid Build Coastguard Worker CFWL_Edit::SetText(wsText); 68*3ac0a46fSAndroid Build Coastguard Worker } 69*3ac0a46fSAndroid Build Coastguard Worker SetTextSkipNotify(const WideString & wsText)70*3ac0a46fSAndroid Build Coastguard Workervoid CFWL_Barcode::SetTextSkipNotify(const WideString& wsText) { 71*3ac0a46fSAndroid Build Coastguard Worker m_pBarcodeEngine.reset(); 72*3ac0a46fSAndroid Build Coastguard Worker m_eStatus = Status::kNeedUpdate; 73*3ac0a46fSAndroid Build Coastguard Worker CFWL_Edit::SetTextSkipNotify(wsText); 74*3ac0a46fSAndroid Build Coastguard Worker } 75*3ac0a46fSAndroid Build Coastguard Worker IsProtectedType() const76*3ac0a46fSAndroid Build Coastguard Workerbool CFWL_Barcode::IsProtectedType() const { 77*3ac0a46fSAndroid Build Coastguard Worker if (!m_pBarcodeEngine) 78*3ac0a46fSAndroid Build Coastguard Worker return true; 79*3ac0a46fSAndroid Build Coastguard Worker 80*3ac0a46fSAndroid Build Coastguard Worker BC_TYPE tEngineType = m_pBarcodeEngine->GetType(); 81*3ac0a46fSAndroid Build Coastguard Worker return tEngineType == BC_TYPE::kQRCode || tEngineType == BC_TYPE::kPDF417 || 82*3ac0a46fSAndroid Build Coastguard Worker tEngineType == BC_TYPE::kDataMatrix; 83*3ac0a46fSAndroid Build Coastguard Worker } 84*3ac0a46fSAndroid Build Coastguard Worker OnProcessEvent(CFWL_Event * pEvent)85*3ac0a46fSAndroid Build Coastguard Workervoid CFWL_Barcode::OnProcessEvent(CFWL_Event* pEvent) { 86*3ac0a46fSAndroid Build Coastguard Worker if (pEvent->GetType() == CFWL_Event::Type::TextWillChange) { 87*3ac0a46fSAndroid Build Coastguard Worker m_pBarcodeEngine.reset(); 88*3ac0a46fSAndroid Build Coastguard Worker m_eStatus = Status::kNeedUpdate; 89*3ac0a46fSAndroid Build Coastguard Worker } 90*3ac0a46fSAndroid Build Coastguard Worker CFWL_Edit::OnProcessEvent(pEvent); 91*3ac0a46fSAndroid Build Coastguard Worker } 92*3ac0a46fSAndroid Build Coastguard Worker SetCharEncoding(BC_CHAR_ENCODING encoding)93*3ac0a46fSAndroid Build Coastguard Workervoid CFWL_Barcode::SetCharEncoding(BC_CHAR_ENCODING encoding) { 94*3ac0a46fSAndroid Build Coastguard Worker m_eCharEncoding = encoding; 95*3ac0a46fSAndroid Build Coastguard Worker } 96*3ac0a46fSAndroid Build Coastguard Worker SetModuleHeight(int32_t height)97*3ac0a46fSAndroid Build Coastguard Workervoid CFWL_Barcode::SetModuleHeight(int32_t height) { 98*3ac0a46fSAndroid Build Coastguard Worker m_nModuleHeight = height; 99*3ac0a46fSAndroid Build Coastguard Worker } 100*3ac0a46fSAndroid Build Coastguard Worker SetModuleWidth(int32_t width)101*3ac0a46fSAndroid Build Coastguard Workervoid CFWL_Barcode::SetModuleWidth(int32_t width) { 102*3ac0a46fSAndroid Build Coastguard Worker m_nModuleWidth = width; 103*3ac0a46fSAndroid Build Coastguard Worker } 104*3ac0a46fSAndroid Build Coastguard Worker SetDataLength(int32_t dataLength)105*3ac0a46fSAndroid Build Coastguard Workervoid CFWL_Barcode::SetDataLength(int32_t dataLength) { 106*3ac0a46fSAndroid Build Coastguard Worker m_nDataLength = dataLength; 107*3ac0a46fSAndroid Build Coastguard Worker SetLimit(dataLength); 108*3ac0a46fSAndroid Build Coastguard Worker } 109*3ac0a46fSAndroid Build Coastguard Worker SetCalChecksum(bool calChecksum)110*3ac0a46fSAndroid Build Coastguard Workervoid CFWL_Barcode::SetCalChecksum(bool calChecksum) { 111*3ac0a46fSAndroid Build Coastguard Worker m_bCalChecksum = calChecksum; 112*3ac0a46fSAndroid Build Coastguard Worker } 113*3ac0a46fSAndroid Build Coastguard Worker SetPrintChecksum(bool printChecksum)114*3ac0a46fSAndroid Build Coastguard Workervoid CFWL_Barcode::SetPrintChecksum(bool printChecksum) { 115*3ac0a46fSAndroid Build Coastguard Worker m_bPrintChecksum = printChecksum; 116*3ac0a46fSAndroid Build Coastguard Worker } 117*3ac0a46fSAndroid Build Coastguard Worker SetTextLocation(BC_TEXT_LOC location)118*3ac0a46fSAndroid Build Coastguard Workervoid CFWL_Barcode::SetTextLocation(BC_TEXT_LOC location) { 119*3ac0a46fSAndroid Build Coastguard Worker m_eTextLocation = location; 120*3ac0a46fSAndroid Build Coastguard Worker } 121*3ac0a46fSAndroid Build Coastguard Worker SetWideNarrowRatio(int8_t ratio)122*3ac0a46fSAndroid Build Coastguard Workervoid CFWL_Barcode::SetWideNarrowRatio(int8_t ratio) { 123*3ac0a46fSAndroid Build Coastguard Worker m_nWideNarrowRatio = ratio; 124*3ac0a46fSAndroid Build Coastguard Worker } 125*3ac0a46fSAndroid Build Coastguard Worker SetStartChar(char startChar)126*3ac0a46fSAndroid Build Coastguard Workervoid CFWL_Barcode::SetStartChar(char startChar) { 127*3ac0a46fSAndroid Build Coastguard Worker m_cStartChar = startChar; 128*3ac0a46fSAndroid Build Coastguard Worker } 129*3ac0a46fSAndroid Build Coastguard Worker SetEndChar(char endChar)130*3ac0a46fSAndroid Build Coastguard Workervoid CFWL_Barcode::SetEndChar(char endChar) { 131*3ac0a46fSAndroid Build Coastguard Worker m_cEndChar = endChar; 132*3ac0a46fSAndroid Build Coastguard Worker } 133*3ac0a46fSAndroid Build Coastguard Worker SetErrorCorrectionLevel(int32_t ecLevel)134*3ac0a46fSAndroid Build Coastguard Workervoid CFWL_Barcode::SetErrorCorrectionLevel(int32_t ecLevel) { 135*3ac0a46fSAndroid Build Coastguard Worker m_nECLevel = ecLevel; 136*3ac0a46fSAndroid Build Coastguard Worker } 137*3ac0a46fSAndroid Build Coastguard Worker GenerateBarcodeImageCache()138*3ac0a46fSAndroid Build Coastguard Workervoid CFWL_Barcode::GenerateBarcodeImageCache() { 139*3ac0a46fSAndroid Build Coastguard Worker if (m_eStatus != Status::kNeedUpdate) 140*3ac0a46fSAndroid Build Coastguard Worker return; 141*3ac0a46fSAndroid Build Coastguard Worker 142*3ac0a46fSAndroid Build Coastguard Worker m_eStatus = Status::kNormal; 143*3ac0a46fSAndroid Build Coastguard Worker CreateBarcodeEngine(); 144*3ac0a46fSAndroid Build Coastguard Worker if (!m_pBarcodeEngine) 145*3ac0a46fSAndroid Build Coastguard Worker return; 146*3ac0a46fSAndroid Build Coastguard Worker 147*3ac0a46fSAndroid Build Coastguard Worker IFWL_ThemeProvider* pTheme = GetThemeProvider(); 148*3ac0a46fSAndroid Build Coastguard Worker CFWL_ThemePart part(CFWL_ThemePart::Part::kNone, this); 149*3ac0a46fSAndroid Build Coastguard Worker if (RetainPtr<CFGAS_GEFont> pFont = pTheme->GetFont(part)) { 150*3ac0a46fSAndroid Build Coastguard Worker if (CFX_Font* pCXFont = pFont->GetDevFont()) 151*3ac0a46fSAndroid Build Coastguard Worker m_pBarcodeEngine->SetFont(pCXFont); 152*3ac0a46fSAndroid Build Coastguard Worker } 153*3ac0a46fSAndroid Build Coastguard Worker m_pBarcodeEngine->SetFontSize(pTheme->GetFontSize(part)); 154*3ac0a46fSAndroid Build Coastguard Worker m_pBarcodeEngine->SetFontColor(pTheme->GetTextColor(part)); 155*3ac0a46fSAndroid Build Coastguard Worker m_pBarcodeEngine->SetHeight(int32_t(GetRTClient().height)); 156*3ac0a46fSAndroid Build Coastguard Worker m_pBarcodeEngine->SetWidth(int32_t(GetRTClient().width)); 157*3ac0a46fSAndroid Build Coastguard Worker if (m_eCharEncoding.has_value()) 158*3ac0a46fSAndroid Build Coastguard Worker m_pBarcodeEngine->SetCharEncoding(m_eCharEncoding.value()); 159*3ac0a46fSAndroid Build Coastguard Worker if (m_nModuleHeight.has_value()) 160*3ac0a46fSAndroid Build Coastguard Worker m_pBarcodeEngine->SetModuleHeight(m_nModuleHeight.value()); 161*3ac0a46fSAndroid Build Coastguard Worker if (m_nModuleWidth.has_value()) 162*3ac0a46fSAndroid Build Coastguard Worker m_pBarcodeEngine->SetModuleWidth(m_nModuleWidth.value()); 163*3ac0a46fSAndroid Build Coastguard Worker if (m_nDataLength.has_value()) 164*3ac0a46fSAndroid Build Coastguard Worker m_pBarcodeEngine->SetDataLength(m_nDataLength.value()); 165*3ac0a46fSAndroid Build Coastguard Worker if (m_bCalChecksum.has_value()) 166*3ac0a46fSAndroid Build Coastguard Worker m_pBarcodeEngine->SetCalChecksum(m_bCalChecksum.value()); 167*3ac0a46fSAndroid Build Coastguard Worker if (m_bPrintChecksum.has_value()) 168*3ac0a46fSAndroid Build Coastguard Worker m_pBarcodeEngine->SetPrintChecksum(m_bPrintChecksum.value()); 169*3ac0a46fSAndroid Build Coastguard Worker if (m_eTextLocation.has_value()) 170*3ac0a46fSAndroid Build Coastguard Worker m_pBarcodeEngine->SetTextLocation(m_eTextLocation.value()); 171*3ac0a46fSAndroid Build Coastguard Worker if (m_nWideNarrowRatio.has_value()) 172*3ac0a46fSAndroid Build Coastguard Worker m_pBarcodeEngine->SetWideNarrowRatio(m_nWideNarrowRatio.value()); 173*3ac0a46fSAndroid Build Coastguard Worker if (m_cStartChar.has_value()) 174*3ac0a46fSAndroid Build Coastguard Worker m_pBarcodeEngine->SetStartChar(m_cStartChar.value()); 175*3ac0a46fSAndroid Build Coastguard Worker if (m_cEndChar.has_value()) 176*3ac0a46fSAndroid Build Coastguard Worker m_pBarcodeEngine->SetEndChar(m_cEndChar.value()); 177*3ac0a46fSAndroid Build Coastguard Worker if (m_nECLevel.has_value()) 178*3ac0a46fSAndroid Build Coastguard Worker m_pBarcodeEngine->SetErrorCorrectionLevel(m_nECLevel.value()); 179*3ac0a46fSAndroid Build Coastguard Worker 180*3ac0a46fSAndroid Build Coastguard Worker m_eStatus = m_pBarcodeEngine->Encode(GetText().AsStringView()) 181*3ac0a46fSAndroid Build Coastguard Worker ? Status::kEncodeSuccess 182*3ac0a46fSAndroid Build Coastguard Worker : Status::kNormal; 183*3ac0a46fSAndroid Build Coastguard Worker } 184*3ac0a46fSAndroid Build Coastguard Worker CreateBarcodeEngine()185*3ac0a46fSAndroid Build Coastguard Workervoid CFWL_Barcode::CreateBarcodeEngine() { 186*3ac0a46fSAndroid Build Coastguard Worker if (m_pBarcodeEngine || m_type == BC_TYPE::kUnknown) 187*3ac0a46fSAndroid Build Coastguard Worker return; 188*3ac0a46fSAndroid Build Coastguard Worker 189*3ac0a46fSAndroid Build Coastguard Worker m_pBarcodeEngine = CFX_Barcode::Create(m_type); 190*3ac0a46fSAndroid Build Coastguard Worker } 191