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

Side by Side Diff: Source/core/rendering/RenderLayerClipper.cpp

Issue 134473008: Remove CSS regions support, keeping a bare minimum to support "region-based" multicol. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 10 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, 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 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 } 119 }
120 120
121 LayoutRect RenderLayerClipper::childrenClipRect() const 121 LayoutRect RenderLayerClipper::childrenClipRect() const
122 { 122 {
123 // FIXME: border-radius not accounted for. 123 // FIXME: border-radius not accounted for.
124 // FIXME: Regions not accounted for. 124 // FIXME: Regions not accounted for.
125 RenderView* renderView = m_renderer->view(); 125 RenderView* renderView = m_renderer->view();
126 RenderLayer* clippingRootLayer = clippingRootForPainting(); 126 RenderLayer* clippingRootLayer = clippingRootForPainting();
127 LayoutRect layerBounds; 127 LayoutRect layerBounds;
128 ClipRect backgroundRect, foregroundRect, outlineRect; 128 ClipRect backgroundRect, foregroundRect, outlineRect;
129 ClipRectsContext clipRectsContext(clippingRootLayer, 0, TemporaryClipRects); 129 ClipRectsContext clipRectsContext(clippingRootLayer, TemporaryClipRects);
130 // Need to use temporary clip rects, because the value of 'dontClipToOverflo w' may be different from the painting path (<rdar://problem/11844909>). 130 // Need to use temporary clip rects, because the value of 'dontClipToOverflo w' may be different from the painting path (<rdar://problem/11844909>).
131 calculateRects(clipRectsContext, renderView->unscaledDocumentRect(), layerBo unds, backgroundRect, foregroundRect, outlineRect); 131 calculateRects(clipRectsContext, renderView->unscaledDocumentRect(), layerBo unds, backgroundRect, foregroundRect, outlineRect);
132 return clippingRootLayer->renderer()->localToAbsoluteQuad(FloatQuad(foregrou ndRect.rect())).enclosingBoundingBox(); 132 return clippingRootLayer->renderer()->localToAbsoluteQuad(FloatQuad(foregrou ndRect.rect())).enclosingBoundingBox();
133 } 133 }
134 134
135 LayoutRect RenderLayerClipper::selfClipRect() const 135 LayoutRect RenderLayerClipper::selfClipRect() const
136 { 136 {
137 // FIXME: border-radius not accounted for. 137 // FIXME: border-radius not accounted for.
138 // FIXME: Regions not accounted for.
139 RenderView* renderView = m_renderer->view(); 138 RenderView* renderView = m_renderer->view();
140 RenderLayer* clippingRootLayer = clippingRootForPainting(); 139 RenderLayer* clippingRootLayer = clippingRootForPainting();
141 LayoutRect layerBounds; 140 LayoutRect layerBounds;
142 ClipRect backgroundRect, foregroundRect, outlineRect; 141 ClipRect backgroundRect, foregroundRect, outlineRect;
143 ClipRectsContext clipRectsContext(clippingRootLayer, 0, PaintingClipRects); 142 ClipRectsContext clipRectsContext(clippingRootLayer, PaintingClipRects);
144 calculateRects(clipRectsContext, renderView->documentRect(), layerBounds, ba ckgroundRect, foregroundRect, outlineRect); 143 calculateRects(clipRectsContext, renderView->documentRect(), layerBounds, ba ckgroundRect, foregroundRect, outlineRect);
145 return clippingRootLayer->renderer()->localToAbsoluteQuad(FloatQuad(backgrou ndRect.rect())).enclosingBoundingBox(); 144 return clippingRootLayer->renderer()->localToAbsoluteQuad(FloatQuad(backgrou ndRect.rect())).enclosingBoundingBox();
146 } 145 }
147 146
148 LayoutRect RenderLayerClipper::localClipRect() const 147 LayoutRect RenderLayerClipper::localClipRect() const
149 { 148 {
150 // FIXME: border-radius not accounted for. 149 // FIXME: border-radius not accounted for.
151 // FIXME: Regions not accounted for.
152 RenderLayer* clippingRootLayer = clippingRootForPainting(); 150 RenderLayer* clippingRootLayer = clippingRootForPainting();
153 LayoutRect layerBounds; 151 LayoutRect layerBounds;
154 ClipRect backgroundRect, foregroundRect, outlineRect; 152 ClipRect backgroundRect, foregroundRect, outlineRect;
155 ClipRectsContext clipRectsContext(clippingRootLayer, 0, PaintingClipRects); 153 ClipRectsContext clipRectsContext(clippingRootLayer, PaintingClipRects);
156 calculateRects(clipRectsContext, PaintInfo::infiniteRect(), layerBounds, bac kgroundRect, foregroundRect, outlineRect); 154 calculateRects(clipRectsContext, PaintInfo::infiniteRect(), layerBounds, bac kgroundRect, foregroundRect, outlineRect);
157 155
158 LayoutRect clipRect = backgroundRect.rect(); 156 LayoutRect clipRect = backgroundRect.rect();
159 if (clipRect == PaintInfo::infiniteRect()) 157 if (clipRect == PaintInfo::infiniteRect())
160 return clipRect; 158 return clipRect;
161 159
162 LayoutPoint clippingRootOffset; 160 LayoutPoint clippingRootOffset;
163 m_renderer->layer()->convertToLayerCoords(clippingRootLayer, clippingRootOff set); 161 m_renderer->layer()->convertToLayerCoords(clippingRootLayer, clippingRootOff set);
164 clipRect.moveBy(-clippingRootOffset); 162 clipRect.moveBy(-clippingRootOffset);
165 163
(...skipping 17 matching lines...) Expand all
183 if (offsetFromRoot) 181 if (offsetFromRoot)
184 offset = *offsetFromRoot; 182 offset = *offsetFromRoot;
185 else 183 else
186 m_renderer->layer()->convertToLayerCoords(clipRectsContext.rootLayer, of fset); 184 m_renderer->layer()->convertToLayerCoords(clipRectsContext.rootLayer, of fset);
187 layerBounds = LayoutRect(offset, m_renderer->layer()->size()); 185 layerBounds = LayoutRect(offset, m_renderer->layer()->size());
188 186
189 // Update the clip rects that will be passed to child layers. 187 // Update the clip rects that will be passed to child layers.
190 if (m_renderer->hasOverflowClip()) { 188 if (m_renderer->hasOverflowClip()) {
191 // This layer establishes a clip of some kind. 189 // This layer establishes a clip of some kind.
192 if (m_renderer->layer() != clipRectsContext.rootLayer || clipRectsContex t.respectOverflowClip == RespectOverflowClip) { 190 if (m_renderer->layer() != clipRectsContext.rootLayer || clipRectsContex t.respectOverflowClip == RespectOverflowClip) {
193 foregroundRect.intersect(toRenderBox(m_renderer)->overflowClipRect(o ffset, clipRectsContext.region, clipRectsContext.overlayScrollbarSizeRelevancy)) ; 191 foregroundRect.intersect(toRenderBox(m_renderer)->overflowClipRect(o ffset, clipRectsContext.overlayScrollbarSizeRelevancy));
194 if (m_renderer->style()->hasBorderRadius()) 192 if (m_renderer->style()->hasBorderRadius())
195 foregroundRect.setHasRadius(true); 193 foregroundRect.setHasRadius(true);
196 } 194 }
197 195
198 // If we establish an overflow clip at all, then go ahead and make sure our background 196 // If we establish an overflow clip at all, then go ahead and make sure our background
199 // rect is intersected with our layer's bounds including our visual over flow, 197 // rect is intersected with our layer's bounds including our visual over flow,
200 // since any visual overflow like box-shadow or border-outset is not cli pped by overflow:auto/hidden. 198 // since any visual overflow like box-shadow or border-outset is not cli pped by overflow:auto/hidden.
201 if (toRenderBox(m_renderer)->hasVisualOverflow()) { 199 if (toRenderBox(m_renderer)->hasVisualOverflow()) {
202 // FIXME: Perhaps we should be propagating the borderbox as the clip rect for children, even though 200 // FIXME: Perhaps we should be propagating the borderbox as the clip rect for children, even though
203 // we may need to inflate our clip specifically for shadows o r outsets. 201 // we may need to inflate our clip specifically for shadows o r outsets.
204 // FIXME: Does not do the right thing with CSS regions yet, since we don't yet factor in the 202 // FIXME: Does not do the right thing with CSS regions yet, since we don't yet factor in the
205 // individual region boxes as overflow. 203 // individual region boxes as overflow.
206 LayoutRect layerBoundsWithVisualOverflow = toRenderBox(m_renderer)-> visualOverflowRect(); 204 LayoutRect layerBoundsWithVisualOverflow = toRenderBox(m_renderer)-> visualOverflowRect();
207 toRenderBox(m_renderer)->flipForWritingMode(layerBoundsWithVisualOve rflow); // Layers are in physical coordinates, so the overflow has to be flipped . 205 toRenderBox(m_renderer)->flipForWritingMode(layerBoundsWithVisualOve rflow); // Layers are in physical coordinates, so the overflow has to be flipped .
208 layerBoundsWithVisualOverflow.moveBy(offset); 206 layerBoundsWithVisualOverflow.moveBy(offset);
209 if (m_renderer->layer() != clipRectsContext.rootLayer || clipRectsCo ntext.respectOverflowClip == RespectOverflowClip) 207 if (m_renderer->layer() != clipRectsContext.rootLayer || clipRectsCo ntext.respectOverflowClip == RespectOverflowClip)
210 backgroundRect.intersect(layerBoundsWithVisualOverflow); 208 backgroundRect.intersect(layerBoundsWithVisualOverflow);
211 } else { 209 } else {
212 // Shift the bounds to be for our region only. 210 LayoutRect bounds = toRenderBox(m_renderer)->borderBoxRect();
213 LayoutRect bounds = toRenderBox(m_renderer)->borderBoxRectInRegion(c lipRectsContext.region);
214 bounds.moveBy(offset); 211 bounds.moveBy(offset);
215 if (m_renderer->layer() != clipRectsContext.rootLayer || clipRectsCo ntext.respectOverflowClip == RespectOverflowClip) 212 if (m_renderer->layer() != clipRectsContext.rootLayer || clipRectsCo ntext.respectOverflowClip == RespectOverflowClip)
216 backgroundRect.intersect(bounds); 213 backgroundRect.intersect(bounds);
217 } 214 }
218 } 215 }
219 216
220 // CSS clip (different than clipping due to overflow) can clip to any box, e ven if it falls outside of the border box. 217 // CSS clip (different than clipping due to overflow) can clip to any box, e ven if it falls outside of the border box.
221 if (m_renderer->hasClip()) { 218 if (m_renderer->hasClip()) {
222 // Clip applies to *us* as well, so go ahead and update the damageRect. 219 // Clip applies to *us* as well, so go ahead and update the damageRect.
223 LayoutRect newPosClip = toRenderBox(m_renderer)->clipRect(offset, clipRe ctsContext.region); 220 LayoutRect newPosClip = toRenderBox(m_renderer)->clipRect(offset);
224 backgroundRect.intersect(newPosClip); 221 backgroundRect.intersect(newPosClip);
225 foregroundRect.intersect(newPosClip); 222 foregroundRect.intersect(newPosClip);
226 outlineRect.intersect(newPosClip); 223 outlineRect.intersect(newPosClip);
227 } 224 }
228 } 225 }
229 226
230 void RenderLayerClipper::calculateClipRects(const ClipRectsContext& clipRectsCon text, ClipRects& clipRects) const 227 void RenderLayerClipper::calculateClipRects(const ClipRectsContext& clipRectsCon text, ClipRects& clipRects) const
231 { 228 {
232 if (!m_renderer->layer()->parent()) { 229 if (!m_renderer->layer()->parent()) {
233 // The root layer's clip rect is always infinite. 230 // The root layer's clip rect is always infinite.
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 // clipRects are needed in view space. 273 // clipRects are needed in view space.
277 LayoutPoint offset; 274 LayoutPoint offset;
278 offset = roundedLayoutPoint(m_renderer->localToContainerPoint(FloatPoint (), clipRectsContext.rootLayer->renderer())); 275 offset = roundedLayoutPoint(m_renderer->localToContainerPoint(FloatPoint (), clipRectsContext.rootLayer->renderer()));
279 RenderView* view = m_renderer->view(); 276 RenderView* view = m_renderer->view();
280 ASSERT(view); 277 ASSERT(view);
281 if (view && clipRects.fixed() && clipRectsContext.rootLayer->renderer() == view) { 278 if (view && clipRects.fixed() && clipRectsContext.rootLayer->renderer() == view) {
282 offset -= view->frameView()->scrollOffsetForFixedPosition(); 279 offset -= view->frameView()->scrollOffsetForFixedPosition();
283 } 280 }
284 281
285 if (m_renderer->hasOverflowClip()) { 282 if (m_renderer->hasOverflowClip()) {
286 ClipRect newOverflowClip = toRenderBox(m_renderer)->overflowClipRect (offset, clipRectsContext.region, clipRectsContext.overlayScrollbarSizeRelevancy ); 283 ClipRect newOverflowClip = toRenderBox(m_renderer)->overflowClipRect (offset, clipRectsContext.overlayScrollbarSizeRelevancy);
287 if (m_renderer->style()->hasBorderRadius()) 284 if (m_renderer->style()->hasBorderRadius())
288 newOverflowClip.setHasRadius(true); 285 newOverflowClip.setHasRadius(true);
289 clipRects.setOverflowClipRect(intersection(newOverflowClip, clipRect s.overflowClipRect())); 286 clipRects.setOverflowClipRect(intersection(newOverflowClip, clipRect s.overflowClipRect()));
290 if (m_renderer->isPositioned()) 287 if (m_renderer->isPositioned())
291 clipRects.setPosClipRect(intersection(newOverflowClip, clipRects .posClipRect())); 288 clipRects.setPosClipRect(intersection(newOverflowClip, clipRects .posClipRect()));
292 } 289 }
293 if (m_renderer->hasClip()) { 290 if (m_renderer->hasClip()) {
294 LayoutRect newPosClip = toRenderBox(m_renderer)->clipRect(offset, cl ipRectsContext.region); 291 LayoutRect newPosClip = toRenderBox(m_renderer)->clipRect(offset);
295 clipRects.setPosClipRect(intersection(newPosClip, clipRects.posClipR ect())); 292 clipRects.setPosClipRect(intersection(newPosClip, clipRects.posClipR ect()));
296 clipRects.setOverflowClipRect(intersection(newPosClip, clipRects.ove rflowClipRect())); 293 clipRects.setOverflowClipRect(intersection(newPosClip, clipRects.ove rflowClipRect()));
297 clipRects.setFixedClipRect(intersection(newPosClip, clipRects.fixedC lipRect())); 294 clipRects.setFixedClipRect(intersection(newPosClip, clipRects.fixedC lipRect()));
298 } 295 }
299 } 296 }
300 } 297 }
301 298
302 static inline ClipRect backgroundClipRectForPosition(const ClipRects& parentRect s, EPosition position) 299 static inline ClipRect backgroundClipRectForPosition(const ClipRects& parentRect s, EPosition position)
303 { 300 {
304 if (position == FixedPosition) 301 if (position == FixedPosition)
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 || (current->compositingState() == PaintsIntoOwnBacking) 364 || (current->compositingState() == PaintsIntoOwnBacking)
368 ) 365 )
369 return const_cast<RenderLayer*>(current); 366 return const_cast<RenderLayer*>(current);
370 } 367 }
371 368
372 ASSERT_NOT_REACHED(); 369 ASSERT_NOT_REACHED();
373 return 0; 370 return 0;
374 } 371 }
375 372
376 } // namespace WebCore 373 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698