From 3c8b880c5edc1dcbf0f481c558c6093513df6b45 Mon Sep 17 00:00:00 2001 From: Xisco Fauli Date: Fri, 12 Feb 2016 01:36:58 +0100 Subject: SVGIO: tdf#97659: Add support for RGBA Change-Id: Icbf3796cdc95f91d298a5ca52d44931b3985eac6 Reviewed-on: https://gerrit.libreoffice.org/22303 Tested-by: Jenkins Reviewed-by: Noel Grandin --- svgio/source/svgreader/svgstyleattributes.cxx | 28 ++++++++++++--- svgio/source/svgreader/svgtools.cxx | 50 ++++++++++++++++++++++----- 2 files changed, 65 insertions(+), 13 deletions(-) (limited to 'svgio/source/svgreader') 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; -- cgit