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 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
157 for (RenderLayer* layer = m_renderer.layer()->firstChild(); layer; layer = l
ayer->nextSibling()) | 157 for (RenderLayer* layer = m_renderer.layer()->firstChild(); layer; layer = l
ayer->nextSibling()) |
158 layer->clipper().clearClipRectsIncludingDescendants(cacheSlot); | 158 layer->clipper().clearClipRectsIncludingDescendants(cacheSlot); |
159 } | 159 } |
160 | 160 |
161 LayoutRect RenderLayerClipper::childrenClipRect() const | 161 LayoutRect RenderLayerClipper::childrenClipRect() const |
162 { | 162 { |
163 // FIXME: border-radius not accounted for. | 163 // FIXME: border-radius not accounted for. |
164 // FIXME: Regions not accounted for. | 164 // FIXME: Regions not accounted for. |
165 RenderLayer* clippingRootLayer = clippingRootForPainting(); | 165 RenderLayer* clippingRootLayer = clippingRootForPainting(); |
166 LayoutRect layerBounds; | 166 LayoutRect layerBounds; |
167 ClipRect backgroundRect, foregroundRect, outlineRect; | 167 ClipRect backgroundRect, foregroundRect; |
168 // Need to use uncached clip rects, because the value of 'dontClipToOverflow
' may be different from the painting path (<rdar://problem/11844909>). | 168 // Need to use uncached clip rects, because the value of 'dontClipToOverflow
' may be different from the painting path (<rdar://problem/11844909>). |
169 ClipRectsContext context(clippingRootLayer, UncachedClipRects); | 169 ClipRectsContext context(clippingRootLayer, UncachedClipRects); |
170 calculateRects(context, m_renderer.view()->unscaledDocumentRect(), layerBoun
ds, backgroundRect, foregroundRect, outlineRect); | 170 calculateRects(context, m_renderer.view()->unscaledDocumentRect(), layerBoun
ds, backgroundRect, foregroundRect); |
171 return clippingRootLayer->renderer()->localToAbsoluteQuad(FloatQuad(foregrou
ndRect.rect())).enclosingBoundingBox(); | 171 return clippingRootLayer->renderer()->localToAbsoluteQuad(FloatQuad(foregrou
ndRect.rect())).enclosingBoundingBox(); |
172 } | 172 } |
173 | 173 |
174 LayoutRect RenderLayerClipper::localClipRect() const | 174 LayoutRect RenderLayerClipper::localClipRect() const |
175 { | 175 { |
176 // FIXME: border-radius not accounted for. | 176 // FIXME: border-radius not accounted for. |
177 RenderLayer* clippingRootLayer = clippingRootForPainting(); | 177 RenderLayer* clippingRootLayer = clippingRootForPainting(); |
178 LayoutRect layerBounds; | 178 LayoutRect layerBounds; |
179 ClipRect backgroundRect, foregroundRect, outlineRect; | 179 ClipRect backgroundRect, foregroundRect; |
180 ClipRectsContext context(clippingRootLayer, PaintingClipRects); | 180 ClipRectsContext context(clippingRootLayer, PaintingClipRects); |
181 calculateRects(context, PaintInfo::infiniteRect(), layerBounds, backgroundRe
ct, foregroundRect, outlineRect); | 181 calculateRects(context, PaintInfo::infiniteRect(), layerBounds, backgroundRe
ct, foregroundRect); |
182 | 182 |
183 LayoutRect clipRect = backgroundRect.rect(); | 183 LayoutRect clipRect = backgroundRect.rect(); |
184 if (clipRect == PaintInfo::infiniteRect()) | 184 if (clipRect == PaintInfo::infiniteRect()) |
185 return clipRect; | 185 return clipRect; |
186 | 186 |
187 LayoutPoint clippingRootOffset; | 187 LayoutPoint clippingRootOffset; |
188 m_renderer.layer()->convertToLayerCoords(clippingRootLayer, clippingRootOffs
et); | 188 m_renderer.layer()->convertToLayerCoords(clippingRootLayer, clippingRootOffs
et); |
189 clipRect.moveBy(-clippingRootOffset); | 189 clipRect.moveBy(-clippingRootOffset); |
190 | 190 |
191 return clipRect; | 191 return clipRect; |
192 } | 192 } |
193 | 193 |
194 void RenderLayerClipper::calculateRects(const ClipRectsContext& context, const L
ayoutRect& paintDirtyRect, LayoutRect& layerBounds, | 194 void RenderLayerClipper::calculateRects(const ClipRectsContext& context, const L
ayoutRect& paintDirtyRect, LayoutRect& layerBounds, |
195 ClipRect& backgroundRect, ClipRect& foregroundRect, ClipRect& outlineRect, c
onst LayoutPoint* offsetFromRoot) const | 195 ClipRect& backgroundRect, ClipRect& foregroundRect, const LayoutPoint* offse
tFromRoot) const |
196 { | 196 { |
197 bool isClippingRoot = m_renderer.layer() == context.rootLayer; | 197 bool isClippingRoot = m_renderer.layer() == context.rootLayer; |
198 | 198 |
199 if (!isClippingRoot && m_renderer.layer()->parent()) { | 199 if (!isClippingRoot && m_renderer.layer()->parent()) { |
200 backgroundRect = backgroundClipRect(context); | 200 backgroundRect = backgroundClipRect(context); |
201 backgroundRect.move(roundedIntSize(context.subPixelAccumulation)); | 201 backgroundRect.move(roundedIntSize(context.subPixelAccumulation)); |
202 backgroundRect.intersect(paintDirtyRect); | 202 backgroundRect.intersect(paintDirtyRect); |
203 } else { | 203 } else { |
204 backgroundRect = paintDirtyRect; | 204 backgroundRect = paintDirtyRect; |
205 } | 205 } |
206 | 206 |
207 foregroundRect = backgroundRect; | 207 foregroundRect = backgroundRect; |
208 outlineRect = backgroundRect; | |
209 | 208 |
210 LayoutPoint offset; | 209 LayoutPoint offset; |
211 if (offsetFromRoot) | 210 if (offsetFromRoot) |
212 offset = *offsetFromRoot; | 211 offset = *offsetFromRoot; |
213 else | 212 else |
214 m_renderer.layer()->convertToLayerCoords(context.rootLayer, offset); | 213 m_renderer.layer()->convertToLayerCoords(context.rootLayer, offset); |
215 layerBounds = LayoutRect(offset, m_renderer.layer()->size()); | 214 layerBounds = LayoutRect(offset, m_renderer.layer()->size()); |
216 | 215 |
217 // Update the clip rects that will be passed to child layers. | 216 // Update the clip rects that will be passed to child layers. |
218 if (m_renderer.hasOverflowClip()) { | 217 if (m_renderer.hasOverflowClip()) { |
(...skipping 18 matching lines...) Expand all Loading... |
237 backgroundRect.intersect(bounds); | 236 backgroundRect.intersect(bounds); |
238 } | 237 } |
239 } | 238 } |
240 | 239 |
241 // CSS clip (different than clipping due to overflow) can clip to any box, e
ven if it falls outside of the border box. | 240 // CSS clip (different than clipping due to overflow) can clip to any box, e
ven if it falls outside of the border box. |
242 if (m_renderer.hasClip()) { | 241 if (m_renderer.hasClip()) { |
243 // Clip applies to *us* as well, so go ahead and update the damageRect. | 242 // Clip applies to *us* as well, so go ahead and update the damageRect. |
244 LayoutRect newPosClip = toRenderBox(m_renderer).clipRect(offset); | 243 LayoutRect newPosClip = toRenderBox(m_renderer).clipRect(offset); |
245 backgroundRect.intersect(newPosClip); | 244 backgroundRect.intersect(newPosClip); |
246 foregroundRect.intersect(newPosClip); | 245 foregroundRect.intersect(newPosClip); |
247 outlineRect.intersect(newPosClip); | |
248 } | 246 } |
249 } | 247 } |
250 | 248 |
251 void RenderLayerClipper::calculateClipRects(const ClipRectsContext& context, Cli
pRects& clipRects) const | 249 void RenderLayerClipper::calculateClipRects(const ClipRectsContext& context, Cli
pRects& clipRects) const |
252 { | 250 { |
253 if (!m_renderer.layer()->parent()) { | 251 if (!m_renderer.layer()->parent()) { |
254 // The root layer's clip rect is always infinite. | 252 // The root layer's clip rect is always infinite. |
255 clipRects.reset(PaintInfo::infiniteRect()); | 253 clipRects.reset(PaintInfo::infiniteRect()); |
256 return; | 254 return; |
257 } | 255 } |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 ASSERT(current); | 322 ASSERT(current); |
325 if (current->transform()) | 323 if (current->transform()) |
326 return const_cast<RenderLayer*>(current); | 324 return const_cast<RenderLayer*>(current); |
327 } | 325 } |
328 | 326 |
329 ASSERT_NOT_REACHED(); | 327 ASSERT_NOT_REACHED(); |
330 return 0; | 328 return 0; |
331 } | 329 } |
332 | 330 |
333 } // namespace blink | 331 } // namespace blink |
OLD | NEW |