1 /* 2 * Copyright (C) 2000 Lars Knoll (knoll (at) kde.org) 3 * (C) 2000 Antti Koivisto (koivisto (at) kde.org) 4 * (C) 2000 Dirk Mueller (mueller (at) kde.org) 5 * (C) 2004 Allan Sandfeld Jensen (kde (at) carewolf.com) 6 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 7 * Copyright (C) 2009 Google Inc. All rights reserved. 8 * 9 * This library is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU Library General Public 11 * License as published by the Free Software Foundation; either 12 * version 2 of the License, or (at your option) any later version. 13 * 14 * This library is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 * Library General Public License for more details. 18 * 19 * You should have received a copy of the GNU Library General Public License 20 * along with this library; see the file COPYING.LIB. If not, write to 21 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 22 * Boston, MA 02110-1301, USA. 23 * 24 */ 25 26 #ifndef PaintInfo_h 27 #define PaintInfo_h 28 29 #include <limits> 30 #include "core/rendering/PaintPhase.h" 31 #include "platform/geometry/IntRect.h" 32 #include "platform/geometry/LayoutRect.h" 33 #include "platform/graphics/GraphicsContext.h" 34 #include "platform/transforms/AffineTransform.h" 35 #include "wtf/HashMap.h" 36 #include "wtf/ListHashSet.h" 37 38 namespace WebCore { 39 40 class RenderInline; 41 class RenderLayerModelObject; 42 class RenderObject; 43 class RenderRegion; 44 class RenderWidget; 45 46 typedef HashMap<RenderWidget*, IntRect> OverlapTestRequestMap; 47 48 /* 49 * Paint the object and its children, clipped by (x|y|w|h). 50 * (tx|ty) is the calculated position of the parent 51 */ 52 struct PaintInfo { 53 PaintInfo(GraphicsContext* newContext, const IntRect& newRect, PaintPhase newPhase, PaintBehavior newPaintBehavior, 54 RenderObject* newPaintingRoot = 0, RenderRegion* region = 0, ListHashSet<RenderInline*>* newOutlineObjects = 0, 55 OverlapTestRequestMap* overlapTestRequests = 0, const RenderLayerModelObject* newPaintContainer = 0) 56 : context(newContext) 57 , rect(newRect) 58 , phase(newPhase) 59 , paintBehavior(newPaintBehavior) 60 , paintingRoot(newPaintingRoot) 61 , renderRegion(region) 62 , overlapTestRequests(overlapTestRequests) 63 , m_paintContainer(newPaintContainer) 64 , m_outlineObjects(newOutlineObjects) 65 { 66 } 67 68 void updatePaintingRootForChildren(const RenderObject* renderer) 69 { 70 if (!paintingRoot) 71 return; 72 73 // If we're the painting root, kids draw normally, and see root of 0. 74 if (paintingRoot == renderer) { 75 paintingRoot = 0; 76 return; 77 } 78 } 79 80 bool shouldPaintWithinRoot(const RenderObject* renderer) const 81 { 82 return !paintingRoot || paintingRoot == renderer; 83 } 84 85 bool forceBlackText() const { return paintBehavior & PaintBehaviorForceBlackText; } 86 87 bool skipRootBackground() const { return paintBehavior & PaintBehaviorSkipRootBackground; } 88 bool paintRootBackgroundOnly() const { return paintBehavior & PaintBehaviorRootBackgroundOnly; } 89 90 void applyTransform(const AffineTransform& localToAncestorTransform) 91 { 92 if (localToAncestorTransform.isIdentity()) 93 return; 94 95 context->concatCTM(localToAncestorTransform); 96 97 if (rect == infiniteRect()) 98 return; 99 100 rect = localToAncestorTransform.inverse().mapRect(rect); 101 } 102 103 static IntRect infiniteRect() { return IntRect(LayoutRect::infiniteRect()); } 104 const RenderLayerModelObject* paintContainer() const { return m_paintContainer; } 105 106 ListHashSet<RenderInline*>* outlineObjects() { return m_outlineObjects; } 107 void setOutlineObjects(ListHashSet<RenderInline*>* objects) { m_outlineObjects = objects; } 108 109 // FIXME: Introduce setters/getters at some point. Requires a lot of changes throughout rendering/. 110 GraphicsContext* context; 111 IntRect rect; 112 PaintPhase phase; 113 PaintBehavior paintBehavior; 114 RenderObject* paintingRoot; // used to draw just one element and its visual kids 115 RenderRegion* renderRegion; 116 OverlapTestRequestMap* overlapTestRequests; 117 118 private: 119 120 const RenderLayerModelObject* m_paintContainer; // the layer object that originates the current painting 121 ListHashSet<RenderInline*>* m_outlineObjects; // used to list outlines that should be painted by a block with inline children 122 }; 123 124 } // namespace WebCore 125 126 #endif // PaintInfo_h 127