xref: /aosp_15_r20/external/pdfium/xfa/fwl/cfwl_barcode.cpp (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
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 Worker CFWL_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 Worker FWL_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 Worker void 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 Worker void 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 Worker void 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 Worker void 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 Worker void 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 Worker bool 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 Worker void 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 Worker void 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 Worker void 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 Worker void 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 Worker void 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 Worker void 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 Worker void 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 Worker void 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 Worker void 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 Worker void 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 Worker void 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 Worker void 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 Worker void 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 Worker void 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