1 /** 2 * Copyright (C) 2007 Rob Buis <buis (at) kde.org> 3 * Copyright (C) 2007 Nikolas Zimmermann <zimmermann (at) kde.org> 4 * Copyright (C) 2007 Eric Seidel <eric (at) webkit.org> 5 * Copyright (C) 2009 Google, Inc. All rights reserved. 6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. 7 * Copyright (C) 2012 Zoltan Herczeg <zherczeg (at) webkit.org>. 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 #ifndef SVGRenderingContext_h 26 #define SVGRenderingContext_h 27 28 #include "core/platform/graphics/ImageBuffer.h" 29 #include "core/rendering/PaintInfo.h" 30 31 namespace WebCore { 32 33 class AffineTransform; 34 class RenderObject; 35 class FloatRect; 36 class RenderSVGResourceFilter; 37 38 // SVGRenderingContext 39 class SVGRenderingContext { 40 public: 41 enum NeedsGraphicsContextSave { 42 SaveGraphicsContext, 43 DontSaveGraphicsContext, 44 }; 45 46 // Does not start rendering. 47 SVGRenderingContext() 48 : m_renderingFlags(0) 49 , m_object(0) 50 , m_paintInfo(0) 51 , m_savedContext(0) 52 , m_filter(0) 53 { 54 } 55 56 SVGRenderingContext(RenderObject* object, PaintInfo& paintinfo, NeedsGraphicsContextSave needsGraphicsContextSave = DontSaveGraphicsContext) 57 : m_renderingFlags(0) 58 , m_object(0) 59 , m_paintInfo(0) 60 , m_savedContext(0) 61 , m_filter(0) 62 { 63 prepareToRenderSVGContent(object, paintinfo, needsGraphicsContextSave); 64 } 65 66 // Automatically finishes context rendering. 67 ~SVGRenderingContext(); 68 69 // Used by all SVG renderers who apply clip/filter/etc. resources to the renderer content. 70 void prepareToRenderSVGContent(RenderObject*, PaintInfo&, NeedsGraphicsContextSave = DontSaveGraphicsContext); 71 bool isRenderingPrepared() const { return m_renderingFlags & RenderingPrepared; } 72 73 static bool createImageBuffer(const FloatRect& paintRect, const AffineTransform& absoluteTransform, OwnPtr<ImageBuffer>&, RenderingMode); 74 // Patterns need a different float-to-integer coordinate mapping. 75 static bool createImageBufferForPattern(const FloatRect& absoluteTargetRect, const FloatRect& clampedAbsoluteTargetRect, OwnPtr<ImageBuffer>&, RenderingMode); 76 77 static void renderSubtreeToImageBuffer(ImageBuffer*, RenderObject*, const AffineTransform&); 78 static void clipToImageBuffer(GraphicsContext*, const AffineTransform& absoluteTransform, const FloatRect& targetRect, OwnPtr<ImageBuffer>&, bool safeToClear); 79 80 static float calculateScreenFontSizeScalingFactor(const RenderObject*); 81 static void calculateTransformationToOutermostCoordinateSystem(const RenderObject*, AffineTransform& absoluteTransform); 82 static IntSize clampedAbsoluteSize(const IntSize&); 83 static FloatRect clampedAbsoluteTargetRect(const FloatRect& absoluteTargetRect); 84 static void clear2DRotation(AffineTransform&); 85 86 static IntRect calculateImageBufferRect(const FloatRect& targetRect, const AffineTransform& absoluteTransform) 87 { 88 return enclosingIntRect(absoluteTransform.mapRect(targetRect)); 89 } 90 91 // Support for the buffered-rendering hint. 92 bool bufferForeground(OwnPtr<ImageBuffer>&); 93 94 private: 95 // To properly revert partially successful initializtions in the destructor, we record all successful steps. 96 enum RenderingFlags { 97 RenderingPrepared = 1, 98 RestoreGraphicsContext = 1 << 1, 99 EndOpacityLayer = 1 << 2, 100 EndFilterLayer = 1 << 3, 101 PrepareToRenderSVGContentWasCalled = 1 << 4 102 }; 103 104 // List of those flags which require actions during the destructor. 105 const static int ActionsNeeded = RestoreGraphicsContext | EndOpacityLayer | EndFilterLayer; 106 107 int m_renderingFlags; 108 RenderObject* m_object; 109 PaintInfo* m_paintInfo; 110 GraphicsContext* m_savedContext; 111 IntRect m_savedPaintRect; 112 RenderSVGResourceFilter* m_filter; 113 }; 114 115 } // namespace WebCore 116 117 #endif // SVGRenderingContext_h 118