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 #ifndef _FDE_CSSDATATABLE 8 #define _FDE_CSSDATATABLE 9 class CFDE_CSSFunction : public CFX_Target { 10 public: 11 CFDE_CSSFunction(const FX_WCHAR* pszFuncName, IFDE_CSSValueList* pArgList) 12 : m_pArgList(pArgList), m_pszFuncName(pszFuncName) { 13 FXSYS_assert(pArgList != NULL); 14 } 15 int32_t CountArgs() const { return m_pArgList->CountValues(); } 16 IFDE_CSSValue* GetArgs(int32_t index) const { 17 return m_pArgList->GetValue(index); 18 } 19 const FX_WCHAR* GetFuncName() const { return m_pszFuncName; }; 20 21 protected: 22 IFDE_CSSValueList* m_pArgList; 23 const FX_WCHAR* m_pszFuncName; 24 }; 25 class CFDE_CSSPrimitiveValue : public IFDE_CSSPrimitiveValue, 26 public CFX_Target { 27 public: 28 CFDE_CSSPrimitiveValue(const CFDE_CSSPrimitiveValue& src) { *this = src; } 29 CFDE_CSSPrimitiveValue(FX_ARGB color) 30 : m_eType(FDE_CSSPRIMITIVETYPE_RGB), m_dwColor(color) {} 31 CFDE_CSSPrimitiveValue(FDE_CSSPROPERTYVALUE eValue) 32 : m_eType(FDE_CSSPRIMITIVETYPE_Enum), m_eEnum(eValue) {} 33 CFDE_CSSPrimitiveValue(FDE_CSSPRIMITIVETYPE eType, FX_FLOAT fValue) 34 : m_eType(eType), m_fNumber(fValue) {} 35 CFDE_CSSPrimitiveValue(FDE_CSSPRIMITIVETYPE eType, const FX_WCHAR* pValue) 36 : m_eType(eType), m_pString(pValue) { 37 FXSYS_assert(m_pString != NULL); 38 } 39 CFDE_CSSPrimitiveValue(CFDE_CSSFunction* pFunction) 40 : m_eType(FDE_CSSPRIMITIVETYPE_Function), m_pFunction(pFunction) {} 41 42 virtual FDE_CSSPRIMITIVETYPE GetPrimitiveType() const { return m_eType; } 43 44 virtual FX_ARGB GetRGBColor() const { 45 FXSYS_assert(m_eType == FDE_CSSPRIMITIVETYPE_RGB); 46 return m_dwColor; 47 } 48 virtual FX_FLOAT GetFloat() const { 49 FXSYS_assert(m_eType >= FDE_CSSPRIMITIVETYPE_Number && 50 m_eType <= FDE_CSSPRIMITIVETYPE_PC); 51 return m_fNumber; 52 } 53 virtual const FX_WCHAR* GetString(int32_t& iLength) const { 54 FXSYS_assert(m_eType >= FDE_CSSPRIMITIVETYPE_String && 55 m_eType <= FDE_CSSPRIMITIVETYPE_URI); 56 iLength = FXSYS_wcslen(m_pString); 57 return m_pString; 58 } 59 virtual FDE_CSSPROPERTYVALUE GetEnum() const { 60 FXSYS_assert(m_eType == FDE_CSSPRIMITIVETYPE_Enum); 61 return m_eEnum; 62 } 63 virtual const FX_WCHAR* GetFuncName() const { 64 FXSYS_assert(m_eType == FDE_CSSPRIMITIVETYPE_Function); 65 return m_pFunction->GetFuncName(); 66 } 67 virtual int32_t CountArgs() const { 68 FXSYS_assert(m_eType == FDE_CSSPRIMITIVETYPE_Function); 69 return m_pFunction->CountArgs(); 70 } 71 virtual IFDE_CSSValue* GetArgs(int32_t index) const { 72 FXSYS_assert(m_eType == FDE_CSSPRIMITIVETYPE_Function); 73 return m_pFunction->GetArgs(index); 74 } 75 76 FDE_CSSPRIMITIVETYPE m_eType; 77 union { 78 FX_ARGB m_dwColor; 79 FX_FLOAT m_fNumber; 80 const FX_WCHAR* m_pString; 81 FDE_CSSPROPERTYVALUE m_eEnum; 82 CFDE_CSSFunction* m_pFunction; 83 }; 84 }; 85 typedef CFX_ArrayTemplate<IFDE_CSSPrimitiveValue*> CFDE_CSSPrimitiveArray; 86 typedef CFX_ArrayTemplate<IFDE_CSSValue*> CFDE_CSSValueArray; 87 class CFDE_CSSValueList : public IFDE_CSSValueList, public CFX_Target { 88 public: 89 CFDE_CSSValueList(IFX_MEMAllocator* pStaticStore, 90 const CFDE_CSSValueArray& list); 91 virtual int32_t CountValues() const { return m_iCount; } 92 virtual IFDE_CSSValue* GetValue(int32_t index) const { 93 return m_ppList[index]; 94 } 95 96 protected: 97 IFDE_CSSValue** m_ppList; 98 int32_t m_iCount; 99 }; 100 class CFDE_CSSValueListParser : public CFX_Target { 101 public: 102 CFDE_CSSValueListParser(const FX_WCHAR* psz, int32_t iLen, FX_WCHAR separator) 103 : m_Separator(separator), m_pCur(psz), m_pEnd(psz + iLen) { 104 FXSYS_assert(psz != NULL && iLen > 0); 105 } 106 FX_BOOL NextValue(FDE_CSSPRIMITIVETYPE& eType, 107 const FX_WCHAR*& pStart, 108 int32_t& iLength); 109 FX_WCHAR m_Separator; 110 111 protected: 112 int32_t SkipTo(FX_WCHAR wch, 113 FX_BOOL bWSSeparator = FALSE, 114 FX_BOOL bBrContinue = FALSE); 115 const FX_WCHAR* m_pCur; 116 const FX_WCHAR* m_pEnd; 117 }; 118 119 #define FDE_CSSVALUETYPE_MaybeNumber 0x0100 120 #define FDE_CSSVALUETYPE_MaybeEnum 0x0200 121 #define FDE_CSSVALUETYPE_MaybeURI 0x0400 122 #define FDE_CSSVALUETYPE_MaybeString 0x0800 123 #define FDE_CSSVALUETYPE_MaybeColor 0x1000 124 #define FDE_CSSVALUETYPE_MaybeFunction 0x2000 125 #define FDE_IsOnlyValue(type, enum) \ 126 (((type) & ~(enum)) == FDE_CSSVALUETYPE_Primitive) 127 struct FDE_CSSPROPERTYTABLE { 128 FDE_CSSPROPERTY eName; 129 const FX_WCHAR* pszName; 130 FX_DWORD dwHash; 131 FX_DWORD dwType; 132 }; 133 typedef FDE_CSSPROPERTYTABLE const* FDE_LPCCSSPROPERTYTABLE; 134 135 FDE_LPCCSSPROPERTYTABLE FDE_GetCSSPropertyByName(const FX_WCHAR* pszName, 136 int32_t iLength); 137 FDE_LPCCSSPROPERTYTABLE FDE_GetCSSPropertyByEnum(FDE_CSSPROPERTY eName); 138 struct FDE_CSSPROPERTYVALUETABLE { 139 FDE_CSSPROPERTYVALUE eName; 140 const FX_WCHAR* pszName; 141 FX_DWORD dwHash; 142 }; 143 typedef FDE_CSSPROPERTYVALUETABLE const* FDE_LPCCSSPROPERTYVALUETABLE; 144 145 FDE_LPCCSSPROPERTYVALUETABLE FDE_GetCSSPropertyValueByName( 146 const FX_WCHAR* pszName, 147 int32_t iLength); 148 FDE_LPCCSSPROPERTYVALUETABLE FDE_GetCSSPropertyValueByEnum( 149 FDE_CSSPROPERTYVALUE eName); 150 struct FDE_CSSMEDIATYPETABLE { 151 FX_WORD wHash; 152 FX_WORD wValue; 153 }; 154 typedef FDE_CSSMEDIATYPETABLE const* FDE_LPCCSSMEDIATYPETABLE; 155 FDE_LPCCSSMEDIATYPETABLE FDE_GetCSSMediaTypeByName(const FX_WCHAR* pszName, 156 int32_t iLength); 157 struct FDE_CSSLENGTHUNITTABLE { 158 FX_WORD wHash; 159 FX_WORD wValue; 160 }; 161 typedef FDE_CSSLENGTHUNITTABLE const* FDE_LPCCSSLENGTHUNITTABLE; 162 FDE_LPCCSSLENGTHUNITTABLE FDE_GetCSSLengthUnitByName(const FX_WCHAR* pszName, 163 int32_t iLength); 164 struct FDE_CSSCOLORTABLE { 165 FX_DWORD dwHash; 166 FX_ARGB dwValue; 167 }; 168 typedef FDE_CSSCOLORTABLE const* FDE_LPCCSSCOLORTABLE; 169 FDE_LPCCSSCOLORTABLE FDE_GetCSSColorByName(const FX_WCHAR* pszName, 170 int32_t iLength); 171 struct FDE_CSSPERSUDOTABLE { 172 FDE_CSSPERSUDO eName; 173 const FX_WCHAR* pszName; 174 FX_DWORD dwHash; 175 }; 176 typedef FDE_CSSPERSUDOTABLE const* FDE_LPCCSSPERSUDOTABLE; 177 178 FDE_LPCCSSPERSUDOTABLE FDE_GetCSSPersudoByEnum(FDE_CSSPERSUDO ePersudo); 179 FX_BOOL FDE_ParseCSSNumber(const FX_WCHAR* pszValue, 180 int32_t iValueLen, 181 FX_FLOAT& fValue, 182 FDE_CSSPRIMITIVETYPE& eUnit); 183 FX_BOOL FDE_ParseCSSString(const FX_WCHAR* pszValue, 184 int32_t iValueLen, 185 int32_t& iOffset, 186 int32_t& iLength); 187 FX_BOOL FDE_ParseCSSColor(const FX_WCHAR* pszValue, 188 int32_t iValueLen, 189 FX_ARGB& dwColor); 190 FX_BOOL FDE_ParseCSSURI(const FX_WCHAR* pszValue, 191 int32_t iValueLen, 192 int32_t& iOffset, 193 int32_t& iLength); 194 195 #endif 196