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 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
199 absRect.moveBy(delta); | 199 absRect.moveBy(delta); |
200 | 200 |
201 if (absRect.isEmpty()) | 201 if (absRect.isEmpty()) |
202 return; | 202 return; |
203 | 203 |
204 RenderView* view = m_renderer.view(); | 204 RenderView* view = m_renderer.view(); |
205 if (view) | 205 if (view) |
206 view->repaintViewRectangle(absRect); | 206 view->repaintViewRectangle(absRect); |
207 return; | 207 return; |
208 } | 208 } |
209 if (m_renderer.compositingState() == PaintsIntoGroupedBacking) { | 209 IntRect repaintRect = pixelSnappedIntRect(r); |
210 LayoutRect updatedRect(r); | 210 // FIXME: generalize accessors to backing GraphicsLayers so that this code i
s squashing-agnostic. |
211 | 211 if (m_renderer.groupedMapping()) { |
212 ASSERT(m_renderer.layer()); | |
213 ASSERT(m_renderer.layer()->enclosingTransformedAncestor()); | |
214 ASSERT(m_renderer.layer()->enclosingTransformedAncestor()->renderer()); | |
215 | |
216 // FIXME: this defensive code should not have to exist. None of these po
inters should ever be 0. See crbug.com/370410. | |
217 RenderLayerModelObject* transformedAncestor = 0; | |
218 if (RenderLayer* ancestor = m_renderer.layer()->enclosingTransformedAnce
stor()) | |
219 transformedAncestor = ancestor->renderer(); | |
220 if (!transformedAncestor) | |
221 return; | |
222 | |
223 // If the transformedAncestor is actually the RenderView, we might get | |
224 // confused and think that we can use LayoutState. Ideally, we'd made | |
225 // LayoutState work for all composited layers as well, but until then | |
226 // we need to disable LayoutState for squashed layers. | |
227 LayoutStateDisabler layoutStateDisabler(*transformedAncestor); | |
228 | |
229 // This code adjusts the repaint rectangle to be in the space of the tra
nsformed ancestor of the grouped (i.e. squashed) | |
230 // layer. This is because all layers that squash together need to repain
t w.r.t. a single container that is | |
231 // an ancestor of all of them, in order to properly take into account an
y local transforms etc. | |
232 // FIXME: remove this special-case code that works around the repainting
code structure. | |
233 m_renderer.computeRectForRepaint(transformedAncestor, updatedRect); | |
234 updatedRect.moveBy(-m_renderer.layer()->groupedMapping()->squashingOffse
tFromTransformedAncestor()); | |
235 | |
236 IntRect repaintRect = pixelSnappedIntRect(updatedRect); | |
237 if (GraphicsLayer* squashingLayer = m_renderer.groupedMapping()->squashi
ngLayer()) | 212 if (GraphicsLayer* squashingLayer = m_renderer.groupedMapping()->squashi
ngLayer()) |
238 squashingLayer->setNeedsDisplayInRect(repaintRect); | 213 squashingLayer->setNeedsDisplayInRect(repaintRect); |
239 } else { | 214 } else { |
240 IntRect repaintRect = pixelSnappedIntRect(r); | |
241 m_renderer.compositedLayerMapping()->setContentsNeedDisplayInRect(repain
tRect); | 215 m_renderer.compositedLayerMapping()->setContentsNeedDisplayInRect(repain
tRect); |
242 } | 216 } |
243 } | 217 } |
244 | 218 |
245 void RenderLayerRepainter::setFilterBackendNeedsRepaintingInRect(const LayoutRec
t& rect) | 219 void RenderLayerRepainter::setFilterBackendNeedsRepaintingInRect(const LayoutRec
t& rect) |
246 { | 220 { |
247 if (rect.isEmpty()) | 221 if (rect.isEmpty()) |
248 return; | 222 return; |
249 | |
250 LayoutRect rectForRepaint = rect; | 223 LayoutRect rectForRepaint = rect; |
251 m_renderer.style()->filterOutsets().expandRect(rectForRepaint); | 224 m_renderer.style()->filterOutsets().expandRect(rectForRepaint); |
252 | 225 |
253 RenderLayerFilterInfo* filterInfo = m_renderer.layer()->filterInfo(); | 226 RenderLayerFilterInfo* filterInfo = m_renderer.layer()->filterInfo(); |
254 ASSERT(filterInfo); | 227 ASSERT(filterInfo); |
255 filterInfo->expandDirtySourceRect(rectForRepaint); | 228 filterInfo->expandDirtySourceRect(rectForRepaint); |
256 | 229 |
257 RenderLayer* parentLayer = enclosingFilterRepaintLayer(); | 230 RenderLayer* parentLayer = enclosingFilterRepaintLayer(); |
258 ASSERT(parentLayer); | 231 ASSERT(parentLayer); |
259 FloatQuad repaintQuad(rectForRepaint); | 232 FloatQuad repaintQuad(rectForRepaint); |
(...skipping 24 matching lines...) Expand all Loading... |
284 RenderLayer* RenderLayerRepainter::enclosingFilterRepaintLayer() const | 257 RenderLayer* RenderLayerRepainter::enclosingFilterRepaintLayer() const |
285 { | 258 { |
286 for (const RenderLayer* curr = m_renderer.layer(); curr; curr = curr->parent
()) { | 259 for (const RenderLayer* curr = m_renderer.layer(); curr; curr = curr->parent
()) { |
287 if ((curr != m_renderer.layer() && curr->requiresFullLayerImageForFilter
s()) || curr->compositingState() == PaintsIntoOwnBacking || curr->isRootLayer()) | 260 if ((curr != m_renderer.layer() && curr->requiresFullLayerImageForFilter
s()) || curr->compositingState() == PaintsIntoOwnBacking || curr->isRootLayer()) |
288 return const_cast<RenderLayer*>(curr); | 261 return const_cast<RenderLayer*>(curr); |
289 } | 262 } |
290 return 0; | 263 return 0; |
291 } | 264 } |
292 | 265 |
293 } // Namespace WebCore | 266 } // Namespace WebCore |
OLD | NEW |