OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights
reserved. | 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights
reserved. |
3 * | 3 * |
4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. | 4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. |
5 * | 5 * |
6 * Other contributors: | 6 * Other contributors: |
7 * Robert O'Callahan <roc+@cs.cmu.edu> | 7 * Robert O'Callahan <roc+@cs.cmu.edu> |
8 * David Baron <dbaron@fas.harvard.edu> | 8 * David Baron <dbaron@fas.harvard.edu> |
9 * Christian Biesinger <cbiesinger@web.de> | 9 * Christian Biesinger <cbiesinger@web.de> |
10 * Randall Jesup <rjesup@wgate.com> | 10 * Randall Jesup <rjesup@wgate.com> |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
162 // CSS clip (different than clipping due to overflow) can clip to any box, e
ven if it falls outside of the border box. | 162 // CSS clip (different than clipping due to overflow) can clip to any box, e
ven if it falls outside of the border box. |
163 if (m_layoutObject.hasClip()) { | 163 if (m_layoutObject.hasClip()) { |
164 // Clip applies to *us* as well, so go ahead and update the damageRect. | 164 // Clip applies to *us* as well, so go ahead and update the damageRect. |
165 LayoutRect newPosClip = toLayoutBox(m_layoutObject).clipRect(offset); | 165 LayoutRect newPosClip = toLayoutBox(m_layoutObject).clipRect(offset); |
166 backgroundRect.intersect(newPosClip); | 166 backgroundRect.intersect(newPosClip); |
167 foregroundRect.intersect(newPosClip); | 167 foregroundRect.intersect(newPosClip); |
168 outlineRect.intersect(newPosClip); | 168 outlineRect.intersect(newPosClip); |
169 } | 169 } |
170 } | 170 } |
171 | 171 |
172 static void precalculate(const ClipRectsContext& context) | 172 void precalculate(const ClipRectsContext& context) |
173 { | 173 { |
174 bool isComputingPaintingRect = context.isComputingPaintingRect(); | 174 bool isComputingPaintingRect = context.isComputingPaintingRect(); |
175 ClipRectComputationState rects; | 175 ClipRectComputationState rects; |
176 const DeprecatedPaintLayer* rootLayer = context.rootLayer; | 176 const DeprecatedPaintLayer* rootLayer = context.rootLayer; |
177 if (isComputingPaintingRect) { | 177 if (isComputingPaintingRect) { |
178 // Starting arbitrarily in the tree when calculating painting clipRects
will | 178 // Starting arbitrarily in the tree when calculating painting clipRects
will |
179 // not allow you to fill in all layers cache because some intermediate l
ayer | 179 // not allow you to fill in all layers cache because some intermediate l
ayer |
180 // may need clips with respect to an ancestor further up. For efficiency
we | 180 // may need clips with respect to an ancestor further up. For efficiency
we |
181 // start at the top in order to fill in the cache for all layers. | 181 // start at the top in order to fill in the cache for all layers. |
182 rootLayer = context.rootLayer->layoutObject()->view()->layer(); | 182 rootLayer = context.rootLayer->layoutObject()->view()->layer(); |
183 rects.stackingContextClipRects.setRootLayer(rootLayer); | 183 rects.stackingContextClipRects.setRootLayer(rootLayer); |
184 } | 184 } |
185 rects.currentClipRects.setRootLayer(rootLayer); | 185 rects.currentClipRects.setRootLayer(rootLayer); |
186 | 186 |
187 rootLayer->clipper().calculateClipRects(context, rects); | 187 rootLayer->clipper().calculateClipRects(context, rects); |
188 } | 188 } |
189 | 189 |
| 190 void DeprecatedPaintLayerClipper::precalculateAbsoluteClipRects() |
| 191 { |
| 192 ASSERT(m_layoutObject.layer()->isRootLayer()); |
| 193 // The absolute rectangles rely on layout sizes and position only. |
| 194 ASSERT(m_layoutObject.document().lifecycle().state() >= DocumentLifecycle::L
ayoutClean); |
| 195 precalculate(ClipRectsContext(m_layoutObject.layer(), AbsoluteClipRects)); |
| 196 } |
190 | 197 |
191 // Calculates clipRect for each element in the section of the tree starting with
context.rootLayer | 198 // Calculates clipRect for each element in the section of the tree starting with
context.rootLayer |
192 // For painting, context.rootLayer is ignored and the entire tree is calculated. | 199 // For painting, context.rootLayer is ignored and the entire tree is calculated. |
193 // TODO(chadarmstrong): When using the cache context shouldn't be able to specif
y the rootLayer. This affects | 200 // TODO(chadarmstrong): When using the cache context shouldn't be able to specif
y the rootLayer. This affects |
194 // what is stored in the 5 caches, and should therefore be enforced internally.
Currently | 201 // what is stored in the 5 caches, and should therefore be enforced internally.
Currently |
195 // different callers have different ideas of what the rootLayer should be for a
particular | 202 // different callers have different ideas of what the rootLayer should be for a
particular |
196 // cacheSlot, which can fill the cache with bad data. If this can be made consis
tent it should | 203 // cacheSlot, which can fill the cache with bad data. If this can be made consis
tent it should |
197 // be possible to eliminate rootLayer. | 204 // be possible to eliminate rootLayer. |
198 ClipRect DeprecatedPaintLayerClipper::backgroundClipRect(const ClipRectsContext&
context) const | 205 ClipRect DeprecatedPaintLayerClipper::backgroundClipRect(const ClipRectsContext&
context) const |
199 { | 206 { |
200 ASSERT(m_layoutObject.layer()->parent()); | 207 ASSERT(m_layoutObject.layer()->parent()); |
201 ASSERT(m_layoutObject.view()); | 208 ASSERT(m_layoutObject.view()); |
202 | 209 |
203 // Ideally backgroundClipRect would not be called with itself as the rootLay
er. | 210 // Ideally backgroundClipRect would not be called with itself as the rootLay
er. |
204 // This behavior can be seen in the following test | 211 // This behavior can be seen in the following test |
205 // LayoutTests/compositing/squashing/abspos-under-abspos-overflow-scroll.htm
l | 212 // LayoutTests/compositing/squashing/abspos-under-abspos-overflow-scroll.htm
l |
206 if (m_layoutObject.layer() == context.rootLayer) | 213 if (m_layoutObject.layer() == context.rootLayer) |
207 return LayoutRect(LayoutRect::infiniteIntRect()); | 214 return LayoutRect(LayoutRect::infiniteIntRect()); |
208 | 215 |
209 // TODO(chadarmstrong): If possible, all queries should use one of the clipR
ectsCacheSlots. | 216 // TODO(chadarmstrong): If possible, all queries should use one of the clipR
ectsCacheSlots. |
210 // Without caching this operation involves walking all the way to rootLayer. | 217 // Without caching this operation involves walking all the way to rootLayer. |
211 if (!context.usesCache()) | 218 if (!context.usesCache()) |
212 return uncachedBackgroundClipRect(context); | 219 return uncachedBackgroundClipRect(context); |
213 | 220 |
214 // TODO(chadarmstrong): precalculation for painting should be moved to updat
eLifecyclePhasesInternal | 221 // TODO(chadarmstrong): precalculation for painting should be moved to updat
eLifecyclePhasesInternal |
215 // and precalculation could be done for all hit testing. This would let us a
void clearing the cache | 222 // and precalculation could be done for all hit testing. This would let us a
void clearing the cache |
216 if (!m_clips[context.cacheSlot()]) | 223 if (!m_clips[context.cacheSlot()]) { |
| 224 // AbsoluteClipRects should have been updated during compositing updates
so we shouldn't miss here. |
| 225 ASSERT(context.cacheSlot() != AbsoluteClipRects); |
217 precalculate(context); | 226 precalculate(context); |
| 227 } |
218 | 228 |
219 // TODO(chadarmstrong): eliminate this if possible. | 229 // TODO(chadarmstrong): eliminate this if possible. |
220 // It is necessary only because of a seemingly atypical use of rootLayer tha
t | 230 // It is necessary only because of a seemingly atypical use of rootLayer tha
t |
221 // can be seen in LayoutTests/fullscreen/full-screen-line-boxes-crash.html a
nd | 231 // can be seen in LayoutTests/fullscreen/full-screen-line-boxes-crash.html a
nd |
222 // fast/block/multicol-paint-invalidation-assert.html. | 232 // fast/block/multicol-paint-invalidation-assert.html. |
223 if (!m_clips[context.cacheSlot()]) | 233 if (!m_clips[context.cacheSlot()]) |
224 return uncachedBackgroundClipRect(context); | 234 return uncachedBackgroundClipRect(context); |
225 // As soon as crbug.com/517173 is resolved this assert should be enabled in
place of the check | 235 // As soon as crbug.com/517173 is resolved this assert should be enabled in
place of the check |
226 // ASSERT(m_clips[context.cacheSlot()]->rootLayer() == context.rootLayer); | 236 // ASSERT(m_clips[context.cacheSlot()]->rootLayer() == context.rootLayer); |
227 if (m_clips[context.cacheSlot()]->rootLayer() != context.rootLayer) | 237 if (m_clips[context.cacheSlot()]->rootLayer() != context.rootLayer) |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
446 if (context.respectOverflowClip == IgnoreOverflowClip) | 456 if (context.respectOverflowClip == IgnoreOverflowClip) |
447 return false; | 457 return false; |
448 | 458 |
449 if (layer->isRootLayer() && context.respectOverflowClipForViewport == Ignore
OverflowClip) | 459 if (layer->isRootLayer() && context.respectOverflowClipForViewport == Ignore
OverflowClip) |
450 return false; | 460 return false; |
451 | 461 |
452 return true; | 462 return true; |
453 } | 463 } |
454 | 464 |
455 } // namespace blink | 465 } // namespace blink |
OLD | NEW |