| OLD | NEW |
| (Empty) |
| 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/src/fde/css/fde_cssdeclaration.h" | |
| 8 | |
| 9 #include "core/include/fxcrt/fx_ext.h" | |
| 10 #include "xfa/src/fgas/crt/fgas_system.h" | |
| 11 | |
| 12 IFDE_CSSValue* CFDE_CSSDeclaration::GetProperty(FDE_CSSPROPERTY eProperty, | |
| 13 FX_BOOL& bImportant) const { | |
| 14 for (const FDE_CSSPropertyHolder* pHolder = m_pFirstProperty; pHolder; | |
| 15 pHolder = pHolder->pNext) { | |
| 16 if (pHolder->eProperty == eProperty) { | |
| 17 bImportant = pHolder->bImportant; | |
| 18 return pHolder->pValue; | |
| 19 } | |
| 20 } | |
| 21 return NULL; | |
| 22 } | |
| 23 FX_POSITION CFDE_CSSDeclaration::GetStartPosition() const { | |
| 24 return (FX_POSITION)m_pFirstProperty; | |
| 25 } | |
| 26 void CFDE_CSSDeclaration::GetNextProperty(FX_POSITION& pos, | |
| 27 FDE_CSSPROPERTY& eProperty, | |
| 28 IFDE_CSSValue*& pValue, | |
| 29 FX_BOOL& bImportant) const { | |
| 30 const FDE_CSSPropertyHolder* pHolder = (const FDE_CSSPropertyHolder*)pos; | |
| 31 FXSYS_assert(pHolder != NULL); | |
| 32 bImportant = pHolder->bImportant; | |
| 33 eProperty = (FDE_CSSPROPERTY)pHolder->eProperty; | |
| 34 pValue = pHolder->pValue; | |
| 35 pos = (FX_POSITION)pHolder->pNext; | |
| 36 } | |
| 37 FX_POSITION CFDE_CSSDeclaration::GetStartCustom() const { | |
| 38 return (FX_POSITION)m_pFirstCustom; | |
| 39 } | |
| 40 void CFDE_CSSDeclaration::GetNextCustom(FX_POSITION& pos, | |
| 41 CFX_WideString& wsName, | |
| 42 CFX_WideString& wsValue) const { | |
| 43 const FDE_CSSCustomProperty* pProperty = (const FDE_CSSCustomProperty*)pos; | |
| 44 if (pProperty == NULL) { | |
| 45 return; | |
| 46 } | |
| 47 wsName = pProperty->pwsName; | |
| 48 wsValue = pProperty->pwsValue; | |
| 49 pos = (FX_POSITION)pProperty->pNext; | |
| 50 } | |
| 51 const FX_WCHAR* CFDE_CSSDeclaration::CopyToLocal( | |
| 52 const FDE_CSSPROPERTYARGS* pArgs, | |
| 53 const FX_WCHAR* pszValue, | |
| 54 int32_t iValueLen) { | |
| 55 FXSYS_assert(iValueLen > 0); | |
| 56 CFX_MapPtrToPtr* pCache = pArgs->pStringCache; | |
| 57 void* pKey = NULL; | |
| 58 if (pCache) { | |
| 59 void* pszCached = NULL; | |
| 60 pKey = | |
| 61 (void*)(uintptr_t)FX_HashCode_String_GetW(pszValue, iValueLen, FALSE); | |
| 62 if (pCache->Lookup(pKey, pszCached)) { | |
| 63 return (const FX_WCHAR*)pszCached; | |
| 64 } | |
| 65 } | |
| 66 FX_WCHAR* psz = | |
| 67 (FX_WCHAR*)pArgs->pStaticStore->Alloc((iValueLen + 1) * sizeof(FX_WCHAR)); | |
| 68 if (psz == NULL) { | |
| 69 return NULL; | |
| 70 } | |
| 71 FXSYS_wcsncpy(psz, pszValue, iValueLen); | |
| 72 psz[iValueLen] = '\0'; | |
| 73 if (pCache) { | |
| 74 pCache->SetAt(pKey, psz); | |
| 75 } | |
| 76 return psz; | |
| 77 } | |
| 78 IFDE_CSSPrimitiveValue* CFDE_CSSDeclaration::NewNumberValue( | |
| 79 IFX_MEMAllocator* pStaticStore, | |
| 80 FDE_CSSPRIMITIVETYPE eUnit, | |
| 81 FX_FLOAT fValue) const { | |
| 82 static CFDE_CSSPrimitiveValue s_ZeroValue(FDE_CSSPRIMITIVETYPE_Number, 0.0f); | |
| 83 if (eUnit == FDE_CSSPRIMITIVETYPE_Number && FXSYS_fabs(fValue) < 0.001f) { | |
| 84 return &s_ZeroValue; | |
| 85 } | |
| 86 return FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(eUnit, fValue); | |
| 87 } | |
| 88 inline IFDE_CSSPrimitiveValue* CFDE_CSSDeclaration::NewEnumValue( | |
| 89 IFX_MEMAllocator* pStaticStore, | |
| 90 FDE_CSSPROPERTYVALUE eValue) const { | |
| 91 return FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(eValue); | |
| 92 } | |
| 93 void CFDE_CSSDeclaration::AddPropertyHolder(IFX_MEMAllocator* pStaticStore, | |
| 94 FDE_CSSPROPERTY eProperty, | |
| 95 IFDE_CSSValue* pValue, | |
| 96 FX_BOOL bImportant) { | |
| 97 FDE_CSSPropertyHolder* pHolder = | |
| 98 FXTARGET_NewWith(pStaticStore) FDE_CSSPropertyHolder; | |
| 99 pHolder->bImportant = bImportant; | |
| 100 pHolder->eProperty = eProperty; | |
| 101 pHolder->pValue = pValue; | |
| 102 pHolder->pNext = NULL; | |
| 103 if (m_pLastProperty == NULL) { | |
| 104 m_pLastProperty = m_pFirstProperty = pHolder; | |
| 105 } else { | |
| 106 m_pLastProperty->pNext = pHolder; | |
| 107 m_pLastProperty = pHolder; | |
| 108 } | |
| 109 } | |
| 110 FX_BOOL CFDE_CSSDeclaration::AddProperty(const FDE_CSSPROPERTYARGS* pArgs, | |
| 111 const FX_WCHAR* pszValue, | |
| 112 int32_t iValueLen) { | |
| 113 FXSYS_assert(iValueLen > 0); | |
| 114 FX_BOOL bImportant = FALSE; | |
| 115 if (iValueLen >= 10 && pszValue[iValueLen - 10] == '!' && | |
| 116 FX_wcsnicmp(L"important", pszValue + iValueLen - 9, 9) == 0) { | |
| 117 if ((iValueLen -= 10) == 0) { | |
| 118 return FALSE; | |
| 119 } | |
| 120 bImportant = TRUE; | |
| 121 } | |
| 122 const FX_DWORD dwType = pArgs->pProperty->dwType; | |
| 123 switch (dwType & 0x0F) { | |
| 124 case FDE_CSSVALUETYPE_Primitive: { | |
| 125 static const FX_DWORD g_ValueGuessOrder[] = { | |
| 126 FDE_CSSVALUETYPE_MaybeNumber, FDE_CSSVALUETYPE_MaybeEnum, | |
| 127 FDE_CSSVALUETYPE_MaybeColor, FDE_CSSVALUETYPE_MaybeURI, | |
| 128 FDE_CSSVALUETYPE_MaybeFunction, FDE_CSSVALUETYPE_MaybeString, | |
| 129 }; | |
| 130 static const int32_t g_ValueGuessCount = | |
| 131 sizeof(g_ValueGuessOrder) / sizeof(FX_DWORD); | |
| 132 for (int32_t i = 0; i < g_ValueGuessCount; ++i) { | |
| 133 const FX_DWORD dwMatch = dwType & g_ValueGuessOrder[i]; | |
| 134 if (dwMatch == 0) { | |
| 135 continue; | |
| 136 } | |
| 137 IFDE_CSSValue* pCSSValue = NULL; | |
| 138 switch (dwMatch) { | |
| 139 case FDE_CSSVALUETYPE_MaybeFunction: | |
| 140 pCSSValue = ParseFunction(pArgs, pszValue, iValueLen); | |
| 141 break; | |
| 142 case FDE_CSSVALUETYPE_MaybeNumber: | |
| 143 pCSSValue = ParseNumber(pArgs, pszValue, iValueLen); | |
| 144 break; | |
| 145 case FDE_CSSVALUETYPE_MaybeEnum: | |
| 146 pCSSValue = ParseEnum(pArgs, pszValue, iValueLen); | |
| 147 break; | |
| 148 case FDE_CSSVALUETYPE_MaybeColor: | |
| 149 pCSSValue = ParseColor(pArgs, pszValue, iValueLen); | |
| 150 break; | |
| 151 case FDE_CSSVALUETYPE_MaybeURI: | |
| 152 pCSSValue = ParseURI(pArgs, pszValue, iValueLen); | |
| 153 break; | |
| 154 case FDE_CSSVALUETYPE_MaybeString: | |
| 155 pCSSValue = ParseString(pArgs, pszValue, iValueLen); | |
| 156 break; | |
| 157 default: | |
| 158 break; | |
| 159 } | |
| 160 if (pCSSValue != NULL) { | |
| 161 AddPropertyHolder(pArgs->pStaticStore, pArgs->pProperty->eName, | |
| 162 pCSSValue, bImportant); | |
| 163 return TRUE; | |
| 164 } | |
| 165 if (FDE_IsOnlyValue(dwType, g_ValueGuessOrder[i])) { | |
| 166 return FALSE; | |
| 167 } | |
| 168 } | |
| 169 } break; | |
| 170 case FDE_CSSVALUETYPE_Shorthand: { | |
| 171 IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore; | |
| 172 IFDE_CSSValue *pColor, *pStyle, *pWidth; | |
| 173 switch (pArgs->pProperty->eName) { | |
| 174 case FDE_CSSPROPERTY_Font: | |
| 175 return ParseFontProperty(pArgs, pszValue, iValueLen, bImportant); | |
| 176 case FDE_CSSPROPERTY_Background: | |
| 177 return ParseBackgroundProperty(pArgs, pszValue, iValueLen, | |
| 178 bImportant); | |
| 179 case FDE_CSSPROPERTY_ListStyle: | |
| 180 return ParseListStyleProperty(pArgs, pszValue, iValueLen, bImportant); | |
| 181 case FDE_CSSPROPERTY_Border: | |
| 182 if (ParseBorderPropoerty(pStaticStore, pszValue, iValueLen, pColor, | |
| 183 pStyle, pWidth)) { | |
| 184 AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant, | |
| 185 FDE_CSSPROPERTY_BorderLeftColor, | |
| 186 FDE_CSSPROPERTY_BorderLeftStyle, | |
| 187 FDE_CSSPROPERTY_BorderLeftWidth); | |
| 188 AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant, | |
| 189 FDE_CSSPROPERTY_BorderTopColor, | |
| 190 FDE_CSSPROPERTY_BorderTopStyle, | |
| 191 FDE_CSSPROPERTY_BorderTopWidth); | |
| 192 AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant, | |
| 193 FDE_CSSPROPERTY_BorderRightColor, | |
| 194 FDE_CSSPROPERTY_BorderRightStyle, | |
| 195 FDE_CSSPROPERTY_BorderRightWidth); | |
| 196 AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant, | |
| 197 FDE_CSSPROPERTY_BorderBottomColor, | |
| 198 FDE_CSSPROPERTY_BorderBottomStyle, | |
| 199 FDE_CSSPROPERTY_BorderBottomWidth); | |
| 200 return TRUE; | |
| 201 } | |
| 202 break; | |
| 203 case FDE_CSSPROPERTY_BorderLeft: | |
| 204 if (ParseBorderPropoerty(pStaticStore, pszValue, iValueLen, pColor, | |
| 205 pStyle, pWidth)) { | |
| 206 AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant, | |
| 207 FDE_CSSPROPERTY_BorderLeftColor, | |
| 208 FDE_CSSPROPERTY_BorderLeftStyle, | |
| 209 FDE_CSSPROPERTY_BorderLeftWidth); | |
| 210 return TRUE; | |
| 211 } | |
| 212 break; | |
| 213 case FDE_CSSPROPERTY_BorderTop: | |
| 214 if (ParseBorderPropoerty(pStaticStore, pszValue, iValueLen, pColor, | |
| 215 pStyle, pWidth)) { | |
| 216 AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant, | |
| 217 FDE_CSSPROPERTY_BorderTopColor, | |
| 218 FDE_CSSPROPERTY_BorderTopStyle, | |
| 219 FDE_CSSPROPERTY_BorderTopWidth); | |
| 220 return TRUE; | |
| 221 } | |
| 222 break; | |
| 223 case FDE_CSSPROPERTY_BorderRight: | |
| 224 if (ParseBorderPropoerty(pStaticStore, pszValue, iValueLen, pColor, | |
| 225 pStyle, pWidth)) { | |
| 226 AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant, | |
| 227 FDE_CSSPROPERTY_BorderRightColor, | |
| 228 FDE_CSSPROPERTY_BorderRightStyle, | |
| 229 FDE_CSSPROPERTY_BorderRightWidth); | |
| 230 return TRUE; | |
| 231 } | |
| 232 break; | |
| 233 case FDE_CSSPROPERTY_BorderBottom: | |
| 234 if (ParseBorderPropoerty(pStaticStore, pszValue, iValueLen, pColor, | |
| 235 pStyle, pWidth)) { | |
| 236 AddBorderProperty(pStaticStore, pColor, pStyle, pWidth, bImportant, | |
| 237 FDE_CSSPROPERTY_BorderBottomColor, | |
| 238 FDE_CSSPROPERTY_BorderBottomStyle, | |
| 239 FDE_CSSPROPERTY_BorderBottomWidth); | |
| 240 return TRUE; | |
| 241 } | |
| 242 break; | |
| 243 case FDE_CSSPROPERTY_Overflow: | |
| 244 return ParseOverflowProperty(pArgs, pszValue, iValueLen, bImportant); | |
| 245 case FDE_CSSPROPERTY_ColumnRule: | |
| 246 return ParseColumnRuleProperty(pArgs, pszValue, iValueLen, | |
| 247 bImportant); | |
| 248 default: | |
| 249 break; | |
| 250 } | |
| 251 } break; | |
| 252 case FDE_CSSVALUETYPE_List: | |
| 253 switch (pArgs->pProperty->eName) { | |
| 254 case FDE_CSSPROPERTY_CounterIncrement: | |
| 255 case FDE_CSSPROPERTY_CounterReset: | |
| 256 return ParseCounterProperty(pArgs, pszValue, iValueLen, bImportant); | |
| 257 case FDE_CSSPROPERTY_Content: | |
| 258 return ParseContentProperty(pArgs, pszValue, iValueLen, bImportant); | |
| 259 default: | |
| 260 return ParseValueListProperty(pArgs, pszValue, iValueLen, bImportant); | |
| 261 } | |
| 262 default: | |
| 263 FXSYS_assert(FALSE); | |
| 264 break; | |
| 265 } | |
| 266 return FALSE; | |
| 267 } | |
| 268 FX_BOOL CFDE_CSSDeclaration::AddProperty(const FDE_CSSPROPERTYARGS* pArgs, | |
| 269 const FX_WCHAR* pszName, | |
| 270 int32_t iNameLen, | |
| 271 const FX_WCHAR* pszValue, | |
| 272 int32_t iValueLen) { | |
| 273 FDE_CSSCustomProperty* pProperty = | |
| 274 FXTARGET_NewWith(pArgs->pStaticStore) FDE_CSSCustomProperty; | |
| 275 pProperty->pwsName = CopyToLocal(pArgs, pszName, iNameLen); | |
| 276 pProperty->pwsValue = CopyToLocal(pArgs, pszValue, iValueLen); | |
| 277 pProperty->pNext = NULL; | |
| 278 if (m_pLastCustom == NULL) { | |
| 279 m_pLastCustom = m_pFirstCustom = pProperty; | |
| 280 } else { | |
| 281 m_pLastCustom->pNext = pProperty; | |
| 282 m_pLastCustom = pProperty; | |
| 283 } | |
| 284 return TRUE; | |
| 285 } | |
| 286 IFDE_CSSValue* CFDE_CSSDeclaration::ParseNumber( | |
| 287 const FDE_CSSPROPERTYARGS* pArgs, | |
| 288 const FX_WCHAR* pszValue, | |
| 289 int32_t iValueLen) { | |
| 290 FX_FLOAT fValue; | |
| 291 FDE_CSSPRIMITIVETYPE eUnit; | |
| 292 if (!FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eUnit)) { | |
| 293 return NULL; | |
| 294 } | |
| 295 return NewNumberValue(pArgs->pStaticStore, eUnit, fValue); | |
| 296 } | |
| 297 IFDE_CSSValue* CFDE_CSSDeclaration::ParseEnum(const FDE_CSSPROPERTYARGS* pArgs, | |
| 298 const FX_WCHAR* pszValue, | |
| 299 int32_t iValueLen) { | |
| 300 const FDE_CSSPROPERTYVALUETABLE* pValue = | |
| 301 FDE_GetCSSPropertyValueByName(pszValue, iValueLen); | |
| 302 return pValue ? NewEnumValue(pArgs->pStaticStore, pValue->eName) : NULL; | |
| 303 } | |
| 304 IFDE_CSSValue* CFDE_CSSDeclaration::ParseColor(const FDE_CSSPROPERTYARGS* pArgs, | |
| 305 const FX_WCHAR* pszValue, | |
| 306 int32_t iValueLen) { | |
| 307 FX_ARGB dwColor; | |
| 308 if (!FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) { | |
| 309 return NULL; | |
| 310 } | |
| 311 return FXTARGET_NewWith(pArgs->pStaticStore) CFDE_CSSPrimitiveValue(dwColor); | |
| 312 } | |
| 313 IFDE_CSSValue* CFDE_CSSDeclaration::ParseURI(const FDE_CSSPROPERTYARGS* pArgs, | |
| 314 const FX_WCHAR* pszValue, | |
| 315 int32_t iValueLen) { | |
| 316 int32_t iOffset; | |
| 317 if (!FDE_ParseCSSURI(pszValue, iValueLen, iOffset, iValueLen)) { | |
| 318 return NULL; | |
| 319 } | |
| 320 if (iValueLen <= 0) { | |
| 321 return NULL; | |
| 322 } | |
| 323 pszValue = CopyToLocal(pArgs, pszValue + iOffset, iValueLen); | |
| 324 return pszValue | |
| 325 ? FXTARGET_NewWith(pArgs->pStaticStore) | |
| 326 CFDE_CSSPrimitiveValue(FDE_CSSPRIMITIVETYPE_URI, pszValue) | |
| 327 : NULL; | |
| 328 } | |
| 329 IFDE_CSSValue* CFDE_CSSDeclaration::ParseString( | |
| 330 const FDE_CSSPROPERTYARGS* pArgs, | |
| 331 const FX_WCHAR* pszValue, | |
| 332 int32_t iValueLen) { | |
| 333 int32_t iOffset; | |
| 334 if (!FDE_ParseCSSString(pszValue, iValueLen, iOffset, iValueLen)) { | |
| 335 return NULL; | |
| 336 } | |
| 337 if (iValueLen <= 0) { | |
| 338 return NULL; | |
| 339 } | |
| 340 pszValue = CopyToLocal(pArgs, pszValue + iOffset, iValueLen); | |
| 341 return pszValue | |
| 342 ? FXTARGET_NewWith(pArgs->pStaticStore) | |
| 343 CFDE_CSSPrimitiveValue(FDE_CSSPRIMITIVETYPE_String, pszValue) | |
| 344 : NULL; | |
| 345 } | |
| 346 IFDE_CSSValue* CFDE_CSSDeclaration::ParseFunction( | |
| 347 const FDE_CSSPROPERTYARGS* pArgs, | |
| 348 const FX_WCHAR* pszValue, | |
| 349 int32_t iValueLen) { | |
| 350 if (pszValue[iValueLen - 1] != ')') { | |
| 351 return NULL; | |
| 352 } | |
| 353 int32_t iStartBracket = 0; | |
| 354 while (pszValue[iStartBracket] != '(') { | |
| 355 if (iStartBracket < iValueLen) { | |
| 356 iStartBracket++; | |
| 357 } else { | |
| 358 return NULL; | |
| 359 } | |
| 360 } | |
| 361 if (iStartBracket == 0) { | |
| 362 return NULL; | |
| 363 } | |
| 364 const FX_WCHAR* pszFuncName = CopyToLocal(pArgs, pszValue, iStartBracket); | |
| 365 pszValue += (iStartBracket + 1); | |
| 366 iValueLen -= (iStartBracket + 2); | |
| 367 CFDE_CSSValueArray argumentArr; | |
| 368 CFDE_CSSValueListParser parser(pszValue, iValueLen, ','); | |
| 369 FDE_CSSPRIMITIVETYPE ePrimitiveType; | |
| 370 while (parser.NextValue(ePrimitiveType, pszValue, iValueLen)) { | |
| 371 switch (ePrimitiveType) { | |
| 372 case FDE_CSSPRIMITIVETYPE_String: { | |
| 373 const FDE_CSSPROPERTYVALUETABLE* pPropertyValue = | |
| 374 FDE_GetCSSPropertyValueByName(pszValue, iValueLen); | |
| 375 if (pPropertyValue != NULL) { | |
| 376 argumentArr.Add( | |
| 377 NewEnumValue(pArgs->pStaticStore, pPropertyValue->eName)); | |
| 378 continue; | |
| 379 } | |
| 380 IFDE_CSSValue* pFunctionValue = | |
| 381 ParseFunction(pArgs, pszValue, iValueLen); | |
| 382 if (pFunctionValue != NULL) { | |
| 383 argumentArr.Add(pFunctionValue); | |
| 384 continue; | |
| 385 } | |
| 386 argumentArr.Add(FXTARGET_NewWith(pArgs->pStaticStore) | |
| 387 CFDE_CSSPrimitiveValue( | |
| 388 FDE_CSSPRIMITIVETYPE_String, | |
| 389 CopyToLocal(pArgs, pszValue, iValueLen))); | |
| 390 } break; | |
| 391 case FDE_CSSPRIMITIVETYPE_Number: { | |
| 392 FX_FLOAT fValue; | |
| 393 if (FDE_ParseCSSNumber(pszValue, iValueLen, fValue, ePrimitiveType)) { | |
| 394 argumentArr.Add( | |
| 395 NewNumberValue(pArgs->pStaticStore, ePrimitiveType, fValue)); | |
| 396 } | |
| 397 } break; | |
| 398 default: | |
| 399 argumentArr.Add(FXTARGET_NewWith(pArgs->pStaticStore) | |
| 400 CFDE_CSSPrimitiveValue( | |
| 401 FDE_CSSPRIMITIVETYPE_String, | |
| 402 CopyToLocal(pArgs, pszValue, iValueLen))); | |
| 403 break; | |
| 404 } | |
| 405 } | |
| 406 IFDE_CSSValueList* pArgumentList = FXTARGET_NewWith(pArgs->pStaticStore) | |
| 407 CFDE_CSSValueList(pArgs->pStaticStore, argumentArr); | |
| 408 CFDE_CSSFunction* pFunction = FXTARGET_NewWith(pArgs->pStaticStore) | |
| 409 CFDE_CSSFunction(pszFuncName, pArgumentList); | |
| 410 return FXTARGET_NewWith(pArgs->pStaticStore) | |
| 411 CFDE_CSSPrimitiveValue(pFunction); | |
| 412 } | |
| 413 FX_BOOL CFDE_CSSDeclaration::ParseContentProperty( | |
| 414 const FDE_CSSPROPERTYARGS* pArgs, | |
| 415 const FX_WCHAR* pszValue, | |
| 416 int32_t iValueLen, | |
| 417 FX_BOOL bImportant) { | |
| 418 IFX_MEMAllocator* pStaticStore = (IFX_MEMAllocator*)pArgs->pStaticStore; | |
| 419 CFDE_CSSValueListParser parser(pszValue, iValueLen, ' '); | |
| 420 FDE_CSSPRIMITIVETYPE eType; | |
| 421 CFDE_CSSValueArray list; | |
| 422 while (parser.NextValue(eType, pszValue, iValueLen)) { | |
| 423 switch (eType) { | |
| 424 case FDE_CSSPRIMITIVETYPE_URI: | |
| 425 list.Add(FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue( | |
| 426 eType, CopyToLocal(pArgs, pszValue, iValueLen))); | |
| 427 break; | |
| 428 case FDE_CSSPRIMITIVETYPE_Number: | |
| 429 return FALSE; | |
| 430 case FDE_CSSPRIMITIVETYPE_String: { | |
| 431 const FDE_CSSPROPERTYVALUETABLE* pValue = | |
| 432 FDE_GetCSSPropertyValueByName(pszValue, iValueLen); | |
| 433 if (pValue != NULL) { | |
| 434 switch (pValue->eName) { | |
| 435 case FDE_CSSPROPERTYVALUE_Normal: | |
| 436 case FDE_CSSPROPERTYVALUE_None: { | |
| 437 if (list.GetSize() == 0) { | |
| 438 list.Add(NewEnumValue(pStaticStore, pValue->eName)); | |
| 439 } else { | |
| 440 return FALSE; | |
| 441 } | |
| 442 } break; | |
| 443 case FDE_CSSPROPERTYVALUE_OpenQuote: | |
| 444 case FDE_CSSPROPERTYVALUE_CloseQuote: | |
| 445 case FDE_CSSPROPERTYVALUE_NoOpenQuote: | |
| 446 case FDE_CSSPROPERTYVALUE_NoCloseQuote: | |
| 447 list.Add(NewEnumValue(pStaticStore, pValue->eName)); | |
| 448 break; | |
| 449 default: | |
| 450 return FALSE; | |
| 451 } | |
| 452 continue; | |
| 453 } | |
| 454 IFDE_CSSValue* pFunction = ParseFunction(pArgs, pszValue, iValueLen); | |
| 455 if (pFunction != NULL) { | |
| 456 list.Add(pFunction); | |
| 457 continue; | |
| 458 } | |
| 459 list.Add(FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue( | |
| 460 eType, CopyToLocal(pArgs, pszValue, iValueLen))); | |
| 461 } break; | |
| 462 case FDE_CSSPRIMITIVETYPE_RGB: | |
| 463 return FALSE; | |
| 464 default: | |
| 465 break; | |
| 466 } | |
| 467 } | |
| 468 if (list.GetSize() == 0) { | |
| 469 return FALSE; | |
| 470 } | |
| 471 AddPropertyHolder(pStaticStore, pArgs->pProperty->eName, | |
| 472 FXTARGET_NewWith(pStaticStore) | |
| 473 CFDE_CSSValueList(pStaticStore, list), | |
| 474 bImportant); | |
| 475 return TRUE; | |
| 476 } | |
| 477 FX_BOOL CFDE_CSSDeclaration::ParseCounterProperty( | |
| 478 const FDE_CSSPROPERTYARGS* pArgs, | |
| 479 const FX_WCHAR* pszValue, | |
| 480 int32_t iValueLen, | |
| 481 FX_BOOL bImportant) { | |
| 482 IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore; | |
| 483 CFDE_CSSValueListParser parser(pszValue, iValueLen, ' '); | |
| 484 CFDE_CSSValueArray list; | |
| 485 CFDE_CSSValueArray listFull; | |
| 486 FDE_CSSPRIMITIVETYPE eType; | |
| 487 while (parser.NextValue(eType, pszValue, iValueLen)) { | |
| 488 switch (eType) { | |
| 489 case FDE_CSSPRIMITIVETYPE_Number: { | |
| 490 FX_FLOAT fValue; | |
| 491 if (FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType)) { | |
| 492 if (list.GetSize() == 1) { | |
| 493 list.Add(NewNumberValue(pStaticStore, eType, fValue)); | |
| 494 listFull.Add(FXTARGET_NewWith(pStaticStore) | |
| 495 CFDE_CSSValueList(pStaticStore, list)); | |
| 496 list.RemoveAll(); | |
| 497 } else { | |
| 498 return FALSE; | |
| 499 } | |
| 500 } | |
| 501 } break; | |
| 502 case FDE_CSSPRIMITIVETYPE_String: { | |
| 503 if (list.GetSize() == 0) { | |
| 504 pszValue = CopyToLocal(pArgs, pszValue, iValueLen); | |
| 505 list.Add(FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue( | |
| 506 FDE_CSSPRIMITIVETYPE_String, pszValue)); | |
| 507 } else { | |
| 508 listFull.Add(FXTARGET_NewWith(pStaticStore) | |
| 509 CFDE_CSSValueList(pStaticStore, list)); | |
| 510 list.RemoveAll(); | |
| 511 pszValue = CopyToLocal(pArgs, pszValue, iValueLen); | |
| 512 list.Add(FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue( | |
| 513 FDE_CSSPRIMITIVETYPE_String, pszValue)); | |
| 514 } | |
| 515 } break; | |
| 516 default: | |
| 517 break; | |
| 518 } | |
| 519 } | |
| 520 if (list.GetSize() == 1) { | |
| 521 listFull.Add(FXTARGET_NewWith(pStaticStore) | |
| 522 CFDE_CSSValueList(pStaticStore, list)); | |
| 523 } | |
| 524 if (listFull.GetSize() == 0) { | |
| 525 return FALSE; | |
| 526 } | |
| 527 AddPropertyHolder(pStaticStore, pArgs->pProperty->eName, | |
| 528 FXTARGET_NewWith(pStaticStore) | |
| 529 CFDE_CSSValueList(pStaticStore, listFull), | |
| 530 bImportant); | |
| 531 return TRUE; | |
| 532 } | |
| 533 FX_BOOL CFDE_CSSDeclaration::ParseValueListProperty( | |
| 534 const FDE_CSSPROPERTYARGS* pArgs, | |
| 535 const FX_WCHAR* pszValue, | |
| 536 int32_t iValueLen, | |
| 537 FX_BOOL bImportant) { | |
| 538 IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore; | |
| 539 FX_WCHAR separator = | |
| 540 (pArgs->pProperty->eName == FDE_CSSPROPERTY_FontFamily) ? ',' : ' '; | |
| 541 CFDE_CSSValueListParser parser(pszValue, iValueLen, separator); | |
| 542 const FX_DWORD dwType = pArgs->pProperty->dwType; | |
| 543 FDE_CSSPRIMITIVETYPE eType; | |
| 544 CFDE_CSSValueArray list; | |
| 545 while (parser.NextValue(eType, pszValue, iValueLen)) { | |
| 546 switch (eType) { | |
| 547 case FDE_CSSPRIMITIVETYPE_Number: | |
| 548 if (dwType & FDE_CSSVALUETYPE_MaybeNumber) { | |
| 549 FX_FLOAT fValue; | |
| 550 if (FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType)) { | |
| 551 list.Add(NewNumberValue(pStaticStore, eType, fValue)); | |
| 552 } | |
| 553 } | |
| 554 break; | |
| 555 case FDE_CSSPRIMITIVETYPE_String: | |
| 556 if (dwType & FDE_CSSVALUETYPE_MaybeColor) { | |
| 557 FX_ARGB dwColor; | |
| 558 if (FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) { | |
| 559 list.Add(FXTARGET_NewWith(pStaticStore) | |
| 560 CFDE_CSSPrimitiveValue(dwColor)); | |
| 561 continue; | |
| 562 } | |
| 563 } | |
| 564 if (dwType & FDE_CSSVALUETYPE_MaybeEnum) { | |
| 565 const FDE_CSSPROPERTYVALUETABLE* pValue = | |
| 566 FDE_GetCSSPropertyValueByName(pszValue, iValueLen); | |
| 567 if (pValue != NULL) { | |
| 568 list.Add(NewEnumValue(pStaticStore, pValue->eName)); | |
| 569 continue; | |
| 570 } | |
| 571 } | |
| 572 if (dwType & FDE_CSSVALUETYPE_MaybeString) { | |
| 573 pszValue = CopyToLocal(pArgs, pszValue, iValueLen); | |
| 574 list.Add(FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue( | |
| 575 FDE_CSSPRIMITIVETYPE_String, pszValue)); | |
| 576 } | |
| 577 break; | |
| 578 case FDE_CSSPRIMITIVETYPE_RGB: | |
| 579 if (dwType & FDE_CSSVALUETYPE_MaybeColor) { | |
| 580 FX_ARGB dwColor; | |
| 581 if (FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) { | |
| 582 list.Add(FXTARGET_NewWith(pStaticStore) | |
| 583 CFDE_CSSPrimitiveValue(dwColor)); | |
| 584 } | |
| 585 } | |
| 586 break; | |
| 587 default: | |
| 588 break; | |
| 589 } | |
| 590 } | |
| 591 if (list.GetSize() == 0) { | |
| 592 return FALSE; | |
| 593 } | |
| 594 switch (pArgs->pProperty->eName) { | |
| 595 case FDE_CSSPROPERTY_BorderColor: | |
| 596 return Add4ValuesProperty( | |
| 597 pStaticStore, list, bImportant, FDE_CSSPROPERTY_BorderLeftColor, | |
| 598 FDE_CSSPROPERTY_BorderTopColor, FDE_CSSPROPERTY_BorderRightColor, | |
| 599 FDE_CSSPROPERTY_BorderBottomColor); | |
| 600 case FDE_CSSPROPERTY_BorderStyle: | |
| 601 return Add4ValuesProperty( | |
| 602 pStaticStore, list, bImportant, FDE_CSSPROPERTY_BorderLeftStyle, | |
| 603 FDE_CSSPROPERTY_BorderTopStyle, FDE_CSSPROPERTY_BorderRightStyle, | |
| 604 FDE_CSSPROPERTY_BorderBottomStyle); | |
| 605 case FDE_CSSPROPERTY_BorderWidth: | |
| 606 return Add4ValuesProperty( | |
| 607 pStaticStore, list, bImportant, FDE_CSSPROPERTY_BorderLeftWidth, | |
| 608 FDE_CSSPROPERTY_BorderTopWidth, FDE_CSSPROPERTY_BorderRightWidth, | |
| 609 FDE_CSSPROPERTY_BorderBottomWidth); | |
| 610 case FDE_CSSPROPERTY_Margin: | |
| 611 return Add4ValuesProperty( | |
| 612 pStaticStore, list, bImportant, FDE_CSSPROPERTY_MarginLeft, | |
| 613 FDE_CSSPROPERTY_MarginTop, FDE_CSSPROPERTY_MarginRight, | |
| 614 FDE_CSSPROPERTY_MarginBottom); | |
| 615 case FDE_CSSPROPERTY_Padding: | |
| 616 return Add4ValuesProperty( | |
| 617 pStaticStore, list, bImportant, FDE_CSSPROPERTY_PaddingLeft, | |
| 618 FDE_CSSPROPERTY_PaddingTop, FDE_CSSPROPERTY_PaddingRight, | |
| 619 FDE_CSSPROPERTY_PaddingBottom); | |
| 620 default: { | |
| 621 CFDE_CSSValueList* pList = | |
| 622 FXTARGET_NewWith(pStaticStore) CFDE_CSSValueList(pStaticStore, list); | |
| 623 AddPropertyHolder(pStaticStore, pArgs->pProperty->eName, pList, | |
| 624 bImportant); | |
| 625 return TRUE; | |
| 626 } break; | |
| 627 } | |
| 628 return FALSE; | |
| 629 } | |
| 630 FX_BOOL CFDE_CSSDeclaration::Add4ValuesProperty(IFX_MEMAllocator* pStaticStore, | |
| 631 const CFDE_CSSValueArray& list, | |
| 632 FX_BOOL bImportant, | |
| 633 FDE_CSSPROPERTY eLeft, | |
| 634 FDE_CSSPROPERTY eTop, | |
| 635 FDE_CSSPROPERTY eRight, | |
| 636 FDE_CSSPROPERTY eBottom) { | |
| 637 switch (list.GetSize()) { | |
| 638 case 1: | |
| 639 AddPropertyHolder(pStaticStore, eLeft, list[0], bImportant); | |
| 640 AddPropertyHolder(pStaticStore, eTop, list[0], bImportant); | |
| 641 AddPropertyHolder(pStaticStore, eRight, list[0], bImportant); | |
| 642 AddPropertyHolder(pStaticStore, eBottom, list[0], bImportant); | |
| 643 return TRUE; | |
| 644 case 2: | |
| 645 AddPropertyHolder(pStaticStore, eLeft, list[1], bImportant); | |
| 646 AddPropertyHolder(pStaticStore, eTop, list[0], bImportant); | |
| 647 AddPropertyHolder(pStaticStore, eRight, list[1], bImportant); | |
| 648 AddPropertyHolder(pStaticStore, eBottom, list[0], bImportant); | |
| 649 return TRUE; | |
| 650 case 3: | |
| 651 AddPropertyHolder(pStaticStore, eLeft, list[1], bImportant); | |
| 652 AddPropertyHolder(pStaticStore, eTop, list[0], bImportant); | |
| 653 AddPropertyHolder(pStaticStore, eRight, list[1], bImportant); | |
| 654 AddPropertyHolder(pStaticStore, eBottom, list[2], bImportant); | |
| 655 return TRUE; | |
| 656 case 4: | |
| 657 AddPropertyHolder(pStaticStore, eLeft, list[3], bImportant); | |
| 658 AddPropertyHolder(pStaticStore, eTop, list[0], bImportant); | |
| 659 AddPropertyHolder(pStaticStore, eRight, list[1], bImportant); | |
| 660 AddPropertyHolder(pStaticStore, eBottom, list[2], bImportant); | |
| 661 return TRUE; | |
| 662 default: | |
| 663 break; | |
| 664 } | |
| 665 return FALSE; | |
| 666 } | |
| 667 FX_BOOL CFDE_CSSDeclaration::ParseBorderPropoerty( | |
| 668 IFX_MEMAllocator* pStaticStore, | |
| 669 const FX_WCHAR* pszValue, | |
| 670 int32_t iValueLen, | |
| 671 IFDE_CSSValue*& pColor, | |
| 672 IFDE_CSSValue*& pStyle, | |
| 673 IFDE_CSSValue*& pWidth) const { | |
| 674 pColor = pStyle = pWidth = NULL; | |
| 675 CFDE_CSSValueListParser parser(pszValue, iValueLen, ' '); | |
| 676 FDE_CSSPRIMITIVETYPE eType; | |
| 677 while (parser.NextValue(eType, pszValue, iValueLen)) { | |
| 678 switch (eType) { | |
| 679 case FDE_CSSPRIMITIVETYPE_Number: | |
| 680 if (pWidth == NULL) { | |
| 681 FX_FLOAT fValue; | |
| 682 if (FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType)) { | |
| 683 pWidth = NewNumberValue(pStaticStore, eType, fValue); | |
| 684 } | |
| 685 } | |
| 686 break; | |
| 687 case FDE_CSSPRIMITIVETYPE_RGB: | |
| 688 if (pColor == NULL) { | |
| 689 FX_ARGB dwColor; | |
| 690 if (FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) { | |
| 691 pColor = | |
| 692 FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(dwColor); | |
| 693 } | |
| 694 } | |
| 695 break; | |
| 696 case FDE_CSSPRIMITIVETYPE_String: { | |
| 697 const FDE_CSSCOLORTABLE* pColorItem = | |
| 698 FDE_GetCSSColorByName(pszValue, iValueLen); | |
| 699 if (pColorItem != NULL) { | |
| 700 if (pColor == NULL) { | |
| 701 pColor = FXTARGET_NewWith(pStaticStore) | |
| 702 CFDE_CSSPrimitiveValue(pColorItem->dwValue); | |
| 703 } | |
| 704 continue; | |
| 705 } | |
| 706 const FDE_CSSPROPERTYVALUETABLE* pValue = | |
| 707 FDE_GetCSSPropertyValueByName(pszValue, iValueLen); | |
| 708 if (pValue == NULL) { | |
| 709 continue; | |
| 710 } | |
| 711 switch (pValue->eName) { | |
| 712 case FDE_CSSPROPERTYVALUE_Transparent: | |
| 713 if (pColor == NULL) { | |
| 714 pColor = FXTARGET_NewWith(pStaticStore) | |
| 715 CFDE_CSSPrimitiveValue((FX_ARGB)0); | |
| 716 } | |
| 717 break; | |
| 718 case FDE_CSSPROPERTYVALUE_Thin: | |
| 719 case FDE_CSSPROPERTYVALUE_Thick: | |
| 720 case FDE_CSSPROPERTYVALUE_Medium: | |
| 721 if (pWidth == NULL) { | |
| 722 pWidth = NewEnumValue(pStaticStore, pValue->eName); | |
| 723 } | |
| 724 break; | |
| 725 case FDE_CSSPROPERTYVALUE_None: | |
| 726 case FDE_CSSPROPERTYVALUE_Hidden: | |
| 727 case FDE_CSSPROPERTYVALUE_Dotted: | |
| 728 case FDE_CSSPROPERTYVALUE_Dashed: | |
| 729 case FDE_CSSPROPERTYVALUE_Solid: | |
| 730 case FDE_CSSPROPERTYVALUE_Double: | |
| 731 case FDE_CSSPROPERTYVALUE_Groove: | |
| 732 case FDE_CSSPROPERTYVALUE_Ridge: | |
| 733 case FDE_CSSPROPERTYVALUE_Inset: | |
| 734 case FDE_CSSPROPERTYVALUE_Outset: | |
| 735 if (pStyle == NULL) { | |
| 736 pStyle = NewEnumValue(pStaticStore, pValue->eName); | |
| 737 } | |
| 738 break; | |
| 739 default: | |
| 740 break; | |
| 741 } | |
| 742 }; break; | |
| 743 default: | |
| 744 break; | |
| 745 } | |
| 746 } | |
| 747 if (pColor == NULL) { | |
| 748 pColor = FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue((FX_ARGB)0); | |
| 749 } | |
| 750 if (pStyle == NULL) { | |
| 751 pStyle = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_None); | |
| 752 } | |
| 753 if (pWidth == NULL) { | |
| 754 pWidth = NewNumberValue(pStaticStore, FDE_CSSPRIMITIVETYPE_Number, 0.0f); | |
| 755 } | |
| 756 return TRUE; | |
| 757 } | |
| 758 void CFDE_CSSDeclaration::AddBorderProperty(IFX_MEMAllocator* pStaticStore, | |
| 759 IFDE_CSSValue* pColor, | |
| 760 IFDE_CSSValue* pStyle, | |
| 761 IFDE_CSSValue* pWidth, | |
| 762 FX_BOOL bImportant, | |
| 763 FDE_CSSPROPERTY eColor, | |
| 764 FDE_CSSPROPERTY eStyle, | |
| 765 FDE_CSSPROPERTY eWidth) { | |
| 766 AddPropertyHolder(pStaticStore, eStyle, pStyle, bImportant); | |
| 767 AddPropertyHolder(pStaticStore, eWidth, pWidth, bImportant); | |
| 768 AddPropertyHolder(pStaticStore, eColor, pColor, bImportant); | |
| 769 } | |
| 770 FX_BOOL CFDE_CSSDeclaration::ParseListStyleProperty( | |
| 771 const FDE_CSSPROPERTYARGS* pArgs, | |
| 772 const FX_WCHAR* pszValue, | |
| 773 int32_t iValueLen, | |
| 774 FX_BOOL bImportant) { | |
| 775 IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore; | |
| 776 CFDE_CSSValueListParser parser(pszValue, iValueLen, ' '); | |
| 777 IFDE_CSSPrimitiveValue *pType = NULL, *pImage = NULL, *pPosition = NULL; | |
| 778 FDE_CSSPRIMITIVETYPE eType; | |
| 779 while (parser.NextValue(eType, pszValue, iValueLen)) { | |
| 780 switch (eType) { | |
| 781 case FDE_CSSPRIMITIVETYPE_URI: | |
| 782 if (pImage == NULL) { | |
| 783 pImage = FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue( | |
| 784 eType, CopyToLocal(pArgs, pszValue, iValueLen)); | |
| 785 } | |
| 786 break; | |
| 787 case FDE_CSSPRIMITIVETYPE_String: { | |
| 788 const FDE_CSSPROPERTYVALUETABLE* pValue = | |
| 789 FDE_GetCSSPropertyValueByName(pszValue, iValueLen); | |
| 790 if (pValue == NULL) { | |
| 791 break; | |
| 792 } | |
| 793 switch (pValue->eName) { | |
| 794 case FDE_CSSPROPERTYVALUE_None: | |
| 795 if (pImage == NULL) { | |
| 796 pImage = NewEnumValue(pStaticStore, pValue->eName); | |
| 797 } else if (pType == NULL) { | |
| 798 pImage = NewEnumValue(pStaticStore, pValue->eName); | |
| 799 } | |
| 800 break; | |
| 801 case FDE_CSSPROPERTYVALUE_Inside: | |
| 802 case FDE_CSSPROPERTYVALUE_Outside: | |
| 803 if (pPosition == NULL) { | |
| 804 pPosition = NewEnumValue(pStaticStore, pValue->eName); | |
| 805 } | |
| 806 break; | |
| 807 case FDE_CSSPROPERTYVALUE_Disc: | |
| 808 case FDE_CSSPROPERTYVALUE_Circle: | |
| 809 case FDE_CSSPROPERTYVALUE_Square: | |
| 810 case FDE_CSSPROPERTYVALUE_Decimal: | |
| 811 case FDE_CSSPROPERTYVALUE_DecimalLeadingZero: | |
| 812 case FDE_CSSPROPERTYVALUE_LowerRoman: | |
| 813 case FDE_CSSPROPERTYVALUE_UpperRoman: | |
| 814 case FDE_CSSPROPERTYVALUE_LowerGreek: | |
| 815 case FDE_CSSPROPERTYVALUE_LowerLatin: | |
| 816 case FDE_CSSPROPERTYVALUE_UpperLatin: | |
| 817 case FDE_CSSPROPERTYVALUE_Armenian: | |
| 818 case FDE_CSSPROPERTYVALUE_Georgian: | |
| 819 case FDE_CSSPROPERTYVALUE_LowerAlpha: | |
| 820 case FDE_CSSPROPERTYVALUE_UpperAlpha: | |
| 821 if (pType == NULL) { | |
| 822 pType = NewEnumValue(pStaticStore, pValue->eName); | |
| 823 } | |
| 824 break; | |
| 825 default: | |
| 826 break; | |
| 827 } | |
| 828 }; break; | |
| 829 default: | |
| 830 break; | |
| 831 } | |
| 832 } | |
| 833 if (pPosition == NULL) { | |
| 834 pPosition = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Outside); | |
| 835 } | |
| 836 if (pImage == NULL) { | |
| 837 pImage = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_None); | |
| 838 } | |
| 839 if (pType == NULL) { | |
| 840 pType = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_None); | |
| 841 } | |
| 842 AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ListStylePosition, pPosition, | |
| 843 bImportant); | |
| 844 AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ListStyleImage, pImage, | |
| 845 bImportant); | |
| 846 AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ListStyleType, pType, | |
| 847 bImportant); | |
| 848 return TRUE; | |
| 849 } | |
| 850 FX_BOOL CFDE_CSSDeclaration::ParseBackgroundProperty( | |
| 851 const FDE_CSSPROPERTYARGS* pArgs, | |
| 852 const FX_WCHAR* pszValue, | |
| 853 int32_t iValueLen, | |
| 854 FX_BOOL bImportant) { | |
| 855 IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore; | |
| 856 CFDE_CSSValueListParser parser(pszValue, iValueLen, ' '); | |
| 857 IFDE_CSSPrimitiveValue *pColor = NULL, *pImage = NULL, *pRepeat = NULL; | |
| 858 IFDE_CSSPrimitiveValue *pPosX = NULL, *pPosY = NULL, *pAttachment = NULL; | |
| 859 FDE_CSSPRIMITIVETYPE eType; | |
| 860 while (parser.NextValue(eType, pszValue, iValueLen)) { | |
| 861 switch (eType) { | |
| 862 case FDE_CSSPRIMITIVETYPE_URI: | |
| 863 if (pImage == NULL) { | |
| 864 pImage = FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue( | |
| 865 eType, CopyToLocal(pArgs, pszValue, iValueLen)); | |
| 866 } | |
| 867 break; | |
| 868 case FDE_CSSPRIMITIVETYPE_Number: { | |
| 869 FX_FLOAT fValue; | |
| 870 if (!FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType)) { | |
| 871 break; | |
| 872 } | |
| 873 if (pPosX == NULL) { | |
| 874 pPosX = NewNumberValue(pStaticStore, eType, fValue); | |
| 875 } else if (pPosY == NULL) { | |
| 876 pPosY = NewNumberValue(pStaticStore, eType, fValue); | |
| 877 } | |
| 878 } break; | |
| 879 case FDE_CSSPRIMITIVETYPE_String: { | |
| 880 const FDE_CSSPROPERTYVALUETABLE* pValue = | |
| 881 FDE_GetCSSPropertyValueByName(pszValue, iValueLen); | |
| 882 if (pValue != NULL) { | |
| 883 switch (pValue->eName) { | |
| 884 case FDE_CSSPROPERTYVALUE_None: | |
| 885 if (pImage == NULL) { | |
| 886 pImage = NewEnumValue(pStaticStore, pValue->eName); | |
| 887 } | |
| 888 break; | |
| 889 case FDE_CSSPROPERTYVALUE_Transparent: | |
| 890 if (pColor == NULL) { | |
| 891 pColor = FXTARGET_NewWith(pStaticStore) | |
| 892 CFDE_CSSPrimitiveValue((FX_ARGB)0); | |
| 893 } | |
| 894 break; | |
| 895 case FDE_CSSPROPERTYVALUE_Fixed: | |
| 896 case FDE_CSSPROPERTYVALUE_Scroll: | |
| 897 if (pAttachment == NULL) { | |
| 898 pAttachment = NewEnumValue(pStaticStore, pValue->eName); | |
| 899 } | |
| 900 break; | |
| 901 case FDE_CSSPROPERTYVALUE_Repeat: | |
| 902 case FDE_CSSPROPERTYVALUE_RepeatX: | |
| 903 case FDE_CSSPROPERTYVALUE_RepeatY: | |
| 904 case FDE_CSSPROPERTYVALUE_NoRepeat: | |
| 905 if (pRepeat == NULL) { | |
| 906 pRepeat = NewEnumValue(pStaticStore, pValue->eName); | |
| 907 } | |
| 908 break; | |
| 909 case FDE_CSSPROPERTYVALUE_Left: | |
| 910 case FDE_CSSPROPERTYVALUE_Right: | |
| 911 if (pPosX == NULL) { | |
| 912 pPosX = NewEnumValue(pStaticStore, pValue->eName); | |
| 913 } | |
| 914 break; | |
| 915 case FDE_CSSPROPERTYVALUE_Top: | |
| 916 case FDE_CSSPROPERTYVALUE_Bottom: | |
| 917 if (pPosY == NULL) { | |
| 918 pPosX = NewEnumValue(pStaticStore, pValue->eName); | |
| 919 } | |
| 920 break; | |
| 921 case FDE_CSSPROPERTYVALUE_Center: | |
| 922 if (pPosX == NULL) { | |
| 923 pPosX = NewEnumValue(pStaticStore, pValue->eName); | |
| 924 } else if (pPosY == NULL) { | |
| 925 pPosX = NewEnumValue(pStaticStore, pValue->eName); | |
| 926 } | |
| 927 break; | |
| 928 default: | |
| 929 break; | |
| 930 } | |
| 931 break; | |
| 932 } | |
| 933 const FDE_CSSCOLORTABLE* pColorItem = | |
| 934 FDE_GetCSSColorByName(pszValue, iValueLen); | |
| 935 if (pColorItem != NULL) { | |
| 936 if (pColor == NULL) { | |
| 937 pColor = FXTARGET_NewWith(pStaticStore) | |
| 938 CFDE_CSSPrimitiveValue(pColorItem->dwValue); | |
| 939 } | |
| 940 } | |
| 941 } break; | |
| 942 case FDE_CSSPRIMITIVETYPE_RGB: | |
| 943 if (pColor == NULL) { | |
| 944 FX_ARGB dwColor; | |
| 945 if (FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) { | |
| 946 pColor = | |
| 947 FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(dwColor); | |
| 948 } | |
| 949 } | |
| 950 break; | |
| 951 default: | |
| 952 break; | |
| 953 } | |
| 954 } | |
| 955 if (pColor == NULL) { | |
| 956 pColor = FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue((FX_ARGB)0); | |
| 957 } | |
| 958 if (pImage == NULL) { | |
| 959 pImage = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_None); | |
| 960 } | |
| 961 if (pRepeat == NULL) { | |
| 962 pRepeat = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Repeat); | |
| 963 } | |
| 964 if (pAttachment == NULL) { | |
| 965 pAttachment = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Scroll); | |
| 966 } | |
| 967 if (pPosX == NULL) { | |
| 968 pPosX = NewNumberValue(pStaticStore, FDE_CSSPRIMITIVETYPE_Number, 0.0f); | |
| 969 pPosY = NewNumberValue(pStaticStore, FDE_CSSPRIMITIVETYPE_Number, 0.0f); | |
| 970 } else if (pPosY == NULL) { | |
| 971 pPosY = NewNumberValue(pStaticStore, FDE_CSSPRIMITIVETYPE_Number, 0.0f); | |
| 972 } | |
| 973 CFDE_CSSValueArray position; | |
| 974 position.Add(pPosX); | |
| 975 position.Add(pPosY); | |
| 976 CFDE_CSSValueList* pPosList = | |
| 977 FXTARGET_NewWith(pStaticStore) CFDE_CSSValueList(pStaticStore, position); | |
| 978 AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_BackgroundColor, pColor, | |
| 979 bImportant); | |
| 980 AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_BackgroundImage, pImage, | |
| 981 bImportant); | |
| 982 AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_BackgroundRepeat, pRepeat, | |
| 983 bImportant); | |
| 984 AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_BackgroundPosition, pPosList, | |
| 985 bImportant); | |
| 986 AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_BackgroundAttachment, | |
| 987 pAttachment, bImportant); | |
| 988 return TRUE; | |
| 989 } | |
| 990 FX_BOOL CFDE_CSSDeclaration::ParseFontProperty(const FDE_CSSPROPERTYARGS* pArgs, | |
| 991 const FX_WCHAR* pszValue, | |
| 992 int32_t iValueLen, | |
| 993 FX_BOOL bImportant) { | |
| 994 IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore; | |
| 995 CFDE_CSSValueListParser parser(pszValue, iValueLen, '/'); | |
| 996 IFDE_CSSPrimitiveValue *pStyle = NULL, *pVariant = NULL, *pWeight = NULL; | |
| 997 IFDE_CSSPrimitiveValue *pFontSize = NULL, *pLineHeight = NULL; | |
| 998 CFDE_CSSValueArray familyList; | |
| 999 FDE_CSSPRIMITIVETYPE eType; | |
| 1000 while (parser.NextValue(eType, pszValue, iValueLen)) { | |
| 1001 switch (eType) { | |
| 1002 case FDE_CSSPRIMITIVETYPE_String: { | |
| 1003 const FDE_CSSPROPERTYVALUETABLE* pValue = | |
| 1004 FDE_GetCSSPropertyValueByName(pszValue, iValueLen); | |
| 1005 if (pValue != NULL) { | |
| 1006 switch (pValue->eName) { | |
| 1007 case FDE_CSSPROPERTYVALUE_XxSmall: | |
| 1008 case FDE_CSSPROPERTYVALUE_XSmall: | |
| 1009 case FDE_CSSPROPERTYVALUE_Small: | |
| 1010 case FDE_CSSPROPERTYVALUE_Medium: | |
| 1011 case FDE_CSSPROPERTYVALUE_Large: | |
| 1012 case FDE_CSSPROPERTYVALUE_XLarge: | |
| 1013 case FDE_CSSPROPERTYVALUE_XxLarge: | |
| 1014 case FDE_CSSPROPERTYVALUE_Smaller: | |
| 1015 case FDE_CSSPROPERTYVALUE_Larger: | |
| 1016 if (pFontSize == NULL) { | |
| 1017 pFontSize = NewEnumValue(pStaticStore, pValue->eName); | |
| 1018 } | |
| 1019 continue; | |
| 1020 case FDE_CSSPROPERTYVALUE_Bold: | |
| 1021 case FDE_CSSPROPERTYVALUE_Bolder: | |
| 1022 case FDE_CSSPROPERTYVALUE_Lighter: | |
| 1023 if (pWeight == NULL) { | |
| 1024 pWeight = NewEnumValue(pStaticStore, pValue->eName); | |
| 1025 } | |
| 1026 continue; | |
| 1027 case FDE_CSSPROPERTYVALUE_Italic: | |
| 1028 case FDE_CSSPROPERTYVALUE_Oblique: | |
| 1029 if (pStyle == NULL) { | |
| 1030 pStyle = NewEnumValue(pStaticStore, pValue->eName); | |
| 1031 } | |
| 1032 continue; | |
| 1033 case FDE_CSSPROPERTYVALUE_SmallCaps: | |
| 1034 if (pVariant == NULL) { | |
| 1035 pVariant = NewEnumValue(pStaticStore, pValue->eName); | |
| 1036 } | |
| 1037 continue; | |
| 1038 case FDE_CSSPROPERTYVALUE_Normal: | |
| 1039 if (pStyle == NULL) { | |
| 1040 pStyle = NewEnumValue(pStaticStore, pValue->eName); | |
| 1041 } else if (pVariant == NULL) { | |
| 1042 pVariant = NewEnumValue(pStaticStore, pValue->eName); | |
| 1043 } else if (pWeight == NULL) { | |
| 1044 pWeight = NewEnumValue(pStaticStore, pValue->eName); | |
| 1045 } else if (pFontSize == NULL) { | |
| 1046 pFontSize = NewEnumValue(pStaticStore, pValue->eName); | |
| 1047 } else if (pLineHeight == NULL) { | |
| 1048 pLineHeight = NewEnumValue(pStaticStore, pValue->eName); | |
| 1049 } | |
| 1050 continue; | |
| 1051 default: | |
| 1052 break; | |
| 1053 } | |
| 1054 } | |
| 1055 if (pFontSize != NULL) { | |
| 1056 familyList.Add(FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue( | |
| 1057 eType, CopyToLocal(pArgs, pszValue, iValueLen))); | |
| 1058 } | |
| 1059 parser.m_Separator = ','; | |
| 1060 } break; | |
| 1061 case FDE_CSSPRIMITIVETYPE_Number: { | |
| 1062 FX_FLOAT fValue; | |
| 1063 if (!FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType)) { | |
| 1064 break; | |
| 1065 } | |
| 1066 if (eType == FDE_CSSPRIMITIVETYPE_Number) { | |
| 1067 switch ((int32_t)fValue) { | |
| 1068 case 100: | |
| 1069 case 200: | |
| 1070 case 300: | |
| 1071 case 400: | |
| 1072 case 500: | |
| 1073 case 600: | |
| 1074 case 700: | |
| 1075 case 800: | |
| 1076 case 900: | |
| 1077 if (pWeight == NULL) { | |
| 1078 pWeight = NewNumberValue(pStaticStore, | |
| 1079 FDE_CSSPRIMITIVETYPE_Number, fValue); | |
| 1080 } | |
| 1081 continue; | |
| 1082 } | |
| 1083 } | |
| 1084 if (pFontSize == NULL) { | |
| 1085 pFontSize = NewNumberValue(pStaticStore, eType, fValue); | |
| 1086 } else if (pLineHeight == NULL) { | |
| 1087 pLineHeight = NewNumberValue(pStaticStore, eType, fValue); | |
| 1088 } | |
| 1089 } break; | |
| 1090 default: | |
| 1091 break; | |
| 1092 } | |
| 1093 } | |
| 1094 if (pStyle == NULL) { | |
| 1095 pStyle = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Normal); | |
| 1096 } | |
| 1097 if (pVariant == NULL) { | |
| 1098 pVariant = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Normal); | |
| 1099 } | |
| 1100 if (pWeight == NULL) { | |
| 1101 pWeight = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Normal); | |
| 1102 } | |
| 1103 if (pFontSize == NULL) { | |
| 1104 pFontSize = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Medium); | |
| 1105 } | |
| 1106 if (pLineHeight == NULL) { | |
| 1107 pLineHeight = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Normal); | |
| 1108 } | |
| 1109 AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_FontStyle, pStyle, | |
| 1110 bImportant); | |
| 1111 AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_FontVariant, pVariant, | |
| 1112 bImportant); | |
| 1113 AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_FontWeight, pWeight, | |
| 1114 bImportant); | |
| 1115 AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_FontSize, pFontSize, | |
| 1116 bImportant); | |
| 1117 AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_LineHeight, pLineHeight, | |
| 1118 bImportant); | |
| 1119 if (familyList.GetSize() > 0) { | |
| 1120 CFDE_CSSValueList* pList = FXTARGET_NewWith(pStaticStore) | |
| 1121 CFDE_CSSValueList(pStaticStore, familyList); | |
| 1122 AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_FontFamily, pList, | |
| 1123 bImportant); | |
| 1124 } | |
| 1125 return TRUE; | |
| 1126 } | |
| 1127 FX_BOOL CFDE_CSSDeclaration::ParseColumnRuleProperty( | |
| 1128 const FDE_CSSPROPERTYARGS* pArgs, | |
| 1129 const FX_WCHAR* pszValue, | |
| 1130 int32_t iValueLen, | |
| 1131 FX_BOOL bImportant) { | |
| 1132 IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore; | |
| 1133 CFDE_CSSValueListParser parser(pszValue, iValueLen, ' '); | |
| 1134 IFDE_CSSPrimitiveValue* pColumnRuleWidth = NULL; | |
| 1135 IFDE_CSSPrimitiveValue* pColumnRuleStyle = NULL; | |
| 1136 IFDE_CSSPrimitiveValue* pColumnRuleColor = NULL; | |
| 1137 FDE_CSSPRIMITIVETYPE eType; | |
| 1138 while (parser.NextValue(eType, pszValue, iValueLen)) { | |
| 1139 switch (eType) { | |
| 1140 case FDE_CSSPRIMITIVETYPE_String: { | |
| 1141 const FDE_CSSPROPERTYVALUETABLE* pValue = | |
| 1142 FDE_GetCSSPropertyValueByName(pszValue, iValueLen); | |
| 1143 if (pValue != NULL) { | |
| 1144 switch (pValue->eName) { | |
| 1145 case FDE_CSSPROPERTYVALUE_None: | |
| 1146 case FDE_CSSPROPERTYVALUE_Hidden: | |
| 1147 case FDE_CSSPROPERTYVALUE_Dotted: | |
| 1148 case FDE_CSSPROPERTYVALUE_Dashed: | |
| 1149 case FDE_CSSPROPERTYVALUE_Solid: | |
| 1150 case FDE_CSSPROPERTYVALUE_Double: | |
| 1151 case FDE_CSSPROPERTYVALUE_Groove: | |
| 1152 case FDE_CSSPROPERTYVALUE_Ridge: | |
| 1153 case FDE_CSSPROPERTYVALUE_Inset: | |
| 1154 case FDE_CSSPROPERTYVALUE_Outset: | |
| 1155 if (pColumnRuleStyle == NULL) { | |
| 1156 pColumnRuleStyle = NewEnumValue(pStaticStore, pValue->eName); | |
| 1157 } | |
| 1158 break; | |
| 1159 case FDE_CSSPROPERTYVALUE_Transparent: | |
| 1160 if (pColumnRuleColor == NULL) { | |
| 1161 pColumnRuleColor = NewEnumValue(pStaticStore, pValue->eName); | |
| 1162 } | |
| 1163 break; | |
| 1164 case FDE_CSSPROPERTYVALUE_Thin: | |
| 1165 case FDE_CSSPROPERTYVALUE_Medium: | |
| 1166 case FDE_CSSPROPERTYVALUE_Thick: | |
| 1167 if (pColumnRuleWidth == NULL) { | |
| 1168 pColumnRuleWidth = NewEnumValue(pStaticStore, pValue->eName); | |
| 1169 } | |
| 1170 break; | |
| 1171 default: | |
| 1172 break; | |
| 1173 } | |
| 1174 continue; | |
| 1175 } | |
| 1176 FX_ARGB dwColor; | |
| 1177 if (FDE_ParseCSSColor(pszValue, iValueLen, dwColor) && | |
| 1178 pColumnRuleColor == NULL) { | |
| 1179 pColumnRuleColor = FXTARGET_NewWith(pStaticStore) | |
| 1180 CFDE_CSSPrimitiveValue((FX_ARGB)dwColor); | |
| 1181 continue; | |
| 1182 } | |
| 1183 } break; | |
| 1184 case FDE_CSSPRIMITIVETYPE_Number: { | |
| 1185 FX_FLOAT fValue; | |
| 1186 if (FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType) && | |
| 1187 pColumnRuleWidth == NULL) { | |
| 1188 pColumnRuleWidth = NewNumberValue(pStaticStore, eType, fValue); | |
| 1189 } | |
| 1190 } break; | |
| 1191 case FDE_CSSPRIMITIVETYPE_RGB: { | |
| 1192 FX_ARGB dwColor; | |
| 1193 if (pColumnRuleColor == NULL && | |
| 1194 FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) { | |
| 1195 pColumnRuleColor = FXTARGET_NewWith(pStaticStore) | |
| 1196 CFDE_CSSPrimitiveValue((FX_ARGB)dwColor); | |
| 1197 } | |
| 1198 } break; | |
| 1199 default: | |
| 1200 break; | |
| 1201 } | |
| 1202 } | |
| 1203 if (pColumnRuleColor == NULL && pColumnRuleStyle == NULL && | |
| 1204 pColumnRuleWidth == NULL) { | |
| 1205 return FALSE; | |
| 1206 } | |
| 1207 if (pColumnRuleStyle == NULL) { | |
| 1208 pColumnRuleStyle = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_None); | |
| 1209 } | |
| 1210 if (pColumnRuleWidth == NULL) { | |
| 1211 pColumnRuleWidth = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Medium); | |
| 1212 } | |
| 1213 if (pColumnRuleColor == NULL) { | |
| 1214 pColumnRuleColor = | |
| 1215 FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue((FX_ARGB)0); | |
| 1216 } | |
| 1217 AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ColumnRuleStyle, | |
| 1218 pColumnRuleStyle, bImportant); | |
| 1219 AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ColumnRuleWidth, | |
| 1220 pColumnRuleWidth, bImportant); | |
| 1221 AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ColumnRuleColor, | |
| 1222 pColumnRuleColor, bImportant); | |
| 1223 return TRUE; | |
| 1224 } | |
| 1225 FX_BOOL CFDE_CSSDeclaration::ParseTextEmphasisProperty( | |
| 1226 FDE_CSSPROPERTYARGS* pArgs, | |
| 1227 const FX_WCHAR* pszValue, | |
| 1228 int32_t iValueLen, | |
| 1229 FX_BOOL bImportant) { | |
| 1230 IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore; | |
| 1231 CFDE_CSSValueListParser parser(pszValue, iValueLen, ' '); | |
| 1232 CFDE_CSSValueArray arrEmphasisStyle; | |
| 1233 FDE_CSSPRIMITIVETYPE eType; | |
| 1234 IFDE_CSSPrimitiveValue* pEmphasisColor = NULL; | |
| 1235 while (parser.NextValue(eType, pszValue, iValueLen)) { | |
| 1236 switch (eType) { | |
| 1237 case FDE_CSSPRIMITIVETYPE_String: { | |
| 1238 const FDE_CSSPROPERTYVALUETABLE* pValue = | |
| 1239 FDE_GetCSSPropertyValueByName(pszValue, iValueLen); | |
| 1240 if (pValue != NULL) { | |
| 1241 arrEmphasisStyle.Add(NewEnumValue(pStaticStore, pValue->eName)); | |
| 1242 continue; | |
| 1243 } | |
| 1244 FX_ARGB dwColor; | |
| 1245 if (FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) { | |
| 1246 pEmphasisColor = | |
| 1247 FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(dwColor); | |
| 1248 continue; | |
| 1249 } | |
| 1250 pszValue = CopyToLocal(pArgs, pszValue, iValueLen); | |
| 1251 arrEmphasisStyle.Add( | |
| 1252 FXTARGET_NewWith(pStaticStore) | |
| 1253 CFDE_CSSPrimitiveValue(FDE_CSSPRIMITIVETYPE_String, pszValue)); | |
| 1254 } break; | |
| 1255 case FDE_CSSPRIMITIVETYPE_RGB: { | |
| 1256 FX_ARGB dwColor; | |
| 1257 if (FDE_ParseCSSColor(pszValue, iValueLen, dwColor)) { | |
| 1258 pEmphasisColor = | |
| 1259 FXTARGET_NewWith(pStaticStore) CFDE_CSSPrimitiveValue(dwColor); | |
| 1260 } | |
| 1261 } break; | |
| 1262 default: | |
| 1263 break; | |
| 1264 } | |
| 1265 } | |
| 1266 if (arrEmphasisStyle.GetSize() != 0) { | |
| 1267 AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_TextEmphasisStyle, | |
| 1268 FXTARGET_NewWith(pStaticStore) | |
| 1269 CFDE_CSSValueList(pStaticStore, arrEmphasisStyle), | |
| 1270 bImportant); | |
| 1271 } | |
| 1272 if (pEmphasisColor != NULL) { | |
| 1273 AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_TextEmphasisColor, | |
| 1274 pEmphasisColor, bImportant); | |
| 1275 } | |
| 1276 return TRUE; | |
| 1277 } | |
| 1278 FX_BOOL CFDE_CSSDeclaration::ParseColumnsProperty( | |
| 1279 const FDE_CSSPROPERTYARGS* pArgs, | |
| 1280 const FX_WCHAR* pszValue, | |
| 1281 int32_t iValueLen, | |
| 1282 FX_BOOL bImportant) { | |
| 1283 IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore; | |
| 1284 CFDE_CSSValueListParser parser(pszValue, iValueLen, ' '); | |
| 1285 IFDE_CSSPrimitiveValue* pColumnWidth = NULL; | |
| 1286 IFDE_CSSPrimitiveValue* pColumnCount = NULL; | |
| 1287 FDE_CSSPRIMITIVETYPE eType; | |
| 1288 while (parser.NextValue(eType, pszValue, iValueLen)) { | |
| 1289 switch (eType) { | |
| 1290 case FDE_CSSPRIMITIVETYPE_String: { | |
| 1291 const FDE_CSSPROPERTYVALUETABLE* pValue = | |
| 1292 FDE_GetCSSPropertyValueByName(pszValue, iValueLen); | |
| 1293 if (pValue == NULL && pValue->eName == FDE_CSSPROPERTYVALUE_Auto) { | |
| 1294 pColumnWidth = NewEnumValue(pStaticStore, pValue->eName); | |
| 1295 } | |
| 1296 } break; | |
| 1297 case FDE_CSSPRIMITIVETYPE_Number: { | |
| 1298 FX_FLOAT fValue; | |
| 1299 if (FDE_ParseCSSNumber(pszValue, iValueLen, fValue, eType)) { | |
| 1300 switch (eType) { | |
| 1301 case FDE_CSSPRIMITIVETYPE_Number: | |
| 1302 if (pColumnCount == NULL) { | |
| 1303 pColumnCount = NewNumberValue(pStaticStore, eType, fValue); | |
| 1304 } | |
| 1305 break; | |
| 1306 default: | |
| 1307 if (pColumnWidth == NULL) { | |
| 1308 pColumnWidth = NewNumberValue(pStaticStore, eType, fValue); | |
| 1309 } | |
| 1310 break; | |
| 1311 } | |
| 1312 } | |
| 1313 } break; | |
| 1314 default: | |
| 1315 break; | |
| 1316 } | |
| 1317 } | |
| 1318 if (pColumnWidth == NULL && pColumnCount == NULL) { | |
| 1319 return FALSE; | |
| 1320 } else if (pColumnWidth == NULL) { | |
| 1321 pColumnWidth = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Auto); | |
| 1322 } else if (pColumnCount == NULL) { | |
| 1323 pColumnCount = NewEnumValue(pStaticStore, FDE_CSSPROPERTYVALUE_Auto); | |
| 1324 } | |
| 1325 AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ColumnWidth, pColumnWidth, | |
| 1326 bImportant); | |
| 1327 AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_ColumnCount, pColumnCount, | |
| 1328 bImportant); | |
| 1329 return TRUE; | |
| 1330 } | |
| 1331 FX_BOOL CFDE_CSSDeclaration::ParseOverflowProperty( | |
| 1332 const FDE_CSSPROPERTYARGS* pArgs, | |
| 1333 const FX_WCHAR* pszValue, | |
| 1334 int32_t iValueLen, | |
| 1335 FX_BOOL bImportant) { | |
| 1336 IFX_MEMAllocator* pStaticStore = pArgs->pStaticStore; | |
| 1337 CFDE_CSSValueListParser parser(pszValue, iValueLen, ' '); | |
| 1338 IFDE_CSSPrimitiveValue* pOverflowX = NULL; | |
| 1339 IFDE_CSSPrimitiveValue* pOverflowY = NULL; | |
| 1340 FDE_CSSPRIMITIVETYPE eType; | |
| 1341 while (parser.NextValue(eType, pszValue, iValueLen)) { | |
| 1342 if (eType == FDE_CSSPRIMITIVETYPE_String) { | |
| 1343 const FDE_CSSPROPERTYVALUETABLE* pValue = | |
| 1344 FDE_GetCSSPropertyValueByName(pszValue, iValueLen); | |
| 1345 if (pValue != NULL) { | |
| 1346 switch (pValue->eName) { | |
| 1347 case FDE_CSSOVERFLOW_Visible: | |
| 1348 case FDE_CSSOVERFLOW_Hidden: | |
| 1349 case FDE_CSSOVERFLOW_Scroll: | |
| 1350 case FDE_CSSOVERFLOW_Auto: | |
| 1351 case FDE_CSSOVERFLOW_NoDisplay: | |
| 1352 case FDE_CSSOVERFLOW_NoContent: | |
| 1353 if (pOverflowX != NULL && pOverflowY != NULL) { | |
| 1354 return FALSE; | |
| 1355 } else if (pOverflowX == NULL) { | |
| 1356 pOverflowX = NewEnumValue(pStaticStore, pValue->eName); | |
| 1357 } else if (pOverflowY == NULL) { | |
| 1358 pOverflowY = NewEnumValue(pStaticStore, pValue->eName); | |
| 1359 } | |
| 1360 break; | |
| 1361 default: | |
| 1362 break; | |
| 1363 } | |
| 1364 } | |
| 1365 } | |
| 1366 } | |
| 1367 if (pOverflowX == NULL && pOverflowY == NULL) { | |
| 1368 return FALSE; | |
| 1369 } else if (pOverflowY == NULL) { | |
| 1370 pOverflowY = NewEnumValue(pStaticStore, pOverflowX->GetEnum()); | |
| 1371 } | |
| 1372 AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_OverflowX, pOverflowX, | |
| 1373 bImportant); | |
| 1374 AddPropertyHolder(pStaticStore, FDE_CSSPROPERTY_OverflowY, pOverflowY, | |
| 1375 bImportant); | |
| 1376 return TRUE; | |
| 1377 } | |
| OLD | NEW |