diff options
author | Xisco Fauli <anistenis@gmail.com> | 2016-01-17 19:17:46 +0100 |
---|---|---|
committer | Armin Le Grand <Armin.Le.Grand@cib.de> | 2016-01-20 13:10:42 +0000 |
commit | 406cdc29039e5e65bacfcd635de8022642d63547 (patch) | |
tree | d04d5bb713c4fa4297bd7378ea82b67a54c8c06f | |
parent | ab6f80909877f1e14de252c456dd2acd84c43974 (diff) |
SVGIO: Add support to font-size keywords
Similar to 0cae9c32ce9884a9809e220ba80b7c4cb4059565
Change-Id: Iac7a6bb30b36e51ea67a6c4f7b3421f480eeea57
Reviewed-on: https://gerrit.libreoffice.org/21542
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Armin Le Grand <Armin.Le.Grand@cib.de>
-rw-r--r-- | svgio/inc/svgio/svgreader/svgstyleattributes.hxx | 23 | ||||
-rw-r--r-- | svgio/source/svgreader/svgcharacternode.cxx | 4 | ||||
-rw-r--r-- | svgio/source/svgreader/svgnode.cxx | 4 | ||||
-rw-r--r-- | svgio/source/svgreader/svgstyleattributes.cxx | 129 |
4 files changed, 140 insertions, 20 deletions
diff --git a/svgio/inc/svgio/svgreader/svgstyleattributes.hxx b/svgio/inc/svgio/svgreader/svgstyleattributes.hxx index c227986b7d35..02cf55dd0252 100644 --- a/svgio/inc/svgio/svgreader/svgstyleattributes.hxx +++ b/svgio/inc/svgio/svgreader/svgstyleattributes.hxx @@ -56,6 +56,21 @@ namespace svgio StrokeLinejoin_bevel }; + enum FontSize + { + FontSize_notset, + FontSize_xx_small, + FontSize_x_small, + FontSize_small, + FontSize_smaller, + FontSize_medium, + FontSize_large, + FontSize_larger, + FontSize_x_large, + FontSize_xx_large, + FontSize_initial + }; + enum FontStretch { FontStretch_notset, @@ -183,7 +198,8 @@ namespace svgio SvgNumber maStrokeMiterLimit; SvgNumber maStrokeOpacity; SvgStringVector maFontFamily; - SvgNumber maFontSize; + FontSize maFontSize; + SvgNumber maFontSizeNumber; FontStretch maFontStretch; FontStyle maFontStyle; FontVariant maFontVariant; @@ -369,8 +385,9 @@ namespace svgio void setFontFamily(const SvgStringVector& rSvgStringVector = SvgStringVector()) { maFontFamily = rSvgStringVector; } /// FontSize content - SvgNumber getFontSize() const; - void setFontSize(const SvgNumber& rFontSize = SvgNumber()) { maFontSize = rFontSize; } + void setFontSize(const FontSize aFontSize = FontSize_notset) { maFontSize = aFontSize; } + void setFontSizeNumber(const SvgNumber& rFontSize = SvgNumber()) { maFontSizeNumber = rFontSize; } + SvgNumber getFontSizeNumber() const; /// FontStretch content FontStretch getFontStretch() const; diff --git a/svgio/source/svgreader/svgcharacternode.cxx b/svgio/source/svgreader/svgcharacternode.cxx index 9cc4c23aef4b..e5bc0a5cb95c 100644 --- a/svgio/source/svgreader/svgcharacternode.cxx +++ b/svgio/source/svgreader/svgcharacternode.cxx @@ -272,8 +272,8 @@ namespace svgio bRTL, bBiDiStrong); - // prepare FontSize - double fFontWidth(rSvgStyleAttributes.getFontSize().solve(*this)); + // prepare FontSizeNumber + double fFontWidth(rSvgStyleAttributes.getFontSizeNumber().solve(*this)); double fFontHeight(fFontWidth); // prepare locale diff --git a/svgio/source/svgreader/svgnode.cxx b/svgio/source/svgreader/svgnode.cxx index 4e90d511d910..b1de51d263fa 100644 --- a/svgio/source/svgreader/svgnode.cxx +++ b/svgio/source/svgreader/svgnode.cxx @@ -624,7 +624,7 @@ namespace svgio double SvgNode::getCurrentFontSize() const { if(getSvgStyleAttributes()) - return getSvgStyleAttributes()->getFontSize().solve(*this, xcoordinate); + return getSvgStyleAttributes()->getFontSizeNumber().solve(*this, xcoordinate); return getCurrentFontSizeInherited(); } @@ -645,7 +645,7 @@ namespace svgio { if(getSvgStyleAttributes()) // for XHeight, use FontSize currently - return getSvgStyleAttributes()->getFontSize().solve(*this, ycoordinate); + return getSvgStyleAttributes()->getFontSizeNumber().solve(*this, ycoordinate); return getCurrentXHeightInherited(); } diff --git a/svgio/source/svgreader/svgstyleattributes.cxx b/svgio/source/svgreader/svgstyleattributes.cxx index 1c93bd96fc05..171545d09e95 100644 --- a/svgio/source/svgreader/svgstyleattributes.cxx +++ b/svgio/source/svgreader/svgstyleattributes.cxx @@ -1201,6 +1201,7 @@ namespace svgio maStrokeOpacity(), maFontFamily(), maFontSize(), + maFontSizeNumber(), maFontStretch(FontStretch_notset), maFontStyle(FontStyle_notset), maFontVariant(FontVariant_notset), @@ -1484,11 +1485,57 @@ namespace svgio } case SVGTokenFontSize: { - SvgNumber aNum; - - if(readSingleNumber(aContent, aNum)) + if(!aContent.isEmpty()) { - setFontSize(aNum); + if(aContent.startsWith("xx-small")) + { + setFontSize(FontSize_xx_small); + } + else if(aContent.startsWith("x-small")) + { + setFontSize(FontSize_x_small); + } + else if(aContent.startsWith("small")) + { + setFontSize(FontSize_small); + } + else if(aContent.startsWith("smaller")) + { + setFontSize(FontSize_smaller); + } + else if(aContent.startsWith("medium")) + { + setFontSize(FontSize_medium); + } + else if(aContent.startsWith("larger")) + { + setFontSize(FontSize_larger); + } + else if(aContent.startsWith("large")) + { + setFontSize(FontSize_large); + } + else if(aContent.startsWith("x-large")) + { + setFontSize(FontSize_x_large); + } + else if(aContent.startsWith("xx-large")) + { + setFontSize(FontSize_xx_large); + } + else if(aContent.startsWith("initial")) + { + setFontSize(FontSize_initial); + } + else + { + SvgNumber aNum; + + if(readSingleNumber(aContent, aNum)) + { + setFontSizeNumber(aNum); + } + } } break; } @@ -2265,40 +2312,96 @@ namespace svgio return maFontFamily; } - SvgNumber SvgStyleAttributes::getFontSize() const + SvgNumber SvgStyleAttributes::getFontSizeNumber() const { - if(maFontSize.isSet()) + if(maFontSizeNumber.isSet()) { // #122524# Handle Unit_percent realtive to parent FontSize (see SVG1.1 // spec 10.10 Font selection properties \91font-size\92, lastline (click 'normative // definition of the property') - if(Unit_percent == maFontSize.getUnit()) + if(Unit_percent == maFontSizeNumber.getUnit()) { const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle(); if(pSvgStyleAttributes) { - const SvgNumber aParentNumber = pSvgStyleAttributes->getFontSize(); + const SvgNumber aParentNumber = pSvgStyleAttributes->getFontSizeNumber(); return SvgNumber( - aParentNumber.getNumber() * maFontSize.getNumber() * 0.01, + aParentNumber.getNumber() * maFontSizeNumber.getNumber() * 0.01, aParentNumber.getUnit(), true); } } - return maFontSize; + return maFontSizeNumber; + } + + // default is 'medium' + const double aDefaultSize = 12.0; + + //In CSS2, the suggested scaling factor between adjacent indexes is 1.2 + switch(maFontSize) + { + case FontSize_notset: + break; + case FontSize_xx_small: + { + return SvgNumber(aDefaultSize / 1.728); + } + case FontSize_x_small: + { + return SvgNumber(aDefaultSize / 1.44); + } + case FontSize_small: + { + return SvgNumber(aDefaultSize / 1.2); + } + case FontSize_smaller: + { + const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle(); + if(pSvgStyleAttributes) + { + const SvgNumber aParentNumber = pSvgStyleAttributes->getFontSizeNumber(); + return SvgNumber(aParentNumber.getNumber() / 1.2, aParentNumber.getUnit()); + } + } + case FontSize_medium: + case FontSize_initial: + { + return SvgNumber(aDefaultSize); + } + case FontSize_large: + { + return SvgNumber(aDefaultSize * 1.2); + } + case FontSize_larger: + { + const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle(); + if(pSvgStyleAttributes) + { + const SvgNumber aParentNumber = pSvgStyleAttributes->getFontSizeNumber(); + return SvgNumber(aParentNumber.getNumber() * 1.2, aParentNumber.getUnit()); + } + } + case FontSize_x_large: + { + return SvgNumber(aDefaultSize * 1.44); + } + case FontSize_xx_large: + { + return SvgNumber(aDefaultSize * 1.728); + } } const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle(); if(pSvgStyleAttributes) { - return pSvgStyleAttributes->getFontSize(); + return pSvgStyleAttributes->getFontSizeNumber(); } - // default is 'medium' - return SvgNumber(12.0); + return SvgNumber(aDefaultSize); } FontStretch SvgStyleAttributes::getFontStretch() const |