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

Side by Side Diff: Source/core/paint/ContentBoxRadiusClipper.cpp

Issue 865353002: Implement clip and scroll DisplayItems for PartPainter (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 11 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 | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "config.h"
6 #include "core/paint/ContentBoxRadiusClipper.h"
7
8 #include "core/rendering/PaintInfo.h"
9 #include "core/rendering/RenderBox.h"
10 #include "platform/graphics/paint/ClipDisplayItem.h"
11 #include "platform/graphics/paint/DisplayItemList.h"
12
13 namespace blink {
14
15 ContentBoxRadiusClipper::ContentBoxRadiusClipper(RenderBox& box, const PaintInfo & paintInfo, const LayoutPoint& accumulatedOffset)
16 : m_box(box)
17 , m_paintInfo(paintInfo)
18 , m_pushedClip(false)
19 , m_completelyClipped(false)
20 {
21 if (!box.style()->hasBorderRadius())
22 return;
23
24 LayoutRect borderRect = LayoutRect(accumulatedOffset, m_box.size());
25
26 FloatRoundedRect roundedContentBox = box.style()->getRoundedInnerBorderFor(b orderRect,
27 box.paddingTop() + box.borderTop(),
28 box.paddingBottom() + box.borderBottom(),
29 box.paddingLeft() + box.borderLeft(),
30 box.paddingRight() + box.borderRight(), true, true);
31
32 if (roundedContentBox.isEmpty()) {
33 m_completelyClipped = true;
34 return;
35 }
36
37 DisplayItem::Type clipType = DisplayItem::ClipBoxForeground;
38 if (RuntimeEnabledFeatures::slimmingPaintEnabled())
39 clipType = m_paintInfo.displayItemTypeForClipping();
40
41 OwnPtr<ClipDisplayItem> clipDisplayItem = ClipDisplayItem::create(box.displa yItemClient(), clipType, pixelSnappedIntRect(borderRect));
42
43 if (roundedContentBox.isRenderable()) {
chrishtr 2015/01/23 05:07:12 I don't get it. Where is all the logic in this cla
44 clipDisplayItem->roundedRectClips().append(roundedContentBox);
45 } else {
46 // We create a rounded rect for each of the corners and clip it, while m aking sure we clip opposing corners together.
47 if (!roundedContentBox.radii().topLeft().isEmpty() || !roundedContentBox .radii().bottomRight().isEmpty()) {
48 FloatRect topCorner(roundedContentBox.rect().x(), roundedContentBox. rect().y(), borderRect.maxX() - roundedContentBox.rect().x(), borderRect.maxY() - roundedContentBox.rect().y());
49 FloatRoundedRect::Radii topCornerRadii;
50 topCornerRadii.setTopLeft(roundedContentBox.radii().topLeft());
51 clipDisplayItem->roundedRectClips().append(FloatRoundedRect(topCorne r, topCornerRadii));
52
53 FloatRect bottomCorner(borderRect.x().toFloat(), borderRect.y().toFl oat(), roundedContentBox.rect().maxX() - borderRect.x().toFloat(), roundedConten tBox.rect().maxY() - borderRect.y().toFloat());
54 FloatRoundedRect::Radii bottomCornerRadii;
55 bottomCornerRadii.setBottomRight(roundedContentBox.radii().bottomRig ht());
56 clipDisplayItem->roundedRectClips().append(FloatRoundedRect(bottomCo rner, bottomCornerRadii));
57 }
58
59 if (!roundedContentBox.radii().topRight().isEmpty() || !roundedContentBo x.radii().bottomLeft().isEmpty()) {
60 FloatRect topCorner(borderRect.x().toFloat(), roundedContentBox.rect ().y(), roundedContentBox.rect().maxX() - borderRect.x().toFloat(), borderRect.m axY() - roundedContentBox.rect().y());
61 FloatRoundedRect::Radii topCornerRadii;
62 topCornerRadii.setTopRight(roundedContentBox.radii().topRight());
63 clipDisplayItem->roundedRectClips().append(FloatRoundedRect(topCorne r, topCornerRadii));
64
65 FloatRect bottomCorner(roundedContentBox.rect().x(), borderRect.y(). toFloat(), borderRect.maxX() - roundedContentBox.rect().x(), roundedContentBox.r ect().maxY() - borderRect.y().toFloat());
66 FloatRoundedRect::Radii bottomCornerRadii;
67 bottomCornerRadii.setBottomLeft(roundedContentBox.radii().bottomLeft ());
68 clipDisplayItem->roundedRectClips().append(FloatRoundedRect(bottomCo rner, bottomCornerRadii));
69 }
70 }
71
72 if (RuntimeEnabledFeatures::slimmingPaintEnabled()) {
73 ASSERT(m_paintInfo.context->displayItemList());
74 m_paintInfo.context->displayItemList()->add(clipDisplayItem.release());
75 } else {
76 clipDisplayItem->replay(paintInfo.context);
77 }
78 m_pushedClip = true;
79 }
80
81 ContentBoxRadiusClipper::~ContentBoxRadiusClipper()
82 {
83 if (!m_pushedClip)
84 return;
85
86 OwnPtr<EndClipDisplayItem> endClipDisplayItem = EndClipDisplayItem::create(m _box.displayItemClient());
87
88 if (RuntimeEnabledFeatures::slimmingPaintEnabled()) {
89 ASSERT(m_paintInfo.context->displayItemList());
90 m_paintInfo.context->displayItemList()->add(endClipDisplayItem.release() );
91 } else {
92 endClipDisplayItem->replay(m_paintInfo.context);
93 }
94 }
95
96 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698