From 72fe435e80807c91dbf8edc41d5bf3ec3c9bd9e4 Mon Sep 17 00:00:00 2001 From: Dan Sinclair Date: Thu, 4 Jan 2018 10:05:36 -0500 Subject: Remove CXFA_DataData This CL removes the CXFA_DataData base class and the functionality is moved to where it's needed. Change-Id: Ieba31aa924b9b513466144b31f0e1613923c50aa Reviewed-on: https://pdfium-review.googlesource.com/22250 Reviewed-by: Ryan Harrison Commit-Queue: dsinclair --- BUILD.gn | 2 - core/fxge/dib/fx_dib_main.cpp | 51 +++++++++++++++++++ core/fxge/fx_dib.h | 3 ++ xfa/fxfa/cxfa_widgetacc.cpp | 4 ++ xfa/fxfa/cxfa_widgetacc.h | 2 + xfa/fxfa/parser/cxfa_datadata.cpp | 75 ---------------------------- xfa/fxfa/parser/cxfa_datadata.h | 33 ------------- xfa/fxfa/parser/cxfa_fill.cpp | 10 ++-- xfa/fxfa/parser/cxfa_fill.h | 1 + xfa/fxfa/parser/cxfa_font.h | 1 + xfa/fxfa/parser/cxfa_stroke.cpp | 2 +- xfa/fxfa/parser/cxfa_value.h | 1 - xfa/fxfa/parser/cxfa_widgetdata.cpp | 97 +++++++++++++++++++------------------ xfa/fxfa/parser/cxfa_widgetdata.h | 10 +++- 14 files changed, 126 insertions(+), 166 deletions(-) delete mode 100644 xfa/fxfa/parser/cxfa_datadata.cpp delete mode 100644 xfa/fxfa/parser/cxfa_datadata.h diff --git a/BUILD.gn b/BUILD.gn index 73b6ef0e46..fc445e37e9 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -2199,8 +2199,6 @@ if (pdf_enable_xfa) { "xfa/fxfa/parser/cxfa_currentpage.h", "xfa/fxfa/parser/cxfa_data.cpp", "xfa/fxfa/parser/cxfa_data.h", - "xfa/fxfa/parser/cxfa_datadata.cpp", - "xfa/fxfa/parser/cxfa_datadata.h", "xfa/fxfa/parser/cxfa_dataexporter.cpp", "xfa/fxfa/parser/cxfa_dataexporter.h", "xfa/fxfa/parser/cxfa_datagroup.cpp", diff --git a/core/fxge/dib/fx_dib_main.cpp b/core/fxge/dib/fx_dib_main.cpp index 3ede85c480..68e06a6c5d 100644 --- a/core/fxge/dib/fx_dib_main.cpp +++ b/core/fxge/dib/fx_dib_main.cpp @@ -9,6 +9,7 @@ #include #include +#include "core/fxcrt/fx_extension.h" #include "third_party/base/ptr_util.h" const int16_t SDP_Table[513] = { @@ -87,3 +88,53 @@ uint32_t ArgbEncode(int a, FX_COLORREF rgb) { return FXARGB_MAKE(a, FXSYS_GetRValue(rgb), FXSYS_GetGValue(rgb), FXSYS_GetBValue(rgb)); } + +FX_ARGB StringToFXARGB(const WideStringView& wsValue) { + uint8_t r = 0, g = 0, b = 0; + if (wsValue.GetLength() == 0) + return 0xff000000; + + int cc = 0; + const wchar_t* str = wsValue.unterminated_c_str(); + int len = wsValue.GetLength(); + while (FXSYS_iswspace(str[cc]) && cc < len) + cc++; + + if (cc >= len) + return 0xff000000; + + while (cc < len) { + if (str[cc] == ',' || !FXSYS_isDecimalDigit(str[cc])) + break; + + r = r * 10 + str[cc] - '0'; + cc++; + } + if (cc < len && str[cc] == ',') { + cc++; + while (FXSYS_iswspace(str[cc]) && cc < len) + cc++; + + while (cc < len) { + if (str[cc] == ',' || !FXSYS_isDecimalDigit(str[cc])) + break; + + g = g * 10 + str[cc] - '0'; + cc++; + } + if (cc < len && str[cc] == ',') { + cc++; + while (FXSYS_iswspace(str[cc]) && cc < len) + cc++; + + while (cc < len) { + if (str[cc] == ',' || !FXSYS_isDecimalDigit(str[cc])) + break; + + b = b * 10 + str[cc] - '0'; + cc++; + } + } + } + return (0xff << 24) | (r << 16) | (g << 8) | b; +} diff --git a/core/fxge/fx_dib.h b/core/fxge/fx_dib.h index 9a7da01467..f7626afd35 100644 --- a/core/fxge/fx_dib.h +++ b/core/fxge/fx_dib.h @@ -11,6 +11,7 @@ #include #include "core/fxcrt/fx_coordinates.h" +#include "core/fxcrt/widestring.h" enum FXDIB_Format { FXDIB_Invalid = 0, @@ -94,6 +95,8 @@ inline FX_ARGB ArgbEncode(int a, int r, int g, int b) { } FX_ARGB ArgbEncode(int a, FX_COLORREF rgb); +FX_ARGB StringToFXARGB(const WideStringView& view); + #define FXARGB_A(argb) ((uint8_t)((argb) >> 24)) #define FXARGB_R(argb) ((uint8_t)((argb) >> 16)) #define FXARGB_G(argb) ((uint8_t)((argb) >> 8)) diff --git a/xfa/fxfa/cxfa_widgetacc.cpp b/xfa/fxfa/cxfa_widgetacc.cpp index 83d3869bdc..2e2807b1f0 100644 --- a/xfa/fxfa/cxfa_widgetacc.cpp +++ b/xfa/fxfa/cxfa_widgetacc.cpp @@ -164,6 +164,10 @@ CXFA_WidgetAcc::CXFA_WidgetAcc(CXFA_FFDocView* pDocView, CXFA_Node* pNode) CXFA_WidgetAcc::~CXFA_WidgetAcc() {} +XFA_Element CXFA_WidgetAcc::GetElementType() const { + return m_pNode ? m_pNode->GetElementType() : XFA_Element::Unknown; +} + CXFA_Node* CXFA_WidgetAcc::GetDatasets() { return m_pNode->GetBindData(); } diff --git a/xfa/fxfa/cxfa_widgetacc.h b/xfa/fxfa/cxfa_widgetacc.h index 3563ff4038..aa4303aef6 100644 --- a/xfa/fxfa/cxfa_widgetacc.h +++ b/xfa/fxfa/cxfa_widgetacc.h @@ -36,6 +36,8 @@ class CXFA_WidgetAcc : public CXFA_WidgetData { void ResetData(); + XFA_Element GetElementType() const; + CXFA_WidgetAcc* GetExclGroup(); CXFA_FFDoc* GetDoc(); diff --git a/xfa/fxfa/parser/cxfa_datadata.cpp b/xfa/fxfa/parser/cxfa_datadata.cpp deleted file mode 100644 index 76a4651d0d..0000000000 --- a/xfa/fxfa/parser/cxfa_datadata.cpp +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2016 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include "xfa/fxfa/parser/cxfa_datadata.h" - -#include "core/fxcrt/fx_extension.h" -#include "xfa/fxfa/parser/cxfa_measurement.h" -#include "xfa/fxfa/parser/cxfa_node.h" - -// Static. -FX_ARGB CXFA_DataData::ToColor(const WideStringView& wsValue) { - uint8_t r = 0, g = 0, b = 0; - if (wsValue.GetLength() == 0) - return 0xff000000; - - int cc = 0; - const wchar_t* str = wsValue.unterminated_c_str(); - int len = wsValue.GetLength(); - while (FXSYS_iswspace(str[cc]) && cc < len) - cc++; - - if (cc >= len) - return 0xff000000; - - while (cc < len) { - if (str[cc] == ',' || !FXSYS_isDecimalDigit(str[cc])) - break; - - r = r * 10 + str[cc] - '0'; - cc++; - } - if (cc < len && str[cc] == ',') { - cc++; - while (FXSYS_iswspace(str[cc]) && cc < len) - cc++; - - while (cc < len) { - if (str[cc] == ',' || !FXSYS_isDecimalDigit(str[cc])) - break; - - g = g * 10 + str[cc] - '0'; - cc++; - } - if (cc < len && str[cc] == ',') { - cc++; - while (FXSYS_iswspace(str[cc]) && cc < len) - cc++; - - while (cc < len) { - if (str[cc] == ',' || !FXSYS_isDecimalDigit(str[cc])) - break; - - b = b * 10 + str[cc] - '0'; - cc++; - } - } - } - return (0xff << 24) | (r << 16) | (g << 8) | b; -} - -CXFA_DataData::CXFA_DataData(CXFA_Node* pNode) : m_pNode(pNode) {} - -CXFA_DataData::~CXFA_DataData() {} - -XFA_Element CXFA_DataData::GetElementType() const { - return m_pNode ? m_pNode->GetElementType() : XFA_Element::Unknown; -} - -pdfium::Optional CXFA_DataData::TryMeasureAsFloat( - XFA_Attribute attr) const { - return m_pNode->JSObject()->TryMeasureAsFloat(attr); -} diff --git a/xfa/fxfa/parser/cxfa_datadata.h b/xfa/fxfa/parser/cxfa_datadata.h deleted file mode 100644 index a77e4512cb..0000000000 --- a/xfa/fxfa/parser/cxfa_datadata.h +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2016 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef XFA_FXFA_PARSER_CXFA_DATADATA_H_ -#define XFA_FXFA_PARSER_CXFA_DATADATA_H_ - -#include "core/fxcrt/fx_system.h" -#include "core/fxge/fx_dib.h" -#include "xfa/fxfa/fxfa_basic.h" - -class CXFA_Node; - -class CXFA_DataData { - public: - static FX_ARGB ToColor(const WideStringView& wsValue); - - explicit CXFA_DataData(CXFA_Node* pNode); - virtual ~CXFA_DataData(); - - bool HasValidNode() const { return !!m_pNode; } - CXFA_Node* GetNode() const { return m_pNode; } - XFA_Element GetElementType() const; - - protected: - pdfium::Optional TryMeasureAsFloat(XFA_Attribute attr) const; - - CXFA_Node* m_pNode; -}; - -#endif // XFA_FXFA_PARSER_CXFA_DATADATA_H_ diff --git a/xfa/fxfa/parser/cxfa_fill.cpp b/xfa/fxfa/parser/cxfa_fill.cpp index e4bde509c9..f5138d5e2e 100644 --- a/xfa/fxfa/parser/cxfa_fill.cpp +++ b/xfa/fxfa/parser/cxfa_fill.cpp @@ -77,7 +77,7 @@ FX_ARGB CXFA_Fill::GetColor(bool bText) { pdfium::Optional wsColor = pNode->JSObject()->TryCData(XFA_Attribute::Value, false); if (wsColor) - return CXFA_DataData::ToColor(wsColor->AsStringView()); + return StringToFXARGB(wsColor->AsStringView()); } if (bText) return 0xFF000000; @@ -106,7 +106,7 @@ FX_ARGB CXFA_Fill::GetPatternColor() { pdfium::Optional wsColor = pColor->JSObject()->TryCData(XFA_Attribute::Value, false); if (wsColor) - return CXFA_DataData::ToColor(wsColor->AsStringView()); + return StringToFXARGB(wsColor->AsStringView()); } return 0xFF000000; } @@ -124,7 +124,7 @@ FX_ARGB CXFA_Fill::GetStippleColor() { pdfium::Optional wsColor = pColor->JSObject()->TryCData(XFA_Attribute::Value, false); if (wsColor) - return CXFA_DataData::ToColor(wsColor->AsStringView()); + return StringToFXARGB(wsColor->AsStringView()); } return 0xFF000000; } @@ -142,7 +142,7 @@ FX_ARGB CXFA_Fill::GetLinearColor() { pdfium::Optional wsColor = pColor->JSObject()->TryCData(XFA_Attribute::Value, false); if (wsColor) - return CXFA_DataData::ToColor(wsColor->AsStringView()); + return StringToFXARGB(wsColor->AsStringView()); } return 0xFF000000; } @@ -160,7 +160,7 @@ FX_ARGB CXFA_Fill::GetRadialColor() { pdfium::Optional wsColor = pColor->JSObject()->TryCData(XFA_Attribute::Value, false); if (wsColor) - return CXFA_DataData::ToColor(wsColor->AsStringView()); + return StringToFXARGB(wsColor->AsStringView()); } return 0xFF000000; } diff --git a/xfa/fxfa/parser/cxfa_fill.h b/xfa/fxfa/parser/cxfa_fill.h index a5ee7609ee..a713047c5d 100644 --- a/xfa/fxfa/parser/cxfa_fill.h +++ b/xfa/fxfa/parser/cxfa_fill.h @@ -7,6 +7,7 @@ #ifndef XFA_FXFA_PARSER_CXFA_FILL_H_ #define XFA_FXFA_PARSER_CXFA_FILL_H_ +#include "core/fxge/fx_dib.h" #include "xfa/fxfa/parser/cxfa_node.h" class CXFA_Linear; diff --git a/xfa/fxfa/parser/cxfa_font.h b/xfa/fxfa/parser/cxfa_font.h index 833c29a530..346be76720 100644 --- a/xfa/fxfa/parser/cxfa_font.h +++ b/xfa/fxfa/parser/cxfa_font.h @@ -7,6 +7,7 @@ #ifndef XFA_FXFA_PARSER_CXFA_FONT_H_ #define XFA_FXFA_PARSER_CXFA_FONT_H_ +#include "core/fxge/fx_dib.h" #include "xfa/fxfa/parser/cxfa_node.h" class CXFA_Font : public CXFA_Node { diff --git a/xfa/fxfa/parser/cxfa_stroke.cpp b/xfa/fxfa/parser/cxfa_stroke.cpp index 3b8e37a728..caa7ef655a 100644 --- a/xfa/fxfa/parser/cxfa_stroke.cpp +++ b/xfa/fxfa/parser/cxfa_stroke.cpp @@ -66,7 +66,7 @@ FX_ARGB CXFA_Stroke::GetColor() { if (!pNode) return 0xFF000000; - return CXFA_DataData::ToColor( + return StringToFXARGB( pNode->JSObject()->GetCData(XFA_Attribute::Value).AsStringView()); } diff --git a/xfa/fxfa/parser/cxfa_value.h b/xfa/fxfa/parser/cxfa_value.h index 92400aa380..5067b715db 100644 --- a/xfa/fxfa/parser/cxfa_value.h +++ b/xfa/fxfa/parser/cxfa_value.h @@ -8,7 +8,6 @@ #define XFA_FXFA_PARSER_CXFA_VALUE_H_ #include "core/fxcrt/fx_string.h" -#include "xfa/fxfa/parser/cxfa_datadata.h" #include "xfa/fxfa/parser/cxfa_node.h" #include "xfa/fxfa/parser/cxfa_text.h" diff --git a/xfa/fxfa/parser/cxfa_widgetdata.cpp b/xfa/fxfa/parser/cxfa_widgetdata.cpp index 5833655156..7771d33d01 100644 --- a/xfa/fxfa/parser/cxfa_widgetdata.cpp +++ b/xfa/fxfa/parser/cxfa_widgetdata.cpp @@ -223,12 +223,14 @@ CXFA_Node* CreateUIChild(CXFA_Node* pNode, XFA_Element& eWidgetType) { } // namespace CXFA_WidgetData::CXFA_WidgetData(CXFA_Node* pNode) - : CXFA_DataData(pNode), + : m_pNode(pNode), m_bIsNull(true), m_bPreNull(true), m_pUiChildNode(nullptr), m_eUIType(XFA_Element::Unknown) {} +CXFA_WidgetData::~CXFA_WidgetData() = default; + CXFA_Node* CXFA_WidgetData::GetUIChild() { if (m_eUIType == XFA_Element::Unknown) m_pUiChildNode = CreateUIChild(m_pNode, m_eUIType); @@ -338,27 +340,27 @@ CXFA_Bind* CXFA_WidgetData::GetBind() { } pdfium::Optional CXFA_WidgetData::TryWidth() { - return TryMeasureAsFloat(XFA_Attribute::W); + return m_pNode->JSObject()->TryMeasureAsFloat(XFA_Attribute::W); } pdfium::Optional CXFA_WidgetData::TryHeight() { - return TryMeasureAsFloat(XFA_Attribute::H); + return m_pNode->JSObject()->TryMeasureAsFloat(XFA_Attribute::H); } pdfium::Optional CXFA_WidgetData::TryMinWidth() { - return TryMeasureAsFloat(XFA_Attribute::MinW); + return m_pNode->JSObject()->TryMeasureAsFloat(XFA_Attribute::MinW); } pdfium::Optional CXFA_WidgetData::TryMinHeight() { - return TryMeasureAsFloat(XFA_Attribute::MinH); + return m_pNode->JSObject()->TryMeasureAsFloat(XFA_Attribute::MinH); } pdfium::Optional CXFA_WidgetData::TryMaxWidth() { - return TryMeasureAsFloat(XFA_Attribute::MaxW); + return m_pNode->JSObject()->TryMeasureAsFloat(XFA_Attribute::MaxW); } pdfium::Optional CXFA_WidgetData::TryMaxHeight() { - return TryMeasureAsFloat(XFA_Attribute::MaxH); + return m_pNode->JSObject()->TryMeasureAsFloat(XFA_Attribute::MaxH); } CXFA_Border* CXFA_WidgetData::GetUIBorder() { @@ -502,46 +504,8 @@ XFA_CHECKSTATE CXFA_WidgetData::GetCheckState() { } void CXFA_WidgetData::SetCheckState(XFA_CHECKSTATE eCheckState, bool bNotify) { - CXFA_WidgetData exclGroup(GetExclGroupNode()); - if (exclGroup.HasValidNode()) { - WideString wsValue; - if (eCheckState != XFA_CHECKSTATE_Off) { - if (CXFA_Items* pItems = - m_pNode->GetChild(0, XFA_Element::Items, false)) { - CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild); - if (pText) - wsValue = pText->JSObject()->GetContent(false); - } - } - CXFA_Node* pChild = - exclGroup.GetNode()->GetNodeItem(XFA_NODEITEM_FirstChild); - for (; pChild; pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { - if (pChild->GetElementType() != XFA_Element::Field) - continue; - - CXFA_Items* pItem = - pChild->GetChild(0, XFA_Element::Items, false); - if (!pItem) - continue; - - CXFA_Node* pItemchild = pItem->GetNodeItem(XFA_NODEITEM_FirstChild); - if (!pItemchild) - continue; - - WideString text = pItemchild->JSObject()->GetContent(false); - WideString wsChildValue = text; - if (wsValue != text) { - pItemchild = pItemchild->GetNodeItem(XFA_NODEITEM_NextSibling); - if (pItemchild) - wsChildValue = pItemchild->JSObject()->GetContent(false); - else - wsChildValue.clear(); - } - CXFA_WidgetData ch(pChild); - ch.SyncValue(wsChildValue, bNotify); - } - exclGroup.SyncValue(wsValue, bNotify); - } else { + CXFA_Node* node = GetExclGroupNode(); + if (!node) { CXFA_Items* pItems = m_pNode->GetChild(0, XFA_Element::Items, false); if (!pItems) @@ -559,7 +523,46 @@ void CXFA_WidgetData::SetCheckState(XFA_CHECKSTATE eCheckState, bool bNotify) { pText = pText->GetNodeItem(XFA_NODEITEM_NextSibling); } SyncValue(wsContent, bNotify); + return; + } + + CXFA_WidgetData exclGroup(node); + WideString wsValue; + if (eCheckState != XFA_CHECKSTATE_Off) { + if (CXFA_Items* pItems = + m_pNode->GetChild(0, XFA_Element::Items, false)) { + CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild); + if (pText) + wsValue = pText->JSObject()->GetContent(false); + } + } + CXFA_Node* pChild = exclGroup.GetNode()->GetNodeItem(XFA_NODEITEM_FirstChild); + for (; pChild; pChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { + if (pChild->GetElementType() != XFA_Element::Field) + continue; + + CXFA_Items* pItem = + pChild->GetChild(0, XFA_Element::Items, false); + if (!pItem) + continue; + + CXFA_Node* pItemchild = pItem->GetNodeItem(XFA_NODEITEM_FirstChild); + if (!pItemchild) + continue; + + WideString text = pItemchild->JSObject()->GetContent(false); + WideString wsChildValue = text; + if (wsValue != text) { + pItemchild = pItemchild->GetNodeItem(XFA_NODEITEM_NextSibling); + if (pItemchild) + wsChildValue = pItemchild->JSObject()->GetContent(false); + else + wsChildValue.clear(); + } + CXFA_WidgetData ch(pChild); + ch.SyncValue(wsChildValue, bNotify); } + exclGroup.SyncValue(wsValue, bNotify); } CXFA_Node* CXFA_WidgetData::GetExclGroupNode() { diff --git a/xfa/fxfa/parser/cxfa_widgetdata.h b/xfa/fxfa/parser/cxfa_widgetdata.h index 57e6939f37..941eead3fd 100644 --- a/xfa/fxfa/parser/cxfa_widgetdata.h +++ b/xfa/fxfa/parser/cxfa_widgetdata.h @@ -14,7 +14,7 @@ #include "core/fxcrt/fx_string.h" #include "core/fxcrt/fx_system.h" #include "fxbarcode/BC_Library.h" -#include "xfa/fxfa/parser/cxfa_datadata.h" +#include "xfa/fxfa/fxfa_basic.h" enum XFA_CHECKSTATE { XFA_CHECKSTATE_On = 0, @@ -42,9 +42,12 @@ class CXFA_Value; class CXFA_Validate; class IFX_Locale; -class CXFA_WidgetData : public CXFA_DataData { +class CXFA_WidgetData { public: explicit CXFA_WidgetData(CXFA_Node* pNode); + virtual ~CXFA_WidgetData(); + + CXFA_Node* GetNode() const { return m_pNode; } CXFA_Node* GetUIChild(); XFA_Element GetUIType(); @@ -174,6 +177,9 @@ class CXFA_WidgetData : public CXFA_DataData { bool IsNull() const { return m_bIsNull; } void SetIsNull(bool val) { m_bIsNull = val; } + protected: + CXFA_Node* m_pNode; + private: CXFA_Bind* GetBind(); void SyncValue(const WideString& wsValue, bool bNotify); -- cgit v1.2.3