OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "config.h" | 5 #include "config.h" |
6 #include "core/paint/BoxPainter.h" | 6 #include "core/paint/BoxPainter.h" |
7 | 7 |
8 #include "core/HTMLNames.h" | 8 #include "core/HTMLNames.h" |
9 #include "core/frame/Settings.h" | 9 #include "core/frame/Settings.h" |
10 #include "core/html/HTMLFrameOwnerElement.h" | 10 #include "core/html/HTMLFrameOwnerElement.h" |
11 #include "core/paint/BackgroundImageGeometry.h" | 11 #include "core/paint/BackgroundImageGeometry.h" |
12 #include "core/paint/BoxDecorationData.h" | 12 #include "core/paint/BoxDecorationData.h" |
13 #include "core/paint/RenderDrawingRecorder.h" | 13 #include "core/paint/RenderDrawingRecorder.h" |
| 14 #include "core/paint/RoundedInnerRectClipper.h" |
14 #include "core/rendering/ImageQualityController.h" | 15 #include "core/rendering/ImageQualityController.h" |
15 #include "core/rendering/PaintInfo.h" | 16 #include "core/rendering/PaintInfo.h" |
16 #include "core/rendering/RenderBox.h" | 17 #include "core/rendering/RenderBox.h" |
17 #include "core/rendering/RenderBoxModelObject.h" | 18 #include "core/rendering/RenderBoxModelObject.h" |
18 #include "core/rendering/RenderLayer.h" | 19 #include "core/rendering/RenderLayer.h" |
19 #include "core/rendering/RenderObject.h" | 20 #include "core/rendering/RenderObject.h" |
20 #include "core/rendering/RenderTable.h" | 21 #include "core/rendering/RenderTable.h" |
21 #include "core/rendering/RenderTheme.h" | 22 #include "core/rendering/RenderTheme.h" |
22 #include "core/rendering/RenderView.h" | 23 #include "core/rendering/RenderView.h" |
23 #include "core/rendering/compositing/CompositedLayerMapping.h" | 24 #include "core/rendering/compositing/CompositedLayerMapping.h" |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
256 if (bleedAvoidance == BackgroundBleedShrinkBackground) { | 257 if (bleedAvoidance == BackgroundBleedShrinkBackground) { |
257 // We shrink the rectangle by one pixel on each side because the bleed i
s one pixel maximum. | 258 // We shrink the rectangle by one pixel on each side because the bleed i
s one pixel maximum. |
258 return BoxPainter::getBackgroundRoundedRect(obj, shrinkRectByOnePixel(co
ntext, borderRect), box, boxSize.width(), boxSize.height(), includeLogicalLeftEd
ge, includeLogicalRightEdge); | 259 return BoxPainter::getBackgroundRoundedRect(obj, shrinkRectByOnePixel(co
ntext, borderRect), box, boxSize.width(), boxSize.height(), includeLogicalLeftEd
ge, includeLogicalRightEdge); |
259 } | 260 } |
260 if (bleedAvoidance == BackgroundBleedBackgroundOverBorder) | 261 if (bleedAvoidance == BackgroundBleedBackgroundOverBorder) |
261 return obj.style()->getRoundedInnerBorderFor(borderRect, includeLogicalL
eftEdge, includeLogicalRightEdge); | 262 return obj.style()->getRoundedInnerBorderFor(borderRect, includeLogicalL
eftEdge, includeLogicalRightEdge); |
262 | 263 |
263 return BoxPainter::getBackgroundRoundedRect(obj, borderRect, box, boxSize.wi
dth(), boxSize.height(), includeLogicalLeftEdge, includeLogicalRightEdge); | 264 return BoxPainter::getBackgroundRoundedRect(obj, borderRect, box, boxSize.wi
dth(), boxSize.height(), includeLogicalLeftEdge, includeLogicalRightEdge); |
264 } | 265 } |
265 | 266 |
266 void BoxPainter::clipRoundedInnerRect(GraphicsContext * context, const LayoutRec
t& rect, const FloatRoundedRect& clipRect) | |
267 { | |
268 if (clipRect.isRenderable()) { | |
269 context->clipRoundedRect(clipRect); | |
270 } else { | |
271 // We create a rounded rect for each of the corners and clip it, while m
aking sure we clip opposing corners together. | |
272 if (!clipRect.radii().topLeft().isEmpty() || !clipRect.radii().bottomRig
ht().isEmpty()) { | |
273 FloatRect topCorner(clipRect.rect().x(), clipRect.rect().y(), rect.m
axX() - clipRect.rect().x(), rect.maxY() - clipRect.rect().y()); | |
274 FloatRoundedRect::Radii topCornerRadii; | |
275 topCornerRadii.setTopLeft(clipRect.radii().topLeft()); | |
276 context->clipRoundedRect(FloatRoundedRect(topCorner, topCornerRadii)
); | |
277 | |
278 FloatRect bottomCorner(rect.x().toFloat(), rect.y().toFloat(), clipR
ect.rect().maxX() - rect.x().toFloat(), clipRect.rect().maxY() - rect.y().toFloa
t()); | |
279 FloatRoundedRect::Radii bottomCornerRadii; | |
280 bottomCornerRadii.setBottomRight(clipRect.radii().bottomRight()); | |
281 context->clipRoundedRect(FloatRoundedRect(bottomCorner, bottomCorner
Radii)); | |
282 } | |
283 | |
284 if (!clipRect.radii().topRight().isEmpty() || !clipRect.radii().bottomLe
ft().isEmpty()) { | |
285 FloatRect topCorner(rect.x().toFloat(), clipRect.rect().y(), clipRec
t.rect().maxX() - rect.x().toFloat(), rect.maxY() - clipRect.rect().y()); | |
286 FloatRoundedRect::Radii topCornerRadii; | |
287 topCornerRadii.setTopRight(clipRect.radii().topRight()); | |
288 context->clipRoundedRect(FloatRoundedRect(topCorner, topCornerRadii)
); | |
289 | |
290 FloatRect bottomCorner(clipRect.rect().x(), rect.y().toFloat(), rect
.maxX() - clipRect.rect().x(), clipRect.rect().maxY() - rect.y().toFloat()); | |
291 FloatRoundedRect::Radii bottomCornerRadii; | |
292 bottomCornerRadii.setBottomLeft(clipRect.radii().bottomLeft()); | |
293 context->clipRoundedRect(FloatRoundedRect(bottomCorner, bottomCorner
Radii)); | |
294 } | |
295 } | |
296 } | |
297 | |
298 void BoxPainter::paintFillLayerExtended(RenderBoxModelObject& obj, const PaintIn
fo& paintInfo, const Color& color, const FillLayer& bgLayer, const LayoutRect& r
ect, | 267 void BoxPainter::paintFillLayerExtended(RenderBoxModelObject& obj, const PaintIn
fo& paintInfo, const Color& color, const FillLayer& bgLayer, const LayoutRect& r
ect, |
299 BackgroundBleedAvoidance bleedAvoidance, InlineFlowBox* box, const LayoutSiz
e& boxSize, SkXfermode::Mode op, RenderObject* backgroundObject, bool skipBaseCo
lor) | 268 BackgroundBleedAvoidance bleedAvoidance, InlineFlowBox* box, const LayoutSiz
e& boxSize, SkXfermode::Mode op, RenderObject* backgroundObject, bool skipBaseCo
lor) |
300 { | 269 { |
301 GraphicsContext* context = paintInfo.context; | 270 GraphicsContext* context = paintInfo.context; |
302 if (rect.isEmpty()) | 271 if (rect.isEmpty()) |
303 return; | 272 return; |
304 | 273 |
305 bool includeLeftEdge = box ? box->includeLogicalLeftEdge() : true; | 274 bool includeLeftEdge = box ? box->includeLogicalLeftEdge() : true; |
306 bool includeRightEdge = box ? box->includeLogicalRightEdge() : true; | 275 bool includeRightEdge = box ? box->includeLogicalRightEdge() : true; |
307 | 276 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
349 bool boxShadowShouldBeAppliedToBackground = obj.boxShadowShouldBeApplied
ToBackground(bleedAvoidance, box); | 318 bool boxShadowShouldBeAppliedToBackground = obj.boxShadowShouldBeApplied
ToBackground(bleedAvoidance, box); |
350 GraphicsContextStateSaver shadowStateSaver(*context, boxShadowShouldBeAp
pliedToBackground); | 319 GraphicsContextStateSaver shadowStateSaver(*context, boxShadowShouldBeAp
pliedToBackground); |
351 if (boxShadowShouldBeAppliedToBackground) | 320 if (boxShadowShouldBeAppliedToBackground) |
352 BoxPainter::applyBoxShadowForBackground(context, obj); | 321 BoxPainter::applyBoxShadowForBackground(context, obj); |
353 | 322 |
354 if (hasRoundedBorder && bleedAvoidance != BackgroundBleedClipBackground)
{ | 323 if (hasRoundedBorder && bleedAvoidance != BackgroundBleedClipBackground)
{ |
355 FloatRoundedRect border = backgroundRoundedRectAdjustedForBleedAvoid
ance(obj, context, rect, bleedAvoidance, box, boxSize, includeLeftEdge, includeR
ightEdge); | 324 FloatRoundedRect border = backgroundRoundedRectAdjustedForBleedAvoid
ance(obj, context, rect, bleedAvoidance, box, boxSize, includeLeftEdge, includeR
ightEdge); |
356 if (border.isRenderable()) { | 325 if (border.isRenderable()) { |
357 context->fillRoundedRect(border, bgColor); | 326 context->fillRoundedRect(border, bgColor); |
358 } else { | 327 } else { |
359 context->save(); | 328 RoundedInnerRectClipper clipper(obj, paintInfo, rect, border, Ap
plyToContext); |
360 clipRoundedInnerRect(context, rect, border); | |
361 context->fillRect(border.rect(), bgColor); | 329 context->fillRect(border.rect(), bgColor); |
362 context->restore(); | |
363 } | 330 } |
364 } else { | 331 } else { |
365 context->fillRect(pixelSnappedIntRect(rect), bgColor); | 332 context->fillRect(pixelSnappedIntRect(rect), bgColor); |
366 } | 333 } |
367 | 334 |
368 return; | 335 return; |
369 } | 336 } |
370 | 337 |
371 // BorderFillBox radius clipping is taken care of by BackgroundBleedClipBack
ground | 338 // BorderFillBox radius clipping is taken care of by BackgroundBleedClipBack
ground |
372 bool clipToBorderRadius = hasRoundedBorder && !(isBorderFill && bleedAvoidan
ce == BackgroundBleedClipBackground); | 339 bool clipToBorderRadius = hasRoundedBorder && !(isBorderFill && bleedAvoidan
ce == BackgroundBleedClipBackground); |
373 GraphicsContextStateSaver clipToBorderStateSaver(*context, clipToBorderRadiu
s); | 340 OwnPtr<RoundedInnerRectClipper> clipToBorder; |
374 if (clipToBorderRadius) { | 341 if (clipToBorderRadius) { |
375 FloatRoundedRect border = isBorderFill ? backgroundRoundedRectAdjustedFo
rBleedAvoidance(obj, context, rect, bleedAvoidance, box, boxSize, includeLeftEdg
e, includeRightEdge) : getBackgroundRoundedRect(obj, rect, box, boxSize.width(),
boxSize.height(), includeLeftEdge, includeRightEdge); | 342 FloatRoundedRect border = isBorderFill ? backgroundRoundedRectAdjustedFo
rBleedAvoidance(obj, context, rect, bleedAvoidance, box, boxSize, includeLeftEdg
e, includeRightEdge) : getBackgroundRoundedRect(obj, rect, box, boxSize.width(),
boxSize.height(), includeLeftEdge, includeRightEdge); |
376 | 343 |
377 // Clip to the padding or content boxes as necessary. | 344 // Clip to the padding or content boxes as necessary. |
378 if (bgLayer.clip() == ContentFillBox) { | 345 if (bgLayer.clip() == ContentFillBox) { |
379 border = obj.style()->getRoundedInnerBorderFor(LayoutRect(border.rec
t()), | 346 border = obj.style()->getRoundedInnerBorderFor(LayoutRect(border.rec
t()), |
380 obj.paddingTop() + obj.borderTop(), obj.paddingBottom() + obj.bo
rderBottom(), | 347 obj.paddingTop() + obj.borderTop(), obj.paddingBottom() + obj.bo
rderBottom(), |
381 obj.paddingLeft() + obj.borderLeft(), obj.paddingRight() + obj.b
orderRight(), includeLeftEdge, includeRightEdge); | 348 obj.paddingLeft() + obj.borderLeft(), obj.paddingRight() + obj.b
orderRight(), includeLeftEdge, includeRightEdge); |
382 } else if (bgLayer.clip() == PaddingFillBox) { | 349 } else if (bgLayer.clip() == PaddingFillBox) { |
383 border = obj.style()->getRoundedInnerBorderFor(LayoutRect(border.rec
t()), includeLeftEdge, includeRightEdge); | 350 border = obj.style()->getRoundedInnerBorderFor(LayoutRect(border.rec
t()), includeLeftEdge, includeRightEdge); |
384 } | 351 } |
385 | 352 |
386 clipRoundedInnerRect(context, rect, border); | 353 clipToBorder = adoptPtr(new RoundedInnerRectClipper(obj, paintInfo, rect
, border, ApplyToContext)); |
387 } | 354 } |
388 | 355 |
389 int bLeft = includeLeftEdge ? obj.borderLeft() : 0; | 356 int bLeft = includeLeftEdge ? obj.borderLeft() : 0; |
390 int bRight = includeRightEdge ? obj.borderRight() : 0; | 357 int bRight = includeRightEdge ? obj.borderRight() : 0; |
391 LayoutUnit pLeft = includeLeftEdge ? obj.paddingLeft() : LayoutUnit(); | 358 LayoutUnit pLeft = includeLeftEdge ? obj.paddingLeft() : LayoutUnit(); |
392 LayoutUnit pRight = includeRightEdge ? obj.paddingRight() : LayoutUnit(); | 359 LayoutUnit pRight = includeRightEdge ? obj.paddingRight() : LayoutUnit(); |
393 | 360 |
394 GraphicsContextStateSaver clipWithScrollingStateSaver(*context, clippedWithL
ocalScrolling); | 361 GraphicsContextStateSaver clipWithScrollingStateSaver(*context, clippedWithL
ocalScrolling); |
395 LayoutRect scrolledPaintRect = rect; | 362 LayoutRect scrolledPaintRect = rect; |
396 if (clippedWithLocalScrolling) { | 363 if (clippedWithLocalScrolling) { |
(...skipping 1816 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2213 | 2180 |
2214 FloatPoint secondQuad[4]; | 2181 FloatPoint secondQuad[4]; |
2215 secondQuad[0] = quad[0]; | 2182 secondQuad[0] = quad[0]; |
2216 secondQuad[1] = FloatPoint(quad[0].x() - r1 * cx, quad[0].y() - r1 * cy); | 2183 secondQuad[1] = FloatPoint(quad[0].x() - r1 * cx, quad[0].y() - r1 * cy); |
2217 secondQuad[2] = quad[2]; | 2184 secondQuad[2] = quad[2]; |
2218 secondQuad[3] = quad[3]; | 2185 secondQuad[3] = quad[3]; |
2219 graphicsContext->clipPolygon(4, secondQuad, !secondEdgeMatches); | 2186 graphicsContext->clipPolygon(4, secondQuad, !secondEdgeMatches); |
2220 } | 2187 } |
2221 | 2188 |
2222 } // namespace blink | 2189 } // namespace blink |
OLD | NEW |