Return a bitmap buffer for tiled rendering from LibLO.

We still need some way of managing the buffers properly rather
than just keeping a static reference to the last buffer
that was rendered.

Change-Id: I17940c758948aa9418f4e0216ecd253d128cd04f
This commit is contained in:
Andrzej Hunt
2014-05-16 09:07:52 +01:00
parent 3a26638155
commit 0434043aed
7 changed files with 56 additions and 32 deletions

View File

@@ -15,6 +15,7 @@ $(eval $(call gb_Library_set_include,sofficeapp,\
-I$(SRCDIR)/desktop/source/inc \
-I$(SRCDIR)/desktop/source/deployment/inc \
-I$(SRCDIR)/sw/inc \
-I$(SRCDIR)/vcl/inc \
))
$(eval $(call gb_Library_use_external,sofficeapp,boost_headers))
@@ -35,6 +36,7 @@ $(eval $(call gb_Library_add_defs,sofficeapp,\
$(eval $(call gb_Library_set_precompiled_header,sofficeapp,$(SRCDIR)/desktop/inc/pch/precompiled_sofficeapp))
$(eval $(call gb_Library_use_libraries,sofficeapp,\
basebmp \
comphelper \
cppu \
cppuhelper \

View File

@@ -54,7 +54,7 @@ bool drawCallback(GtkWidget* pCanvas, void* /* cairo_t* cr */, gpointer pData)
GDK_VISUAL_XVISUAL( gtk_widget_get_visual( pCanvas ) ) );
// Hardcoded tile just to see whether or not we get any sort of output.
pDocument->paintTile( &aSystemGraphicsData, 256, 256, 0, 0, 5000, 5000 );
pDocument->paintTile( 256, 256, 0, 0, 5000, 5000 );
return true;
}

View File

@@ -53,6 +53,11 @@
#include <unotxdoc.hxx>
#include <viewsh.hxx>
// And let's also grab the SvpSalVirtualDevice
#include <headless/svpvd.hxx>
#include <basebmp/bitmapdevice.hxx>
using namespace css;
using namespace utl;
@@ -167,7 +172,7 @@ static int doc_saveAs(LibreOfficeKitDocument* pThis, const char* pUrl, const ch
static LibreOfficeKitDocumentType doc_getDocumentType(LibreOfficeKitDocument* pThis);
static int doc_getNumberOfParts(LibreOfficeKitDocument* pThis);
static void doc_setPart(LibreOfficeKitDocument* pThis, int nPart);
static void doc_paintTile(LibreOfficeKitDocument* pThis, void* pCanvas,
static unsigned char* doc_paintTile(LibreOfficeKitDocument* pThis,
const int nCanvasWidth, const int nCanvasHeight,
const int nTilePosX, const int nTilePosY,
const int nTileWidth, const int nTileHeight);
@@ -378,27 +383,39 @@ static void doc_setPart(LibreOfficeKitDocument* pThis, int nPart)
(void) nPart;
}
static void doc_paintTile (LibreOfficeKitDocument* pThis, void* pCanvas,
// TODO: Temporary hack -- we need to keep the buffer alive while we paint it
// in the gtk tiled viewer -- we can't pass out the shared_array through
// the C interface, so maybe we want some sort of wrapper where we can return
// a handle which we then associate with a given shared_array within LibLO
// (where the client then has to tell us when they are finished with using
// the buffer).
boost::shared_array< sal_uInt8 > ourBuffer;
// TODO: Not 100% sure about the bitmap buffer format yet -- it appears
// to just be RGB, 8 bits per sample, and vertically mirrored compared
// to what gtk expects.
// The BitmapDevice actually supports various formats, as detailed in
// basebmp/scanlineformat.hxx -- for svp SVP_DEFAULT_BITMAP_FORMAT is seemingly used
// (see creation in svpvd.cxx) -- which is simply FORMAT_TWENTYFOUR_BIT_TC_MASK
// for now -- we could probably adjust this as necessary to get whatever
// format is presumably most useful, or maybe even allow that as a parameter.
//
// It's actually possible to set the depth in the creation of a VirtualDevice,
// however that only allows 0, 1 or 8 -- and we can't select the full range of formats
// as above, so we'd need to add a way of setting the format entirely from scratch
// should that be deemed necessary.
//
// We probably also want to use getScanlineStride() -- I'm guessing that
// this is where we are actually just returning a sub-portion of a larger buffer
// which /shouldn't/ apply in our case, but better to be safe here.
static unsigned char* doc_paintTile (LibreOfficeKitDocument* pThis,
const int nCanvasWidth, const int nCanvasHeight,
const int nTilePosX, const int nTilePosY,
const int nTileWidth, const int nTileHeight)
{
LibLODocument_Impl* pDocument = static_cast<LibLODocument_Impl*>(pThis);
// We can't use this on anything but Linux for now, so the following is
// likely unusable for now.
SystemGraphicsData aSystemGraphicsData;
#if defined( WNT )
aSystemGraphicsData.hDC = *static_cast< HDC* >(pCanvas);
#elif defined( MACOSX )
aSystemGraphicsData.rCGContext = *static_cast< CGContextRef* >(pCanvas);
#elif defined( ANDROID )
assert(false); // We can't use tiled rendering on Android in any case yet...
#elif defined( IOS )
aSystemGraphicsData.rCGContext = *static_cast< CGContextRef* >(pCanvas);
#elif defined( UNX )
aSystemGraphicsData = *static_cast< SystemGraphicsData*> (pCanvas);
#endif
unsigned char* pRet = 0;
Application::AcquireSolarMutex(1);
{
@@ -407,11 +424,21 @@ static void doc_paintTile (LibreOfficeKitDocument* pThis, void* pCanvas,
SwDoc* pDoc = pDocShell->GetDoc();
SwViewShell* pViewShell = pDoc->GetCurrentViewShell();
VirtualDevice aDevice(&aSystemGraphicsData, (sal_uInt16)0);
VirtualDevice aDevice(0, (sal_uInt16)0);
pViewShell->PaintTile(aDevice, nCanvasWidth, nCanvasHeight,
nTilePosX, nTilePosY, nTileWidth, nTileHeight);
SvpSalVirtualDevice* pSalDev = static_cast< SvpSalVirtualDevice* >(aDevice.getSalVirtualDevice());
basebmp::BitmapDeviceSharedPtr pBmpDev = pSalDev->getBitmapDevice();
ourBuffer = pBmpDev->getBuffer();
pRet = ourBuffer.get();
}
Application::ReleaseSolarMutex();
return pRet;
}
static char* lo_getError (LibreOfficeKit *pThis)

View File

@@ -85,16 +85,8 @@ struct _LibreOfficeKitDocumentClass
void (*setPart) (LibreOfficeKitDocument* pThis,
int nPart);
// pCanvas is a pointer to the appropriate type of graphics object:
// Windows: HDC
// iOS/OSX: CGContextRef
// Unx: A full SystemGraphicsData
// (This is as we need multiple pieces of data on Unx -- in the future
// it would potentially be best to define our own simple equivalent
// structure here which can then be copied into a SystemGraphicsData
// within the paintTile implementation.)
void (*paintTile) (LibreOfficeKitDocument* pThis,
void* Canvas,
// Get a pointer to a raw array, of size 3*nCanvasWidth*nCanvasHeight
unsigned char* (*paintTile) (LibreOfficeKitDocument* pThis,
const int nCanvasWidth,
const int nCanvasHeight,
const int nTilePosX,

View File

@@ -59,16 +59,15 @@ public:
mpDoc->pClass->setPart(mpDoc, nPart);
}
inline void paintTile(void* pHandle,
const int nCanvasWidth,
inline unsigned char* paintTile(const int nCanvasWidth,
const int nCanvasHeight,
const int nTilePosX,
const int nTilePosY,
const int nTileWidth,
const int nTileHeight)
{
mpDoc->pClass->paintTile(mpDoc, pHandle, nCanvasWidth, nCanvasHeight,
nTilePosX, nTilePosY, nTileWidth, nTileHeight);
return mpDoc->pClass->paintTile(mpDoc, nCanvasWidth, nCanvasHeight,
nTilePosX, nTilePosY, nTileWidth, nTileHeight);
}
#endif // LOK_USE_UNSTABLE_API
};

View File

@@ -66,6 +66,8 @@ protected:
virtual void ReleaseGraphics( bool bRelease = true ) SAL_OVERRIDE;
public:
SalVirtualDevice* getSalVirtualDevice() { return mpVirDev; }
/** Create a virtual device of size 1x1
@param nBitCount

View File

@@ -47,6 +47,8 @@ public:
virtual bool SetSize( long nNewDX, long nNewDY ) SAL_OVERRIDE;
virtual bool SetSizeUsingBuffer( long nNewDX, long nNewDY, const basebmp::RawMemorySharedArray &pBuffer ) SAL_OVERRIDE;
virtual void GetSize( long& rWidth, long& rHeight ) SAL_OVERRIDE;
basebmp::BitmapDeviceSharedPtr getBitmapDevice() { return m_aDevice; }
};
#endif // INCLUDED_VCL_INC_HEADLESS_SVPVD_HXX