diff options
author | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2019-02-08 21:56:14 +0100 |
---|---|---|
committer | Tomaž Vajngerl <quikee@gmail.com> | 2019-03-05 11:23:41 +0100 |
commit | 983566119c926d0e2478f74548f00a789de55c15 (patch) | |
tree | 082517f6aa3414cf6bd8c475f2c4eb956ddacb51 /vcl/source/gdi | |
parent | 5723d303a44597cdb2ea242cf3fb0ac0e8c15b83 (diff) |
Add support for <image> draw definition to draw a SVG image
Attribute "source" is used to get the relative path to the image.
Path is relative to the definition file.
Change-Id: I6ca0c113385e26ad74b928e1f56635b4b0cef995
Reviewed-on: https://gerrit.libreoffice.org/68712
Tested-by: Jenkins
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'vcl/source/gdi')
-rw-r--r-- | vcl/source/gdi/FileDefinitionWidgetDraw.cxx | 20 | ||||
-rw-r--r-- | vcl/source/gdi/WidgetDefinition.cxx | 7 | ||||
-rw-r--r-- | vcl/source/gdi/WidgetDefinitionReader.cxx | 17 |
3 files changed, 38 insertions, 6 deletions
diff --git a/vcl/source/gdi/FileDefinitionWidgetDraw.cxx b/vcl/source/gdi/FileDefinitionWidgetDraw.cxx index 6681d2190dd2..a615bd390c81 100644 --- a/vcl/source/gdi/FileDefinitionWidgetDraw.cxx +++ b/vcl/source/gdi/FileDefinitionWidgetDraw.cxx @@ -18,6 +18,10 @@ #include <basegfx/range/b2drectangle.hxx> #include <basegfx/polygon/b2dpolygontools.hxx> +#include <tools/stream.hxx> +#include <vcl/bitmapex.hxx> +#include <vcl/BitmapTools.hxx> + namespace vcl { namespace @@ -34,7 +38,8 @@ OUString lcl_getThemeDefinitionPath() FileDefinitionWidgetDraw::FileDefinitionWidgetDraw(SalGraphics& rGraphics) : m_rGraphics(rGraphics) { - WidgetDefinitionReader aReader(lcl_getThemeDefinitionPath() + "definition.xml"); + OUString sDefinitionBasePath = lcl_getThemeDefinitionPath(); + WidgetDefinitionReader aReader(sDefinitionBasePath + "definition.xml", sDefinitionBasePath); aReader.read(m_aWidgetDefinition); ImplSVData* pSVData = ImplGetSVData(); @@ -171,6 +176,19 @@ void munchDrawCommands(std::vector<std::shared_ptr<DrawCommand>> const& rDrawCom 0.0f, false, nullptr); } break; + case DrawCommandType::IMAGE: + { + auto const& rDrawCommand = static_cast<ImageDrawCommand const&>(*pDrawCommand); + SvFileStream aFileStream(rDrawCommand.msSource, StreamMode::READ); + BitmapEx aBitmap; + vcl::bitmap::loadFromSvg(aFileStream, "", aBitmap, 1.0); + long nImageWidth = aBitmap.GetSizePixel().Width(); + long nImageHeight = aBitmap.GetSizePixel().Height(); + SalTwoRect aTR(0, 0, nImageWidth, nImageHeight, nX, nY, nImageWidth, nImageHeight); + rGraphics.DrawBitmap(aTR, *aBitmap.GetBitmap().ImplGetSalBitmap().get(), + *aBitmap.GetAlpha().ImplGetSalBitmap().get(), nullptr); + } + break; } } } diff --git a/vcl/source/gdi/WidgetDefinition.cxx b/vcl/source/gdi/WidgetDefinition.cxx index 2cff3aedd36e..defcf0b84cd8 100644 --- a/vcl/source/gdi/WidgetDefinition.cxx +++ b/vcl/source/gdi/WidgetDefinition.cxx @@ -132,6 +132,13 @@ void WidgetDefinitionState::addDrawLine(Color aStrokeColor, sal_Int32 nStrokeWid mpDrawCommands.push_back(std::move(pCommand)); } +void WidgetDefinitionState::addDrawImage(OUString sSource) +{ + auto pCommand(std::make_shared<ImageDrawCommand>()); + pCommand->msSource = sSource; + mpDrawCommands.push_back(std::move(pCommand)); +} + } // end vcl namespace /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/gdi/WidgetDefinitionReader.cxx b/vcl/source/gdi/WidgetDefinitionReader.cxx index f37385cc09b9..72bd5649d4db 100644 --- a/vcl/source/gdi/WidgetDefinitionReader.cxx +++ b/vcl/source/gdi/WidgetDefinitionReader.cxx @@ -164,8 +164,10 @@ bool getControlTypeForXmlString(OString const& rString, ControlType& reType) } // end anonymous namespace -WidgetDefinitionReader::WidgetDefinitionReader(OUString const& rFilePath) - : m_rFilePath(rFilePath) +WidgetDefinitionReader::WidgetDefinitionReader(OUString const& rDefinitionFile, + OUString const& rResourcePath) + : m_rDefinitionFile(rDefinitionFile) + , m_rResourcePath(rResourcePath) { } @@ -260,7 +262,12 @@ void WidgetDefinitionReader::readDrawingDefinition(tools::XmlWalker& rWalker, rpState->addDrawLine(aStrokeColor, nStrokeWidth, fX1, fY1, fX2, fY2); } - + else if (rWalker.name() == "image") + { + OString sSource = rWalker.attribute("source"); + rpState->addDrawImage(m_rResourcePath + + OStringToOUString(sSource, RTL_TEXTENCODING_UTF8)); + } rWalker.next(); } rWalker.parent(); @@ -313,10 +320,10 @@ void WidgetDefinitionReader::readPart(tools::XmlWalker& rWalker, bool WidgetDefinitionReader::read(WidgetDefinition& rWidgetDefinition) { - if (!lcl_fileExists(m_rFilePath)) + if (!lcl_fileExists(m_rDefinitionFile)) return false; - SvFileStream aFileStream(m_rFilePath, StreamMode::READ); + SvFileStream aFileStream(m_rDefinitionFile, StreamMode::READ); std::unordered_map<OString, Color*> aStyleColorMap = { { "faceColor", &rWidgetDefinition.maFaceColor }, |