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" |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
150 | 150 |
151 bool BoxPainter::calculateFillLayerOcclusionCulling(FillLayerOcclusionOutputList
&reversedPaintList, const FillLayer& fillLayer) | 151 bool BoxPainter::calculateFillLayerOcclusionCulling(FillLayerOcclusionOutputList
&reversedPaintList, const FillLayer& fillLayer) |
152 { | 152 { |
153 bool isNonAssociative = false; | 153 bool isNonAssociative = false; |
154 for (auto currentLayer = &fillLayer; currentLayer; currentLayer = currentLay
er->next()) { | 154 for (auto currentLayer = &fillLayer; currentLayer; currentLayer = currentLay
er->next()) { |
155 reversedPaintList.append(currentLayer); | 155 reversedPaintList.append(currentLayer); |
156 // Stop traversal when an opaque layer is encountered. | 156 // Stop traversal when an opaque layer is encountered. |
157 // FIXME : It would be possible for the following occlusion culling test
to be more aggressive | 157 // FIXME : It would be possible for the following occlusion culling test
to be more aggressive |
158 // on layers with no repeat by testing whether the image covers the layo
ut rect. | 158 // on layers with no repeat by testing whether the image covers the layo
ut rect. |
159 // Testing that here would imply duplicating a lot of calculations that
are currently done in | 159 // Testing that here would imply duplicating a lot of calculations that
are currently done in |
160 // LayoutBoxModelObject::paintFillLayerExtended. A more efficient soluti
on might be to move | 160 // LayoutBoxModelObject::paintFillLayer. A more efficient solution might
be to move the layer |
161 // the layer recursion into paintFillLayerExtended, or to compute the la
yer geometry here | 161 // recursion into paintFillLayer, or to compute the layer geometry here
and pass it down. |
162 // and pass it down. | |
163 | 162 |
164 // TODO(trchen): Need to check compositing mode as well. | 163 // TODO(trchen): Need to check compositing mode as well. |
165 if (currentLayer->blendMode() != WebBlendModeNormal) | 164 if (currentLayer->blendMode() != WebBlendModeNormal) |
166 isNonAssociative = true; | 165 isNonAssociative = true; |
167 | 166 |
168 // TODO(trchen): A fill layer cannot paint if the calculated tile size i
s empty. | 167 // TODO(trchen): A fill layer cannot paint if the calculated tile size i
s empty. |
169 // This occlusion check can be wrong. | 168 // This occlusion check can be wrong. |
170 if (currentLayer->clipOccludesNextLayers() | 169 if (currentLayer->clipOccludesNextLayers() |
171 && isFillLayerOpaque(*currentLayer, m_layoutBox)) { | 170 && isFillLayerOpaque(*currentLayer, m_layoutBox)) { |
172 if (currentLayer->clip() == BorderFillBox) | 171 if (currentLayer->clip() == BorderFillBox) |
(...skipping 25 matching lines...) Expand all Loading... |
198 | 197 |
199 // TODO(trchen): We can optimize out isolation group if we have a non-transp
arent | 198 // TODO(trchen): We can optimize out isolation group if we have a non-transp
arent |
200 // background color and the bottom layer encloses all other layers. | 199 // background color and the bottom layer encloses all other layers. |
201 | 200 |
202 GraphicsContext& context = paintInfo.context; | 201 GraphicsContext& context = paintInfo.context; |
203 | 202 |
204 if (shouldDrawBackgroundInSeparateBuffer) | 203 if (shouldDrawBackgroundInSeparateBuffer) |
205 context.beginLayer(); | 204 context.beginLayer(); |
206 | 205 |
207 for (auto it = reversedPaintList.rbegin(); it != reversedPaintList.rend(); +
+it) | 206 for (auto it = reversedPaintList.rbegin(); it != reversedPaintList.rend(); +
+it) |
208 paintFillLayer(paintInfo, c, **it, rect, bleedAvoidance, op, backgroundO
bject); | 207 paintFillLayer(m_layoutBox, paintInfo, c, **it, rect, bleedAvoidance, 0,
LayoutSize(), op, backgroundObject); |
209 | 208 |
210 if (shouldDrawBackgroundInSeparateBuffer) | 209 if (shouldDrawBackgroundInSeparateBuffer) |
211 context.endLayer(); | 210 context.endLayer(); |
212 } | 211 } |
213 | 212 |
214 void BoxPainter::paintFillLayer(const PaintInfo& paintInfo, const Color& c, cons
t FillLayer& fillLayer, const LayoutRect& rect, | |
215 BackgroundBleedAvoidance bleedAvoidance, SkXfermode::Mode op, const LayoutOb
ject* backgroundObject) | |
216 { | |
217 BoxPainter::paintFillLayerExtended(m_layoutBox, paintInfo, c, fillLayer, rec
t, bleedAvoidance, 0, LayoutSize(), op, backgroundObject); | |
218 } | |
219 | |
220 void BoxPainter::applyBoxShadowForBackground(GraphicsContext& context, const Lay
outObject& obj) | 213 void BoxPainter::applyBoxShadowForBackground(GraphicsContext& context, const Lay
outObject& obj) |
221 { | 214 { |
222 const ShadowList* shadowList = obj.style()->boxShadow(); | 215 const ShadowList* shadowList = obj.style()->boxShadow(); |
223 ASSERT(shadowList); | 216 ASSERT(shadowList); |
224 for (size_t i = shadowList->shadows().size(); i--; ) { | 217 for (size_t i = shadowList->shadows().size(); i--; ) { |
225 const ShadowData& boxShadow = shadowList->shadows()[i]; | 218 const ShadowData& boxShadow = shadowList->shadows()[i]; |
226 if (boxShadow.style() != Normal) | 219 if (boxShadow.style() != Normal) |
227 continue; | 220 continue; |
228 FloatSize shadowOffset(boxShadow.x(), boxShadow.y()); | 221 FloatSize shadowOffset(boxShadow.x(), boxShadow.y()); |
229 context.setShadow(shadowOffset, boxShadow.blur(), | 222 context.setShadow(shadowOffset, boxShadow.blur(), |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
279 FloatRect insetRect(backgroundRoundedRect.rect()); | 272 FloatRect insetRect(backgroundRoundedRect.rect()); |
280 insetRect.expand(insets); | 273 insetRect.expand(insets); |
281 FloatRoundedRect::Radii insetRadii(backgroundRoundedRect.radii()); | 274 FloatRoundedRect::Radii insetRadii(backgroundRoundedRect.radii()); |
282 insetRadii.shrink(-insets.top(), -insets.bottom(), -insets.left(), -inse
ts.right()); | 275 insetRadii.shrink(-insets.top(), -insets.bottom(), -insets.left(), -inse
ts.right()); |
283 return FloatRoundedRect(insetRect, insetRadii); | 276 return FloatRoundedRect(insetRect, insetRadii); |
284 } | 277 } |
285 | 278 |
286 return getBackgroundRoundedRect(obj, borderRect, box, boxSize.width(), boxSi
ze.height(), includeLogicalLeftEdge, includeLogicalRightEdge); | 279 return getBackgroundRoundedRect(obj, borderRect, box, boxSize.width(), boxSi
ze.height(), includeLogicalLeftEdge, includeLogicalRightEdge); |
287 } | 280 } |
288 | 281 |
289 void BoxPainter::paintFillLayerExtended(const LayoutBoxModelObject& obj, const P
aintInfo& paintInfo, const Color& color, const FillLayer& bgLayer, const LayoutR
ect& rect, BackgroundBleedAvoidance bleedAvoidance, const InlineFlowBox* box, co
nst LayoutSize& boxSize, SkXfermode::Mode op, const LayoutObject* backgroundObje
ct) | 282 void BoxPainter::paintFillLayer(const LayoutBoxModelObject& obj, const PaintInfo
& paintInfo, const Color& color, const FillLayer& bgLayer, const LayoutRect& rec
t, BackgroundBleedAvoidance bleedAvoidance, const InlineFlowBox* box, const Layo
utSize& boxSize, SkXfermode::Mode op, const LayoutObject* backgroundObject) |
290 { | 283 { |
291 GraphicsContext& context = paintInfo.context; | 284 GraphicsContext& context = paintInfo.context; |
292 if (rect.isEmpty()) | 285 if (rect.isEmpty()) |
293 return; | 286 return; |
294 | 287 |
295 bool includeLeftEdge = box ? box->includeLogicalLeftEdge() : true; | 288 bool includeLeftEdge = box ? box->includeLogicalLeftEdge() : true; |
296 bool includeRightEdge = box ? box->includeLogicalRightEdge() : true; | 289 bool includeRightEdge = box ? box->includeLogicalRightEdge() : true; |
297 | 290 |
298 bool hasRoundedBorder = obj.style()->hasBorderRadius() && (includeLeftEdge |
| includeRightEdge); | 291 bool hasRoundedBorder = obj.style()->hasBorderRadius() && (includeLeftEdge |
| includeRightEdge); |
299 bool clippedWithLocalScrolling = obj.hasOverflowClip() && bgLayer.attachment
() == LocalBackgroundAttachment; | 292 bool clippedWithLocalScrolling = obj.hasOverflowClip() && bgLayer.attachment
() == LocalBackgroundAttachment; |
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
703 } | 696 } |
704 } | 697 } |
705 | 698 |
706 bool BoxPainter::shouldForceWhiteBackgroundForPrintEconomy(const ComputedStyle&
style, const Document& document) | 699 bool BoxPainter::shouldForceWhiteBackgroundForPrintEconomy(const ComputedStyle&
style, const Document& document) |
707 { | 700 { |
708 return document.printing() && style.printColorAdjust() == PrintColorAdjustEc
onomy | 701 return document.printing() && style.printColorAdjust() == PrintColorAdjustEc
onomy |
709 && (!document.settings() || !document.settings()->shouldPrintBackgrounds
()); | 702 && (!document.settings() || !document.settings()->shouldPrintBackgrounds
()); |
710 } | 703 } |
711 | 704 |
712 } // namespace blink | 705 } // namespace blink |
OLD | NEW |