/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * */ #include #include #include #include #include #include #include #include using namespace css; using drawinglayer::primitive2d::Primitive2DSequence; using drawinglayer::primitive2d::Primitive2DReference; namespace vcl { void BitmapTools::loadFromSvg(SvStream& rStream, const OUString& sPath, BitmapEx& rBitmapEx, double fScalingFactor) { uno::Reference xContext(comphelper::getProcessComponentContext()); const uno::Reference xSvgParser = graphic::SvgTools::create(xContext); std::size_t nSize = rStream.remainingSize(); std::vector aBuffer(nSize + 1); rStream.ReadBytes(aBuffer.data(), nSize); aBuffer[nSize] = 0; uno::Sequence aData(aBuffer.data(), nSize + 1); uno::Reference aInputStream(new comphelper::SequenceInputStream(aData)); Primitive2DSequence aPrimitiveSequence = xSvgParser->getDecomposition(aInputStream, sPath); if (aPrimitiveSequence.hasElements()) { uno::Sequence aViewParameters; const sal_Int32 nCount(aPrimitiveSequence.getLength()); geometry::RealRectangle2D aRealRect; basegfx::B2DRange aRange; for (sal_Int32 a = 0L; a < nCount; ++a) { const Primitive2DReference xReference(aPrimitiveSequence[a]); if (xReference.is()) { aRealRect = xReference->getRange(aViewParameters); aRange.expand(basegfx::B2DRange(aRealRect.X1, aRealRect.Y1, aRealRect.X2, aRealRect.Y2)); } } aRealRect.X1 = 0; aRealRect.Y1 = 0; aRealRect.X2 = aRange.getMaxX() - aRange.getMinX(); aRealRect.Y2 = aRange.getMaxY() - aRange.getMinY(); double nDPI = 90 * fScalingFactor; const css::uno::Reference xPrimitive2DRenderer = css::graphic::Primitive2DTools::create(xContext); const css::uno::Reference xBitmap( xPrimitive2DRenderer->rasterize(aPrimitiveSequence, aViewParameters, nDPI, nDPI, aRealRect, 256*256)); if (xBitmap.is()) { const css::uno::Reference xIntBmp(xBitmap, uno::UNO_QUERY_THROW); if (xIntBmp.is()) { rBitmapEx = vcl::unotools::bitmapExFromXBitmap(xIntBmp); } } } } } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */