summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXisco Fauli <anistenis@gmail.com>2016-02-12 01:36:58 +0100
committerNoel Grandin <noelgrandin@gmail.com>2016-02-13 13:38:39 +0000
commit3c8b880c5edc1dcbf0f481c558c6093513df6b45 (patch)
treebcdbe6cbcb48cc5ede632109e6db30428938fd21
parent52942f142ec40f762c1de0751d802fd42eaabed3 (diff)
SVGIO: tdf#97659: Add support for RGBA
Change-Id: Icbf3796cdc95f91d298a5ca52d44931b3985eac6 Reviewed-on: https://gerrit.libreoffice.org/22303 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Noel Grandin <noelgrandin@gmail.com>
-rw-r--r--svgio/inc/svgio/svgreader/svgtools.hxx4
-rw-r--r--svgio/qa/cppunit/SvgImportTest.cxx32
-rw-r--r--svgio/qa/cppunit/data/RGBAColor.svg4
-rw-r--r--svgio/qa/cppunit/data/RGBColor.svg4
-rw-r--r--svgio/source/svgreader/svgstyleattributes.cxx28
-rw-r--r--svgio/source/svgreader/svgtools.cxx50
6 files changed, 107 insertions, 15 deletions
diff --git a/svgio/inc/svgio/svgreader/svgtools.hxx b/svgio/inc/svgio/svgreader/svgtools.hxx
index 27b687f6f2eb..a9dba7f2cdbf 100644
--- a/svgio/inc/svgio/svgreader/svgtools.hxx
+++ b/svgio/inc/svgio/svgreader/svgtools.hxx
@@ -201,12 +201,12 @@ namespace svgio
bool readAngle(const OUString& rCandidate, sal_Int32& nPos, double& fAngle, const sal_Int32 nLen);
sal_Int32 read_hex(const sal_Unicode& rChar);
bool match_colorKeyword(basegfx::BColor& rColor, const OUString& rName, bool bCaseIndependent);
- bool read_color(const OUString& rCandidate, basegfx::BColor& rColor, bool bCaseIndependent);
+ bool read_color(const OUString& rCandidate, basegfx::BColor& rColor, bool bCaseIndependent, SvgNumber& rOpacity);
basegfx::B2DRange readViewBox(const OUString& rCandidate, InfoProvider& rInfoProvider);
basegfx::B2DHomMatrix readTransform(const OUString& rCandidate, InfoProvider& rInfoProvider);
bool readSingleNumber(const OUString& rCandidate, SvgNumber& aNum);
bool readLocalUrl(const OUString& rCandidate, OUString& rURL);
- bool readSvgPaint(const OUString& rCandidate, SvgPaint& rSvgPaint, OUString& rURL, bool bCaseIndependent);
+ bool readSvgPaint(const OUString& rCandidate, SvgPaint& rSvgPaint, OUString& rURL, bool bCaseIndependent, SvgNumber& rOpacity);
bool readSvgNumberVector(const OUString& rCandidate, SvgNumberVector& rSvgNumberVector);
::std::vector< double > solveSvgNumberVector(const SvgNumberVector& rInput, const InfoProvider& rInfoProvider, NumberType aNumberType = length);
diff --git a/svgio/qa/cppunit/SvgImportTest.cxx b/svgio/qa/cppunit/SvgImportTest.cxx
index 182c4fe1f8af..20305988c3ab 100644
--- a/svgio/qa/cppunit/SvgImportTest.cxx
+++ b/svgio/qa/cppunit/SvgImportTest.cxx
@@ -48,6 +48,8 @@ class Test : public test::BootstrapFixture, public XmlTestTools
void testTdf97542_1();
void testTdf97542_2();
void testTdf97543();
+ void testRGBColor();
+ void testRGBAColor();
Primitive2DSequence parseSvg(const char* aSource);
@@ -66,6 +68,8 @@ public:
CPPUNIT_TEST(testTdf97542_1);
CPPUNIT_TEST(testTdf97542_2);
CPPUNIT_TEST(testTdf97543);
+ CPPUNIT_TEST(testRGBColor);
+ CPPUNIT_TEST(testRGBAColor);
CPPUNIT_TEST_SUITE_END();
};
@@ -232,6 +236,7 @@ void Test::testTdf85770()
void Test::testTdf79163()
{
+ //Check Opacity
Primitive2DSequence aSequenceTdf79163 = parseSvg("/svgio/qa/cppunit/data/tdf79163.svg");
CPPUNIT_ASSERT_EQUAL(1, (int)aSequenceTdf79163.getLength());
@@ -284,6 +289,33 @@ void Test::testTdf97543()
assertXPath(pDocument, "/primitive2D/transform/polypolygoncolor", "color", "#00cc00");
}
+
+void Test::testRGBColor()
+{
+ Primitive2DSequence aSequenceRGBColor = parseSvg("/svgio/qa/cppunit/data/RGBColor.svg");
+ CPPUNIT_ASSERT_EQUAL(1, (int)aSequenceRGBColor.getLength());
+
+ Primitive2dXmlDump dumper;
+ xmlDocPtr pDocument = dumper.dumpAndParse(comphelper::sequenceToContainer<Primitive2DContainer>(aSequenceRGBColor));
+
+ CPPUNIT_ASSERT (pDocument);
+
+ assertXPath(pDocument, "/primitive2D/transform/polypolygoncolor", "color", "#646464");
+}
+
+void Test::testRGBAColor()
+{
+ Primitive2DSequence aSequenceRGBAColor = parseSvg("/svgio/qa/cppunit/data/RGBAColor.svg");
+ CPPUNIT_ASSERT_EQUAL(1, (int)aSequenceRGBAColor.getLength());
+
+ Primitive2dXmlDump dumper;
+ xmlDocPtr pDocument = dumper.dumpAndParse(comphelper::sequenceToContainer<Primitive2DContainer>(aSequenceRGBAColor));
+
+ CPPUNIT_ASSERT (pDocument);
+
+ assertXPath(pDocument, "/primitive2D/transform/unifiedtransparence", "transparence", "0");
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(Test);
}
diff --git a/svgio/qa/cppunit/data/RGBAColor.svg b/svgio/qa/cppunit/data/RGBAColor.svg
new file mode 100644
index 000000000000..ddd7a3cc0342
--- /dev/null
+++ b/svgio/qa/cppunit/data/RGBAColor.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<svg width="120" height="120" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <rect x="10" y="10" width="100" height="100" rx="10" ry="10" fill="rgba(20,10,100,0.5)" visibility="inherit" />
+</svg>
diff --git a/svgio/qa/cppunit/data/RGBColor.svg b/svgio/qa/cppunit/data/RGBColor.svg
new file mode 100644
index 000000000000..ad60d5b55a62
--- /dev/null
+++ b/svgio/qa/cppunit/data/RGBColor.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<svg width="120" height="120" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <rect x="10" y="10" width="100" height="100" rx="10" ry="10" fill="rgb(100,100,100)" visibility="inherit" />
+</svg>
diff --git a/svgio/source/svgreader/svgstyleattributes.cxx b/svgio/source/svgreader/svgstyleattributes.cxx
index 1f592e7d73d7..698f7e8ccd69 100644
--- a/svgio/source/svgreader/svgstyleattributes.cxx
+++ b/svgio/source/svgreader/svgstyleattributes.cxx
@@ -1258,10 +1258,15 @@ namespace svgio
{
SvgPaint aSvgPaint;
OUString aURL;
+ SvgNumber aOpacity;
- if(readSvgPaint(aContent, aSvgPaint, aURL, bCaseIndependent))
+ if(readSvgPaint(aContent, aSvgPaint, aURL, bCaseIndependent, aOpacity))
{
setFill(aSvgPaint);
+ if(aOpacity.isSet())
+ {
+ setOpacity(SvgNumber(basegfx::clamp(aOpacity.getNumber(), 0.0, 1.0)));
+ }
}
else if(!aURL.isEmpty())
{
@@ -1310,10 +1315,15 @@ namespace svgio
{
SvgPaint aSvgPaint;
OUString aURL;
+ SvgNumber aOpacity;
- if(readSvgPaint(aContent, aSvgPaint, aURL, bCaseIndependent))
+ if(readSvgPaint(aContent, aSvgPaint, aURL, bCaseIndependent, aOpacity))
{
setStroke(aSvgPaint);
+ if(aOpacity.isSet())
+ {
+ setOpacity(SvgNumber(basegfx::clamp(aOpacity.getNumber(), 0.0, 1.0)));
+ }
}
else if(!aURL.isEmpty())
{
@@ -1448,10 +1458,15 @@ namespace svgio
{
SvgPaint aSvgPaint;
OUString aURL;
+ SvgNumber aOpacity;
- if(readSvgPaint(aContent, aSvgPaint, aURL, bCaseIndependent))
+ if(readSvgPaint(aContent, aSvgPaint, aURL, bCaseIndependent, aOpacity))
{
setStopColor(aSvgPaint);
+ if(aOpacity.isSet())
+ {
+ setOpacity(SvgNumber(basegfx::clamp(aOpacity.getNumber(), 0.0, 1.0)));
+ }
}
break;
}
@@ -1767,10 +1782,15 @@ namespace svgio
{
SvgPaint aSvgPaint;
OUString aURL;
+ SvgNumber aOpacity;
- if(readSvgPaint(aContent, aSvgPaint, aURL, bCaseIndependent))
+ if(readSvgPaint(aContent, aSvgPaint, aURL, bCaseIndependent, aOpacity))
{
setColor(aSvgPaint);
+ if(aOpacity.isSet())
+ {
+ setOpacity(SvgNumber(basegfx::clamp(aOpacity.getNumber(), 0.0, 1.0)));
+ }
}
break;
}
diff --git a/svgio/source/svgreader/svgtools.cxx b/svgio/source/svgreader/svgtools.cxx
index ff74d63061aa..a4e4233a805d 100644
--- a/svgio/source/svgreader/svgtools.cxx
+++ b/svgio/source/svgreader/svgtools.cxx
@@ -814,7 +814,7 @@ namespace svgio
}
}
- bool read_color(const OUString& rCandidate, basegfx::BColor& rColor, bool bCaseIndependent)
+ bool read_color(const OUString& rCandidate, basegfx::BColor& rColor, bool bCaseIndependent, SvgNumber& rOpacity)
{
const sal_Int32 nLen(rCandidate.getLength());
@@ -866,8 +866,17 @@ namespace svgio
if(rCandidate.matchIgnoreAsciiCase(aStrRgb, 0))
{
- // rgb definition
+ // rgb/rgba definition
sal_Int32 nPos(strlen(aStrRgb));
+ bool bIsRGBA = false;
+
+ if('a' == rCandidate[nPos])
+ {
+ //Delete the 'a' from 'rbga'
+ skip_char(rCandidate, 'a', nPos, nPos + 1);
+ bIsRGBA = true;
+ }
+
skip_char(rCandidate, ' ', '(', nPos, nLen);
double fR(0.0);
@@ -901,17 +910,39 @@ namespace svgio
if(readNumber(rCandidate, nPos, fB, nLen))
{
- const double fFac(bIsPercent ? 0.01 : fFactor);
-
- rColor.setRed(fR * fFac);
- rColor.setGreen(fG * fFac);
- rColor.setBlue(fB * fFac);
+ double fA(1.0);
if(bIsPercent)
{
skip_char(rCandidate, '%', nPos, nLen);
}
+ skip_char(rCandidate, ' ', ',', nPos, nLen);
+
+ if(readNumber(rCandidate, nPos, fA, nLen))
+ {
+ if(bIsRGBA)
+ {
+ const double fFac(bIsPercent ? 0.01 : 1);
+ rOpacity = SvgNumber(fA * fFac);
+
+ if(bIsPercent)
+ {
+ skip_char(rCandidate, '%', nPos, nLen);
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ const double fFac(bIsPercent ? 0.01 : fFactor);
+
+ rColor.setRed(fR * fFac);
+ rColor.setGreen(fG * fFac);
+ rColor.setBlue(fB * fFac);
+
skip_char(rCandidate, ' ', ')', nPos, nLen);
return true;
}
@@ -1207,13 +1238,14 @@ namespace svgio
return false;
}
- bool readSvgPaint(const OUString& rCandidate, SvgPaint& rSvgPaint, OUString& rURL, bool bCaseIndependent)
+ bool readSvgPaint(const OUString& rCandidate, SvgPaint& rSvgPaint,
+ OUString& rURL, bool bCaseIndependent, SvgNumber& rOpacity)
{
if( !rCandidate.isEmpty() )
{
basegfx::BColor aColor;
- if(read_color(rCandidate, aColor, bCaseIndependent))
+ if(read_color(rCandidate, aColor, bCaseIndependent, rOpacity))
{
rSvgPaint = SvgPaint(aColor, true, true);
return true;