You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by al...@apache.org on 2011/12/07 15:54:33 UTC
svn commit: r1211462 - in
/incubator/ooo/branches/alg/svgreplacement/main/svgio: Library_svgio.mk
inc/svgio/svgreader/svgimagenode.hxx inc/svgio/svgreader/svgtools.hxx
source/svgreader/svgimagenode.cxx source/svgreader/svgtools.cxx
Author: alg
Date: Wed Dec 7 14:54:33 2011
New Revision: 1211462
URL: http://svn.apache.org/viewvc?rev=1211462&view=rev
Log:
svg: added support for image, base64 embedded; added AspectRatio support for image
Modified:
incubator/ooo/branches/alg/svgreplacement/main/svgio/Library_svgio.mk
incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgimagenode.hxx
incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtools.hxx
incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgimagenode.cxx
incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtools.cxx
Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/Library_svgio.mk
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/Library_svgio.mk?rev=1211462&r1=1211461&r2=1211462&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/Library_svgio.mk (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/Library_svgio.mk Wed Dec 7 14:54:33 2011
@@ -49,6 +49,9 @@ $(eval $(call gb_Library_add_linked_libs
sal \
stl \
tl \
+ sax \
+ vcl \
+ svt \
$(gb_STDLIBS) \
))
Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgimagenode.hxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgimagenode.hxx?rev=1211462&r1=1211461&r2=1211462&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgimagenode.hxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgimagenode.hxx Wed Dec 7 14:54:33 2011
@@ -45,7 +45,12 @@ namespace svgio
SvgNumber maY;
SvgNumber maWidth;
SvgNumber maHeight;
- rtl::OUString maXLink;
+
+ rtl::OUString maXLink; // internal link
+ rtl::OUString maUrl; // external link
+
+ rtl::OUString maMimeType; // mimetype and
+ rtl::OUString maData; // base64 data
public:
SvgImageNode(
Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtools.hxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtools.hxx?rev=1211462&r1=1211461&r2=1211462&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtools.hxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtools.hxx Wed Dec 7 14:54:33 2011
@@ -195,6 +195,8 @@ namespace svgio
typedef ::std::vector< rtl::OUString > SvgStringVector;
bool readSvgStringVector(const rtl::OUString& rCandidate, SvgStringVector& rSvgStringVector);
+ void readImageLink(const rtl::OUString& rCandidate, rtl::OUString& rXLink, rtl::OUString& rUrl, rtl::OUString& rMimeType, rtl::OUString& rData);
+
rtl::OUString convert(const rtl::OUString& rCandidate, const sal_Unicode& rPattern, const sal_Unicode& rNew, bool bRemove);
rtl::OUString consolidateContiguosSpace(const rtl::OUString& rCandidate);
rtl::OUString whiteSpaceHandlingDefault(const rtl::OUString& rCandidate);
Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgimagenode.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgimagenode.cxx?rev=1211462&r1=1211461&r2=1211462&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgimagenode.cxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgimagenode.cxx Wed Dec 7 14:54:33 2011
@@ -23,6 +23,17 @@
#include "precompiled_svgio.hxx"
#include <svgio/svgreader/svgimagenode.hxx>
+#include <sax/tools/converter.hxx>
+#include <tools/stream.hxx>
+#include <vcl/bitmapex.hxx>
+#include <svtools/filter.hxx>
+#include <basegfx/matrix/b2dhommatrixtools.hxx>
+#include <drawinglayer/primitive2d/bitmapprimitive2d.hxx>
+#include <drawinglayer/primitive2d/groupprimitive2d.hxx>
+#include <drawinglayer/primitive2d/transformprimitive2d.hxx>
+#include <drawinglayer/primitive2d/maskprimitive2d.hxx>
+#include <basegfx/polygon/b2dpolygontools.hxx>
+#include <basegfx/polygon/b2dpolygon.hxx>
//////////////////////////////////////////////////////////////////////////////
@@ -41,7 +52,10 @@ namespace svgio
maY(0),
maWidth(0),
maHeight(0),
- maXLink()
+ maXLink(),
+ maUrl(),
+ maMimeType(),
+ maData()
{
}
@@ -139,9 +153,9 @@ namespace svgio
{
const sal_Int32 nLen(aContent.getLength());
- if(nLen && sal_Unicode('#') == aContent[0])
+ if(nLen)
{
- maXLink = aContent.copy(1);
+ readImageLink(aContent, maXLink, maUrl, maMimeType, maData);
}
break;
}
@@ -160,13 +174,132 @@ namespace svgio
if(fWidth > 0.0 && fHeight > 0.0)
{
+ BitmapEx aBitmapEx;
+ drawinglayer::primitive2d::Primitive2DVector aNewTarget;
+ drawinglayer::primitive2d::Primitive2DSequence aEmbedded;
+
+ // prepare Target and ViewBox for evtl. AspectRatio mappings
const double fX(getX().isSet() ? getX().solve(*this, xcoordinate) : 0.0);
const double fY(getY().isSet() ? getY().solve(*this, ycoordinate) : 0.0);
- const basegfx::B2DRange aRange(fX, fY, fX + fWidth, fY + fHeight);
+ const basegfx::B2DRange aTarget(fX, fY, fX + fWidth, fY + fHeight);
+ basegfx::B2DRange aViewBox(aTarget);
+ if(maMimeType.getLength() && maData.getLength())
+ {
+ // use embedded base64 encoded data
+ ::com::sun::star::uno::Sequence< sal_Int8 > aPass;
+ ::sax::Converter::decodeBase64(aPass, maData);
+ if(aPass.hasElements())
+ {
+ SvMemoryStream aStream(aPass.getArray(), aPass.getLength(), STREAM_READ);
+ Graphic aGraphic;
+ if(GRFILTER_OK == GraphicFilter::GetGraphicFilter()->ImportGraphic(
+ aGraphic,
+ String(),
+ aStream))
+ {
+ if(GRAPHIC_BITMAP == aGraphic.GetType())
+ {
+ if(aGraphic.getSvgData().get())
+ {
+ // embedded Svg
+ aEmbedded = aGraphic.getSvgData()->getPrimitive2DSequence();
+
+ // fill aViewBox
+ aViewBox = aGraphic.getSvgData()->getRange();
+ }
+ else
+ {
+ // get bitmap
+ aBitmapEx = aGraphic.GetBitmapEx();
+ }
+ }
+ else
+ {
+ // evtl. convert to bitmap
+ aBitmapEx = aGraphic.GetBitmapEx();
+ }
+ }
+ }
+ }
+ if(!aBitmapEx.IsEmpty())
+ {
+ // create content from bitmap
+ aNewTarget.push_back(
+ new drawinglayer::primitive2d::BitmapPrimitive2D(
+ aBitmapEx,
+ basegfx::B2DHomMatrix()));
+
+ // fill aViewBox. No size set yet, use unit size
+ aViewBox = basegfx::B2DRange(0.0, 0.0, 1.0, 1.0);
+ }
+ else if(aEmbedded.hasElements())
+ {
+ // add to aNewTarget as Group
+ aNewTarget.push_back(
+ new drawinglayer::primitive2d::GroupPrimitive2D(
+ aEmbedded));
+ }
+
+ if(aNewTarget.size())
+ {
+ if(aTarget.equal(aViewBox))
+ {
+ // just add to rTarget
+ rTarget.insert(rTarget.end(), aNewTarget.begin(), aNewTarget.end());
+ }
+ else
+ {
+ // create mapping
+ const SvgAspectRatio& rRatio = getSvgAspectRatio();
+ const drawinglayer::primitive2d::Primitive2DSequence aSequence(Primitive2DVectorToPrimitive2DSequence(aNewTarget));
+
+ if(rRatio.isSet())
+ {
+ // let mapping be created from SvgAspectRatio
+ const basegfx::B2DHomMatrix aEmbeddingTransform(
+ rRatio.createMapping(aTarget, aViewBox));
+
+ // prepare embedding in transformation
+ drawinglayer::primitive2d::TransformPrimitive2D* pNew =
+ new drawinglayer::primitive2d::TransformPrimitive2D(
+ aEmbeddingTransform,
+ aSequence);
+
+ if(rRatio.isMeetOrSlice())
+ {
+ // embed in transformation
+ rTarget.push_back(pNew);
+ }
+ else
+ {
+ // need to embed in MaskPrimitive2D, too
+ const drawinglayer::primitive2d::Primitive2DReference xRef(pNew);
+
+ rTarget.push_back(
+ new drawinglayer::primitive2d::MaskPrimitive2D(
+ basegfx::B2DPolyPolygon(basegfx::tools::createPolygonFromRect(aTarget)),
+ drawinglayer::primitive2d::Primitive2DSequence(&xRef, 1)));
+ }
+ }
+ else
+ {
+ // choose default mapping
+ const basegfx::B2DHomMatrix aEmbeddingTransform(
+ rRatio.createLinearMapping(
+ aTarget, aViewBox));
+
+ // embed in transformation
+ rTarget.push_back(
+ new drawinglayer::primitive2d::TransformPrimitive2D(
+ aEmbeddingTransform,
+ aSequence));
+ }
+ }
+ }
}
}
}
Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtools.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtools.cxx?rev=1211462&r1=1211461&r2=1211462&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtools.cxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtools.cxx Wed Dec 7 14:54:33 2011
@@ -1335,6 +1335,66 @@ namespace svgio
return !rSvgStringVector.empty();
}
+ void readImageLink(const rtl::OUString& rCandidate, rtl::OUString& rXLink, rtl::OUString& rUrl, rtl::OUString& rMimeType, rtl::OUString& rData)
+ {
+ rXLink = rUrl = rMimeType = rData = rtl::OUString();
+
+ if(sal_Unicode('#') == rCandidate[0])
+ {
+ // local link
+ rXLink = rCandidate.copy(1);
+ }
+ else
+ {
+ static rtl::OUString aStrData(rtl::OUString::createFromAscii("data:"));
+
+ if(rCandidate.match(aStrData, 0))
+ {
+ // embedded data
+ sal_Int32 nPos(aStrData.getLength());
+ sal_Int32 nLen(rCandidate.getLength());
+ rtl::OUStringBuffer aBuffer;
+
+ // read mime type
+ skip_char(rCandidate, sal_Unicode(' '), nPos, nLen);
+ copyToLimiter(rCandidate, sal_Unicode(';'), nPos, aBuffer, nLen);
+ skip_char(rCandidate, sal_Unicode(' '), sal_Unicode(';'), nPos, nLen);
+ rMimeType = aBuffer.makeStringAndClear();
+
+ if(rMimeType.getLength() && nPos < nLen)
+ {
+ static rtl::OUString aStrImage(rtl::OUString::createFromAscii("image"));
+
+ if(rMimeType.match(aStrImage, 0))
+ {
+ // image data
+ rtl::OUString aData(rCandidate.copy(nPos));
+ static rtl::OUString aStrBase64(rtl::OUString::createFromAscii("base64"));
+
+ if(aData.match(aStrBase64, 0))
+ {
+ // base64 encoded
+ nPos = aStrBase64.getLength();
+ nLen = aData.getLength();
+
+ skip_char(aData, sal_Unicode(' '), sal_Unicode(','), nPos, nLen);
+
+ if(nPos < nLen)
+ {
+ rData = aData.copy(nPos);
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ // Url (path and filename)
+ rUrl = rCandidate;
+ }
+ }
+ }
+
rtl::OUString convert(const rtl::OUString& rCandidate, const sal_Unicode& rPattern, const sal_Unicode& rNew, bool bRemove)
{
const sal_Int32 nLen(rCandidate.getLength());