OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "xfa/fde/css/fde_cssstyleselector.h" | 7 #include "xfa/fde/css/fde_cssstyleselector.h" |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <memory> | 10 #include <memory> |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 0x00100000, 0x01000000}; | 98 0x00100000, 0x01000000}; |
99 for (; pSel; pSel = pSel->GetNextSelector()) { | 99 for (; pSel; pSel = pSel->GetNextSelector()) { |
100 FDE_CSSSELECTORTYPE eType = pSel->GetType(); | 100 FDE_CSSSELECTORTYPE eType = pSel->GetType(); |
101 if (eType > FDE_CSSSELECTORTYPE_Descendant || | 101 if (eType > FDE_CSSSELECTORTYPE_Descendant || |
102 pSel->GetNameHash() != FDE_CSSUNIVERSALHASH) { | 102 pSel->GetNameHash() != FDE_CSSUNIVERSALHASH) { |
103 dwPriority += s_Specific[eType]; | 103 dwPriority += s_Specific[eType]; |
104 } | 104 } |
105 } | 105 } |
106 } | 106 } |
107 | 107 |
108 void CFDE_CSSRuleCollection::Clear() { | |
109 m_IDRules.RemoveAll(); | |
110 m_TagRules.RemoveAll(); | |
111 m_ClassRules.RemoveAll(); | |
112 m_pUniversalRules = nullptr; | |
113 m_pStaticStore = nullptr; | |
114 m_iSelectors = 0; | |
115 } | |
116 | |
117 CFDE_CSSRuleCollection::CFDE_CSSRuleCollection() | |
118 : m_pStaticStore(nullptr), | |
119 m_pUniversalRules(nullptr), | |
120 m_pPersudoRules(nullptr), | |
121 m_iSelectors(0) {} | |
122 | |
123 CFDE_CSSRuleCollection::~CFDE_CSSRuleCollection() { | |
124 Clear(); | |
125 } | |
126 | |
127 void CFDE_CSSRuleCollection::AddRulesFrom(const CFDE_CSSStyleSheetArray& sheets, | |
128 uint32_t dwMediaList, | |
129 IFGAS_FontMgr* pFontMgr) { | |
130 int32_t iSheets = sheets.GetSize(); | |
131 for (int32_t i = 0; i < iSheets; ++i) { | |
132 IFDE_CSSStyleSheet* pSheet = sheets.GetAt(i); | |
133 if (uint32_t dwMatchMedia = pSheet->GetMediaList() & dwMediaList) { | |
134 int32_t iRules = pSheet->CountRules(); | |
135 for (int32_t j = 0; j < iRules; j++) { | |
136 AddRulesFrom(pSheet, pSheet->GetRule(j), dwMatchMedia, pFontMgr); | |
137 } | |
138 } | |
139 } | |
140 } | |
141 | |
142 void CFDE_CSSRuleCollection::AddRulesFrom(IFDE_CSSStyleSheet* pStyleSheet, | |
143 IFDE_CSSRule* pRule, | |
144 uint32_t dwMediaList, | |
145 IFGAS_FontMgr* pFontMgr) { | |
146 switch (pRule->GetType()) { | |
147 case FDE_CSSRULETYPE_Style: { | |
148 IFDE_CSSStyleRule* pStyleRule = static_cast<IFDE_CSSStyleRule*>(pRule); | |
149 CFDE_CSSDeclaration* pDeclaration = pStyleRule->GetDeclaration(); | |
150 int32_t iSelectors = pStyleRule->CountSelectorLists(); | |
151 for (int32_t i = 0; i < iSelectors; ++i) { | |
152 CFDE_CSSSelector* pSelector = pStyleRule->GetSelectorList(i); | |
153 if (pSelector->GetType() == FDE_CSSSELECTORTYPE_Persudo) { | |
154 FDE_CSSRuleData* pData = NewRuleData(pSelector, pDeclaration); | |
155 AddRuleTo(m_pPersudoRules, pData); | |
156 continue; | |
157 } | |
158 if (pSelector->GetNameHash() != FDE_CSSUNIVERSALHASH) { | |
159 AddRuleTo(m_TagRules, pSelector->GetNameHash(), pSelector, | |
160 pDeclaration); | |
161 continue; | |
162 } | |
163 CFDE_CSSSelector* pNext = pSelector->GetNextSelector(); | |
164 if (!pNext) { | |
165 FDE_CSSRuleData* pData = NewRuleData(pSelector, pDeclaration); | |
166 AddRuleTo(m_pUniversalRules, pData); | |
167 continue; | |
168 } | |
169 switch (pNext->GetType()) { | |
170 case FDE_CSSSELECTORTYPE_ID: | |
171 AddRuleTo(m_IDRules, pNext->GetNameHash(), pSelector, pDeclaration); | |
172 break; | |
173 case FDE_CSSSELECTORTYPE_Class: | |
174 AddRuleTo(m_ClassRules, pNext->GetNameHash(), pSelector, | |
175 pDeclaration); | |
176 break; | |
177 case FDE_CSSSELECTORTYPE_Descendant: | |
178 case FDE_CSSSELECTORTYPE_Element: | |
179 AddRuleTo(m_pUniversalRules, NewRuleData(pSelector, pDeclaration)); | |
180 break; | |
181 default: | |
182 ASSERT(FALSE); | |
183 break; | |
184 } | |
185 } | |
186 } break; | |
187 case FDE_CSSRULETYPE_Media: { | |
188 IFDE_CSSMediaRule* pMediaRule = static_cast<IFDE_CSSMediaRule*>(pRule); | |
189 if (pMediaRule->GetMediaList() & dwMediaList) { | |
190 int32_t iRules = pMediaRule->CountRules(); | |
191 for (int32_t i = 0; i < iRules; ++i) { | |
192 AddRulesFrom(pStyleSheet, pMediaRule->GetRule(i), dwMediaList, | |
193 pFontMgr); | |
194 } | |
195 } | |
196 } break; | |
197 default: | |
198 break; | |
199 } | |
200 } | |
201 | |
202 void CFDE_CSSRuleCollection::AddRuleTo(CFX_MapPtrToPtr& map, | |
203 uint32_t dwKey, | |
204 CFDE_CSSSelector* pSel, | |
205 CFDE_CSSDeclaration* pDecl) { | |
206 void* pKey = (void*)(uintptr_t)dwKey; | |
207 FDE_CSSRuleData* pData = NewRuleData(pSel, pDecl); | |
208 FDE_CSSRuleData* pList = nullptr; | |
209 if (!map.Lookup(pKey, (void*&)pList)) { | |
210 map.SetAt(pKey, pData); | |
211 } else if (AddRuleTo(pList, pData)) { | |
212 map.SetAt(pKey, pList); | |
213 } | |
214 } | |
215 | |
216 FX_BOOL CFDE_CSSRuleCollection::AddRuleTo(FDE_CSSRuleData*& pList, | |
217 FDE_CSSRuleData* pData) { | |
218 if (pList) { | |
219 pData->pNext = pList->pNext; | |
220 pList->pNext = pData; | |
221 return FALSE; | |
222 } | |
223 | |
224 pList = pData; | |
225 return TRUE; | |
226 } | |
227 | |
228 FDE_CSSRuleData* CFDE_CSSRuleCollection::NewRuleData( | |
229 CFDE_CSSSelector* pSel, | |
230 CFDE_CSSDeclaration* pDecl) { | |
231 return FXTARGET_NewWith(m_pStaticStore) | |
232 FDE_CSSRuleData(pSel, pDecl, ++m_iSelectors); | |
233 } | |
234 | |
235 CFDE_CSSStyleSelector::CFDE_CSSStyleSelector() | 108 CFDE_CSSStyleSelector::CFDE_CSSStyleSelector() |
236 : m_pFontMgr(nullptr), | 109 : m_pFontMgr(nullptr), |
237 m_fDefFontSize(12.0f), | 110 m_fDefFontSize(12.0f), |
238 m_pRuleDataStore(nullptr), | 111 m_pRuleDataStore(nullptr), |
239 m_pInlineStyleStore(nullptr), | 112 m_pInlineStyleStore(nullptr), |
240 m_pFixedStyleStore(nullptr), | 113 m_pFixedStyleStore(nullptr), |
241 m_pAccelerator(nullptr) { | 114 m_pAccelerator(nullptr) { |
242 m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_High] = FDE_CSSSTYLESHEETGROUP_Author; | 115 m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_High] = FDE_CSSSTYLESHEETGROUP_Author; |
243 m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_Mid] = FDE_CSSSTYLESHEETGROUP_User; | 116 m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_Mid] = FDE_CSSSTYLESHEETGROUP_User; |
244 m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_Low] = | 117 m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_Low] = |
(...skipping 1781 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2026 m_MaxBoxSize.Set(FDE_CSSLENGTHUNIT_None); | 1899 m_MaxBoxSize.Set(FDE_CSSLENGTHUNIT_None); |
2027 m_eDisplay = FDE_CSSDISPLAY_Inline; | 1900 m_eDisplay = FDE_CSSDISPLAY_Inline; |
2028 m_fVerticalAlign = 0.0f; | 1901 m_fVerticalAlign = 0.0f; |
2029 m_ColumnCount.Set(FDE_CSSLENGTHUNIT_Auto); | 1902 m_ColumnCount.Set(FDE_CSSLENGTHUNIT_Auto); |
2030 m_ColumnGap.Set(FDE_CSSLENGTHUNIT_Normal); | 1903 m_ColumnGap.Set(FDE_CSSLENGTHUNIT_Normal); |
2031 m_bColumnRuleColorSame = TRUE; | 1904 m_bColumnRuleColorSame = TRUE; |
2032 m_ColumnWidth.Set(FDE_CSSLENGTHUNIT_Auto); | 1905 m_ColumnWidth.Set(FDE_CSSLENGTHUNIT_Auto); |
2033 m_ColumnRuleWidth.Set(FDE_CSSLENGTHUNIT_Auto); | 1906 m_ColumnRuleWidth.Set(FDE_CSSLENGTHUNIT_Auto); |
2034 m_eTextCombine = FDE_CSSTEXTCOMBINE_None; | 1907 m_eTextCombine = FDE_CSSTEXTCOMBINE_None; |
2035 } | 1908 } |
OLD | NEW |