| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| #ifndef INCLUDED_SVGIO_SVGREADER_SVGSTYLEATTRIBUTES_HXX |
| #define INCLUDED_SVGIO_SVGREADER_SVGSTYLEATTRIBUTES_HXX |
| |
| #include <svgio/svgiodllapi.h> |
| #include <svgio/svgreader/svgpaint.hxx> |
| #include <svgio/svgreader/svgnode.hxx> |
| #include <vcl/vclenum.hxx> |
| #include <basegfx/polygon/b2dpolypolygontools.hxx> |
| |
| ////////////////////////////////////////////////////////////////////////////// |
| // predefines |
| |
| namespace svgio { namespace svgreader { |
| class SvgGradientNode; |
| class SvgPatternNode; |
| class SvgMarkerNode; |
| }} |
| |
| ////////////////////////////////////////////////////////////////////////////// |
| |
| namespace svgio |
| { |
| namespace svgreader |
| { |
| enum StrokeLinecap |
| { |
| StrokeLinecap_notset, |
| StrokeLinecap_butt, |
| StrokeLinecap_round, |
| StrokeLinecap_square |
| }; |
| |
| enum StrokeLinejoin |
| { |
| StrokeLinejoin_notset, |
| StrokeLinejoin_miter, |
| StrokeLinejoin_round, |
| StrokeLinejoin_bevel |
| }; |
| |
| enum FontStretch |
| { |
| FontStretch_notset, |
| FontStretch_normal, |
| FontStretch_wider, |
| FontStretch_narrower, |
| FontStretch_ultra_condensed, |
| FontStretch_extra_condensed, |
| FontStretch_condensed, |
| FontStretch_semi_condensed, |
| FontStretch_semi_expanded, |
| FontStretch_expanded, |
| FontStretch_extra_expanded, |
| FontStretch_ultra_expanded |
| }; |
| |
| FontStretch getWider(FontStretch aSource); |
| FontStretch getNarrower(FontStretch aSource); |
| |
| enum FontStyle |
| { |
| FontStyle_notset, |
| FontStyle_normal, |
| FontStyle_italic, |
| FontStyle_oblique |
| }; |
| |
| enum FontVariant |
| { |
| FontVariant_notset, |
| FontVariant_normal, |
| FontVariant_small_caps |
| }; |
| |
| enum FontWeight |
| { |
| FontWeight_notset, |
| FontWeight_100, |
| FontWeight_200, |
| FontWeight_300, |
| FontWeight_400, // same as FontWeight_normal |
| FontWeight_500, |
| FontWeight_600, |
| FontWeight_700, // same as FontWeight_bold |
| FontWeight_800, |
| FontWeight_900, |
| FontWeight_bolder, |
| FontWeight_lighter, |
| }; |
| |
| FontWeight getBolder(FontWeight aSource); |
| FontWeight getLighter(FontWeight aSource); |
| ::FontWeight getVclFontWeight(FontWeight aSource); |
| |
| enum TextAlign |
| { |
| TextAlign_notset, |
| TextAlign_left, |
| TextAlign_right, |
| TextAlign_center, |
| TextAlign_justify |
| }; |
| |
| enum TextDecoration |
| { |
| TextDecoration_notset, |
| TextDecoration_none, |
| TextDecoration_underline, |
| TextDecoration_overline, |
| TextDecoration_line_through, |
| TextDecoration_blink |
| }; |
| |
| enum TextAnchor |
| { |
| TextAnchor_notset, |
| TextAnchor_start, |
| TextAnchor_middle, |
| TextAnchor_end |
| }; |
| |
| enum FillRule |
| { |
| FillRule_notset, |
| FillRule_nonzero, |
| FillRule_evenodd |
| }; |
| |
| enum BaselineShift |
| { |
| BaselineShift_Baseline, |
| BaselineShift_Sub, |
| BaselineShift_Super, |
| BaselineShift_Percentage, |
| BaselineShift_Length |
| }; |
| |
| class SvgStyleAttributes |
| { |
| private: |
| SvgNode& mrOwner; |
| const SvgStyleAttributes* mpCssStyleParent; |
| SvgPaint maFill; |
| SvgPaint maStroke; |
| SvgPaint maStopColor; |
| SvgNumber maStrokeWidth; |
| SvgNumber maStopOpacity; |
| const SvgGradientNode* mpSvgGradientNodeFill; |
| const SvgGradientNode* mpSvgGradientNodeStroke; |
| const SvgPatternNode* mpSvgPatternNodeFill; |
| const SvgPatternNode* mpSvgPatternNodeStroke; |
| SvgNumber maFillOpacity; |
| SvgNumberVector maStrokeDasharray; |
| SvgNumber maStrokeDashOffset; |
| StrokeLinecap maStrokeLinecap; |
| StrokeLinejoin maStrokeLinejoin; |
| SvgNumber maStrokeMiterLimit; |
| SvgNumber maStrokeOpacity; |
| SvgStringVector maFontFamily; |
| SvgNumber maFontSize; |
| FontStretch maFontStretch; |
| FontStyle maFontStyle; |
| FontVariant maFontVariant; |
| FontWeight maFontWeight; |
| TextAlign maTextAlign; |
| TextDecoration maTextDecoration; |
| TextAnchor maTextAnchor; |
| SvgPaint maColor; |
| SvgNumber maOpacity; |
| rtl::OUString maTitle; |
| rtl::OUString maDesc; |
| |
| /// link to content. If set, the node can be fetched on demand |
| rtl::OUString maClipPathXLink; |
| rtl::OUString maMaskXLink; |
| |
| /// link to markers. If set, the node can be fetched on demand |
| rtl::OUString maMarkerStartXLink; |
| const SvgMarkerNode* mpMarkerStartXLink; |
| rtl::OUString maMarkerMidXLink; |
| const SvgMarkerNode* mpMarkerMidXLink; |
| rtl::OUString maMarkerEndXLink; |
| const SvgMarkerNode* mpMarkerEndXLink; |
| |
| /// fill rule |
| FillRule maFillRule; |
| |
| // ClipRule setting (only valid wne mbIsClipPathContent == true, default is FillRule_nonzero) |
| FillRule maClipRule; |
| |
| // BaselineShift: Type and number (in case of BaselineShift_Percentage or BaselineShift_Length) |
| BaselineShift maBaselineShift; |
| SvgNumber maBaselineShiftNumber; |
| |
| /// bitfield |
| |
| // defines if this attributes are part of a ClipPath. If yes, |
| // rough geometry will be created on decomposition by patching |
| // vaules for fill, stroke, strokeWidth and others |
| bool mbIsClipPathContent : 1; |
| |
| // #121221# Defines if evtl. an empty array *is* set |
| bool mbStrokeDasharraySet : 1; |
| |
| /// internal helpers |
| void add_fillGradient( |
| const basegfx::B2DPolyPolygon& rPath, |
| drawinglayer::primitive2d::Primitive2DSequence& rTarget, |
| const SvgGradientNode& rFillGradient, |
| const basegfx::B2DRange& rGeoRange) const; |
| void add_fillPatternTransform( |
| const basegfx::B2DPolyPolygon& rPath, |
| drawinglayer::primitive2d::Primitive2DSequence& rTarget, |
| const SvgPatternNode& rFillGradient, |
| const basegfx::B2DRange& rGeoRange) const; |
| void add_fillPattern( |
| const basegfx::B2DPolyPolygon& rPath, |
| drawinglayer::primitive2d::Primitive2DSequence& rTarget, |
| const SvgPatternNode& rFillGradient, |
| const basegfx::B2DRange& rGeoRange) const; |
| void add_fill( |
| const basegfx::B2DPolyPolygon& rPath, |
| drawinglayer::primitive2d::Primitive2DSequence& rTarget, |
| const basegfx::B2DRange& rGeoRange) const; |
| void add_stroke( |
| const basegfx::B2DPolyPolygon& rPath, |
| drawinglayer::primitive2d::Primitive2DSequence& rTarget, |
| const basegfx::B2DRange& rGeoRange) const; |
| bool prepare_singleMarker( |
| drawinglayer::primitive2d::Primitive2DSequence& rMarkerPrimitives, |
| basegfx::B2DHomMatrix& rMarkerTransform, |
| basegfx::B2DRange& rClipRange, |
| const SvgMarkerNode& rMarker) const; |
| void add_markers( |
| const basegfx::B2DPolyPolygon& rPath, |
| drawinglayer::primitive2d::Primitive2DSequence& rTarget, |
| const basegfx::tools::PointIndexSet* pHelpPointIndices) const; |
| |
| public: |
| /// local attribute scanner |
| void parseStyleAttribute(const rtl::OUString& rTokenName, SVGToken aSVGToken, const rtl::OUString& aContent); |
| |
| /// helper which does the necessary with a given path |
| void add_text( |
| drawinglayer::primitive2d::Primitive2DSequence& rTarget, |
| drawinglayer::primitive2d::Primitive2DSequence& rSource) const; |
| void add_path( |
| const basegfx::B2DPolyPolygon& rPath, |
| drawinglayer::primitive2d::Primitive2DSequence& rTarget, |
| const basegfx::tools::PointIndexSet* pHelpPointIndices) const; |
| void add_postProcess( |
| drawinglayer::primitive2d::Primitive2DSequence& rTarget, |
| const drawinglayer::primitive2d::Primitive2DSequence& rSource, |
| const basegfx::B2DHomMatrix* pTransform) const; |
| |
| /// helper to set mpCssStyleParent temporarily for CSS style hierarchies |
| void setCssStyleParent(const SvgStyleAttributes* pNew) { mpCssStyleParent = pNew; } |
| const SvgStyleAttributes* getCssStyleParent() const { return mpCssStyleParent; } |
| |
| /// scan helpers |
| void readStyle(const rtl::OUString& rCandidate); |
| const SvgStyleAttributes* getParentStyle() const; |
| |
| SvgStyleAttributes(SvgNode& rOwner); |
| ~SvgStyleAttributes(); |
| |
| /// fill content |
| bool isFillSet() const; // #125258# ask if fill is a direct hard attribute (no hierarchy) |
| const basegfx::BColor* getFill() const; |
| void setFill(const SvgPaint& rFill) { maFill = rFill; } |
| |
| /// stroke content |
| const basegfx::BColor* getStroke() const; |
| void setStroke(const SvgPaint& rStroke) { maStroke = rStroke; } |
| |
| /// stop color content |
| const basegfx::BColor& getStopColor() const; |
| void setStopColor(const SvgPaint& rStopColor) { maStopColor = rStopColor; } |
| |
| /// stroke-width content |
| SvgNumber getStrokeWidth() const; |
| void setStrokeWidth(const SvgNumber& rStrokeWidth = SvgNumber()) { maStrokeWidth = rStrokeWidth; } |
| |
| /// stop opacity content |
| SvgNumber getStopOpacity() const; |
| void setStopOpacity(const SvgNumber& rStopOpacity = SvgNumber()) { maStopOpacity = rStopOpacity; } |
| |
| /// access to evtl. set fill gradient |
| const SvgGradientNode* getSvgGradientNodeFill() const; |
| void setSvgGradientNodeFill(const SvgGradientNode* pNew) { mpSvgGradientNodeFill = pNew; } |
| |
| /// access to evtl. set fill pattern |
| const SvgPatternNode* getSvgPatternNodeFill() const; |
| void setSvgPatternNodeFill(const SvgPatternNode* pNew) { mpSvgPatternNodeFill = pNew; } |
| |
| /// access to evtl. set stroke gradient |
| const SvgGradientNode* getSvgGradientNodeStroke() const; |
| void setSvgGradientNodeStroke(const SvgGradientNode* pNew) { mpSvgGradientNodeStroke = pNew; } |
| |
| /// access to evtl. set stroke pattern |
| const SvgPatternNode* getSvgPatternNodeStroke() const; |
| void setSvgPatternNodeStroke(const SvgPatternNode* pNew) { mpSvgPatternNodeStroke = pNew; } |
| |
| /// fill opacity content |
| SvgNumber getFillOpacity() const; |
| void setFillOpacity(const SvgNumber& rFillOpacity = SvgNumber()) { maFillOpacity = rFillOpacity; } |
| |
| /// fill rule content |
| FillRule getFillRule() const; |
| void setFillRule(const FillRule aFillRule = FillRule_notset) { maFillRule = aFillRule; } |
| |
| /// fill StrokeDasharray content |
| const SvgNumberVector& getStrokeDasharray() const; |
| void setStrokeDasharray(const SvgNumberVector& rStrokeDasharray = SvgNumberVector()) { maStrokeDasharray = rStrokeDasharray; } |
| |
| /// #121221# StrokeDasharray needs a set state, it *may* be set to empty by purpose |
| bool getStrokeDasharraySet() const { return mbStrokeDasharraySet; } |
| void setStrokeDasharraySet(bool bNew) { mbStrokeDasharraySet = bNew; } |
| |
| /// StrokeDashOffset content |
| SvgNumber getStrokeDashOffset() const; |
| void setStrokeDashOffset(const SvgNumber& rStrokeDashOffset = SvgNumber()) { maStrokeDashOffset = rStrokeDashOffset; } |
| |
| /// StrokeLinecap content |
| StrokeLinecap getStrokeLinecap() const; |
| void setStrokeLinecap(const StrokeLinecap aStrokeLinecap = StrokeLinecap_notset) { maStrokeLinecap = aStrokeLinecap; } |
| |
| /// StrokeLinejoin content |
| StrokeLinejoin getStrokeLinejoin() const; |
| void setStrokeLinejoin(const StrokeLinejoin aStrokeLinejoin = StrokeLinejoin_notset) { maStrokeLinejoin = aStrokeLinejoin; } |
| |
| /// StrokeMiterLimit content |
| SvgNumber getStrokeMiterLimit() const; |
| void setStrokeMiterLimit(const SvgNumber& rStrokeMiterLimit = SvgNumber()) { maStrokeMiterLimit = rStrokeMiterLimit; } |
| |
| /// StrokeOpacity content |
| SvgNumber getStrokeOpacity() const; |
| void setStrokeOpacity(const SvgNumber& rStrokeOpacity = SvgNumber()) { maStrokeOpacity = rStrokeOpacity; } |
| |
| /// Font content |
| const SvgStringVector& getFontFamily() const; |
| void setFontFamily(const SvgStringVector& rSvgStringVector = SvgStringVector()) { maFontFamily = rSvgStringVector; } |
| |
| /// FontSize content |
| SvgNumber getFontSize() const; |
| void setFontSize(const SvgNumber& rFontSize = SvgNumber()) { maFontSize = rFontSize; } |
| |
| /// FontStretch content |
| FontStretch getFontStretch() const; |
| void setFontStretch(const FontStretch aFontStretch = FontStretch_notset) { maFontStretch = aFontStretch; } |
| |
| /// FontStyle content |
| FontStyle getFontStyle() const; |
| void setFontStyle(const FontStyle aFontStyle = FontStyle_notset) { maFontStyle = aFontStyle; } |
| |
| /// FontVariant content |
| FontVariant getFontVariant() const; |
| void setFontVariant(const FontVariant aFontVariant = FontVariant_notset) { maFontVariant = aFontVariant; } |
| |
| /// FontWeight content |
| FontWeight getFontWeight() const; |
| void setFontWeight(const FontWeight aFontWeight = FontWeight_notset) { maFontWeight = aFontWeight; } |
| |
| /// TextAlign content |
| TextAlign getTextAlign() const; |
| void setTextAlign(const TextAlign aTextAlign = TextAlign_notset) { maTextAlign = aTextAlign; } |
| |
| /// TextDecoration content |
| const SvgStyleAttributes* getTextDecorationDefiningSvgStyleAttributes() const; |
| TextDecoration getTextDecoration() const; |
| void setTextDecoration(const TextDecoration aTextDecoration = TextDecoration_notset) { maTextDecoration = aTextDecoration; } |
| |
| /// TextAnchor content |
| TextAnchor getTextAnchor() const; |
| void setTextAnchor(const TextAnchor aTextAnchor = TextAnchor_notset) { maTextAnchor = aTextAnchor; } |
| |
| /// Color content |
| const basegfx::BColor* getColor() const; |
| void setColor(const SvgPaint& rColor) { maColor = rColor; } |
| |
| /// Opacity content |
| SvgNumber getOpacity() const { return maOpacity; } |
| void setOpacity(const SvgNumber& rOpacity = SvgNumber()) { maOpacity = rOpacity; } |
| |
| // Title content |
| const rtl::OUString& getTitle() const { return maTitle; } |
| void setTitle(const rtl::OUString& rNew) { maTitle = rNew; } |
| |
| // Desc content |
| const rtl::OUString& getDesc() const { return maDesc; } |
| void setDesc(const rtl::OUString& rNew) { maDesc = rNew; } |
| |
| // ClipPathXLink content |
| const rtl::OUString& getClipPathXLink() const { return maClipPathXLink; } |
| void setClipPathXLink(const rtl::OUString& rNew) { maClipPathXLink = rNew; } |
| |
| // MaskXLink content |
| const rtl::OUString& getMaskXLink() const { return maMaskXLink; } |
| void setMaskXLink(const rtl::OUString& rNew) { maMaskXLink = rNew; } |
| |
| // MarkerStartXLink content |
| rtl::OUString getMarkerStartXLink() const; |
| const SvgMarkerNode* accessMarkerStartXLink() const; |
| void setMarkerStartXLink(const rtl::OUString& rNew) { maMarkerStartXLink = rNew; } |
| |
| // MarkerMidXLink content |
| rtl::OUString getMarkerMidXLink() const; |
| const SvgMarkerNode* accessMarkerMidXLink() const; |
| void setMarkerMidXLink(const rtl::OUString& rNew) { maMarkerMidXLink = rNew; } |
| |
| // MarkerEndXLink content |
| rtl::OUString getMarkerEndXLink() const; |
| const SvgMarkerNode* accessMarkerEndXLink() const; |
| void setMarkerEndXLink(const rtl::OUString& rNew) { maMarkerEndXLink = rNew; } |
| |
| // BaselineShift |
| void setBaselineShift(const BaselineShift aBaselineShift = BaselineShift_Baseline) { maBaselineShift = aBaselineShift; } |
| BaselineShift getBaselineShift() const { return maBaselineShift; } |
| void setBaselineShiftNumber(const SvgNumber& rBaselineShift = SvgNumber()) { maBaselineShiftNumber = rBaselineShift; } |
| SvgNumber getBaselineShiftNumber() const; |
| }; |
| } // end of namespace svgreader |
| } // end of namespace svgio |
| |
| ////////////////////////////////////////////////////////////////////////////// |
| |
| #endif //INCLUDED_SVGIO_SVGREADER_SVGSTYLEATTRIBUTES_HXX |
| |
| // eof |