summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXisco Fauli <anistenis@gmail.com>2015-12-03 17:16:55 +0100
committerThorsten Behrens <Thorsten.Behrens@CIB.de>2016-01-08 09:35:20 +0000
commit0cae9c32ce9884a9809e220ba80b7c4cb4059565 (patch)
tree45d8d03698e92b62a3a4924a4a5d4e82c95a6fd9
parent6b7d41094d06bbb4c248927d02318cf1b5faba0a (diff)
tdf#96046 SVG: Change logic to parse doubles correctly and..
add support for font-size keywords. My previous commit fa17cfd7e006c73f1360a5a974f38d9875f347c5 was wrong as doubles like '-10.0' or '5e1' were ignored. Change logic to parse the whole string but the units ( 'cm', 'mm', etc, etc) Then, value.toDouble() will try to convert it to double, and if it's not possible it will return 0.0. Besides, add support for font-size keywords described here: http://www.w3.org/TR/REC-CSS2/fonts.html#font-size-props Working on a parse test for this section. Change-Id: I2b9c89225fcf63f1a0564abf7187097373cbc9a1 Reviewed-on: https://gerrit.libreoffice.org/20379 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Armin Le Grand <Armin.Le.Grand@cib.de>
-rw-r--r--filter/source/svg/gfxtypes.hxx6
-rw-r--r--filter/source/svg/svgreader.cxx1
-rw-r--r--filter/source/svg/units.cxx50
-rw-r--r--filter/source/svg/units.hxx5
4 files changed, 49 insertions, 13 deletions
diff --git a/filter/source/svg/gfxtypes.hxx b/filter/source/svg/gfxtypes.hxx
index 3d502da9ccd9..e8041f52c453 100644
--- a/filter/source/svg/gfxtypes.hxx
+++ b/filter/source/svg/gfxtypes.hxx
@@ -193,13 +193,9 @@ struct State
bool mbIsText;
OUString maFontFamily;
- /** Absolute: xx-small=6.94 | x-small=8.33 | small=10 | medium=12 | large=14.4 | x-large=17.28 | xx-large=20.736
- Relative(to parent): larger (enlarge by 1.2)
- smaller (shrink by 1.2)
-
- */
double mnFontSize;
+ double mnParentFontSize;
OUString maFontStyle;
OUString maFontVariant;
double mnFontWeight;
diff --git a/filter/source/svg/svgreader.cxx b/filter/source/svg/svgreader.cxx
index 5ae3281ae329..7e8a769d75cf 100644
--- a/filter/source/svg/svgreader.cxx
+++ b/filter/source/svg/svgreader.cxx
@@ -1142,6 +1142,7 @@ struct AnnotatingVisitor
maCurrState.maFontFamily=sValue;
break;
case XML_FONT_SIZE:
+ maCurrState.mnParentFontSize=maParentStates.back().mnFontSize;
maCurrState.mnFontSize=convLength(sValue,maCurrState,'v');
break;
case XML_FONT_STYLE:
diff --git a/filter/source/svg/units.cxx b/filter/source/svg/units.cxx
index 34360ac247ef..dd1a31e36f65 100644
--- a/filter/source/svg/units.cxx
+++ b/filter/source/svg/units.cxx
@@ -17,12 +17,12 @@
namespace svgi
{
-double convLength( double value, SvgUnit unit, const State& rState, char dir )
+double convLength( const OUString& value, SvgUnit unit, const State& rState, char dir )
{
// convert svg unit to internal coordinates ("pixel"). Since the
// OOo drawing layer is still largely integer-based, the initial
// viewport transformation includes a certain scale factor
- double fRet(value);
+ double fRet(value.toDouble());
switch ( unit )
{
case SVG_LENGTH_UNIT_CM: fRet *= F_SVG_PIXEL_PER_INCH/2.54; break;
@@ -36,14 +36,38 @@ double convLength( double value, SvgUnit unit, const State& rState, char dir )
case SVG_LENGTH_UNIT_PX:
// no unit defaults to PX in svg, assume display to have 90DPI
break;
+ case SVG_LENGTH_FONT_SIZE:
+ {
+ //In CSS2, the suggested scaling factor between adjacent indexes is 1.2
+ if ( value == "xx-small" )
+ fRet = rState.mnFontSize / 1.728;
+ else if ( value == "x-small" )
+ fRet = rState.mnFontSize / 1.44;
+ else if ( value == "small" )
+ fRet = rState.mnFontSize / 1.2;
+ else if ( value == "smaller" )
+ fRet = rState.mnParentFontSize / 1.2;
+ else if ( value == "initial" || value == "medium" )
+ fRet = rState.mnFontSize;
+ else if ( value == "larger" )
+ fRet = rState.mnParentFontSize * 1.2;
+ else if ( value == "large" )
+ fRet = rState.mnFontSize * 1.2;
+ else if ( value == "x-large" )
+ fRet = rState.mnFontSize * 1.44;
+ else if ( value == "xx-large" )
+ fRet = rState.mnFontSize * 1.728;
+
+ break;
+ }
case SVG_LENGTH_UNIT_PERCENTAGE:
{
double fBoxLen;
if (rState.maViewBox.isEmpty())
{
basegfx::B2DRange aDefaultBox(0, 0,
- convLength(210, SVG_LENGTH_UNIT_MM, rState, 'h'),
- convLength(297, SVG_LENGTH_UNIT_MM, rState, 'v'));
+ convLength("210", SVG_LENGTH_UNIT_MM, rState, 'h'),
+ convLength("297", SVG_LENGTH_UNIT_MM, rState, 'v'));
fBoxLen = (dir=='h' ? aDefaultBox.getWidth() :
(dir=='v' ? aDefaultBox.getHeight() :
aDefaultBox.getRange().getLength()));
@@ -77,7 +101,21 @@ double convLength( const OUString& sValue, const State& rState, char dir )
const bool bRes = parse(aUTF8.getStr(),
// Begin grammar
(
- (*digit_p >> *((str_p(".") | str_p(",")) >> *digit_p))[assign_a(sVal)]
+ //parse font-size keywords (ie: xx-large, medium )
+ ( +(alpha_p) >> !(str_p("-") >> +alpha_p) )[assign_a(sVal)]
+ >> str_p("")[assign_a(eUnit,SVG_LENGTH_FONT_SIZE)] |
+ //take the first part and ignore the units
+ ( +(anychar_p -
+ (str_p("cm") |
+ str_p("em") |
+ str_p("ex") |
+ str_p("in") |
+ str_p("mm") |
+ str_p("pc") |
+ str_p("pt") |
+ str_p("px") |
+ str_p("%")))
+ )[assign_a(sVal)]
>> ( str_p("cm") [assign_a(eUnit,SVG_LENGTH_UNIT_CM)]
| str_p("em") [assign_a(eUnit,SVG_LENGTH_UNIT_EM)]
| str_p("ex") [assign_a(eUnit,SVG_LENGTH_UNIT_EX)]
@@ -98,7 +136,7 @@ double convLength( const OUString& sValue, const State& rState, char dir )
OUString oVal = OUString::createFromAscii(sVal.c_str()).replaceAll(",",".");
- return convLength(oVal.toDouble(),eUnit,rState,dir);
+ return convLength(oVal,eUnit,rState,dir);
}
} // namespace svgi
diff --git a/filter/source/svg/units.hxx b/filter/source/svg/units.hxx
index d348104de83c..06b7217c1b6c 100644
--- a/filter/source/svg/units.hxx
+++ b/filter/source/svg/units.hxx
@@ -30,7 +30,8 @@ namespace svgi
SVG_LENGTH_UNIT_PT,
SVG_LENGTH_UNIT_PX,
SVG_LENGTH_UNIT_PERCENTAGE,
- SVG_LENGTH_UNIT_USER
+ SVG_LENGTH_UNIT_USER,
+ SVG_LENGTH_FONT_SIZE
};
/** return svg_length_t in 100th's of mm
@@ -39,7 +40,7 @@ namespace svgi
@param rState current state (needed for viewport dimensions etc.)
@param dir direction - either 'h' or 'v' for horizonal or vertical, resp.
*/
- double convLength( double fVal, SvgUnit unit, const State& rState, char dir );
+ double convLength( const OUString& sVal, SvgUnit unit, const State& rState, char dir );
/** return svg_length_t in 100th's of mm
@param sValue value to convert