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 @@
class BitmapEx;
class VCL_DLLPUBLIC AlphaMask : private Bitmap
class VCL_DLLPUBLIC AlphaMask : public Bitmap
{
public:
......@@ -51,23 +51,18 @@ public:
void SetPrefSize( const Size& rSize ) { Bitmap::SetPrefSize( rSize ); }
Size GetSizePixel() const { return Bitmap::GetSizePixel(); }
BitmapChecksum GetChecksum() const { return Bitmap::GetChecksum(); }
Bitmap const & GetBitmap() const;
void Erase( sal_uInt8 cTransparency );
void Replace( const Bitmap& rMask, sal_uInt8 rReplaceTransparency );
void Replace( sal_uInt8 cSearchTransparency, sal_uInt8 cReplaceTransparency );
BitmapReadAccess* AcquireReadAccess() { return Bitmap::AcquireReadAccess(); }
BitmapWriteAccess* AcquireWriteAccess() { return Bitmap::AcquireWriteAccess(); }
BitmapReadAccess* AcquireAlphaReadAccess() { return Bitmap::AcquireReadAccess(); }
BitmapWriteAccess* AcquireAlphaWriteAccess() { return Bitmap::AcquireWriteAccess(); }
void ReleaseAccess( BitmapReadAccess* pAccess );
typedef vcl::ScopedBitmapAccess< BitmapReadAccess, AlphaMask, &AlphaMask::AcquireReadAccess >
ScopedReadAccess;
typedef vcl::ScopedBitmapAccess<BitmapReadAccess, AlphaMask, &AlphaMask::AcquireAlphaReadAccess> ScopedReadAccess;
using Bitmap::IsEmpty;
......
......@@ -19,7 +19,7 @@
typedef vcl::ScopedBitmapAccess<BitmapWriteAccess, Bitmap, &Bitmap::AcquireWriteAccess>
BitmapScopedWriteAccess;
typedef vcl::ScopedBitmapAccess<BitmapWriteAccess, AlphaMask, &AlphaMask::AcquireWriteAccess>
typedef vcl::ScopedBitmapAccess<BitmapWriteAccess, AlphaMask, &AlphaMask::AcquireAlphaWriteAccess>
AlphaScopedWriteAccess;
class VCL_DLLPUBLIC BitmapWriteAccess : public BitmapReadAccess
......
......@@ -28,7 +28,8 @@ enum class DrawCommandType
{
RECTANGLE,
CIRCLE,
LINE
LINE,
IMAGE
};
class VCL_DLLPUBLIC DrawCommand
......@@ -102,6 +103,17 @@ public:
}
};
class VCL_DLLPUBLIC ImageDrawCommand : public DrawCommand
{
public:
OUString msSource;
ImageDrawCommand()
: DrawCommand(DrawCommandType::IMAGE)
{
}
};
struct VCL_DLLPUBLIC ControlTypeAndPart
{
ControlType const meType;
......@@ -162,6 +174,8 @@ public:
void addDrawLine(Color aStrokeColor, sal_Int32 nStrokeWidth, float fX1, float fY1, float fX2,
float fY2);
void addDrawImage(OUString sSource);
};
class VCL_DLLPUBLIC WidgetDefinitionPart
......
......@@ -22,18 +22,19 @@ namespace vcl
class VCL_DLLPUBLIC WidgetDefinitionReader
{
private:
OUString m_rFilePath;
OUString m_rDefinitionFile;
OUString m_rResourcePath;
static void readDefinition(tools::XmlWalker& rWalker, WidgetDefinition& rWidgetDefinition,
ControlType eType);
void readDefinition(tools::XmlWalker& rWalker, WidgetDefinition& rWidgetDefinition,
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,
std::shared_ptr<WidgetDefinitionState>& rStates);
void readDrawingDefinition(tools::XmlWalker& rWalker,
std::shared_ptr<WidgetDefinitionState>& rStates);
public:
WidgetDefinitionReader(OUString const& rFilePath);
WidgetDefinitionReader(OUString const& rDefinitionFile, OUString const& rResourcePath);
bool read(WidgetDefinition& rWidgetDefinition);
};
......
......@@ -43,7 +43,7 @@ void WidgetDefinitionReaderTest::testRead()
CPPUNIT_ASSERT_EQUAL(OUString("000000"), aDefinition.maCheckedColor.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);
CPPUNIT_ASSERT_EQUAL(OUString("123456"), aDefinition.maFaceColor.AsRGBHexString());
......
......@@ -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;
}
}
}
......
......@@ -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: */
......@@ -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 },
......
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