OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * Copyright (C) 2000 Dirk Mueller (mueller@kde.org) | 3 * Copyright (C) 2000 Dirk Mueller (mueller@kde.org) |
4 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved. | 4 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved. |
5 * Copyright (C) Research In Motion Limited 2011-2012. All rights reserved. | 5 * Copyright (C) Research In Motion Limited 2011-2012. All rights reserved. |
6 * | 6 * |
7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
11 * | 11 * |
12 * This library is distributed in the hope that it will be useful, | 12 * This library is distributed in the hope that it will be useful, |
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
15 * Library General Public License for more details. | 15 * Library General Public License for more details. |
16 * | 16 * |
17 * You should have received a copy of the GNU Library General Public License | 17 * You should have received a copy of the GNU Library General Public License |
18 * along with this library; see the file COPYING.LIB. If not, write to | 18 * along with this library; see the file COPYING.LIB. If not, write to |
19 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | 19 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
20 * Boston, MA 02110-1301, USA. | 20 * Boston, MA 02110-1301, USA. |
21 * | 21 * |
22 */ | 22 */ |
23 | 23 |
24 #include "config.h" | 24 #include "config.h" |
25 #include "core/rendering/RenderReplaced.h" | 25 #include "core/rendering/RenderReplaced.h" |
26 | 26 |
27 #include "core/editing/PositionWithAffinity.h" | 27 #include "core/editing/PositionWithAffinity.h" |
28 #include "core/paint/BoxPainter.h" | 28 #include "core/paint/ReplacedPainter.h" |
29 #include "core/rendering/GraphicsContextAnnotator.h" | 29 #include "core/rendering/GraphicsContextAnnotator.h" |
30 #include "core/rendering/RenderBlock.h" | 30 #include "core/rendering/RenderBlock.h" |
31 #include "core/rendering/RenderImage.h" | 31 #include "core/rendering/RenderImage.h" |
32 #include "core/rendering/RenderLayer.h" | 32 #include "core/rendering/RenderLayer.h" |
33 #include "core/rendering/RenderView.h" | 33 #include "core/rendering/RenderView.h" |
34 #include "platform/LengthFunctions.h" | 34 #include "platform/LengthFunctions.h" |
35 #include "platform/graphics/GraphicsContext.h" | 35 #include "platform/graphics/GraphicsContext.h" |
36 | 36 |
37 namespace blink { | 37 namespace blink { |
38 | 38 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 void RenderReplaced::intrinsicSizeChanged() | 95 void RenderReplaced::intrinsicSizeChanged() |
96 { | 96 { |
97 int scaledWidth = static_cast<int>(defaultWidth * style()->effectiveZoom()); | 97 int scaledWidth = static_cast<int>(defaultWidth * style()->effectiveZoom()); |
98 int scaledHeight = static_cast<int>(defaultHeight * style()->effectiveZoom()
); | 98 int scaledHeight = static_cast<int>(defaultHeight * style()->effectiveZoom()
); |
99 m_intrinsicSize = IntSize(scaledWidth, scaledHeight); | 99 m_intrinsicSize = IntSize(scaledWidth, scaledHeight); |
100 setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(); | 100 setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(); |
101 } | 101 } |
102 | 102 |
103 void RenderReplaced::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset) | 103 void RenderReplaced::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset) |
104 { | 104 { |
105 ANNOTATE_GRAPHICS_CONTEXT(paintInfo, this); | 105 ReplacedPainter(*this).paint(paintInfo, paintOffset); |
106 | |
107 if (!shouldPaint(paintInfo, paintOffset)) | |
108 return; | |
109 | |
110 LayoutPoint adjustedPaintOffset = paintOffset + location(); | |
111 | |
112 if (hasBoxDecorationBackground() && (paintInfo.phase == PaintPhaseForeground
|| paintInfo.phase == PaintPhaseSelection)) | |
113 paintBoxDecorationBackground(paintInfo, adjustedPaintOffset); | |
114 | |
115 if (paintInfo.phase == PaintPhaseMask) { | |
116 paintMask(paintInfo, adjustedPaintOffset); | |
117 return; | |
118 } | |
119 | |
120 if (paintInfo.phase == PaintPhaseClippingMask && (!hasLayer() || !layer()->h
asCompositedClippingMask())) | |
121 return; | |
122 | |
123 LayoutRect paintRect = LayoutRect(adjustedPaintOffset, size()); | |
124 if ((paintInfo.phase == PaintPhaseOutline || paintInfo.phase == PaintPhaseSe
lfOutline) && style()->outlineWidth()) | |
125 paintOutline(paintInfo, paintRect); | |
126 | |
127 if (paintInfo.phase != PaintPhaseForeground && paintInfo.phase != PaintPhase
Selection && !canHaveChildren() && paintInfo.phase != PaintPhaseClippingMask) | |
128 return; | |
129 | |
130 if (!paintInfo.shouldPaintWithinRoot(this)) | |
131 return; | |
132 | |
133 bool drawSelectionTint = selectionState() != SelectionNone && !document().pr
inting(); | |
134 if (paintInfo.phase == PaintPhaseSelection) { | |
135 if (selectionState() == SelectionNone) | |
136 return; | |
137 drawSelectionTint = false; | |
138 } | |
139 | |
140 bool completelyClippedOut = false; | |
141 if (style()->hasBorderRadius()) { | |
142 LayoutRect borderRect = LayoutRect(adjustedPaintOffset, size()); | |
143 | |
144 if (borderRect.isEmpty()) | |
145 completelyClippedOut = true; | |
146 else { | |
147 // Push a clip if we have a border radius, since we want to round th
e foreground content that gets painted. | |
148 paintInfo.context->save(); | |
149 RoundedRect roundedInnerRect = style()->getRoundedInnerBorderFor(pai
ntRect, | |
150 paddingTop() + borderTop(), paddingBottom() + borderBottom(), pa
ddingLeft() + borderLeft(), paddingRight() + borderRight(), true, true); | |
151 BoxPainter::clipRoundedInnerRect(paintInfo.context, paintRect, round
edInnerRect); | |
152 } | |
153 } | |
154 | |
155 if (!completelyClippedOut) { | |
156 if (paintInfo.phase == PaintPhaseClippingMask) { | |
157 paintClippingMask(paintInfo, adjustedPaintOffset); | |
158 } else { | |
159 paintReplaced(paintInfo, adjustedPaintOffset); | |
160 } | |
161 | |
162 if (style()->hasBorderRadius()) | |
163 paintInfo.context->restore(); | |
164 } | |
165 | |
166 // The selection tint never gets clipped by border-radius rounding, since we
want it to run right up to the edges of | |
167 // surrounding content. | |
168 if (drawSelectionTint) { | |
169 LayoutRect selectionPaintingRect = localSelectionRect(); | |
170 selectionPaintingRect.moveBy(adjustedPaintOffset); | |
171 paintInfo.context->fillRect(pixelSnappedIntRect(selectionPaintingRect),
selectionBackgroundColor()); | |
172 } | |
173 } | 106 } |
174 | 107 |
175 bool RenderReplaced::shouldPaint(PaintInfo& paintInfo, const LayoutPoint& paintO
ffset) | 108 bool RenderReplaced::shouldPaint(PaintInfo& paintInfo, const LayoutPoint& paintO
ffset) |
176 { | 109 { |
177 if (paintInfo.phase != PaintPhaseForeground && paintInfo.phase != PaintPhase
Outline && paintInfo.phase != PaintPhaseSelfOutline | 110 if (paintInfo.phase != PaintPhaseForeground && paintInfo.phase != PaintPhase
Outline && paintInfo.phase != PaintPhaseSelfOutline |
178 && paintInfo.phase != PaintPhaseSelection && paintInfo.phase != PaintPha
seMask && paintInfo.phase != PaintPhaseClippingMask) | 111 && paintInfo.phase != PaintPhaseSelection && paintInfo.phase != PaintPha
seMask && paintInfo.phase != PaintPhaseClippingMask) |
179 return false; | 112 return false; |
180 | 113 |
181 if (!paintInfo.shouldPaintWithinRoot(this)) | 114 if (!paintInfo.shouldPaintWithinRoot(this)) |
182 return false; | 115 return false; |
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
563 return LayoutRect(); | 496 return LayoutRect(); |
564 | 497 |
565 // The selectionRect can project outside of the overflowRect, so take their
union | 498 // The selectionRect can project outside of the overflowRect, so take their
union |
566 // for paint invalidation to avoid selection painting glitches. | 499 // for paint invalidation to avoid selection painting glitches. |
567 LayoutRect r = isSelected() ? localSelectionRect() : visualOverflowRect(); | 500 LayoutRect r = isSelected() ? localSelectionRect() : visualOverflowRect(); |
568 mapRectToPaintInvalidationBacking(paintInvalidationContainer, r, paintInvali
dationState); | 501 mapRectToPaintInvalidationBacking(paintInvalidationContainer, r, paintInvali
dationState); |
569 return r; | 502 return r; |
570 } | 503 } |
571 | 504 |
572 } | 505 } |
OLD | NEW |