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

Side by Side Diff: third_party/WebKit/Source/core/layout/svg/LayoutSVGText.cpp

Issue 1871393003: Don't persist the SVGTextLayoutAttributesBuilder (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: explicit Created 4 years, 8 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) 2006 Apple Computer, Inc. 2 * Copyright (C) 2006 Apple Computer, Inc.
3 * Copyright (C) 2006 Alexander Kellett <lypanov@kde.org> 3 * Copyright (C) 2006 Alexander Kellett <lypanov@kde.org>
4 * Copyright (C) 2006 Oliver Hunt <ojh16@student.canterbury.ac.nz> 4 * Copyright (C) 2006 Oliver Hunt <ojh16@student.canterbury.ac.nz>
5 * Copyright (C) 2007 Nikolas Zimmermann <zimmermann@kde.org> 5 * Copyright (C) 2007 Nikolas Zimmermann <zimmermann@kde.org>
6 * Copyright (C) 2008 Rob Buis <buis@kde.org> 6 * Copyright (C) 2008 Rob Buis <buis@kde.org>
7 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> 7 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
8 * Copyright (C) Research In Motion Limited 2010-2012. All rights reserved. 8 * Copyright (C) Research In Motion Limited 2010-2012. All rights reserved.
9 * Copyright (C) 2012 Google Inc. 9 * Copyright (C) 2012 Google Inc.
10 * 10 *
(...skipping 21 matching lines...) Expand all
32 #include "core/layout/LayoutAnalyzer.h" 32 #include "core/layout/LayoutAnalyzer.h"
33 #include "core/layout/LayoutState.h" 33 #include "core/layout/LayoutState.h"
34 #include "core/layout/LayoutView.h" 34 #include "core/layout/LayoutView.h"
35 #include "core/layout/PointerEventsHitRules.h" 35 #include "core/layout/PointerEventsHitRules.h"
36 #include "core/layout/api/LineLayoutItem.h" 36 #include "core/layout/api/LineLayoutItem.h"
37 #include "core/layout/svg/LayoutSVGInline.h" 37 #include "core/layout/svg/LayoutSVGInline.h"
38 #include "core/layout/svg/LayoutSVGInlineText.h" 38 #include "core/layout/svg/LayoutSVGInlineText.h"
39 #include "core/layout/svg/LayoutSVGRoot.h" 39 #include "core/layout/svg/LayoutSVGRoot.h"
40 #include "core/layout/svg/SVGLayoutSupport.h" 40 #include "core/layout/svg/SVGLayoutSupport.h"
41 #include "core/layout/svg/SVGResourcesCache.h" 41 #include "core/layout/svg/SVGResourcesCache.h"
42 #include "core/layout/svg/SVGTextLayoutAttributesBuilder.h"
42 #include "core/layout/svg/line/SVGRootInlineBox.h" 43 #include "core/layout/svg/line/SVGRootInlineBox.h"
43 #include "core/paint/SVGTextPainter.h" 44 #include "core/paint/SVGTextPainter.h"
44 #include "core/style/ShadowList.h" 45 #include "core/style/ShadowList.h"
45 #include "core/svg/SVGLengthList.h" 46 #include "core/svg/SVGLengthList.h"
46 #include "core/svg/SVGTextElement.h" 47 #include "core/svg/SVGTextElement.h"
47 #include "core/svg/SVGTransformList.h" 48 #include "core/svg/SVGTransformList.h"
48 #include "core/svg/SVGURIReference.h" 49 #include "core/svg/SVGURIReference.h"
49 #include "platform/FloatConversion.h" 50 #include "platform/FloatConversion.h"
50 #include "platform/geometry/FloatQuad.h" 51 #include "platform/geometry/FloatQuad.h"
51 52
(...skipping 23 matching lines...) Expand all
75 } 76 }
76 77
77 LayoutSVGText::~LayoutSVGText() 78 LayoutSVGText::~LayoutSVGText()
78 { 79 {
79 ASSERT(m_layoutAttributes.isEmpty()); 80 ASSERT(m_layoutAttributes.isEmpty());
80 } 81 }
81 82
82 void LayoutSVGText::willBeDestroyed() 83 void LayoutSVGText::willBeDestroyed()
83 { 84 {
84 m_layoutAttributes.clear(); 85 m_layoutAttributes.clear();
85 m_layoutAttributesBuilder.clearTextPositioningElements();
86 86
87 LayoutSVGBlock::willBeDestroyed(); 87 LayoutSVGBlock::willBeDestroyed();
88 } 88 }
89 89
90 bool LayoutSVGText::isChildAllowed(LayoutObject* child, const ComputedStyle&) co nst 90 bool LayoutSVGText::isChildAllowed(LayoutObject* child, const ComputedStyle&) co nst
91 { 91 {
92 return child->isSVGInline() || (child->isText() && SVGLayoutSupport::isLayou tableTextNode(child)); 92 return child->isSVGInline() || (child->isText() && SVGLayoutSupport::isLayou tableTextNode(child));
93 } 93 }
94 94
95 LayoutSVGText* LayoutSVGText::locateLayoutSVGTextAncestor(LayoutObject* start) 95 LayoutSVGText* LayoutSVGText::locateLayoutSVGTextAncestor(LayoutObject* start)
(...skipping 10 matching lines...) Expand all
106 { 106 {
107 for (LayoutObject* descendant = text; descendant; descendant = descendant->n extInPreOrder(text)) { 107 for (LayoutObject* descendant = text; descendant; descendant = descendant->n extInPreOrder(text)) {
108 if (descendant->isSVGInlineText()) 108 if (descendant->isSVGInlineText())
109 attributes.append(toLayoutSVGInlineText(descendant)->layoutAttribute s()); 109 attributes.append(toLayoutSVGInlineText(descendant)->layoutAttribute s());
110 } 110 }
111 } 111 }
112 112
113 void LayoutSVGText::invalidatePositioningValues(LayoutInvalidationReasonForTraci ng reason) 113 void LayoutSVGText::invalidatePositioningValues(LayoutInvalidationReasonForTraci ng reason)
114 { 114 {
115 m_layoutAttributes.clear(); 115 m_layoutAttributes.clear();
116 m_layoutAttributesBuilder.clearTextPositioningElements();
117 setNeedsPositioningValuesUpdate(); 116 setNeedsPositioningValuesUpdate();
118 setNeedsLayoutAndFullPaintInvalidation(reason); 117 setNeedsLayoutAndFullPaintInvalidation(reason);
119 } 118 }
120 119
121 void LayoutSVGText::subtreeChildWasAdded() 120 void LayoutSVGText::subtreeChildWasAdded()
122 { 121 {
123 if (beingDestroyed() || !everHadLayout()) { 122 if (beingDestroyed() || !everHadLayout()) {
124 ASSERT(m_layoutAttributes.isEmpty()); 123 ASSERT(m_layoutAttributes.isEmpty());
125 ASSERT(!m_layoutAttributesBuilder.numberOfTextPositioningElements());
126 return; 124 return;
127 } 125 }
128 if (documentBeingDestroyed()) 126 if (documentBeingDestroyed())
129 return; 127 return;
130 128
131 // The positioning elements cache depends on the size of each text layoutObj ect in the 129 // The positioning elements cache depends on the size of each text layoutObj ect in the
132 // subtree. If this changes, clear the cache. It will be rebuilt on the next layout. 130 // subtree. If this changes, clear the cache. It will be rebuilt on the next layout.
133 invalidatePositioningValues(LayoutInvalidationReason::ChildChanged); 131 invalidatePositioningValues(LayoutInvalidationReason::ChildChanged);
134 setNeedsTextMetricsUpdate(); 132 setNeedsTextMetricsUpdate();
135 } 133 }
136 134
137 void LayoutSVGText::subtreeChildWillBeRemoved() 135 void LayoutSVGText::subtreeChildWillBeRemoved()
138 { 136 {
139 if (beingDestroyed() || !everHadLayout()) { 137 if (beingDestroyed() || !everHadLayout()) {
140 ASSERT(m_layoutAttributes.isEmpty()); 138 ASSERT(m_layoutAttributes.isEmpty());
141 ASSERT(!m_layoutAttributesBuilder.numberOfTextPositioningElements());
142 return; 139 return;
143 } 140 }
144 141
145 // The positioning elements cache depends on the size of each text layoutObj ect in the 142 // The positioning elements cache depends on the size of each text layoutObj ect in the
146 // subtree. If this changes, clear the cache. It will be rebuilt on the next layout. 143 // subtree. If this changes, clear the cache. It will be rebuilt on the next layout.
147 invalidatePositioningValues(LayoutInvalidationReason::ChildChanged); 144 invalidatePositioningValues(LayoutInvalidationReason::ChildChanged);
148 setNeedsTextMetricsUpdate(); 145 setNeedsTextMetricsUpdate();
149 } 146 }
150 147
151 void LayoutSVGText::subtreeTextDidChange() 148 void LayoutSVGText::subtreeTextDidChange()
152 { 149 {
153 ASSERT(!beingDestroyed()); 150 ASSERT(!beingDestroyed());
154 if (!everHadLayout()) { 151 if (!everHadLayout()) {
155 ASSERT(m_layoutAttributes.isEmpty()); 152 ASSERT(m_layoutAttributes.isEmpty());
156 ASSERT(!m_layoutAttributesBuilder.numberOfTextPositioningElements());
157 return; 153 return;
158 } 154 }
159 155
160 // The positioning elements cache depends on the size of each text object in 156 // The positioning elements cache depends on the size of each text object in
161 // the subtree. If this changes, clear the cache and mark it for rebuilding 157 // the subtree. If this changes, clear the cache and mark it for rebuilding
162 // in the next layout. 158 // in the next layout.
163 invalidatePositioningValues(LayoutInvalidationReason::TextChanged); 159 invalidatePositioningValues(LayoutInvalidationReason::TextChanged);
164 setNeedsTextMetricsUpdate(); 160 setNeedsTextMetricsUpdate();
165 } 161 }
166 162
(...skipping 29 matching lines...) Expand all
196 m_needsTransformUpdate = false; 192 m_needsTransformUpdate = false;
197 updateCachedBoundariesInParents = true; 193 updateCachedBoundariesInParents = true;
198 } 194 }
199 195
200 if (!everHadLayout()) { 196 if (!everHadLayout()) {
201 // When laying out initially, collect all layout attributes, build the c haracter data map, 197 // When laying out initially, collect all layout attributes, build the c haracter data map,
202 // and propogate resulting SVGLayoutAttributes to all LayoutSVGInlineTex t children in the subtree. 198 // and propogate resulting SVGLayoutAttributes to all LayoutSVGInlineTex t children in the subtree.
203 ASSERT(m_layoutAttributes.isEmpty()); 199 ASSERT(m_layoutAttributes.isEmpty());
204 collectLayoutAttributes(this, m_layoutAttributes); 200 collectLayoutAttributes(this, m_layoutAttributes);
205 updateFontAndMetrics(*this); 201 updateFontAndMetrics(*this);
206 m_layoutAttributesBuilder.buildLayoutAttributesForTextRoot(*this); 202
203 SVGTextLayoutAttributesBuilder(*this).buildLayoutAttributes();
207 204
208 m_needsReordering = true; 205 m_needsReordering = true;
209 m_needsTextMetricsUpdate = false; 206 m_needsTextMetricsUpdate = false;
210 m_needsPositioningValuesUpdate = false; 207 m_needsPositioningValuesUpdate = false;
211 updateCachedBoundariesInParents = true; 208 updateCachedBoundariesInParents = true;
212 } else if (m_needsPositioningValuesUpdate) { 209 } else if (m_needsPositioningValuesUpdate) {
213 // When the x/y/dx/dy/rotate lists change, recompute the layout attribut es, and eventually 210 // When the x/y/dx/dy/rotate lists change, recompute the layout attribut es, and eventually
214 // update the on-screen font objects as well in all descendants. 211 // update the on-screen font objects as well in all descendants.
215 if (m_needsTextMetricsUpdate) { 212 if (m_needsTextMetricsUpdate) {
216 updateFontAndMetrics(*this); 213 updateFontAndMetrics(*this);
217 m_needsTextMetricsUpdate = false; 214 m_needsTextMetricsUpdate = false;
218 } 215 }
219 216
220 m_layoutAttributes.clear(); 217 m_layoutAttributes.clear();
221 collectLayoutAttributes(this, m_layoutAttributes); 218 collectLayoutAttributes(this, m_layoutAttributes);
222 m_layoutAttributesBuilder.buildLayoutAttributesForTextRoot(*this); 219
220 SVGTextLayoutAttributesBuilder(*this).buildLayoutAttributes();
221
223 m_needsReordering = true; 222 m_needsReordering = true;
224 m_needsPositioningValuesUpdate = false; 223 m_needsPositioningValuesUpdate = false;
225 updateCachedBoundariesInParents = true; 224 updateCachedBoundariesInParents = true;
226 } else if (m_needsTextMetricsUpdate || SVGLayoutSupport::findTreeRootObject( this)->isLayoutSizeChanged()) { 225 } else if (m_needsTextMetricsUpdate || SVGLayoutSupport::findTreeRootObject( this)->isLayoutSizeChanged()) {
227 // If the root layout size changed (eg. window size changes) or the tran sform to the root 226 // If the root layout size changed (eg. window size changes) or the tran sform to the root
228 // context has changed then recompute the on-screen font size. 227 // context has changed then recompute the on-screen font size.
229 updateFontAndMetrics(*this); 228 updateFontAndMetrics(*this);
230 229
231 ASSERT(!m_needsReordering); 230 ASSERT(!m_needsReordering);
232 ASSERT(!m_needsPositioningValuesUpdate); 231 ASSERT(!m_needsPositioningValuesUpdate);
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
418 paintInvalidationState.pushDelayedPaintInvalidationTarget(*this); 417 paintInvalidationState.pushDelayedPaintInvalidationTarget(*this);
419 418
420 if (reason == PaintInvalidationSVGResourceChange) 419 if (reason == PaintInvalidationSVGResourceChange)
421 newPaintInvalidationState.setForceSubtreeInvalidationWithinContainer(); 420 newPaintInvalidationState.setForceSubtreeInvalidationWithinContainer();
422 421
423 newPaintInvalidationState.updateForChildren(); 422 newPaintInvalidationState.updateForChildren();
424 invalidatePaintOfSubtreesIfNeeded(newPaintInvalidationState); 423 invalidatePaintOfSubtreesIfNeeded(newPaintInvalidationState);
425 } 424 }
426 425
427 } // namespace blink 426 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698