• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #include "config.h"
6 #include "core/paint/ViewPainter.h"
7 
8 #include "core/frame/FrameView.h"
9 #include "core/rendering/GraphicsContextAnnotator.h"
10 #include "core/rendering/PaintInfo.h"
11 #include "core/rendering/RenderBox.h"
12 #include "core/rendering/RenderView.h"
13 
14 namespace blink {
15 
paint(PaintInfo & paintInfo,const LayoutPoint & paintOffset)16 void ViewPainter::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
17 {
18     // If we ever require layout but receive a paint anyway, something has gone horribly wrong.
19     ASSERT(!m_renderView.needsLayout());
20     // RenderViews should never be called to paint with an offset not on device pixels.
21     ASSERT(LayoutPoint(IntPoint(paintOffset.x(), paintOffset.y())) == paintOffset);
22 
23     ANNOTATE_GRAPHICS_CONTEXT(paintInfo, &m_renderView);
24 
25     // This avoids painting garbage between columns if there is a column gap.
26     if (m_renderView.frameView() && m_renderView.style()->isOverflowPaged())
27         paintInfo.context->fillRect(paintInfo.rect, m_renderView.frameView()->baseBackgroundColor());
28 
29     m_renderView.paintObject(paintInfo, paintOffset);
30 }
31 
rendererObscuresBackground(RenderBox * rootBox)32 static inline bool rendererObscuresBackground(RenderBox* rootBox)
33 {
34     ASSERT(rootBox);
35     RenderStyle* style = rootBox->style();
36     if (style->visibility() != VISIBLE
37         || style->opacity() != 1
38         || style->hasFilter()
39         || style->hasTransform())
40         return false;
41 
42     if (rootBox->compositingState() == PaintsIntoOwnBacking)
43         return false;
44 
45     const RenderObject* rootRenderer = rootBox->rendererForRootBackground();
46     if (rootRenderer->style()->backgroundClip() == TextFillBox)
47         return false;
48 
49     return true;
50 }
51 
paintBoxDecorationBackground(PaintInfo & paintInfo)52 void ViewPainter::paintBoxDecorationBackground(PaintInfo& paintInfo)
53 {
54     if (m_renderView.document().ownerElement() || !m_renderView.view())
55         return;
56 
57     if (paintInfo.skipRootBackground())
58         return;
59 
60     bool shouldPaintBackground = true;
61     Node* documentElement = m_renderView.document().documentElement();
62     if (RenderBox* rootBox = documentElement ? toRenderBox(documentElement->renderer()) : 0)
63         shouldPaintBackground = !rootFillsViewportBackground(rootBox) || !rendererObscuresBackground(rootBox);
64 
65     // If painting will entirely fill the view, no need to fill the background.
66     if (!shouldPaintBackground)
67         return;
68 
69     // This code typically only executes if the root element's visibility has been set to hidden,
70     // if there is a transform on the <html>, or if there is a page scale factor less than 1.
71     // Only fill with the base background color (typically white) if we're the root document,
72     // since iframes/frames with no background in the child document should show the parent's background.
73     if (!m_renderView.frameView()->isTransparent()) {
74         Color baseColor = m_renderView.frameView()->baseBackgroundColor();
75         if (baseColor.alpha()) {
76             CompositeOperator previousOperator = paintInfo.context->compositeOperation();
77             paintInfo.context->setCompositeOperation(CompositeCopy);
78             paintInfo.context->fillRect(paintInfo.rect, baseColor);
79             paintInfo.context->setCompositeOperation(previousOperator);
80         } else {
81             paintInfo.context->clearRect(paintInfo.rect);
82         }
83     }
84 }
85 
rootFillsViewportBackground(RenderBox * rootBox) const86 bool ViewPainter::rootFillsViewportBackground(RenderBox* rootBox) const
87 {
88     ASSERT(rootBox);
89     // CSS Boxes always fill the viewport background (see paintRootBoxFillLayers)
90     if (!rootBox->isSVG())
91         return true;
92 
93     return rootBox->frameRect().contains(m_renderView.frameRect());
94 }
95 
96 } // namespace blink
97