[Libreoffice-commits] core.git: Branch 'feature/calctiledrendering3' - 3 commits - desktop/source libreofficekit/CppunitTest_libreofficekit_tiledrendering.mk libreofficekit/qa sd/source
Andrzej Hunt
andrzej.hunt at collabora.com
Fri Jul 11 07:10:59 PDT 2014
desktop/source/lib/init.cxx | 6 -
libreofficekit/CppunitTest_libreofficekit_tiledrendering.mk | 3
libreofficekit/qa/unit/tiledrendering.cxx | 25 ++++
sd/source/ui/unoidl/unomodel.cxx | 65 ++++++++++--
4 files changed, 87 insertions(+), 12 deletions(-)
New commits:
commit b33469fc41b798cf151d26f27ced85d73663c459
Author: Andrzej Hunt <andrzej.hunt at collabora.com>
Date: Fri Jul 11 16:10:58 2014 +0200
Impress: implement tiled rendering.
However we cannot as of yet select between rendering just the slide,
just the notes, or both combined -- this simply defaults to whatever
mode the document was last opened in for now.
Change-Id: Ia8ec0280aab75a36e430aa04c47cee4fea2db974
diff --git a/sd/source/ui/unoidl/unomodel.cxx b/sd/source/ui/unoidl/unomodel.cxx
index 74133b8..ec22916 100644
--- a/sd/source/ui/unoidl/unomodel.cxx
+++ b/sd/source/ui/unoidl/unomodel.cxx
@@ -87,6 +87,7 @@
#include <unokywds.hxx>
#include "FrameView.hxx"
#include "ClientView.hxx"
+#include "DrawViewShell.hxx"
#include "ViewShell.hxx"
#include "app.hrc"
#include <vcl/pdfextoutdevdata.hxx>
@@ -108,6 +109,7 @@
using namespace ::osl;
using namespace ::cppu;
using namespace ::com::sun::star;
+using namespace ::sd;
class SdUnoForbiddenCharsTable : public SvxUnoForbiddenCharsTable,
public SfxListener
@@ -2190,33 +2192,76 @@ void SdXImpressDocument::paintTile( VirtualDevice& rDevice,
int nTilePosX, int nTilePosY,
long nTileWidth, long nTileHeight )
{
- (void) rDevice;
- (void) nOutputWidth;
- (void) nOutputHeight;
- (void) nTilePosX;
- (void) nTilePosY;
- (void) nTileWidth;
- (void) nTileHeight;
+ // Scaling. Must convert from pixels to twips. We know
+ // that VirtualDevices use a DPI of 96.
+ // We specifically calculate these scales first as we're still
+ // in TWIPs, and might as well minimise the number of conversions.
+ Fraction scaleX = Fraction( nOutputWidth, 96 ) * Fraction(1440L) /
+ Fraction( nTileWidth);
+ Fraction scaleY = Fraction( nOutputHeight, 96 ) * Fraction(1440L) /
+ Fraction( nTileHeight);
+
+ // svx seems to be the only component that works natively in
+ // 100th mm rather than TWIP. It makes most sense just to
+ // convert here and in getDocumentSize, and leave the tiled
+ // rendering API working in TWIPs.
+ nTileWidth = nTileWidth * 2540l / 1440l;
+ nTileHeight = nTileHeight * 2540l / 1440l;
+ nTilePosX = nTilePosX * 2540l / 1440l;
+ nTilePosY = nTilePosY * 2540l / 1440l;
+
+ MapMode aMapMode = rDevice.GetMapMode();
+ aMapMode.SetMapUnit( MAP_100TH_MM );
+ aMapMode.SetOrigin( Point( -nTilePosX,
+ -nTilePosY) );
+ aMapMode.SetScaleX( scaleX );
+ aMapMode.SetScaleY( scaleY );
+
+ rDevice.SetMapMode( aMapMode );
+
+ rDevice.SetOutputSizePixel( Size(nOutputWidth, nOutputHeight) );
+ mpDoc->GetDocSh()->GetViewShell()->GetView()->CompleteRedraw(
+ &rDevice,
+ Region(
+ Rectangle( Point( nTilePosX, nTilePosY ),
+ Size( nTileWidth, nTileHeight ) ) ) );
+
+ // TODO: Set page kind in frameview?
}
void SdXImpressDocument::setPart( int nPart )
{
- (void) nPart;
+ DrawViewShell* pViewSh = dynamic_cast< DrawViewShell* >( mpDoc->GetDocSh()->GetViewShell() );
+ if (pViewSh)
+ {
+ pViewSh->SwitchPage( nPart );
+ }
}
int SdXImpressDocument::getParts()
{
- return mpDoc->GetPageCount();
+ // TODO: master pages?
+ // Read: drviews1.cxx
+ return mpDoc->GetSdPageCount(PK_STANDARD);
}
int SdXImpressDocument::getPart()
{
+ DrawViewShell* pViewSh = dynamic_cast< DrawViewShell* >( mpDoc->GetDocSh()->GetViewShell() );
+ if (pViewSh)
+ {
+ return pViewSh->GetCurPageId();
+ }
return 0;
}
Size SdXImpressDocument::getDocumentSize()
{
- return Size( 100, 100 );
+ SdrPageView* pCurPageView = mpDoc->GetDocSh()->GetViewShell()->GetView()->GetSdrPageView();
+ Size aSize = pCurPageView->GetPageRect().GetSize();
+ // Convert the size in 100th mm to TWIP
+ // See paintTile above for further info.
+ return Size( aSize.getWidth() * 1440l / 2540l, aSize.getHeight() * 1440l / 2540l );
}
commit 0ff0b9c0310d1541d1a7d02c2cc222da9191479b
Author: Andrzej Hunt <andrzej.hunt at collabora.com>
Date: Fri Jul 11 16:09:30 2014 +0200
LOK: use solar mutex for setPart.
Needed e.g. for changing slides in impress.
Change-Id: I2f5de40d4efbacde910e27225768979a98ff1c0a
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index 7b6197a..da551b4 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -461,7 +461,11 @@ static void doc_setPart(LibreOfficeKitDocument* pThis, int nPart)
return;
}
- pDoc->setPart( nPart );
+ Application::AcquireSolarMutex(1);
+ {
+ pDoc->setPart( nPart );
+ }
+ Application::ReleaseSolarMutex();
}
void doc_paintTile (LibreOfficeKitDocument* pThis,
commit b360f9e0864f9b370f917d7bb846746cf122d40b
Author: Andrzej Hunt <andrzej.hunt at collabora.com>
Date: Fri Jul 11 10:23:15 2014 +0200
Add png dumping to LOK tiled rendering test.
This allows for easier visual comparisons (i.e. currently the test
would be failing for some tiles).
Change-Id: I5b174375b57ffe0edd2700fdec411a83669e4a34
diff --git a/libreofficekit/CppunitTest_libreofficekit_tiledrendering.mk b/libreofficekit/CppunitTest_libreofficekit_tiledrendering.mk
index 3c41c0a..4b77fbf 100644
--- a/libreofficekit/CppunitTest_libreofficekit_tiledrendering.mk
+++ b/libreofficekit/CppunitTest_libreofficekit_tiledrendering.mk
@@ -21,9 +21,10 @@ $(eval $(call gb_CppunitTest_use_external,libreofficekit_tiledrendering,boost_he
# 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 \
+ tl \
+ test \
vcl \
$(gb_UWINAPI) \
))
diff --git a/libreofficekit/qa/unit/tiledrendering.cxx b/libreofficekit/qa/unit/tiledrendering.cxx
index 1cc93f7..3fda443 100644
--- a/libreofficekit/qa/unit/tiledrendering.cxx
+++ b/libreofficekit/qa/unit/tiledrendering.cxx
@@ -16,6 +16,10 @@
#include <string>
#include <sal/types.h>
+#include <tools/stream.hxx>
+#include <vcl/salbtype.hxx>
+#include <vcl/bmpacc.hxx>
+#include <vcl/pngwrite.hxx>
#define LOK_USE_UNSTABLE_API
#include <LibreOfficeKit/LibreOfficeKit.hxx>
@@ -39,6 +43,23 @@ public:
CPPUNIT_TEST_SUITE_END();
};
+// Our dumped .png files end up in
+// workdir/CppunitTest/libreofficekit_tiledrendering.test.core
+
+static void dumpRGBABitmap( const OUString& rPath, const unsigned char* pBuffer,
+ const int nWidth, const int nHeight )
+{
+ Bitmap aBitmap( Size( nWidth, nHeight ), 32 );
+ Bitmap::ScopedWriteAccess pWriteAccess( aBitmap );
+ memcpy( pWriteAccess->GetBuffer(), pBuffer, 4*nWidth*nHeight );
+
+ BitmapEx aBitmapEx( aBitmap );
+ vcl::PNGWriter aWriter( aBitmapEx );
+ SvFileStream sOutput( rPath, STREAM_WRITE );
+ aWriter.Write( sOutput );
+ sOutput.Close();
+}
+
void TiledRenderingTest::testOverlay()
{
const string sSrcRoot = getenv( "SRC_ROOT" );
@@ -73,6 +94,8 @@ void TiledRenderingTest::testOverlay()
pDocument->paintTile( pLarge.get(), nTotalWidthPix, nTotalHeightPix, &nRowStride,
0, 0,
nTotalWidthDoc, nTotalHeightDoc );
+ dumpRGBABitmap( "large.png", pLarge.get(), nTotalWidthPix, nTotalHeightPix );
+
scoped_array< unsigned char > pSmall[4];
for ( int i = 0; i < 4; i++ )
{
@@ -81,6 +104,8 @@ void TiledRenderingTest::testOverlay()
// 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);
+ dumpRGBABitmap( "small_" + OUString::number(i) + ".png",
+ pSmall[i].get(), nTotalWidthPix/2, nTotalHeightPix/2 );
}
// Iterate over each pixel of the sub-tile, and compare that pixel for every
More information about the Libreoffice-commits
mailing list