Kaydet (Commit) 98356611 authored tarafından Tomaž Vajngerl's avatar Tomaž Vajngerl Kaydeden (comit) Tomaž Vajngerl

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: 's avatarTomaž Vajngerl <quikee@gmail.com>
üst 5723d303
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
class BitmapEx; class BitmapEx;
class VCL_DLLPUBLIC AlphaMask : private Bitmap class VCL_DLLPUBLIC AlphaMask : public Bitmap
{ {
public: public:
...@@ -51,23 +51,18 @@ public: ...@@ -51,23 +51,18 @@ public:
void SetPrefSize( const Size& rSize ) { Bitmap::SetPrefSize( rSize ); } void SetPrefSize( const Size& rSize ) { Bitmap::SetPrefSize( rSize ); }
Size GetSizePixel() const { return Bitmap::GetSizePixel(); }
BitmapChecksum GetChecksum() const { return Bitmap::GetChecksum(); }
Bitmap const & GetBitmap() const; Bitmap const & GetBitmap() const;
void Erase( sal_uInt8 cTransparency ); void Erase( sal_uInt8 cTransparency );
void Replace( const Bitmap& rMask, sal_uInt8 rReplaceTransparency ); void Replace( const Bitmap& rMask, sal_uInt8 rReplaceTransparency );
void Replace( sal_uInt8 cSearchTransparency, sal_uInt8 cReplaceTransparency ); void Replace( sal_uInt8 cSearchTransparency, sal_uInt8 cReplaceTransparency );
BitmapReadAccess* AcquireReadAccess() { return Bitmap::AcquireReadAccess(); } BitmapReadAccess* AcquireAlphaReadAccess() { return Bitmap::AcquireReadAccess(); }
BitmapWriteAccess* AcquireWriteAccess() { return Bitmap::AcquireWriteAccess(); } BitmapWriteAccess* AcquireAlphaWriteAccess() { return Bitmap::AcquireWriteAccess(); }
void ReleaseAccess( BitmapReadAccess* pAccess ); void ReleaseAccess( BitmapReadAccess* pAccess );
typedef vcl::ScopedBitmapAccess< BitmapReadAccess, AlphaMask, &AlphaMask::AcquireReadAccess > typedef vcl::ScopedBitmapAccess<BitmapReadAccess, AlphaMask, &AlphaMask::AcquireAlphaReadAccess> ScopedReadAccess;
ScopedReadAccess;
using Bitmap::IsEmpty; using Bitmap::IsEmpty;
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
typedef vcl::ScopedBitmapAccess<BitmapWriteAccess, Bitmap, &Bitmap::AcquireWriteAccess> typedef vcl::ScopedBitmapAccess<BitmapWriteAccess, Bitmap, &Bitmap::AcquireWriteAccess>
BitmapScopedWriteAccess; BitmapScopedWriteAccess;
typedef vcl::ScopedBitmapAccess<BitmapWriteAccess, AlphaMask, &AlphaMask::AcquireWriteAccess> typedef vcl::ScopedBitmapAccess<BitmapWriteAccess, AlphaMask, &AlphaMask::AcquireAlphaWriteAccess>
AlphaScopedWriteAccess; AlphaScopedWriteAccess;
class VCL_DLLPUBLIC BitmapWriteAccess : public BitmapReadAccess class VCL_DLLPUBLIC BitmapWriteAccess : public BitmapReadAccess
......
...@@ -28,7 +28,8 @@ enum class DrawCommandType ...@@ -28,7 +28,8 @@ enum class DrawCommandType
{ {
RECTANGLE, RECTANGLE,
CIRCLE, CIRCLE,
LINE LINE,
IMAGE
}; };
class VCL_DLLPUBLIC DrawCommand class VCL_DLLPUBLIC DrawCommand
...@@ -102,6 +103,17 @@ public: ...@@ -102,6 +103,17 @@ public:
} }
}; };
class VCL_DLLPUBLIC ImageDrawCommand : public DrawCommand
{
public:
OUString msSource;
ImageDrawCommand()
: DrawCommand(DrawCommandType::IMAGE)
{
}
};
struct VCL_DLLPUBLIC ControlTypeAndPart struct VCL_DLLPUBLIC ControlTypeAndPart
{ {
ControlType const meType; ControlType const meType;
...@@ -162,6 +174,8 @@ public: ...@@ -162,6 +174,8 @@ public:
void addDrawLine(Color aStrokeColor, sal_Int32 nStrokeWidth, float fX1, float fY1, float fX2, void addDrawLine(Color aStrokeColor, sal_Int32 nStrokeWidth, float fX1, float fY1, float fX2,
float fY2); float fY2);
void addDrawImage(OUString sSource);
}; };
class VCL_DLLPUBLIC WidgetDefinitionPart class VCL_DLLPUBLIC WidgetDefinitionPart
......
...@@ -22,18 +22,19 @@ namespace vcl ...@@ -22,18 +22,19 @@ namespace vcl
class VCL_DLLPUBLIC WidgetDefinitionReader class VCL_DLLPUBLIC WidgetDefinitionReader
{ {
private: private:
OUString m_rFilePath; OUString m_rDefinitionFile;
OUString m_rResourcePath;
static void readDefinition(tools::XmlWalker& rWalker, WidgetDefinition& rWidgetDefinition, void readDefinition(tools::XmlWalker& rWalker, WidgetDefinition& rWidgetDefinition,
ControlType eType); ControlType eType);
static void readPart(tools::XmlWalker& rWalker, std::shared_ptr<WidgetDefinitionPart> rpPart); void readPart(tools::XmlWalker& rWalker, std::shared_ptr<WidgetDefinitionPart> rpPart);
static void readDrawingDefinition(tools::XmlWalker& rWalker, void readDrawingDefinition(tools::XmlWalker& rWalker,
std::shared_ptr<WidgetDefinitionState>& rStates); std::shared_ptr<WidgetDefinitionState>& rStates);
public: public:
WidgetDefinitionReader(OUString const& rFilePath); WidgetDefinitionReader(OUString const& rDefinitionFile, OUString const& rResourcePath);
bool read(WidgetDefinition& rWidgetDefinition); bool read(WidgetDefinition& rWidgetDefinition);
}; };
......
...@@ -43,7 +43,7 @@ void WidgetDefinitionReaderTest::testRead() ...@@ -43,7 +43,7 @@ void WidgetDefinitionReaderTest::testRead()
CPPUNIT_ASSERT_EQUAL(OUString("000000"), aDefinition.maCheckedColor.AsRGBHexString()); CPPUNIT_ASSERT_EQUAL(OUString("000000"), aDefinition.maCheckedColor.AsRGBHexString());
CPPUNIT_ASSERT_EQUAL(OUString("000000"), aDefinition.maLightColor.AsRGBHexString()); CPPUNIT_ASSERT_EQUAL(OUString("000000"), aDefinition.maLightColor.AsRGBHexString());
vcl::WidgetDefinitionReader aReader(getFullUrl("definition1.xml")); vcl::WidgetDefinitionReader aReader(getFullUrl("definition1.xml"), getFullUrl(""));
aReader.read(aDefinition); aReader.read(aDefinition);
CPPUNIT_ASSERT_EQUAL(OUString("123456"), aDefinition.maFaceColor.AsRGBHexString()); CPPUNIT_ASSERT_EQUAL(OUString("123456"), aDefinition.maFaceColor.AsRGBHexString());
......
...@@ -18,6 +18,10 @@ ...@@ -18,6 +18,10 @@
#include <basegfx/range/b2drectangle.hxx> #include <basegfx/range/b2drectangle.hxx>
#include <basegfx/polygon/b2dpolygontools.hxx> #include <basegfx/polygon/b2dpolygontools.hxx>
#include <tools/stream.hxx>
#include <vcl/bitmapex.hxx>
#include <vcl/BitmapTools.hxx>
namespace vcl namespace vcl
{ {
namespace namespace
...@@ -34,7 +38,8 @@ OUString lcl_getThemeDefinitionPath() ...@@ -34,7 +38,8 @@ OUString lcl_getThemeDefinitionPath()
FileDefinitionWidgetDraw::FileDefinitionWidgetDraw(SalGraphics& rGraphics) FileDefinitionWidgetDraw::FileDefinitionWidgetDraw(SalGraphics& rGraphics)
: m_rGraphics(rGraphics) : m_rGraphics(rGraphics)
{ {
WidgetDefinitionReader aReader(lcl_getThemeDefinitionPath() + "definition.xml"); OUString sDefinitionBasePath = lcl_getThemeDefinitionPath();
WidgetDefinitionReader aReader(sDefinitionBasePath + "definition.xml", sDefinitionBasePath);
aReader.read(m_aWidgetDefinition); aReader.read(m_aWidgetDefinition);
ImplSVData* pSVData = ImplGetSVData(); ImplSVData* pSVData = ImplGetSVData();
...@@ -171,6 +176,19 @@ void munchDrawCommands(std::vector<std::shared_ptr<DrawCommand>> const& rDrawCom ...@@ -171,6 +176,19 @@ void munchDrawCommands(std::vector<std::shared_ptr<DrawCommand>> const& rDrawCom
0.0f, false, nullptr); 0.0f, false, nullptr);
} }
break; 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;
} }
} }
} }
......
...@@ -132,6 +132,13 @@ void WidgetDefinitionState::addDrawLine(Color aStrokeColor, sal_Int32 nStrokeWid ...@@ -132,6 +132,13 @@ void WidgetDefinitionState::addDrawLine(Color aStrokeColor, sal_Int32 nStrokeWid
mpDrawCommands.push_back(std::move(pCommand)); 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 } // end vcl namespace
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -164,8 +164,10 @@ bool getControlTypeForXmlString(OString const& rString, ControlType& reType) ...@@ -164,8 +164,10 @@ bool getControlTypeForXmlString(OString const& rString, ControlType& reType)
} // end anonymous namespace } // end anonymous namespace
WidgetDefinitionReader::WidgetDefinitionReader(OUString const& rFilePath) WidgetDefinitionReader::WidgetDefinitionReader(OUString const& rDefinitionFile,
: m_rFilePath(rFilePath) OUString const& rResourcePath)
: m_rDefinitionFile(rDefinitionFile)
, m_rResourcePath(rResourcePath)
{ {
} }
...@@ -260,7 +262,12 @@ void WidgetDefinitionReader::readDrawingDefinition(tools::XmlWalker& rWalker, ...@@ -260,7 +262,12 @@ void WidgetDefinitionReader::readDrawingDefinition(tools::XmlWalker& rWalker,
rpState->addDrawLine(aStrokeColor, nStrokeWidth, fX1, fY1, fX2, fY2); 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.next();
} }
rWalker.parent(); rWalker.parent();
...@@ -313,10 +320,10 @@ void WidgetDefinitionReader::readPart(tools::XmlWalker& rWalker, ...@@ -313,10 +320,10 @@ void WidgetDefinitionReader::readPart(tools::XmlWalker& rWalker,
bool WidgetDefinitionReader::read(WidgetDefinition& rWidgetDefinition) bool WidgetDefinitionReader::read(WidgetDefinition& rWidgetDefinition)
{ {
if (!lcl_fileExists(m_rFilePath)) if (!lcl_fileExists(m_rDefinitionFile))
return false; return false;
SvFileStream aFileStream(m_rFilePath, StreamMode::READ); SvFileStream aFileStream(m_rDefinitionFile, StreamMode::READ);
std::unordered_map<OString, Color*> aStyleColorMap = { std::unordered_map<OString, Color*> aStyleColorMap = {
{ "faceColor", &rWidgetDefinition.maFaceColor }, { "faceColor", &rWidgetDefinition.maFaceColor },
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment