summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrzej Hunt <andrzej.hunt@collabora.com>2014-07-11 09:12:27 +0200
committerAndrzej Hunt <andrzej.hunt@collabora.com>2014-07-11 16:29:28 +0200
commit75837dfefaef467dbf8813fbf12d8f4348a9b333 (patch)
treeca2a97e50e62004baf6ddde2ff840700c8aed504
parent1a163ed10084c696601bfaad33c8fc0668294e26 (diff)
Add LOK tiled rendering divided-tile unit test.
I.e. we render the same area as one larger tile, and then as 4 sub-tiles (which, when put together, should be identical to the larger tile). However currently only the top-left sub-tile actually matches the larger tile, so we have to disable the test for the remaining sub-tiles. Change-Id: If1130022b43898e20fefff3e9f592102da3e413a
-rw-r--r--libreofficekit/CppunitTest_libreofficekit_tiledrendering.mk56
-rw-r--r--libreofficekit/Module_libreofficekit.mk4
-rw-r--r--libreofficekit/qa/unit/tiledrendering.cxx111
3 files changed, 171 insertions, 0 deletions
diff --git a/libreofficekit/CppunitTest_libreofficekit_tiledrendering.mk b/libreofficekit/CppunitTest_libreofficekit_tiledrendering.mk
new file mode 100644
index 000000000000..3c41c0a811d3
--- /dev/null
+++ b/libreofficekit/CppunitTest_libreofficekit_tiledrendering.mk
@@ -0,0 +1,56 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#*************************************************************************
+#
+# 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/.
+#
+#*************************************************************************
+
+$(eval $(call gb_CppunitTest_CppunitTest,libreofficekit_tiledrendering))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,libreofficekit_tiledrendering, \
+ libreofficekit/qa/unit/tiledrendering \
+))
+
+$(eval $(call gb_CppunitTest_use_external,libreofficekit_tiledrendering,boost_headers))
+
+# We need all these libraries / etc. due for CppunitTest to work, even though
+# our test specifically tests LOK only functionality which would otherwise not
+# require any normal LO api/libraries.
+$(eval $(call gb_CppunitTest_use_libraries,libreofficekit_tiledrendering, \
+ test \
+ cppu \
+ sal \
+ vcl \
+ $(gb_UWINAPI) \
+))
+
+
+# unotest \
+
+ifeq ($(OS),LINUX)
+$(eval $(call gb_CppunitTest_add_libs,libreofficekit_tiledrendering,\
+ -lm \
+ -ldl \
+ -lpthread \
+))
+endif
+
+$(eval $(call gb_CppunitTest_use_sdk_api,libreofficekit_tiledrendering))
+
+$(eval $(call gb_CppunitTest_use_static_libraries,libreofficekit_tiledrendering,\
+ libreofficekit \
+))
+
+$(eval $(call gb_CppunitTest_use_ure,libreofficekit_tiledrendering))
+#$(eval $(call gb_CppunitTest_use_vcl,libreofficekit_tiledrendering))
+
+# Depend on ~everything, as tiled rendering can use most parts of LO.
+$(eval $(call gb_CppunitTest_use_rdb,libreofficekit_tiledrendering,services))
+
+$(eval $(call gb_CppunitTest_use_configuration,libreofficekit_tiledrendering))
+
+# vim: set noet sw=4 ts=4:
diff --git a/libreofficekit/Module_libreofficekit.mk b/libreofficekit/Module_libreofficekit.mk
index b349a5d29b0a..2d9b98cc4762 100644
--- a/libreofficekit/Module_libreofficekit.mk
+++ b/libreofficekit/Module_libreofficekit.mk
@@ -15,6 +15,10 @@ $(eval $(call gb_Module_add_targets,libreofficekit,\
StaticLibrary_libreofficekit \
))
+$(eval $(call gb_Module_add_check_targets,libreofficekit,\
+ CppunitTest_libreofficekit_tiledrendering \
+))
+
ifneq ($(ENABLE_GTK),)
$(eval $(call gb_Module_add_targets,libreofficekit,\
Library_libreofficekitgtk \
diff --git a/libreofficekit/qa/unit/tiledrendering.cxx b/libreofficekit/qa/unit/tiledrendering.cxx
new file mode 100644
index 000000000000..1cc93f798edd
--- /dev/null
+++ b/libreofficekit/qa/unit/tiledrendering.cxx
@@ -0,0 +1,111 @@
+/* -*- 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 <boost/scoped_array.hpp>
+#include <boost/scoped_ptr.hpp>
+#include <cppunit/TestFixture.h>
+#include <cppunit/plugin/TestPlugIn.h>
+#include <cppunit/extensions/HelperMacros.h>
+#include <cstdlib>
+#include <string>
+
+#include <sal/types.h>
+
+#define LOK_USE_UNSTABLE_API
+#include <LibreOfficeKit/LibreOfficeKit.hxx>
+
+using namespace ::boost;
+using namespace ::lok;
+using namespace ::std;
+
+// We specifically don't use the usual BootStrapFixture, as LOK does
+// all it's own setup and bootstrapping, and should be useable in a
+// raw C++ program.
+class TiledRenderingTest : public ::CppUnit::TestFixture
+{
+public:
+ TiledRenderingTest() {}
+
+ void testOverlay();
+
+ CPPUNIT_TEST_SUITE(TiledRenderingTest);
+ CPPUNIT_TEST(testOverlay);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+void TiledRenderingTest::testOverlay()
+{
+ const string sSrcRoot = getenv( "SRC_ROOT" );
+ const string sLOPath = sSrcRoot + "/instdir/program";
+ const string sDocPath = sSrcRoot + "/odk/examples/java/DocumentHandling/test/test1.odt";
+
+ scoped_ptr< Office > pOffice( lok_cpp_init(
+ sLOPath.c_str() ) );
+ scoped_ptr< Document> pDocument( pOffice->documentLoad(
+ sDocPath.c_str() ) );
+
+ // We render one large tile, then subdivide it into 4 and render those parts, and finally
+ // iterate over each smaller tile and check whether their contents match the large
+ // tile.
+ const int nTotalWidthPix = 512;
+ const int nTotalHeightPix = 512;
+ int nRowStride;
+
+ long nTotalWidthDoc;
+ long nTotalHeightDoc;
+ // pDocument->getDocumentSize( &nTotalWidthDoc, &nTotalHeightDoc );
+ // TODO: make sure we select an actually interesting part of the document
+ // for this comparison, i.e. ideally an image and lots of text, in order
+ // to test as many edge cases as possible.
+ // Alternatively we could rewrite this to actually grab the document size
+ // and iterate over it (subdividing into an arbitrary number of tiles rather
+ // than our less sophisticated test of just 4 sub-tiles).
+ nTotalWidthDoc = 8000;
+ nTotalHeightDoc = 9000;
+
+ scoped_array< unsigned char > pLarge( new unsigned char[ 4*nTotalWidthPix*nTotalHeightPix ] );
+ pDocument->paintTile( pLarge.get(), nTotalWidthPix, nTotalHeightPix, &nRowStride,
+ 0, 0,
+ nTotalWidthDoc, nTotalHeightDoc );
+ scoped_array< unsigned char > pSmall[4];
+ for ( int i = 0; i < 4; i++ )
+ {
+ pSmall[i].reset( new unsigned char[ 4*(nTotalWidthPix/2)*(nTotalHeightPix/2) ] );
+ pDocument->paintTile( pSmall[i].get(), nTotalWidthPix / 2, nTotalHeightPix / 2, &nRowStride,
+ // Tile 0/2: left. Tile 1/3: right. Tile 0/1: top. Tile 2/3: bottom
+ ((i%2 == 0) ? 0 : nTotalWidthDoc / 2), ((i < 2 ) ? 0 : nTotalHeightDoc / 2),
+ nTotalWidthDoc / 2, nTotalHeightDoc / 2);
+ }
+
+ // Iterate over each pixel of the sub-tile, and compare that pixel for every
+ // tile with the equivalent super-tile pixel.
+ for ( int i = 0; i < 4*nTotalWidthPix / 2 * nTotalHeightPix / 2; i++ )
+ {
+ int xSmall = i % (4*nTotalWidthPix/2);
+ int ySmall = i / (4*nTotalWidthPix/2);
+ // Iterate over our array of tiles
+ // However for now we only bother with the top-left
+ // tile as the other ones don't match yet...
+ for ( int x = 0; x < 1; x++ )
+ {
+ for ( int y = 0; y < 1; y++ )
+ {
+ int xLarge = (x * (4 * nTotalWidthPix / 2)) + xSmall;
+ int yLarge = (y * (nTotalHeightPix / 2)) + ySmall;
+ CPPUNIT_ASSERT( pSmall[2*y+x][i] == pLarge[yLarge*4*nTotalWidthPix + xLarge] );
+ }
+ }
+ }
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(TiledRenderingTest);
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */