Hi all, Here are some tiny patches to fix bugs in SVG import. 0001: Check opacity for == operator Sometimes, LilbreOffice doesn't handle opacity value. Example: http://gnome-colors.googlecode.com/svn/trunk/gnome-colors/gnome-colors-common/scalable/actions/document-properties.svg The patch fixes this problem. 0002: Fix color serialization Sometimes, LibreOffice fails to import fill or stroke colors (when using File -> Open) Example: http://gnome-colors.googlecode.com/svn/trunk/gnome-colors/gnome-colors-common/scalable/actions/edit-redo.svg Treat color value as hex. 0003:Relax paint url parsing (fix fdo#34205) LibreOffice doesn't allow ' or " between "url(" and "#". As a result, gradients using url('#foo') syntax aren't imported. Bug 34205 – SVG import: transparency gradients incorrect https://bugs.freedesktop.org/show_bug.cgi?id=34205 0004: Ensure writing styles for text Currently, when a text element doesn't have presentation attributes or styles, style information is not written (when using File -> Open). So the text has zero width and is wrapped wrongly. This patch ensures that filter writes style information if a text has no styles. See attached text3.svg. Black text ("Hello") will be wrapped wrongly. All patches are under LGPLv3 / MPL. cheers, -- Kurosawa Takeshi <taken.spc@gmail.com>
From 7264908a3058c34b5a72e8ce274c1c8e7ccbad02 Mon Sep 17 00:00:00 2001
From: Takeshi Kurosawa <taken.spc@gmail.com>
Date: Mon, 14 Feb 2011 15:21:41 +0900
Subject: [PATCH 1/4] Check opacity for == operator
Or opacity is ignored.
---
filter/source/svg/gfxtypes.hxx | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/filter/source/svg/gfxtypes.hxx b/filter/source/svg/gfxtypes.hxx
index 60e6a6c..0a07094 100644
--- a/filter/source/svg/gfxtypes.hxx
+++ b/filter/source/svg/gfxtypes.hxx
@@ -275,6 +275,7 @@ inline bool operator==(const State& rLHS, const State& rRHS )
rLHS.mbVisibility==rRHS.mbVisibility &&
rLHS.meFillType==rRHS.meFillType &&
rLHS.mnFillOpacity==rRHS.mnFillOpacity &&
+ rLHS.mnOpacity==rRHS.mnOpacity &&
rLHS.meStrokeType==rRHS.meStrokeType &&
rLHS.mnStrokeOpacity==rRHS.mnStrokeOpacity &&
rLHS.meViewportFillType==rRHS.meViewportFillType &&
@@ -319,6 +320,7 @@ struct StateHash
^ size_t(rState.mbVisibility)
^ size_t(rState.meFillType)
^ size_t(rState.mnFillOpacity)
+ ^ size_t(rState.mnOpacity)
^ size_t(rState.meStrokeType)
^ size_t(rState.mnStrokeOpacity)
^ size_t(rState.meViewportFillType)
--
1.7.1
From 38fe5587d887efc468393b4df4caed1f7604f63c Mon Sep 17 00:00:00 2001
From: Takeshi Kurosawa <taken.spc@gmail.com>
Date: Mon, 14 Feb 2011 15:23:20 +0900
Subject: [PATCH 2/4] Fix color serialization
The are hex values.
---
filter/source/svg/svgreader.cxx | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/filter/source/svg/svgreader.cxx b/filter/source/svg/svgreader.cxx
index 9ccd3b7..44fa416 100644
--- a/filter/source/svg/svgreader.cxx
+++ b/filter/source/svg/svgreader.cxx
@@ -410,13 +410,13 @@ struct AnnotatingVisitor
const sal_uInt8 nGreen( toByteColor(rColor.g) );
const sal_uInt8 nBlue ( toByteColor(rColor.b) );
aBuf.append( sal_Unicode('#') );
- if( nRed < 10 )
+ if( nRed < 0x10 )
aBuf.append( sal_Unicode('0') );
aBuf.append( sal_Int32(nRed), 16 );
- if( nGreen < 10 )
+ if( nGreen < 0x10 )
aBuf.append( sal_Unicode('0') );
aBuf.append( sal_Int32(nGreen), 16 );
- if( nBlue < 10 )
+ if( nBlue < 0x10 )
aBuf.append( sal_Unicode('0') );
aBuf.append( sal_Int32(nBlue), 16 );
--
1.7.1
From cf0c6d64bb3190743ce7237c75197c8f691aafbe Mon Sep 17 00:00:00 2001
From: Takeshi Kurosawa <taken.spc@gmail.com>
Date: Mon, 14 Feb 2011 15:24:11 +0900
Subject: [PATCH 3/4] Relax paint url parsing (fix fdo#34205)
Allow ' and " around parens.
---
filter/source/svg/parserfragments.cxx | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/filter/source/svg/parserfragments.cxx b/filter/source/svg/parserfragments.cxx
index c515e85..95811d4 100644
--- a/filter/source/svg/parserfragments.cxx
+++ b/filter/source/svg/parserfragments.cxx
@@ -560,9 +560,9 @@ bool parsePaintUri( std::pair<const char*,const char*>& o_rPaintUri,
const bool bRes = parse(sPaintUri,
// Begin grammar
(
- str_p("url(#") >>
+ str_p("url(") >> !( str_p("'") | str_p("\"") ) >> ("#") >>
(+alnum_p)[assign_a(o_rPaintUri)] >>
- str_p(")") >>
+ !( str_p("'") | str_p("\"") ) >> str_p(")") >>
*( str_p("none")[assign_a(io_rColor.second,false)] |
str_p("currentColor")[assign_a(io_rColor.second,true)] |
ColorGrammar(io_rColor.first)
--
1.7.1
Attachment:
text3.svg
Description: image/svg
From b6fdd34b092bae64afc52f519ffa120f2e99ea2b Mon Sep 17 00:00:00 2001
From: Takeshi Kurosawa <taken.spc@gmail.com>
Date: Mon, 14 Feb 2011 15:26:21 +0900
Subject: [PATCH 4/4] Ensure writing styles for text
When a text element doesn't have presentation attributes or styles,
style information is not written. As a result the text has zero width.
---
filter/source/svg/gfxtypes.hxx | 2 +-
filter/source/svg/svgreader.cxx | 9 +++++++++
2 files changed, 10 insertions(+), 1 deletions(-)
diff --git a/filter/source/svg/gfxtypes.hxx b/filter/source/svg/gfxtypes.hxx
index 0a07094..24c4cbd 100644
--- a/filter/source/svg/gfxtypes.hxx
+++ b/filter/source/svg/gfxtypes.hxx
@@ -174,7 +174,7 @@ struct State
maViewport(),
maViewBox(),
maFontFamily(), // app-default
- mnFontSize(12.0),
+ mnFontSize(0),
maFontStyle(RTL_CONSTASCII_USTRINGPARAM("normal")),
maFontVariant(RTL_CONSTASCII_USTRINGPARAM("normal")),
mnFontWeight(400.0),
diff --git a/filter/source/svg/svgreader.cxx b/filter/source/svg/svgreader.cxx
index 44fa416..b909155 100644
--- a/filter/source/svg/svgreader.cxx
+++ b/filter/source/svg/svgreader.cxx
@@ -147,6 +147,7 @@ struct AnnotatingVisitor
StateMap& rStateMap,
const State& rInitialState,
const uno::Reference<xml::sax::XDocumentHandler>& xDocumentHandler) :
+ mbSeenText(false),
mnCurrStateId(0),
maCurrState(),
maParentStates(),
@@ -266,6 +267,13 @@ struct AnnotatingVisitor
maCurrState.maTransform.identity();
maCurrState.maViewBox.reset();
+ // set default font size here to ensure writing styles for text
+ if( !mbSeenText && XML_TEXT == nTagId )
+ {
+ maCurrState.mnFontSize = 12.0;
+ mbSeenText = true;
+ }
+
// scan for style info
const sal_Int32 nNumAttrs( xAttributes->getLength() );
rtl::OUString sAttributeValue;
@@ -1161,6 +1169,7 @@ struct AnnotatingVisitor
}
}
+ bool mbSeenText;
sal_Int32 mnCurrStateId;
State maCurrState;
std::vector<State> maParentStates;
--
1.7.1