Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(131)

Side by Side Diff: third_party/WebKit/Source/core/style/ComputedStyle.cpp

Issue 2117143003: Add a fast-path for independent inherited properties (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@computedstyle_cleanup_rename_final_member_fields
Patch Set: Added useful sizeof check comment Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Antti Koivisto (koivisto@kde.org) 2 * Copyright (C) 1999 Antti Koivisto (koivisto@kde.org)
3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
4 * Copyright (C) 2011 Adobe Systems Incorporated. All rights reserved. 4 * Copyright (C) 2011 Adobe Systems Incorporated. All rights reserved.
5 * 5 *
6 * This library is free software; you can redistribute it and/or 6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public 7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either 8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version. 9 * version 2 of the License, or (at your option) any later version.
10 * 10 *
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 57
58 namespace blink { 58 namespace blink {
59 59
60 struct SameSizeAsBorderValue { 60 struct SameSizeAsBorderValue {
61 RGBA32 m_color; 61 RGBA32 m_color;
62 unsigned m_width; 62 unsigned m_width;
63 }; 63 };
64 64
65 static_assert(sizeof(BorderValue) == sizeof(SameSizeAsBorderValue), "BorderValue should stay small"); 65 static_assert(sizeof(BorderValue) == sizeof(SameSizeAsBorderValue), "BorderValue should stay small");
66 66
67 // Since different platforms pack ComputedStyle differently, re-create the same
Timothy Loh 2016/07/19 01:29:32 Are you sure this gets packed differently on diffe
sashab 2016/07/19 03:31:35 Done.
68 // structure for an accurate size comparison.
67 struct SameSizeAsComputedStyle : public RefCounted<SameSizeAsComputedStyle> { 69 struct SameSizeAsComputedStyle : public RefCounted<SameSizeAsComputedStyle> {
68 void* dataRefs[7]; 70 void* dataRefs[7];
69 void* ownPtrs[1]; 71 void* ownPtrs[1];
70 void* dataRefSvgStyle; 72 void* dataRefSvgStyle;
71 73
72 struct InheritedData { 74 struct InheritedData {
73 unsigned m_bitfields[2]; 75 unsigned m_bitfields[2];
74 } m_inheritedData; 76 } m_inheritedData;
75 77
76 struct NonInheritedData { 78 struct NonInheritedData {
77 unsigned m_bitfields[3]; 79 unsigned m_bitfields[3];
78 } m_nonInheritedData; 80 } m_nonInheritedData;
81
82 struct IsInheritedFlags {
83 unsigned m_bitfields[1];
84 } m_isInheritedFlags;
esprehn 2016/07/19 03:46:26 merge this into m_nonInheritedData and it doesn't
sashab 2016/07/19 06:32:38 Woo done. :)
79 }; 85 };
80 86
81 static_assert(sizeof(ComputedStyle) == sizeof(SameSizeAsComputedStyle), "Compute dStyle should stay small"); 87 static_assert(sizeof(ComputedStyle) == sizeof(SameSizeAsComputedStyle), "Compute dStyle should stay small");
82 88
83 PassRefPtr<ComputedStyle> ComputedStyle::create() 89 PassRefPtr<ComputedStyle> ComputedStyle::create()
84 { 90 {
85 return adoptRef(new ComputedStyle()); 91 return adoptRef(new ComputedStyle());
86 } 92 }
87 93
88 PassRefPtr<ComputedStyle> ComputedStyle::createInitialStyle() 94 PassRefPtr<ComputedStyle> ComputedStyle::createInitialStyle()
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 , m_box(o.m_box) 159 , m_box(o.m_box)
154 , m_visual(o.m_visual) 160 , m_visual(o.m_visual)
155 , m_background(o.m_background) 161 , m_background(o.m_background)
156 , m_surround(o.m_surround) 162 , m_surround(o.m_surround)
157 , m_rareNonInheritedData(o.m_rareNonInheritedData) 163 , m_rareNonInheritedData(o.m_rareNonInheritedData)
158 , m_rareInheritedData(o.m_rareInheritedData) 164 , m_rareInheritedData(o.m_rareInheritedData)
159 , m_styleInheritedData(o.m_styleInheritedData) 165 , m_styleInheritedData(o.m_styleInheritedData)
160 , m_svgStyle(o.m_svgStyle) 166 , m_svgStyle(o.m_svgStyle)
161 , m_inheritedData(o.m_inheritedData) 167 , m_inheritedData(o.m_inheritedData)
162 , m_nonInheritedData(o.m_nonInheritedData) 168 , m_nonInheritedData(o.m_nonInheritedData)
169 , m_isInheritedFlags(o.m_isInheritedFlags)
163 { 170 {
164 } 171 }
165 172
166 static StyleRecalcChange diffPseudoStyles(const ComputedStyle& oldStyle, const C omputedStyle& newStyle) 173 static StyleRecalcChange diffPseudoStyles(const ComputedStyle& oldStyle, const C omputedStyle& newStyle)
167 { 174 {
168 // If the pseudoStyles have changed, we want any StyleRecalcChange that is n ot NoChange 175 // If the pseudoStyles have changed, we want any StyleRecalcChange that is n ot NoChange
169 // because setStyle will do the right thing with anything else. 176 // because setStyle will do the right thing with anything else.
170 if (!oldStyle.hasAnyPublicPseudoStyles()) 177 if (!oldStyle.hasAnyPublicPseudoStyles())
171 return NoChange; 178 return NoChange;
172 for (PseudoId pseudoId = FirstPublicPseudoId; pseudoId < FirstInternalPseudo Id; pseudoId = static_cast<PseudoId>(pseudoId + 1)) { 179 for (PseudoId pseudoId = FirstPublicPseudoId; pseudoId < FirstInternalPseudo Id; pseudoId = static_cast<PseudoId>(pseudoId + 1)) {
(...skipping 17 matching lines...) Expand all
190 if (!oldStyle && !newStyle) 197 if (!oldStyle && !newStyle)
191 return NoChange; 198 return NoChange;
192 199
193 if (oldStyle->display() != newStyle->display() 200 if (oldStyle->display() != newStyle->display()
194 || oldStyle->hasPseudoStyle(PseudoIdFirstLetter) != newStyle->hasPseudoS tyle(PseudoIdFirstLetter) 201 || oldStyle->hasPseudoStyle(PseudoIdFirstLetter) != newStyle->hasPseudoS tyle(PseudoIdFirstLetter)
195 || !oldStyle->contentDataEquivalent(newStyle) 202 || !oldStyle->contentDataEquivalent(newStyle)
196 || oldStyle->hasTextCombine() != newStyle->hasTextCombine() 203 || oldStyle->hasTextCombine() != newStyle->hasTextCombine()
197 || oldStyle->justifyItems() != newStyle->justifyItems()) // TODO (lajava ): We must avoid this Reattach. 204 || oldStyle->justifyItems() != newStyle->justifyItems()) // TODO (lajava ): We must avoid this Reattach.
198 return Reattach; 205 return Reattach;
199 206
207 if (!oldStyle->independentInheritedEqual(*newStyle)
208 && oldStyle->nonIndependentInheritedEqual(*newStyle)
esprehn 2016/07/19 03:46:26 this is a duplicate check with the inheritedEqual
sashab 2016/07/19 06:32:38 Unfortunately that doesn't quite work... See new c
209 && !oldStyle->hasExplicitlyInheritedProperties())
210 return IndependentInherit;
211
200 if (!oldStyle->inheritedEqual(*newStyle) 212 if (!oldStyle->inheritedEqual(*newStyle)
201 || !oldStyle->loadingCustomFontsEqual(*newStyle)) 213 || !oldStyle->loadingCustomFontsEqual(*newStyle))
202 return Inherit; 214 return Inherit;
203 215
204 if (*oldStyle == *newStyle) 216 if (*oldStyle == *newStyle)
205 return diffPseudoStyles(*oldStyle, *newStyle); 217 return diffPseudoStyles(*oldStyle, *newStyle);
206 218
207 if (oldStyle->hasExplicitlyInheritedProperties()) 219 if (oldStyle->hasExplicitlyInheritedProperties())
208 return Inherit; 220 return Inherit;
209 221
210 return NoInherit; 222 return NoInherit;
211 } 223 }
212 224
225 // TODO(sashab): Generate this function.
226 void ComputedStyle::propagateIndependentInheritedProperties(const ComputedStyle& parent, ComputedStyle& child)
227 {
228 if (child.m_isInheritedFlags.m_isPointerEventsInherited)
esprehn 2016/07/19 03:46:26 I do wonder how fast this will be if there's a ton
sashab 2016/07/19 06:32:38 Yeah, that's why the TODO to generate :)
229 child.setPointerEvents(parent.pointerEvents());
230 if (child.m_isInheritedFlags.m_isVisibilityInherited)
231 child.setVisibility(parent.visibility());
232 }
233
213 ItemPosition ComputedStyle::resolveAlignment(const ComputedStyle& parentStyle, c onst ComputedStyle& childStyle, ItemPosition resolvedAutoPositionForLayoutObject ) 234 ItemPosition ComputedStyle::resolveAlignment(const ComputedStyle& parentStyle, c onst ComputedStyle& childStyle, ItemPosition resolvedAutoPositionForLayoutObject )
214 { 235 {
215 // The auto keyword computes to the parent's align-items computed value, or to "stretch", if not set or "auto". 236 // The auto keyword computes to the parent's align-items computed value, or to "stretch", if not set or "auto".
216 if (childStyle.alignSelfPosition() == ItemPositionAuto) 237 if (childStyle.alignSelfPosition() == ItemPositionAuto)
217 return (parentStyle.alignItemsPosition() == ItemPositionAuto) ? resolved AutoPositionForLayoutObject : parentStyle.alignItemsPosition(); 238 return (parentStyle.alignItemsPosition() == ItemPositionAuto) ? resolved AutoPositionForLayoutObject : parentStyle.alignItemsPosition();
218 return childStyle.alignSelfPosition(); 239 return childStyle.alignSelfPosition();
219 } 240 }
220 241
221 const StyleSelfAlignmentData ComputedStyle::resolvedAlignment(const ComputedStyl e& parentStyle, ItemPosition resolvedAutoPositionForLayoutObject) const 242 const StyleSelfAlignmentData ComputedStyle::resolvedAlignment(const ComputedStyl e& parentStyle, ItemPosition resolvedAutoPositionForLayoutObject) const
222 { 243 {
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 // properties here, but the affectedBy flags will be set differently based o n 355 // properties here, but the affectedBy flags will be set differently based o n
335 // the matching order of the :-webkit-any components. 356 // the matching order of the :-webkit-any components.
336 // 357 //
337 // m_nonInheritedData.m_emptyState 358 // m_nonInheritedData.m_emptyState
338 // m_nonInheritedData.m_affectedByFocus 359 // m_nonInheritedData.m_affectedByFocus
339 // m_nonInheritedData.m_affectedByHover 360 // m_nonInheritedData.m_affectedByHover
340 // m_nonInheritedData.m_affectedByActive 361 // m_nonInheritedData.m_affectedByActive
341 // m_nonInheritedData.m_affectedByDrag 362 // m_nonInheritedData.m_affectedByDrag
342 // m_nonInheritedData.m_isLink 363 // m_nonInheritedData.m_isLink
343 364
365 // Any properties that are inherited on a style are also inherited on elemen ts
366 // that share this style.
367 m_isInheritedFlags = other.m_isInheritedFlags;
368
344 if (m_svgStyle != other.m_svgStyle) 369 if (m_svgStyle != other.m_svgStyle)
345 m_svgStyle.access()->copyNonInheritedFromCached(other.m_svgStyle.get()); 370 m_svgStyle.access()->copyNonInheritedFromCached(other.m_svgStyle.get());
346 DCHECK_EQ(zoom(), initialZoom()); 371 DCHECK_EQ(zoom(), initialZoom());
347 } 372 }
348 373
349 bool ComputedStyle::operator==(const ComputedStyle& o) const 374 bool ComputedStyle::operator==(const ComputedStyle& o) const
350 { 375 {
351 return inheritedEqual(o) 376 return inheritedEqual(o)
352 && nonInheritedEqual(o); 377 && nonInheritedEqual(o);
353 } 378 }
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 ComputedStyle* pseudoStyle = m_cachedPseudoStyles->at(i).get(); 438 ComputedStyle* pseudoStyle = m_cachedPseudoStyles->at(i).get();
414 if (pseudoStyle->styleType() == pid) { 439 if (pseudoStyle->styleType() == pid) {
415 m_cachedPseudoStyles->remove(i); 440 m_cachedPseudoStyles->remove(i);
416 return; 441 return;
417 } 442 }
418 } 443 }
419 } 444 }
420 445
421 bool ComputedStyle::inheritedEqual(const ComputedStyle& other) const 446 bool ComputedStyle::inheritedEqual(const ComputedStyle& other) const
422 { 447 {
423 return m_inheritedData == other.m_inheritedData 448 return independentInheritedEqual(other)
449 && nonIndependentInheritedEqual(other);
450 }
451
452 bool ComputedStyle::independentInheritedEqual(const ComputedStyle& other) const
453 {
454 return m_inheritedData.compareEqualIndependent(other.m_inheritedData);
455 }
456
457 bool ComputedStyle::nonIndependentInheritedEqual(const ComputedStyle& other) con st
458 {
459 return m_inheritedData.compareEqualNonIndependent(other.m_inheritedData)
424 && m_styleInheritedData == other.m_styleInheritedData 460 && m_styleInheritedData == other.m_styleInheritedData
425 && m_svgStyle->inheritedEqual(*other.m_svgStyle) 461 && m_svgStyle->inheritedEqual(*other.m_svgStyle)
426 && m_rareInheritedData == other.m_rareInheritedData; 462 && m_rareInheritedData == other.m_rareInheritedData;
427 } 463 }
428 464
429 bool ComputedStyle::loadingCustomFontsEqual(const ComputedStyle& other) const 465 bool ComputedStyle::loadingCustomFontsEqual(const ComputedStyle& other) const
430 { 466 {
431 return font().loadingCustomFonts() == other.font().loadingCustomFonts(); 467 return font().loadingCustomFonts() == other.font().loadingCustomFonts();
432 } 468 }
433 469
(...skipping 1500 matching lines...) Expand 10 before | Expand all | Expand 10 after
1934 if (value < 0) 1970 if (value < 0)
1935 fvalue -= 0.5f; 1971 fvalue -= 0.5f;
1936 else 1972 else
1937 fvalue += 0.5f; 1973 fvalue += 0.5f;
1938 } 1974 }
1939 1975
1940 return roundForImpreciseConversion<int>(fvalue / zoomFactor); 1976 return roundForImpreciseConversion<int>(fvalue / zoomFactor);
1941 } 1977 }
1942 1978
1943 } // namespace blink 1979 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698