summaryrefslogtreecommitdiff
path: root/desktop
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2015-10-15 09:41:52 +0200
committerMiklos Vajna <vmiklos@collabora.co.uk>2015-10-15 09:42:26 +0200
commitd30f5bc3e65463f28c3087acad6f88e12d60e53b (patch)
tree333687b33c59d1ffb618c431cf013f9f79caf2d3 /desktop
parent396da96d27077ffb0ce670dc28ed24c3f7427e06 (diff)
lok::Document::paintTile: fix non-rectangular tiles wrt. transparency
When copying the alpha channel, the offset was incorrect when canvas width/height did not equal. Change-Id: If0ab3ec7a4ad4dd958419b566fd473732965cfda
Diffstat (limited to 'desktop')
-rw-r--r--desktop/qa/desktop_lib/test_desktop_lib.cxx21
-rw-r--r--desktop/source/lib/init.cxx2
2 files changed, 22 insertions, 1 deletions
diff --git a/desktop/qa/desktop_lib/test_desktop_lib.cxx b/desktop/qa/desktop_lib/test_desktop_lib.cxx
index 28948099b5e3..a8c2015f93fd 100644
--- a/desktop/qa/desktop_lib/test_desktop_lib.cxx
+++ b/desktop/qa/desktop_lib/test_desktop_lib.cxx
@@ -61,6 +61,7 @@ public:
void testGetFilterTypes();
void testGetPartPageRectangles();
void testSearchCalc();
+ void testPaintTile();
CPPUNIT_TEST_SUITE(DesktopLOKTest);
CPPUNIT_TEST(testGetStyles);
@@ -69,6 +70,7 @@ public:
CPPUNIT_TEST(testGetFilterTypes);
CPPUNIT_TEST(testGetPartPageRectangles);
CPPUNIT_TEST(testSearchCalc);
+ CPPUNIT_TEST(testPaintTile);
CPPUNIT_TEST_SUITE_END();
uno::Reference<lang::XComponent> mxComponent;
@@ -280,6 +282,25 @@ void DesktopLOKTest::testSearchCalc()
comphelper::LibreOfficeKit::setActive(false);
}
+void DesktopLOKTest::testPaintTile()
+{
+ LibLODocument_Impl* pDocument = loadDoc("blank_text.odt");
+ int nCanvasWidth = 100;
+ int nCanvasHeight = 300;
+ std::vector<unsigned char> aBuffer(nCanvasWidth * nCanvasHeight * 4);
+ int nTilePosX = 0;
+ int nTilePosY = 0;
+ int nTileWidth = 1000;
+ int nTileHeight = 3000;
+
+ // This used to crash: painTile() implementation did not handle
+ // nCanvasWidth != nCanvasHeight correctly, as usually both are just always
+ // 256.
+ pDocument->pClass->paintTile(pDocument, aBuffer.data(), nCanvasWidth, nCanvasHeight, nTilePosX, nTilePosY, nTileWidth, nTileHeight);
+
+ closeDoc();
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(DesktopLOKTest);
CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index dc738921a04f..8713bb52fd74 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -789,7 +789,7 @@ void doc_paintTile (LibreOfficeKitDocument* pThis,
{
for (int nCol = 0; nCol < nCanvasWidth; ++nCol)
{
- const int nOffset = (nCanvasHeight * nRow) + nCol;
+ const int nOffset = (nCanvasWidth * nRow) + nCol;
// VCL's transparent is 0, RGBA's transparent is 0xff.
pBuffer[nOffset * 4 +3] = 0xff - aAlpha[nOffset];
}