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/rendering/PaintInfo.h"
     29 #include "core/rendering/svg/RenderSVGResourceClipper.h"
     30 #include "platform/graphics/ImageBuffer.h"
     31 
     32 namespace blink {
     33 
     34 class AffineTransform;
     35 class RenderObject;
     36 class FloatRect;
     37 class RenderSVGResourceFilter;
     38 class RenderSVGResourceMasker;
     39 
     40 // SVGRenderingContext
     41 class SVGRenderingContext {
     42 public:
     43     // Does not start rendering.
     44     SVGRenderingContext()
     45         : m_renderingFlags(0)
     46         , m_object(0)
     47         , m_paintInfo(0)
     48         , m_savedContext(0)
     49         , m_filter(0)
     50         , m_clipper(0)
     51         , m_clipperState(RenderSVGResourceClipper::ClipperNotApplied)
     52         , m_masker(0)
     53     {
     54     }
     55 
     56     SVGRenderingContext(RenderObject* object, PaintInfo& paintinfo)
     57         : m_renderingFlags(0)
     58         , m_object(0)
     59         , m_paintInfo(0)
     60         , m_savedContext(0)
     61         , m_filter(0)
     62         , m_clipper(0)
     63         , m_clipperState(RenderSVGResourceClipper::ClipperNotApplied)
     64         , m_masker(0)
     65     {
     66         prepareToRenderSVGContent(object, paintinfo);
     67     }
     68 
     69     // Automatically finishes context rendering.
     70     ~SVGRenderingContext();
     71 
     72     // Used by all SVG renderers who apply clip/filter/etc. resources to the renderer content.
     73     void prepareToRenderSVGContent(RenderObject*, PaintInfo&);
     74     bool isRenderingPrepared() const { return m_renderingFlags & RenderingPrepared; }
     75 
     76     static void renderSubtree(GraphicsContext*, RenderObject*, const AffineTransform&);
     77 
     78     static float calculateScreenFontSizeScalingFactor(const RenderObject*);
     79     static void calculateDeviceSpaceTransformation(const RenderObject*, AffineTransform& absoluteTransform);
     80     static FloatRect clampedAbsoluteTargetRect(const FloatRect& absoluteTargetRect);
     81     static void clear2DRotation(AffineTransform&);
     82 
     83     static IntRect calculateImageBufferRect(const FloatRect& targetRect, const AffineTransform& absoluteTransform)
     84     {
     85         return enclosingIntRect(absoluteTransform.mapRect(targetRect));
     86     }
     87 
     88     // Support for the buffered-rendering hint.
     89     bool bufferForeground(OwnPtr<ImageBuffer>&);
     90 
     91 private:
     92     // To properly revert partially successful initializtions in the destructor, we record all successful steps.
     93     enum RenderingFlags {
     94         RenderingPrepared = 1,
     95         RestoreGraphicsContext = 1 << 1,
     96         EndOpacityLayer = 1 << 2,
     97         PostApplyResources = 1 << 3,
     98         PrepareToRenderSVGContentWasCalled = 1 << 4
     99     };
    100 
    101     // List of those flags which require actions during the destructor.
    102     const static int ActionsNeeded = RestoreGraphicsContext | EndOpacityLayer | PostApplyResources;
    103 
    104     int m_renderingFlags;
    105     RenderObject* m_object;
    106     PaintInfo* m_paintInfo;
    107     GraphicsContext* m_savedContext;
    108     IntRect m_savedPaintRect;
    109     RenderSVGResourceFilter* m_filter;
    110     RenderSVGResourceClipper* m_clipper;
    111     RenderSVGResourceClipper::ClipperState m_clipperState;
    112     RenderSVGResourceMasker* m_masker;
    113 };
    114 
    115 } // namespace blink
    116 
    117 #endif // SVGRenderingContext_h
    118