/* Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann 2004, 2005 Rob Buis Copyright (C) 2005, 2006 Apple Computer, Inc. Copyright (C) Research In Motion Limited 2010. All rights reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef SVGRenderStyle_h #define SVGRenderStyle_h #if ENABLE(SVG) #include "CSSValueList.h" #include "DataRef.h" #include "GraphicsTypes.h" #include "Path.h" #include "RenderStyleConstants.h" #include "SVGPaint.h" #include "SVGRenderStyleDefs.h" namespace WebCore { class FloatRect; class IntRect; class RenderObject; class SVGRenderStyle : public RefCounted { public: static PassRefPtr create() { return adoptRef(new SVGRenderStyle); } PassRefPtr copy() const { return adoptRef(new SVGRenderStyle(*this));} ~SVGRenderStyle(); bool inheritedNotEqual(const SVGRenderStyle*) const; void inheritFrom(const SVGRenderStyle*); // FIXME: These functions should move to ShadowData. void inflateForShadow(IntRect&) const; void inflateForShadow(FloatRect&) const; StyleDifference diff(const SVGRenderStyle*) const; bool operator==(const SVGRenderStyle&) const; bool operator!=(const SVGRenderStyle& o) const { return !(*this == o); } // Initial values for all the properties static EAlignmentBaseline initialAlignmentBaseline() { return AB_AUTO; } static EDominantBaseline initialDominantBaseline() { return DB_AUTO; } static EBaselineShift initialBaselineShift() { return BS_BASELINE; } static EVectorEffect initialVectorEffect() { return VE_NONE; } static LineCap initialCapStyle() { return ButtCap; } static WindRule initialClipRule() { return RULE_NONZERO; } static EColorInterpolation initialColorInterpolation() { return CI_SRGB; } static EColorInterpolation initialColorInterpolationFilters() { return CI_LINEARRGB; } static EColorRendering initialColorRendering() { return CR_AUTO; } static WindRule initialFillRule() { return RULE_NONZERO; } static EImageRendering initialImageRendering() { return IR_AUTO; } static LineJoin initialJoinStyle() { return MiterJoin; } static EShapeRendering initialShapeRendering() { return SR_AUTO; } static ETextAnchor initialTextAnchor() { return TA_START; } static EWritingMode initialWritingMode() { return WM_LRTB; } static EGlyphOrientation initialGlyphOrientationHorizontal() { return GO_0DEG; } static EGlyphOrientation initialGlyphOrientationVertical() { return GO_AUTO; } static float initialFillOpacity() { return 1.0f; } static SVGPaint* initialFillPaint() { return SVGPaint::defaultFill(); } static float initialStrokeOpacity() { return 1.0f; } static SVGPaint* initialStrokePaint() { return SVGPaint::defaultStroke(); } static CSSValueList* initialStrokeDashArray() { return 0; } static float initialStrokeMiterLimit() { return 4.0f; } static CSSValue* initialStrokeWidth() { return 0; } static CSSValue* initialStrokeDashOffset() { return 0; }; static CSSValue* initialKerning() { return 0; } static float initialStopOpacity() { return 1.0f; } static Color initialStopColor() { return Color(0, 0, 0); } static float initialFloodOpacity() { return 1.0f; } static Color initialFloodColor() { return Color(0, 0, 0); } static Color initialLightingColor() { return Color(255, 255, 255); } static CSSValue* initialBaselineShiftValue() { return 0; } static ShadowData* initialShadow() { return 0; } static String initialClipperResource() { return String(); } static String initialFilterResource() { return String(); } static String initialMaskerResource() { return String(); } static String initialMarkerStartResource() { return String(); } static String initialMarkerMidResource() { return String(); } static String initialMarkerEndResource() { return String(); } // SVG CSS Property setters void setAlignmentBaseline(EAlignmentBaseline val) { svg_noninherited_flags.f._alignmentBaseline = val; } void setDominantBaseline(EDominantBaseline val) { svg_noninherited_flags.f._dominantBaseline = val; } void setBaselineShift(EBaselineShift val) { svg_noninherited_flags.f._baselineShift = val; } void setVectorEffect(EVectorEffect val) { svg_noninherited_flags.f._vectorEffect = val; } void setCapStyle(LineCap val) { svg_inherited_flags._capStyle = val; } void setClipRule(WindRule val) { svg_inherited_flags._clipRule = val; } void setColorInterpolation(EColorInterpolation val) { svg_inherited_flags._colorInterpolation = val; } void setColorInterpolationFilters(EColorInterpolation val) { svg_inherited_flags._colorInterpolationFilters = val; } void setColorRendering(EColorRendering val) { svg_inherited_flags._colorRendering = val; } void setFillRule(WindRule val) { svg_inherited_flags._fillRule = val; } void setImageRendering(EImageRendering val) { svg_inherited_flags._imageRendering = val; } void setJoinStyle(LineJoin val) { svg_inherited_flags._joinStyle = val; } void setShapeRendering(EShapeRendering val) { svg_inherited_flags._shapeRendering = val; } void setTextAnchor(ETextAnchor val) { svg_inherited_flags._textAnchor = val; } void setWritingMode(EWritingMode val) { svg_inherited_flags._writingMode = val; } void setGlyphOrientationHorizontal(EGlyphOrientation val) { svg_inherited_flags._glyphOrientationHorizontal = val; } void setGlyphOrientationVertical(EGlyphOrientation val) { svg_inherited_flags._glyphOrientationVertical = val; } void setFillOpacity(float obj) { if (!(fill->opacity == obj)) fill.access()->opacity = obj; } void setFillPaint(PassRefPtr obj) { if (!(fill->paint == obj)) fill.access()->paint = obj; } void setStrokeOpacity(float obj) { if (!(stroke->opacity == obj)) stroke.access()->opacity = obj; } void setStrokePaint(PassRefPtr obj) { if (!(stroke->paint == obj)) stroke.access()->paint = obj; } void setStrokeDashArray(PassRefPtr obj) { if (!(stroke->dashArray == obj)) stroke.access()->dashArray = obj; } void setStrokeMiterLimit(float obj) { if (!(stroke->miterLimit == obj)) stroke.access()->miterLimit = obj; } void setStrokeWidth(PassRefPtr obj) { if (!(stroke->width == obj)) stroke.access()->width = obj; } void setStrokeDashOffset(PassRefPtr obj) { if (!(stroke->dashOffset == obj)) stroke.access()->dashOffset = obj; } void setKerning(PassRefPtr obj) { if (!(text->kerning == obj)) text.access()->kerning = obj; } void setStopOpacity(float obj) { if (!(stops->opacity == obj)) stops.access()->opacity = obj; } void setStopColor(Color obj) { if (!(stops->color == obj)) stops.access()->color = obj; } void setFloodOpacity(float obj) { if (!(misc->floodOpacity == obj)) misc.access()->floodOpacity = obj; } void setFloodColor(Color obj) { if (!(misc->floodColor == obj)) misc.access()->floodColor = obj; } void setLightingColor(Color obj) { if (!(misc->lightingColor == obj)) misc.access()->lightingColor = obj; } void setBaselineShiftValue(PassRefPtr obj) { if (!(misc->baselineShiftValue == obj)) misc.access()->baselineShiftValue = obj; } void setShadow(PassOwnPtr obj) { shadowSVG.access()->shadow = obj; } // Setters for non-inherited resources void setClipperResource(String obj) { if (!(resources->clipper == obj)) resources.access()->clipper = obj; } void setFilterResource(String obj) { if (!(resources->filter == obj)) resources.access()->filter = obj; } void setMaskerResource(String obj) { if (!(resources->masker == obj)) resources.access()->masker = obj; } // Setters for inherited resources void setMarkerStartResource(String obj) { if (!(inheritedResources->markerStart == obj)) inheritedResources.access()->markerStart = obj; } void setMarkerMidResource(String obj) { if (!(inheritedResources->markerMid == obj)) inheritedResources.access()->markerMid = obj; } void setMarkerEndResource(String obj) { if (!(inheritedResources->markerEnd == obj)) inheritedResources.access()->markerEnd = obj; } // Read accessors for all the properties EAlignmentBaseline alignmentBaseline() const { return (EAlignmentBaseline) svg_noninherited_flags.f._alignmentBaseline; } EDominantBaseline dominantBaseline() const { return (EDominantBaseline) svg_noninherited_flags.f._dominantBaseline; } EBaselineShift baselineShift() const { return (EBaselineShift) svg_noninherited_flags.f._baselineShift; } EVectorEffect vectorEffect() const { return (EVectorEffect) svg_noninherited_flags.f._vectorEffect; } LineCap capStyle() const { return (LineCap) svg_inherited_flags._capStyle; } WindRule clipRule() const { return (WindRule) svg_inherited_flags._clipRule; } EColorInterpolation colorInterpolation() const { return (EColorInterpolation) svg_inherited_flags._colorInterpolation; } EColorInterpolation colorInterpolationFilters() const { return (EColorInterpolation) svg_inherited_flags._colorInterpolationFilters; } EColorRendering colorRendering() const { return (EColorRendering) svg_inherited_flags._colorRendering; } WindRule fillRule() const { return (WindRule) svg_inherited_flags._fillRule; } EImageRendering imageRendering() const { return (EImageRendering) svg_inherited_flags._imageRendering; } LineJoin joinStyle() const { return (LineJoin) svg_inherited_flags._joinStyle; } EShapeRendering shapeRendering() const { return (EShapeRendering) svg_inherited_flags._shapeRendering; } ETextAnchor textAnchor() const { return (ETextAnchor) svg_inherited_flags._textAnchor; } EWritingMode writingMode() const { return (EWritingMode) svg_inherited_flags._writingMode; } EGlyphOrientation glyphOrientationHorizontal() const { return (EGlyphOrientation) svg_inherited_flags._glyphOrientationHorizontal; } EGlyphOrientation glyphOrientationVertical() const { return (EGlyphOrientation) svg_inherited_flags._glyphOrientationVertical; } float fillOpacity() const { return fill->opacity; } SVGPaint* fillPaint() const { return fill->paint.get(); } float strokeOpacity() const { return stroke->opacity; } SVGPaint* strokePaint() const { return stroke->paint.get(); } CSSValueList* strokeDashArray() const { return stroke->dashArray.get(); } float strokeMiterLimit() const { return stroke->miterLimit; } CSSValue* strokeWidth() const { return stroke->width.get(); } CSSValue* strokeDashOffset() const { return stroke->dashOffset.get(); } CSSValue* kerning() const { return text->kerning.get(); } float stopOpacity() const { return stops->opacity; } Color stopColor() const { return stops->color; } float floodOpacity() const { return misc->floodOpacity; } Color floodColor() const { return misc->floodColor; } Color lightingColor() const { return misc->lightingColor; } CSSValue* baselineShiftValue() const { return misc->baselineShiftValue.get(); } ShadowData* shadow() const { return shadowSVG->shadow.get(); } String clipperResource() const { return resources->clipper; } String filterResource() const { return resources->filter; } String maskerResource() const { return resources->masker; } String markerStartResource() const { return inheritedResources->markerStart; } String markerMidResource() const { return inheritedResources->markerMid; } String markerEndResource() const { return inheritedResources->markerEnd; } // convenience bool hasClipper() const { return !clipperResource().isEmpty(); } bool hasMasker() const { return !maskerResource().isEmpty(); } bool hasFilter() const { return !filterResource().isEmpty(); } bool hasMarkers() const { return !markerStartResource().isEmpty() || !markerMidResource().isEmpty() || !markerEndResource().isEmpty(); } bool hasStroke() const { return strokePaint()->paintType() != SVGPaint::SVG_PAINTTYPE_NONE; } bool hasFill() const { return fillPaint()->paintType() != SVGPaint::SVG_PAINTTYPE_NONE; } static float cssPrimitiveToLength(const RenderObject*, CSSValue*, float defaultValue = 0.0f); protected: // inherit struct InheritedFlags { bool operator==(const InheritedFlags& other) const { return (_colorRendering == other._colorRendering) && (_imageRendering == other._imageRendering) && (_shapeRendering == other._shapeRendering) && (_clipRule == other._clipRule) && (_fillRule == other._fillRule) && (_capStyle == other._capStyle) && (_joinStyle == other._joinStyle) && (_textAnchor == other._textAnchor) && (_colorInterpolation == other._colorInterpolation) && (_colorInterpolationFilters == other._colorInterpolationFilters) && (_writingMode == other._writingMode) && (_glyphOrientationHorizontal == other._glyphOrientationHorizontal) && (_glyphOrientationVertical == other._glyphOrientationVertical); } bool operator!=(const InheritedFlags& other) const { return !(*this == other); } unsigned _colorRendering : 2; // EColorRendering unsigned _imageRendering : 2; // EImageRendering unsigned _shapeRendering : 2; // EShapeRendering unsigned _clipRule : 1; // WindRule unsigned _fillRule : 1; // WindRule unsigned _capStyle : 2; // LineCap unsigned _joinStyle : 2; // LineJoin unsigned _textAnchor : 2; // ETextAnchor unsigned _colorInterpolation : 2; // EColorInterpolation unsigned _colorInterpolationFilters : 2; // EColorInterpolation unsigned _writingMode : 3; // EWritingMode unsigned _glyphOrientationHorizontal : 3; // EGlyphOrientation unsigned _glyphOrientationVertical : 3; // EGlyphOrientation } svg_inherited_flags; // don't inherit struct NonInheritedFlags { // 32 bit non-inherited, don't add to the struct, or the operator will break. bool operator==(const NonInheritedFlags &other) const { return _niflags == other._niflags; } bool operator!=(const NonInheritedFlags &other) const { return _niflags != other._niflags; } union { struct { unsigned _alignmentBaseline : 4; // EAlignmentBaseline unsigned _dominantBaseline : 4; // EDominantBaseline unsigned _baselineShift : 2; // EBaselineShift unsigned _vectorEffect: 1; // EVectorEffect // 21 bits unused } f; uint32_t _niflags; }; } svg_noninherited_flags; // inherited attributes DataRef fill; DataRef stroke; DataRef text; DataRef inheritedResources; // non-inherited attributes DataRef stops; DataRef misc; DataRef shadowSVG; DataRef resources; private: enum CreateDefaultType { CreateDefault }; SVGRenderStyle(); SVGRenderStyle(const SVGRenderStyle&); SVGRenderStyle(CreateDefaultType); // Used to create the default style. void setBitDefaults() { svg_inherited_flags._clipRule = initialClipRule(); svg_inherited_flags._colorRendering = initialColorRendering(); svg_inherited_flags._fillRule = initialFillRule(); svg_inherited_flags._imageRendering = initialImageRendering(); svg_inherited_flags._shapeRendering = initialShapeRendering(); svg_inherited_flags._textAnchor = initialTextAnchor(); svg_inherited_flags._capStyle = initialCapStyle(); svg_inherited_flags._joinStyle = initialJoinStyle(); svg_inherited_flags._colorInterpolation = initialColorInterpolation(); svg_inherited_flags._colorInterpolationFilters = initialColorInterpolationFilters(); svg_inherited_flags._writingMode = initialWritingMode(); svg_inherited_flags._glyphOrientationHorizontal = initialGlyphOrientationHorizontal(); svg_inherited_flags._glyphOrientationVertical = initialGlyphOrientationVertical(); svg_noninherited_flags._niflags = 0; svg_noninherited_flags.f._alignmentBaseline = initialAlignmentBaseline(); svg_noninherited_flags.f._dominantBaseline = initialDominantBaseline(); svg_noninherited_flags.f._baselineShift = initialBaselineShift(); svg_noninherited_flags.f._vectorEffect = initialVectorEffect(); } }; } // namespace WebCore #endif // ENABLE(SVG) #endif // SVGRenderStyle_h