15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org>
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  2004, 2005 Rob Buis <buis@kde.org>
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 2005, 2006 Apple Computer, Inc.
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) Research In Motion Limited 2010. All rights reserved.
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    This library is free software; you can redistribute it and/or
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    modify it under the terms of the GNU Library General Public
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    License as published by the Free Software Foundation; either
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    version 2 of the License, or (at your option) any later version.
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    This library is distributed in the hope that it will be useful,
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    but WITHOUT ANY WARRANTY; without even the implied warranty of
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Library General Public License for more details.
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    You should have received a copy of the GNU Library General Public License
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    along with this library; see the file COPYING.LIB.  If not, write to
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Boston, MA 02110-1301, USA.
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef SVGRenderStyle_h
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define SVGRenderStyle_h
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
26df95704c49daea886ddad70775bda23618d6274dBen Murdoch#include "bindings/v8/ExceptionStatePlaceholder.h"
2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSValueList.h"
2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/graphics/GraphicsTypes.h"
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/graphics/Path.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/style/DataRef.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/style/RenderStyleConstants.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/style/SVGRenderStyleDefs.h"
3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGPaint.h"
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class FloatRect;
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class IntRect;
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderObject;
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdochclass SVGRenderStyle : public RefCounted<SVGRenderStyle> {
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static PassRefPtr<SVGRenderStyle> create() { return adoptRef(new SVGRenderStyle); }
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<SVGRenderStyle> copy() const { return adoptRef(new SVGRenderStyle(*this));}
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ~SVGRenderStyle();
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool inheritedNotEqual(const SVGRenderStyle*) const;
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void inheritFrom(const SVGRenderStyle*);
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void copyNonInheritedFrom(const SVGRenderStyle*);
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StyleDifference diff(const SVGRenderStyle*) const;
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool operator==(const SVGRenderStyle&) const;
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool operator!=(const SVGRenderStyle& o) const { return !(*this == o); }
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Initial values for all the properties
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static EAlignmentBaseline initialAlignmentBaseline() { return AB_AUTO; }
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static EDominantBaseline initialDominantBaseline() { return DB_AUTO; }
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static EBaselineShift initialBaselineShift() { return BS_BASELINE; }
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static EVectorEffect initialVectorEffect() { return VE_NONE; }
6153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    static EBufferedRendering initialBufferedRendering() { return BR_AUTO; }
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static LineCap initialCapStyle() { return ButtCap; }
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static WindRule initialClipRule() { return RULE_NONZERO; }
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static EColorInterpolation initialColorInterpolation() { return CI_SRGB; }
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static EColorInterpolation initialColorInterpolationFilters() { return CI_LINEARRGB; }
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static EColorRendering initialColorRendering() { return CR_AUTO; }
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static WindRule initialFillRule() { return RULE_NONZERO; }
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static LineJoin initialJoinStyle() { return MiterJoin; }
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static EShapeRendering initialShapeRendering() { return SR_AUTO; }
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static ETextAnchor initialTextAnchor() { return TA_START; }
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static SVGWritingMode initialWritingMode() { return WM_LRTB; }
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static EGlyphOrientation initialGlyphOrientationHorizontal() { return GO_0DEG; }
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static EGlyphOrientation initialGlyphOrientationVertical() { return GO_AUTO; }
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static float initialFillOpacity() { return 1; }
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static SVGPaint::SVGPaintType initialFillPaintType() { return SVGPaint::SVG_PAINTTYPE_RGBCOLOR; }
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static Color initialFillPaintColor() { return Color::black; }
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static String initialFillPaintUri() { return String(); }
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static float initialStrokeOpacity() { return 1; }
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static SVGPaint::SVGPaintType initialStrokePaintType() { return SVGPaint::SVG_PAINTTYPE_NONE; }
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static Color initialStrokePaintColor() { return Color(); }
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static String initialStrokePaintUri() { return String(); }
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static Vector<SVGLength> initialStrokeDashArray() { return Vector<SVGLength>(); }
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static float initialStrokeMiterLimit() { return 4; }
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static float initialStopOpacity() { return 1; }
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static Color initialStopColor() { return Color(0, 0, 0); }
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static float initialFloodOpacity() { return 1; }
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static Color initialFloodColor() { return Color(0, 0, 0); }
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static Color initialLightingColor() { return Color(255, 255, 255); }
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static String initialClipperResource() { return String(); }
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static String initialFilterResource() { return String(); }
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static String initialMaskerResource() { return String(); }
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static String initialMarkerStartResource() { return String(); }
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static String initialMarkerMidResource() { return String(); }
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static String initialMarkerEndResource() { return String(); }
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static EMaskType initialMaskType() { return MT_LUMINANCE; }
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static SVGLength initialBaselineShiftValue()
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        SVGLength length;
1001fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        length.newValueSpecifiedUnits(LengthTypeNumber, 0, ASSERT_NO_EXCEPTION);
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return length;
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static SVGLength initialKerning()
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        SVGLength length;
1071fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        length.newValueSpecifiedUnits(LengthTypeNumber, 0, ASSERT_NO_EXCEPTION);
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return length;
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static SVGLength initialStrokeDashOffset()
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        SVGLength length;
1141fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        length.newValueSpecifiedUnits(LengthTypeNumber, 0, ASSERT_NO_EXCEPTION);
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return length;
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static SVGLength initialStrokeWidth()
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        SVGLength length;
1211fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        length.newValueSpecifiedUnits(LengthTypeNumber, 1, ASSERT_NO_EXCEPTION);
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return length;
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // SVG CSS Property setters
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setAlignmentBaseline(EAlignmentBaseline val) { svg_noninherited_flags.f._alignmentBaseline = val; }
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setDominantBaseline(EDominantBaseline val) { svg_noninherited_flags.f._dominantBaseline = val; }
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setBaselineShift(EBaselineShift val) { svg_noninherited_flags.f._baselineShift = val; }
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setVectorEffect(EVectorEffect val) { svg_noninherited_flags.f._vectorEffect = val; }
13053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    void setBufferedRendering(EBufferedRendering val) { svg_noninherited_flags.f.bufferedRendering = val; }
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setCapStyle(LineCap val) { svg_inherited_flags._capStyle = val; }
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setClipRule(WindRule val) { svg_inherited_flags._clipRule = val; }
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setColorInterpolation(EColorInterpolation val) { svg_inherited_flags._colorInterpolation = val; }
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setColorInterpolationFilters(EColorInterpolation val) { svg_inherited_flags._colorInterpolationFilters = val; }
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setColorRendering(EColorRendering val) { svg_inherited_flags._colorRendering = val; }
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setFillRule(WindRule val) { svg_inherited_flags._fillRule = val; }
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setJoinStyle(LineJoin val) { svg_inherited_flags._joinStyle = val; }
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setShapeRendering(EShapeRendering val) { svg_inherited_flags._shapeRendering = val; }
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setTextAnchor(ETextAnchor val) { svg_inherited_flags._textAnchor = val; }
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setWritingMode(SVGWritingMode val) { svg_inherited_flags._writingMode = val; }
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setGlyphOrientationHorizontal(EGlyphOrientation val) { svg_inherited_flags._glyphOrientationHorizontal = val; }
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setGlyphOrientationVertical(EGlyphOrientation val) { svg_inherited_flags._glyphOrientationVertical = val; }
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setMaskType(EMaskType val) { svg_noninherited_flags.f.maskType = val; }
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setFillOpacity(float obj)
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!(fill->opacity == obj))
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            fill.access()->opacity = obj;
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setFillPaint(SVGPaint::SVGPaintType type, const Color& color, const String& uri, bool applyToRegularStyle = true, bool applyToVisitedLinkStyle = false)
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (applyToRegularStyle) {
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!(fill->paintType == type))
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                fill.access()->paintType = type;
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!(fill->paintColor == color))
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                fill.access()->paintColor = color;
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!(fill->paintUri == uri))
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                fill.access()->paintUri = uri;
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (applyToVisitedLinkStyle) {
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!(fill->visitedLinkPaintType == type))
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                fill.access()->visitedLinkPaintType = type;
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!(fill->visitedLinkPaintColor == color))
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                fill.access()->visitedLinkPaintColor = color;
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!(fill->visitedLinkPaintUri == uri))
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                fill.access()->visitedLinkPaintUri = uri;
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setStrokeOpacity(float obj)
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!(stroke->opacity == obj))
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            stroke.access()->opacity = obj;
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setStrokePaint(SVGPaint::SVGPaintType type, const Color& color, const String& uri, bool applyToRegularStyle = true, bool applyToVisitedLinkStyle = false)
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (applyToRegularStyle) {
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!(stroke->paintType == type))
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                stroke.access()->paintType = type;
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!(stroke->paintColor == color))
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                stroke.access()->paintColor = color;
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!(stroke->paintUri == uri))
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                stroke.access()->paintUri = uri;
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (applyToVisitedLinkStyle) {
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!(stroke->visitedLinkPaintType == type))
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                stroke.access()->visitedLinkPaintType = type;
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!(stroke->visitedLinkPaintColor == color))
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                stroke.access()->visitedLinkPaintColor = color;
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!(stroke->visitedLinkPaintUri == uri))
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                stroke.access()->visitedLinkPaintUri = uri;
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setStrokeDashArray(const Vector<SVGLength>& obj)
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!(stroke->dashArray == obj))
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            stroke.access()->dashArray = obj;
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setStrokeMiterLimit(float obj)
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!(stroke->miterLimit == obj))
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            stroke.access()->miterLimit = obj;
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setStrokeWidth(const SVGLength& obj)
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!(stroke->width == obj))
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            stroke.access()->width = obj;
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setStrokeDashOffset(const SVGLength& obj)
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!(stroke->dashOffset == obj))
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            stroke.access()->dashOffset = obj;
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setKerning(const SVGLength& obj)
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!(text->kerning == obj))
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            text.access()->kerning = obj;
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setStopOpacity(float obj)
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!(stops->opacity == obj))
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            stops.access()->opacity = obj;
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setStopColor(const Color& obj)
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!(stops->color == obj))
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            stops.access()->color = obj;
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setFloodOpacity(float obj)
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!(misc->floodOpacity == obj))
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            misc.access()->floodOpacity = obj;
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setFloodColor(const Color& obj)
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!(misc->floodColor == obj))
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            misc.access()->floodColor = obj;
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setLightingColor(const Color& obj)
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!(misc->lightingColor == obj))
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            misc.access()->lightingColor = obj;
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setBaselineShiftValue(const SVGLength& obj)
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!(misc->baselineShiftValue == obj))
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            misc.access()->baselineShiftValue = obj;
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Setters for non-inherited resources
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setClipperResource(const String& obj)
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!(resources->clipper == obj))
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            resources.access()->clipper = obj;
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setFilterResource(const String& obj)
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!(resources->filter == obj))
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            resources.access()->filter = obj;
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setMaskerResource(const String& obj)
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!(resources->masker == obj))
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            resources.access()->masker = obj;
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Setters for inherited resources
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setMarkerStartResource(const String& obj)
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!(inheritedResources->markerStart == obj))
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            inheritedResources.access()->markerStart = obj;
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setMarkerMidResource(const String& obj)
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!(inheritedResources->markerMid == obj))
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            inheritedResources.access()->markerMid = obj;
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setMarkerEndResource(const String& obj)
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!(inheritedResources->markerEnd == obj))
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            inheritedResources.access()->markerEnd = obj;
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Read accessors for all the properties
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EAlignmentBaseline alignmentBaseline() const { return (EAlignmentBaseline) svg_noninherited_flags.f._alignmentBaseline; }
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EDominantBaseline dominantBaseline() const { return (EDominantBaseline) svg_noninherited_flags.f._dominantBaseline; }
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EBaselineShift baselineShift() const { return (EBaselineShift) svg_noninherited_flags.f._baselineShift; }
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EVectorEffect vectorEffect() const { return (EVectorEffect) svg_noninherited_flags.f._vectorEffect; }
30653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    EBufferedRendering bufferedRendering() const { return (EBufferedRendering) svg_noninherited_flags.f.bufferedRendering; }
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LineCap capStyle() const { return (LineCap) svg_inherited_flags._capStyle; }
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WindRule clipRule() const { return (WindRule) svg_inherited_flags._clipRule; }
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EColorInterpolation colorInterpolation() const { return (EColorInterpolation) svg_inherited_flags._colorInterpolation; }
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EColorInterpolation colorInterpolationFilters() const { return (EColorInterpolation) svg_inherited_flags._colorInterpolationFilters; }
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EColorRendering colorRendering() const { return (EColorRendering) svg_inherited_flags._colorRendering; }
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WindRule fillRule() const { return (WindRule) svg_inherited_flags._fillRule; }
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LineJoin joinStyle() const { return (LineJoin) svg_inherited_flags._joinStyle; }
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EShapeRendering shapeRendering() const { return (EShapeRendering) svg_inherited_flags._shapeRendering; }
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ETextAnchor textAnchor() const { return (ETextAnchor) svg_inherited_flags._textAnchor; }
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SVGWritingMode writingMode() const { return (SVGWritingMode) svg_inherited_flags._writingMode; }
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EGlyphOrientation glyphOrientationHorizontal() const { return (EGlyphOrientation) svg_inherited_flags._glyphOrientationHorizontal; }
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EGlyphOrientation glyphOrientationVertical() const { return (EGlyphOrientation) svg_inherited_flags._glyphOrientationVertical; }
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float fillOpacity() const { return fill->opacity; }
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const SVGPaint::SVGPaintType& fillPaintType() const { return fill->paintType; }
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Color& fillPaintColor() const { return fill->paintColor; }
32202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    const String& fillPaintUri() const { return fill->paintUri; }
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float strokeOpacity() const { return stroke->opacity; }
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const SVGPaint::SVGPaintType& strokePaintType() const { return stroke->paintType; }
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Color& strokePaintColor() const { return stroke->paintColor; }
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const String& strokePaintUri() const { return stroke->paintUri; }
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<SVGLength> strokeDashArray() const { return stroke->dashArray; }
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float strokeMiterLimit() const { return stroke->miterLimit; }
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SVGLength strokeWidth() const { return stroke->width; }
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SVGLength strokeDashOffset() const { return stroke->dashOffset; }
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SVGLength kerning() const { return text->kerning; }
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float stopOpacity() const { return stops->opacity; }
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Color& stopColor() const { return stops->color; }
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float floodOpacity() const { return misc->floodOpacity; }
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Color& floodColor() const { return misc->floodColor; }
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Color& lightingColor() const { return misc->lightingColor; }
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SVGLength baselineShiftValue() const { return misc->baselineShiftValue; }
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String clipperResource() const { return resources->clipper; }
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String filterResource() const { return resources->filter; }
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String maskerResource() const { return resources->masker; }
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String markerStartResource() const { return inheritedResources->markerStart; }
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String markerMidResource() const { return inheritedResources->markerMid; }
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String markerEndResource() const { return inheritedResources->markerEnd; }
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EMaskType maskType() const { return (EMaskType) svg_noninherited_flags.f.maskType; }
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const SVGPaint::SVGPaintType& visitedLinkFillPaintType() const { return fill->visitedLinkPaintType; }
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Color& visitedLinkFillPaintColor() const { return fill->visitedLinkPaintColor; }
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const String& visitedLinkFillPaintUri() const { return fill->visitedLinkPaintUri; }
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const SVGPaint::SVGPaintType& visitedLinkStrokePaintType() const { return stroke->visitedLinkPaintType; }
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Color& visitedLinkStrokePaintColor() const { return stroke->visitedLinkPaintColor; }
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const String& visitedLinkStrokePaintUri() const { return stroke->visitedLinkPaintUri; }
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // convenience
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasClipper() const { return !clipperResource().isEmpty(); }
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasMasker() const { return !maskerResource().isEmpty(); }
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasFilter() const { return !filterResource().isEmpty(); }
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasMarkers() const { return !markerStartResource().isEmpty() || !markerMidResource().isEmpty() || !markerEndResource().isEmpty(); }
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasStroke() const { return strokePaintType() != SVGPaint::SVG_PAINTTYPE_NONE; }
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasVisibleStroke() const { return hasStroke() && !strokeWidth().isZero(); }
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasFill() const { return fillPaintType() != SVGPaint::SVG_PAINTTYPE_NONE; }
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isVerticalWritingMode() const { return writingMode() == WM_TBRL || writingMode() == WM_TB; }
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // inherit
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    struct InheritedFlags {
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool operator==(const InheritedFlags& other) const
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return (_colorRendering == other._colorRendering)
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                && (_shapeRendering == other._shapeRendering)
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                && (_clipRule == other._clipRule)
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                && (_fillRule == other._fillRule)
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                && (_capStyle == other._capStyle)
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                && (_joinStyle == other._joinStyle)
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                && (_textAnchor == other._textAnchor)
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                && (_colorInterpolation == other._colorInterpolation)
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                && (_colorInterpolationFilters == other._colorInterpolationFilters)
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                && (_writingMode == other._writingMode)
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                && (_glyphOrientationHorizontal == other._glyphOrientationHorizontal)
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                && (_glyphOrientationVertical == other._glyphOrientationVertical);
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool operator!=(const InheritedFlags& other) const
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return !(*this == other);
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unsigned _colorRendering : 2; // EColorRendering
38802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        unsigned _shapeRendering : 2; // EShapeRendering
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unsigned _clipRule : 1; // WindRule
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unsigned _fillRule : 1; // WindRule
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unsigned _capStyle : 2; // LineCap
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unsigned _joinStyle : 2; // LineJoin
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unsigned _textAnchor : 2; // ETextAnchor
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unsigned _colorInterpolation : 2; // EColorInterpolation
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unsigned _colorInterpolationFilters : 2; // EColorInterpolation
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unsigned _writingMode : 3; // SVGWritingMode
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unsigned _glyphOrientationHorizontal : 3; // EGlyphOrientation
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        unsigned _glyphOrientationVertical : 3; // EGlyphOrientation
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } svg_inherited_flags;
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // don't inherit
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    struct NonInheritedFlags {
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // 32 bit non-inherited, don't add to the struct, or the operator will break.
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool operator==(const NonInheritedFlags &other) const { return _niflags == other._niflags; }
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool operator!=(const NonInheritedFlags &other) const { return _niflags != other._niflags; }
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        union {
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            struct {
40902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch                unsigned _alignmentBaseline : 4; // EAlignmentBaseline
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                unsigned _dominantBaseline : 4; // EDominantBaseline
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                unsigned _baselineShift : 2; // EBaselineShift
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                unsigned _vectorEffect: 1; // EVectorEffect
41353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                unsigned bufferedRendering: 2; // EBufferedRendering
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                unsigned maskType: 1; // EMaskType
41553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                // 18 bits unused
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            } f;
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            uint32_t _niflags;
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        };
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } svg_noninherited_flags;
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // inherited attributes
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DataRef<StyleFillData> fill;
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DataRef<StyleStrokeData> stroke;
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DataRef<StyleTextData> text;
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DataRef<StyleInheritedResourceData> inheritedResources;
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // non-inherited attributes
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DataRef<StyleStopData> stops;
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DataRef<StyleMiscData> misc;
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DataRef<StyleResourceData> resources;
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum CreateDefaultType { CreateDefault };
43402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SVGRenderStyle();
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SVGRenderStyle(const SVGRenderStyle&);
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SVGRenderStyle(CreateDefaultType); // Used to create the default style.
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setBitDefaults()
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svg_inherited_flags._clipRule = initialClipRule();
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svg_inherited_flags._colorRendering = initialColorRendering();
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svg_inherited_flags._fillRule = initialFillRule();
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svg_inherited_flags._shapeRendering = initialShapeRendering();
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svg_inherited_flags._textAnchor = initialTextAnchor();
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svg_inherited_flags._capStyle = initialCapStyle();
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svg_inherited_flags._joinStyle = initialJoinStyle();
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svg_inherited_flags._colorInterpolation = initialColorInterpolation();
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svg_inherited_flags._colorInterpolationFilters = initialColorInterpolationFilters();
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svg_inherited_flags._writingMode = initialWritingMode();
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svg_inherited_flags._glyphOrientationHorizontal = initialGlyphOrientationHorizontal();
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svg_inherited_flags._glyphOrientationVertical = initialGlyphOrientationVertical();
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svg_noninherited_flags._niflags = 0;
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svg_noninherited_flags.f._alignmentBaseline = initialAlignmentBaseline();
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svg_noninherited_flags.f._dominantBaseline = initialDominantBaseline();
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svg_noninherited_flags.f._baselineShift = initialBaselineShift();
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svg_noninherited_flags.f._vectorEffect = initialVectorEffect();
45953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        svg_noninherited_flags.f.bufferedRendering = initialBufferedRendering();
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svg_noninherited_flags.f.maskType = initialMaskType();
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // SVGRenderStyle_h
467