summaryrefslogtreecommitdiff
path: root/svgio
diff options
context:
space:
mode:
authorXisco Fauli <anistenis@gmail.com>2016-01-17 19:17:46 +0100
committerArmin Le Grand <Armin.Le.Grand@cib.de>2016-01-20 13:10:42 +0000
commit406cdc29039e5e65bacfcd635de8022642d63547 (patch)
treed04d5bb713c4fa4297bd7378ea82b67a54c8c06f /svgio
parentab6f80909877f1e14de252c456dd2acd84c43974 (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>
Diffstat (limited to 'svgio')
-rw-r--r--svgio/inc/svgio/svgreader/svgstyleattributes.hxx23
-rw-r--r--svgio/source/svgreader/svgcharacternode.cxx4
-rw-r--r--svgio/source/svgreader/svgnode.cxx4
-rw-r--r--svgio/source/svgreader/svgstyleattributes.cxx129
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