Home | History | Annotate | Download | only in svg
      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