#i10000# take version form canvas05 (thb)
This commit is contained in:
parent
a73452e618
commit
447b3a5eaf
5 changed files with 796 additions and 516 deletions
|
@ -7,8 +7,7 @@
|
|||
* OpenOffice.org - a multi-platform office productivity suite
|
||||
*
|
||||
* $RCSfile: cairo_quartz_cairo.cxx,v $
|
||||
*
|
||||
* $Revision: 1.3 $
|
||||
* $Revision: 1.4 $
|
||||
*
|
||||
* This file is part of OpenOffice.org.
|
||||
*
|
||||
|
@ -29,11 +28,9 @@
|
|||
*
|
||||
************************************************************************/
|
||||
|
||||
|
||||
// MARKER(update_precomp.py): autogen include statement, do not remove
|
||||
#include "precompiled_canvas.hxx"
|
||||
|
||||
|
||||
#ifdef QUARTZ
|
||||
/************************************************************************
|
||||
* Mac OS X/Quartz surface backend for OpenOffice.org Cairo Canvas *
|
||||
|
@ -45,154 +42,302 @@
|
|||
|
||||
#if defined CAIRO_HAS_QUARTZ_SURFACE
|
||||
|
||||
// premac.h/postmac.h needed because cairo-quartz.h includes Carbon/Carbon.h
|
||||
#include "premac.h"
|
||||
#include <cairo-quartz.h>
|
||||
#include "postmac.h"
|
||||
#include "cairo_quartz_cairo.hxx"
|
||||
|
||||
namespace cairo
|
||||
{
|
||||
/**
|
||||
* Surface::Surface: Create generic Canvas surface using given Cairo Surface
|
||||
*
|
||||
* @param pSurface Cairo Surface
|
||||
*
|
||||
* This constructor only stores data, it does no processing.
|
||||
* It is used with e.g. cairo_image_surface_create_for_data()
|
||||
* and Surface::getSimilar()
|
||||
*
|
||||
* Set the mpSurface to the new surface or NULL
|
||||
**/
|
||||
Surface::Surface( cairo_surface_t* pSurface )
|
||||
: mnRefCount( 1 ),
|
||||
mpSurface( pSurface )
|
||||
bool IsCairoWorking( OutputDevice* )
|
||||
{
|
||||
// Necessary, context is lost otherwise
|
||||
CGContextRetain( cairo_quartz_surface_get_cg_context(pSurface) ); // == NULL for non-native surfaces
|
||||
// trivially true for Mac
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Surface::Surface: Create Canvas surface from Window reference.
|
||||
* @param pSysData Platform native system environment data (struct SystemEnvData in vcl/inc/sysdata.hxx)
|
||||
* @param x horizontal location of the new surface
|
||||
* @param y vertical location of the new surface
|
||||
* @param width width of the new surface
|
||||
* @param height height of the new surface
|
||||
*
|
||||
* pSysData contains the platform native Window reference.
|
||||
* pSysData is used to create a surface on the Window
|
||||
*
|
||||
* Set the mpSurface to the new surface or NULL
|
||||
**/
|
||||
Surface::Surface( const SystemEnvData* pSysData, int x, int y, int width, int height )
|
||||
: mnRefCount( 1 ),
|
||||
mpSurface( NULL )
|
||||
/**
|
||||
* QuartzSurface::Surface: Create generic Canvas surface using given Cairo Surface
|
||||
*
|
||||
* @param pSurface Cairo Surface
|
||||
*
|
||||
* This constructor only stores data, it does no processing.
|
||||
* It is used with e.g. cairo_image_surface_create_for_data()
|
||||
* and QuartzSurface::getSimilar()
|
||||
*
|
||||
* Set the mpSurface to the new surface or NULL
|
||||
**/
|
||||
QuartzSurface::QuartzSurface( const CairoSurfaceSharedPtr& pSurface ) :
|
||||
mpView(NULL),
|
||||
mpSurface( pSurface )
|
||||
{
|
||||
OSL_TRACE("Canvas::cairo::Surface(const void*, x:%d, y:%d, w:%d, h:%d): New Surface for window", x, y, width, height);
|
||||
|
||||
// on Mac OS X / Quartz we are not drawing directly to the screen, but via regular CGContextRef.
|
||||
// The actual drawing to NSView (i.e. screen) is done in Surface::flush()
|
||||
|
||||
// HACK: currently initial size for windowsurface is 0x0, which is not possible for us.
|
||||
if (width == 0 || height == 0) {
|
||||
NSView* mpView = (NSView *) pSysData->pView;
|
||||
width = [mpView bounds].size.width;
|
||||
height = [mpView bounds].size.height;
|
||||
OSL_TRACE("Canvas::cairo::Surface(): BUG!! size is ZERO! fixing to %d x %d...", width, height);
|
||||
}
|
||||
|
||||
// create a generic surface. Although View/Window is ARGB32, we however do all drawing => RGB24
|
||||
mpSurface = cairo_quartz_surface_create(CAIRO_FORMAT_ARGB32, width, height);
|
||||
cairo_surface_set_device_offset( mpSurface, x, y );
|
||||
// Necessary, context is lost otherwise
|
||||
CGContextRetain( getCGContext() ); // == NULL for non-native surfaces
|
||||
}
|
||||
|
||||
/**
|
||||
* Surface::Surface: Create platfrom native Canvas surface from BitmapSystemData
|
||||
* @param pSysData (not used)
|
||||
* @param pBmpData Platform native image data (struct BitmapSystemData in vcl/inc/bitmap.hxx)
|
||||
* @param width width of the new surface
|
||||
* @param height height of the new surface
|
||||
*
|
||||
* Create a surface based on image data on pBmpData
|
||||
*
|
||||
* Set the mpSurface to the new surface or NULL
|
||||
**/
|
||||
Surface::Surface( const SystemEnvData* /* pSysData */, const BitmapSystemData* pBmpData, int width, int height )
|
||||
: mnRefCount( 1 ),
|
||||
mpSurface( NULL )
|
||||
/**
|
||||
* QuartzSurface::Surface: Create Canvas surface from Window reference.
|
||||
* @param NSView
|
||||
* @param x horizontal location of the new surface
|
||||
* @param y vertical location of the new surface
|
||||
* @param width width of the new surface
|
||||
* @param height height of the new surface
|
||||
*
|
||||
* pSysData contains the platform native Window reference.
|
||||
* pSysData is used to create a surface on the Window
|
||||
*
|
||||
* Set the mpSurface to the new surface or NULL
|
||||
**/
|
||||
QuartzSurface::QuartzSurface( NSView* pView, int x, int y, int width, int height ) :
|
||||
mpView(pView),
|
||||
mpSurface()
|
||||
{
|
||||
OSL_TRACE("Canvas::cairo::Surface(pBmpData: %p, w:%d, h:%d): New native image surface.", pBmpData, width, height);
|
||||
OSL_TRACE("Canvas::cairo::Surface(NSView*, x:%d, y:%d, w:%d, h:%d): New Surface for window", x, y, width, height);
|
||||
|
||||
OSL_ASSERT (pBmpData->mnWidth == width && pBmpData->mnHeight == height);
|
||||
CGContextRef rContext = (CGContextRef) pBmpData->rImageContext;
|
||||
// ensure kCGBitmapByteOrder32Host flag, otherwise Cairo breaks
|
||||
OSL_ASSERT ((CGBitmapContextGetBitmapInfo(rContext) & kCGBitmapByteOrderMask) == kCGBitmapByteOrder32Host);
|
||||
// on Mac OS X / Quartz we are not drawing directly to the screen, but via regular CGContextRef.
|
||||
// The actual drawing to NSView (i.e. screen) is done in QuartzSurface::flush()
|
||||
|
||||
// create image surface based on CGContext
|
||||
mpSurface = cairo_quartz_surface_create_for_cg_context( rContext, width, height);
|
||||
// HACK: currently initial size for windowsurface is 0x0, which is not possible for us.
|
||||
if (width == 0 || height == 0) {
|
||||
width = [mpView bounds].size.width;
|
||||
height = [mpView bounds].size.height;
|
||||
OSL_TRACE("Canvas::cairo::Surface(): BUG!! size is ZERO! fixing to %d x %d...", width, height);
|
||||
}
|
||||
|
||||
// Necessary, context is lost otherwise
|
||||
CGContextRetain(rContext);
|
||||
// create a generic surface, NSView/Window is ARGB32.
|
||||
mpSurface.reset(
|
||||
cairo_quartz_surface_create(CAIRO_FORMAT_ARGB32, width, height),
|
||||
&cairo_surface_destroy);
|
||||
|
||||
cairo_surface_set_device_offset( mpSurface.get(), x, y );
|
||||
}
|
||||
|
||||
/**
|
||||
* QuartzSurface::Surface: Create Canvas surface from CGContextRef.
|
||||
* @param CGContext Native graphics context
|
||||
* @param x horizontal location of the new surface
|
||||
* @param y vertical location of the new surface
|
||||
* @param width width of the new surface
|
||||
* @param height height of the new surface
|
||||
*
|
||||
* Set the mpSurface to the new surface or NULL
|
||||
**/
|
||||
QuartzSurface::QuartzSurface( CGContextRef rContext, int x, int y, int width, int height ) :
|
||||
mpView(NULL),
|
||||
mpSurface()
|
||||
{
|
||||
OSL_TRACE("Canvas::cairo::Surface(CGContext:%p, x:%d, y:%d, w:%d, h:%d): New Surface.", rContext, x, y, width, height);
|
||||
// create surface based on CGContext
|
||||
|
||||
// ensure kCGBitmapByteOrder32Host flag, otherwise Cairo breaks (we are practically always using CGBitmapContext)
|
||||
OSL_ASSERT ((CGBitmapContextGetBitsPerPixel(rContext) != 32) ||
|
||||
(CGBitmapContextGetBitmapInfo(rContext) & kCGBitmapByteOrderMask) == kCGBitmapByteOrder32Host);
|
||||
|
||||
mpSurface.reset(cairo_quartz_surface_create_for_cg_context(rContext, width, height),
|
||||
&cairo_surface_destroy);
|
||||
|
||||
cairo_surface_set_device_offset( mpSurface.get(), x, y );
|
||||
|
||||
// Necessary, context is lost otherwise
|
||||
CGContextRetain(rContext);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Surface::getDepth: Get the color depth of the Canvas surface.
|
||||
*
|
||||
* @return color depth
|
||||
**/
|
||||
int
|
||||
Surface::getDepth()
|
||||
/**
|
||||
* QuartzSurface::getCairo: Create Cairo (drawing object) for the Canvas surface
|
||||
*
|
||||
* @return new Cairo or NULL
|
||||
**/
|
||||
CairoSharedPtr QuartzSurface::getCairo() const
|
||||
{
|
||||
if (mpSurface) {
|
||||
switch (cairo_surface_get_content (mpSurface)) {
|
||||
if (mpSurface.get()){
|
||||
return CairoSharedPtr( cairo_create(mpSurface.get()),
|
||||
&cairo_destroy );
|
||||
} else {
|
||||
return CairoSharedPtr();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* QuartzSurface::getSimilar: Create new similar Canvas surface
|
||||
* @param aContent format of the new surface (cairo_content_t from cairo/src/cairo.h)
|
||||
* @param width width of the new surface
|
||||
* @param height height of the new surface
|
||||
*
|
||||
* Creates a new Canvas surface. This normally creates platform native surface, even though
|
||||
* generic function is used.
|
||||
*
|
||||
* Cairo surface from aContent (cairo_content_t)
|
||||
*
|
||||
* @return new surface or NULL
|
||||
**/
|
||||
SurfaceSharedPtr QuartzSurface::getSimilar( Content aContent, int width, int height ) const
|
||||
{
|
||||
return SurfaceSharedPtr(
|
||||
new QuartzSurface(
|
||||
CairoSurfaceSharedPtr(
|
||||
cairo_surface_create_similar( mpSurface.get(), aContent, width, height ),
|
||||
&cairo_surface_destroy )));
|
||||
}
|
||||
|
||||
/**
|
||||
* QuartzSurface::Resize: Resizes the Canvas surface.
|
||||
* @param width new width of the surface
|
||||
* @param height new height of the surface
|
||||
*
|
||||
* Only used on X11.
|
||||
*
|
||||
* @return The new surface or NULL
|
||||
**/
|
||||
void QuartzSurface::Resize( int width, int height )
|
||||
{
|
||||
OSL_ENSURE(false,"not supposed to be called!");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* QuartzSurface::flush: Draw the data to screen
|
||||
**/
|
||||
void QuartzSurface::flush() const
|
||||
{
|
||||
// can only flush surfaces with NSView
|
||||
if( !mpView ) return;
|
||||
|
||||
OSL_TRACE("Canvas::cairo::QuartzSurface::flush(): flush to NSView");
|
||||
|
||||
CGContextRef mrContext = getCGContext();
|
||||
|
||||
if (!mrContext) return;
|
||||
|
||||
[mpView lockFocus];
|
||||
|
||||
/**
|
||||
* This code is using same screen update code as in VCL (esp. AquaSalGraphics::UpdateWindow() )
|
||||
*/
|
||||
CGContextRef rViewContext = reinterpret_cast<CGContextRef>([[NSGraphicsContext currentContext] graphicsPort]);
|
||||
CGImageRef xImage = CGBitmapContextCreateImage(mrContext);
|
||||
CGContextDrawImage(rViewContext,
|
||||
CGRectMake( 0, 0,
|
||||
CGImageGetWidth(xImage),
|
||||
CGImageGetHeight(xImage)),
|
||||
xImage);
|
||||
CGImageRelease( xImage );
|
||||
CGContextFlush( rViewContext );
|
||||
|
||||
[mpView unlockFocus];
|
||||
}
|
||||
|
||||
/**
|
||||
* QuartzSurface::getDepth: Get the color depth of the Canvas surface.
|
||||
*
|
||||
* @return color depth
|
||||
**/
|
||||
int QuartzSurface::getDepth() const
|
||||
{
|
||||
if (mpSurface.get()) {
|
||||
switch (cairo_surface_get_content (mpSurface.get())) {
|
||||
case CAIRO_CONTENT_ALPHA: return 8; break;
|
||||
case CAIRO_CONTENT_COLOR: return 24; break;
|
||||
case CAIRO_CONTENT_COLOR_ALPHA: return 32; break;
|
||||
}
|
||||
}
|
||||
OSL_TRACE("Canvas::cairo::%s(): ERROR - depth unspecified!",__func__);
|
||||
OSL_TRACE("Canvas::cairo::QuartzSurface::getDepth(): ERROR - depth unspecified!");
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Surface::fillSystemGraphicsData: Fill SystemGraphicsData with native surface data
|
||||
* @param aSystemGraphicsData Platform native system graphics data (struct SystemGraphicsData in vcl/inc/sysdata.hxx)
|
||||
*
|
||||
*/
|
||||
void Surface::fillSystemGraphicsData( SystemGraphicsData& aSystemGraphicsData)
|
||||
/**
|
||||
* QuartzSurface::getCGContext: Get the native CGContextRef of the Canvas's cairo surface
|
||||
*
|
||||
* @return graphics context
|
||||
**/
|
||||
CGContextRef QuartzSurface::getCGContext() const
|
||||
{
|
||||
aSystemGraphicsData.rCGContext = cairo_quartz_surface_get_cg_context( mpSurface );
|
||||
if (mpSurface.get())
|
||||
return cairo_quartz_surface_get_cg_context(mpSurface.get());
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/** Surface::flush Flush the platform native window
|
||||
*
|
||||
* @param pSysData Platform native system environment data (struct SystemEnvData in vcl/inc/vcl/sysdata.hxx)
|
||||
*
|
||||
**/
|
||||
void Surface::flush(const SystemEnvData* pSysData)
|
||||
/**
|
||||
* cairo::createVirtualDevice: Create a VCL virtual device for the CGContext in the cairo Surface
|
||||
*
|
||||
* @return The new virtual device
|
||||
**/
|
||||
boost::shared_ptr<VirtualDevice> QuartzSurface::createVirtualDevice() const
|
||||
{
|
||||
|
||||
OSL_TRACE("Canvas::cairo::%s(): flush to NSView",__func__);
|
||||
|
||||
CGContextRef mrContext = cairo_quartz_surface_get_cg_context(mpSurface);
|
||||
|
||||
// write to the NSView in pSysData
|
||||
NSView* mpView = (NSView *) pSysData->pView;
|
||||
|
||||
[mpView lockFocus];
|
||||
SystemGraphicsData aSystemGraphicsData;
|
||||
aSystemGraphicsData.nSize = sizeof(SystemGraphicsData);
|
||||
aSystemGraphicsData.rCGContext = getCGContext();
|
||||
return boost::shared_ptr<VirtualDevice>(
|
||||
new VirtualDevice( &aSystemGraphicsData, getDepth() ));
|
||||
}
|
||||
|
||||
/**
|
||||
* This code is using same screen update code as in VCL (esp. AquaSalGraphics::UpdateWindow() )
|
||||
*/
|
||||
CGContextRef rViewContext = reinterpret_cast<CGContextRef>([[NSGraphicsContext currentContext] graphicsPort]);
|
||||
CGImageRef xImage = CGBitmapContextCreateImage (mrContext);
|
||||
CGContextDrawImage(rViewContext, CGRectMake( 0, 0, CGImageGetWidth(xImage), CGImageGetHeight(xImage)), xImage);
|
||||
CGImageRelease( xImage );
|
||||
CGContextFlush( rViewContext );
|
||||
* cairo::createSurface: Create generic Canvas surface using given Cairo Surface
|
||||
*
|
||||
* @param rSurface Cairo Surface
|
||||
*
|
||||
* @return new Surface
|
||||
*/
|
||||
SurfaceSharedPtr createSurface( const CairoSurfaceSharedPtr& rSurface )
|
||||
{
|
||||
return SurfaceSharedPtr(new QuartzSurface(rSurface));
|
||||
}
|
||||
|
||||
[mpView unlockFocus];
|
||||
/**
|
||||
* cairo::createSurface: Create Canvas surface using given VCL Window or Virtualdevice
|
||||
*
|
||||
* @param rSurface Cairo Surface
|
||||
*
|
||||
* For VCL Window, use platform native system environment data (struct SystemEnvData in vcl/inc/sysdata.hxx)
|
||||
* For VCL Virtualdevice, use platform native system graphics data (struct SystemGraphicsData in vcl/inc/sysdata.hxx)
|
||||
*
|
||||
* @return new Surface
|
||||
*/
|
||||
SurfaceSharedPtr createSurface( const OutputDevice& rRefDevice,
|
||||
int x, int y, int width, int height )
|
||||
{
|
||||
SurfaceSharedPtr surf;
|
||||
|
||||
if( rRefDevice.GetOutDevType() == OUTDEV_WINDOW )
|
||||
{
|
||||
const Window &rWindow = (const Window &) rRefDevice;
|
||||
const SystemEnvData* pSysData = GetSysData(&rWindow);
|
||||
if (pSysData)
|
||||
surf = SurfaceSharedPtr(new QuartzSurface(pSysData->pView, x, y, width, height));
|
||||
}
|
||||
else if( rRefDevice.GetOutDevType() == OUTDEV_VIRDEV )
|
||||
{
|
||||
SystemGraphicsData aSysData = ((const VirtualDevice&) rRefDevice).GetSystemGfxData();
|
||||
|
||||
if (aSysData.rCGContext)
|
||||
surf = SurfaceSharedPtr(new QuartzSurface(aSysData.rCGContext, x, y, width, height));
|
||||
}
|
||||
return surf;
|
||||
}
|
||||
|
||||
/**
|
||||
* cairo::createBitmapSurface: Create platfrom native Canvas surface from BitmapSystemData
|
||||
* @param OutputDevice (not used)
|
||||
* @param rData Platform native image data (struct BitmapSystemData in vcl/inc/bitmap.hxx)
|
||||
* @param rSize width and height of the new surface
|
||||
*
|
||||
* Create a surface based on image data on rData
|
||||
*
|
||||
* @return new surface or empty surface
|
||||
**/
|
||||
SurfaceSharedPtr createBitmapSurface( const OutputDevice& /* rRefDevice */,
|
||||
const BitmapSystemData& rData,
|
||||
const Size& rSize )
|
||||
{
|
||||
OSL_TRACE( "requested size: %d x %d available size: %d x %d",
|
||||
rSize.Width(), rSize.Height(), rData.mnWidth, rData.mnHeight );
|
||||
|
||||
if ( rData.mnWidth == rSize.Width() && rData.mnHeight == rSize.Height() )
|
||||
{
|
||||
CGContextRef rContext = (CGContextRef)rData.rImageContext;
|
||||
OSL_TRACE("Canvas::cairo::createBitmapSurface(): New native image surface, context = %p.", rData.rImageContext);
|
||||
|
||||
return SurfaceSharedPtr(new QuartzSurface(rContext, 0, 0, rData.mnWidth, rData.mnHeight));
|
||||
}
|
||||
return SurfaceSharedPtr();
|
||||
}
|
||||
|
||||
} // namespace cairo
|
||||
|
|
|
@ -7,8 +7,7 @@
|
|||
* OpenOffice.org - a multi-platform office productivity suite
|
||||
*
|
||||
* $RCSfile: cairo_win32_cairo.cxx,v $
|
||||
*
|
||||
* $Revision: 1.3 $
|
||||
* $Revision: 1.4 $
|
||||
*
|
||||
* This file is part of OpenOffice.org.
|
||||
*
|
||||
|
@ -29,11 +28,9 @@
|
|||
*
|
||||
************************************************************************/
|
||||
|
||||
|
||||
// MARKER(update_precomp.py): autogen include statement, do not remove
|
||||
#include "precompiled_canvas.hxx"
|
||||
|
||||
|
||||
#ifdef WNT
|
||||
/************************************************************************
|
||||
* Win32 surface backend for OpenOffice.org Cairo Canvas *
|
||||
|
@ -44,134 +41,155 @@
|
|||
#include <tools/postwin.h>
|
||||
|
||||
#include <osl/diagnose.h>
|
||||
#include <vcl/bitmap.hxx>
|
||||
#include <vcl/virdev.hxx>
|
||||
#include <vcl/sysdata.hxx>
|
||||
|
||||
#include "cairo_cairo.hxx"
|
||||
#include "cairo_win32_cairo.hxx"
|
||||
|
||||
#ifdef CAIRO_HAS_WIN32_SURFACE
|
||||
|
||||
#include <cairo-win32.h>
|
||||
|
||||
namespace cairo
|
||||
{
|
||||
/**
|
||||
* Surface::Surface: Create generic Canvas surface using given Cairo Surface
|
||||
*
|
||||
* @param pSurface Cairo Surface
|
||||
*
|
||||
* This constructor only stores data, it does no processing.
|
||||
* It is used with e.g. cairo_image_surface_create_for_data()
|
||||
* and Surface::getSimilar()
|
||||
*
|
||||
* Set the mpSurface to the new surface or NULL
|
||||
**/
|
||||
Surface::Surface( cairo_surface_t* pSurface )
|
||||
: mnRefCount( 1 ),
|
||||
mpSurface( pSurface )
|
||||
|
||||
#include <cairo-win32.h>
|
||||
|
||||
bool IsCairoWorking( OutputDevice* )
|
||||
{
|
||||
// trivially true for Windows
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Surface::Surface: Create generic Canvas surface using given Cairo Surface
|
||||
*
|
||||
* @param pSurface Cairo Surface
|
||||
*
|
||||
* This constructor only stores data, it does no processing.
|
||||
* It is used with e.g. cairo_image_surface_create_for_data()
|
||||
* and Surface::getSimilar()
|
||||
*
|
||||
* Set the mpSurface to the new surface or NULL
|
||||
**/
|
||||
Win32Surface::Win32Surface( const CairoSurfaceSharedPtr& pSurface ) :
|
||||
mpSurface( pSurface )
|
||||
{}
|
||||
|
||||
/**
|
||||
* Surface::Surface: Create Canvas surface from Window reference.
|
||||
* @param pSysData Platform native system environment data (struct SystemEnvData in vcl/inc/sysdata.hxx)
|
||||
* @param x horizontal location of the new surface
|
||||
* @param y vertical location of the new surface
|
||||
* @param width width of the new surface
|
||||
* @param height height of the new surface
|
||||
*
|
||||
* pSysData contains the platform native Window reference.
|
||||
* pSysData is used to create a surface on the Window
|
||||
*
|
||||
* Set the mpSurface to the new surface or NULL
|
||||
**/
|
||||
Surface::Surface( const SystemEnvData* pSysData, int x, int y, int /* width */, int /* height */ )
|
||||
: mnRefCount( 1 ),
|
||||
mpSurface( NULL )
|
||||
/**
|
||||
* Surface::Surface: Create Canvas surface from Window reference.
|
||||
* @param pSysData Platform native system environment data (struct SystemEnvData in vcl/inc/sysdata.hxx)
|
||||
* @param x horizontal location of the new surface
|
||||
* @param y vertical location of the new surface
|
||||
*
|
||||
* pSysData contains the platform native Window reference.
|
||||
* pSysData is used to create a surface on the Window
|
||||
*
|
||||
* Set the mpSurface to the new surface or NULL
|
||||
**/
|
||||
Win32Surface::Win32Surface( HDC hDC, int x, int y) :
|
||||
mpSurface(
|
||||
cairo_win32_surface_create(hDC),
|
||||
&cairo_surface_destroy)
|
||||
{
|
||||
HDC hDC;
|
||||
|
||||
hDC = GetDC( pSysData->hWnd );
|
||||
mpSurface = cairo_win32_surface_create( hDC );
|
||||
cairo_surface_set_device_offset( mpSurface, x, y );
|
||||
cairo_surface_set_device_offset( mpSurface.get(), x, y );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Surface::Surface: Create platfrom native Canvas surface from BitmapSystemData
|
||||
* @param pSysData (not used)
|
||||
* @param pBmpData Platform native image data (struct BitmapSystemData in vcl/inc/bitmap.hxx)
|
||||
* @param width width of the new surface
|
||||
* @param height height of the new surface
|
||||
*
|
||||
* Create a surface based on image data on pBmpData
|
||||
*
|
||||
* Set the mpSurface to the new surface or NULL
|
||||
**/
|
||||
Surface::Surface( const SystemEnvData* /* pSysData */, const BitmapSystemData* pBmpData, int width, int height )
|
||||
: mnRefCount( 1 ),
|
||||
mpSurface( NULL )
|
||||
/**
|
||||
* Surface::Surface: Create platfrom native Canvas surface from BitmapSystemData
|
||||
* @param pBmpData Platform native image data (struct BitmapSystemData in vcl/inc/bitmap.hxx)
|
||||
*
|
||||
* Create a surface based on image data on pBmpData
|
||||
*
|
||||
* Set the mpSurface to the new surface or NULL
|
||||
**/
|
||||
Win32Surface::Win32Surface( const BitmapSystemData& rBmpData ) :
|
||||
mpSurface()
|
||||
{
|
||||
OSL_ASSERT (pBmpData->mnWidth == width && pBmpData->mnHeight == height);
|
||||
OSL_ASSERT(rBmpData.pDIB == NULL);
|
||||
|
||||
// NOTE: width and height are not used in win32
|
||||
OSL_ASSERT (pBmpData->pDIB == NULL);
|
||||
|
||||
// FIXME: could we use
|
||||
// cairo_win32_surface_create_with_ddb (HDC hdc, cairo_format_t format, int width, int height);
|
||||
// and
|
||||
// cairo_win32_surface_create_with_dib (cairo_format_t format, int width, int height);
|
||||
// instead?
|
||||
//
|
||||
|
||||
if (pBmpData->pDIB != NULL) {
|
||||
#if 0
|
||||
// This code will not work anyway, as most (?) DIBs that
|
||||
// come here will be in bottom-down order (upside-down)
|
||||
// and in any case have a different order of colour
|
||||
// channels compared to what cairo expects.
|
||||
PBITMAPINFOHEADER pBIH = (PBITMAPINFOHEADER) GlobalLock ((HANDLE) p_BmpData->pDIB);
|
||||
cairo_format_t fmt;
|
||||
OSL_ASSERT (pBIH->biBitCount == 24 && pBIH->biCompression == BI_RGB);
|
||||
mhDIB = p_BmpData->pDIB;
|
||||
if (pBIH->biBitCount == 24 && pBIH->biCompression == BI_RGB)
|
||||
{
|
||||
mpSurface = cairo_image_surface_create_for_data (((unsigned char *) pBIH) + pBIH->biSize,
|
||||
CAIRO_FORMAT_RGB24,
|
||||
pBIH->biWidth, pBIH->biHeight,
|
||||
4*((3*pBIH->biWidth-1)/4+1));
|
||||
}
|
||||
#else
|
||||
if(rBmpData.pDIB != NULL) {
|
||||
// So just leave mpSurface to NULL, little else we can do at
|
||||
// this stage. Hopefully the Win32 patch to
|
||||
// cairocanvas::DeviceHelper::getSurface(BitmapSystemData&,
|
||||
// const Size&) will catch the cases where this
|
||||
// constructor would be called with a DIB bitmap, and we
|
||||
// will never get here. At least it worked for Ballmer.ppt.
|
||||
#endif
|
||||
} else {
|
||||
HDC hDC;
|
||||
void* hOrigBitmap;
|
||||
hDC = CreateCompatibleDC( NULL );
|
||||
OSL_TRACE ("::cairo::cairo::Surface::Surface(): Selecting bitmap %p into DC %p", pBmpData->pDDB, hDC);
|
||||
hOrigBitmap = SelectObject( hDC, (HANDLE) pBmpData->pDDB );
|
||||
if (hOrigBitmap == NULL)
|
||||
OSL_TRACE ("SelectObject failed: %d", GetLastError ());
|
||||
mpSurface = cairo_win32_surface_create( hDC );
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
HDC hDC = CreateCompatibleDC(NULL);
|
||||
void* hOrigBitmap;
|
||||
OSL_TRACE ("Surface::Surface(): Selecting bitmap %p into DC %p", rBmpData.pDDB, hDC);
|
||||
hOrigBitmap = SelectObject( hDC, (HANDLE)rBmpData.pDDB );
|
||||
if(hOrigBitmap == NULL)
|
||||
OSL_TRACE ("SelectObject failed: %d", GetLastError ());
|
||||
mpSurface.reset(
|
||||
cairo_win32_surface_create(hDC),
|
||||
&cairo_surface_destroy);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Surface::getCairo: Create Cairo (drawing object) for the Canvas surface
|
||||
*
|
||||
* @return new Cairo or NULL
|
||||
**/
|
||||
CairoSharedPtr Win32Surface::getCairo() const
|
||||
{
|
||||
return CairoSharedPtr( cairo_create(mpSurface.get()),
|
||||
&cairo_destroy );
|
||||
}
|
||||
|
||||
/**
|
||||
* Surface::getDepth: Get the color depth of the Canvas surface.
|
||||
*
|
||||
* @return color depth
|
||||
**/
|
||||
int
|
||||
Surface::getDepth()
|
||||
/**
|
||||
* Surface::getSimilar: Create new similar Canvas surface
|
||||
* @param aContent format of the new surface (cairo_content_t from cairo/src/cairo.h)
|
||||
* @param width width of the new surface
|
||||
* @param height height of the new surface
|
||||
*
|
||||
* Creates a new Canvas surface. This normally creates platform native surface, even though
|
||||
* generic function is used.
|
||||
*
|
||||
* Cairo surface from aContent (cairo_content_t)
|
||||
*
|
||||
* @return new surface or NULL
|
||||
**/
|
||||
SurfaceSharedPtr Win32Surface::getSimilar( Content aContent, int width, int height ) const
|
||||
{
|
||||
return SurfaceSharedPtr(
|
||||
new Win32Surface(
|
||||
CairoSurfaceSharedPtr(
|
||||
cairo_surface_create_similar( mpSurface.get(), aContent, width, height ),
|
||||
&cairo_surface_destroy )));
|
||||
}
|
||||
|
||||
/**
|
||||
* Surface::Resize: Resizes the Canvas surface.
|
||||
* @param width new width of the surface
|
||||
* @param height new height of the surface
|
||||
*
|
||||
* Only used on X11.
|
||||
*
|
||||
* @return The new surface or NULL
|
||||
**/
|
||||
void Win32Surface::Resize( int /*width*/, int /*height*/ )
|
||||
{
|
||||
OSL_ENSURE(false,"not supposed to be called!");
|
||||
}
|
||||
|
||||
void Win32Surface::flush() const
|
||||
{
|
||||
GdiFlush();
|
||||
}
|
||||
|
||||
/**
|
||||
* Surface::getDepth: Get the color depth of the Canvas surface.
|
||||
*
|
||||
* @return color depth
|
||||
**/
|
||||
int Win32Surface::getDepth() const
|
||||
{
|
||||
if (mpSurface) {
|
||||
switch (cairo_surface_get_content (mpSurface)) {
|
||||
switch (cairo_surface_get_content (mpSurface.get())) {
|
||||
case CAIRO_CONTENT_ALPHA: return 8; break;
|
||||
case CAIRO_CONTENT_COLOR: return 24; break;
|
||||
case CAIRO_CONTENT_COLOR_ALPHA: return 32; break;
|
||||
|
@ -182,14 +200,88 @@ namespace cairo
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Surface::fillSystemGraphicsData: Fill SystemGraphicsData with native surface data
|
||||
* @param aSystemGraphicsData Platform native system graphics data (struct SystemGraphicsData in vcl/inc/sysdata.hxx)
|
||||
*
|
||||
*/
|
||||
void Surface::fillSystemGraphicsData( SystemGraphicsData& aSystemGraphicsData)
|
||||
/**
|
||||
* cairo::createVirtualDevice: Create a VCL virtual device for the CGContext in the cairo Surface
|
||||
*
|
||||
* @return The new virtual device
|
||||
**/
|
||||
boost::shared_ptr<VirtualDevice> Win32Surface::createVirtualDevice() const
|
||||
{
|
||||
aSystemGraphicsData.hDC = cairo_win32_surface_get_dc( mpSurface );
|
||||
SystemGraphicsData aSystemGraphicsData;
|
||||
aSystemGraphicsData.nSize = sizeof(SystemGraphicsData);
|
||||
aSystemGraphicsData.hDC = cairo_win32_surface_get_dc( mpSurface.get() );
|
||||
|
||||
return boost::shared_ptr<VirtualDevice>(
|
||||
new VirtualDevice( &aSystemGraphicsData, sal::static_int_cast<USHORT>(getDepth()) ));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* cairo::createSurface: Create generic Canvas surface using given Cairo Surface
|
||||
*
|
||||
* @param rSurface Cairo Surface
|
||||
*
|
||||
* @return new Surface
|
||||
*/
|
||||
SurfaceSharedPtr createSurface( const CairoSurfaceSharedPtr& rSurface )
|
||||
{
|
||||
return SurfaceSharedPtr(new Win32Surface(rSurface));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* cairo::createSurface: Create Canvas surface using given VCL Window or Virtualdevice
|
||||
*
|
||||
* @param rSurface Cairo Surface
|
||||
*
|
||||
* For VCL Window, use platform native system environment data (struct SystemEnvData in vcl/inc/sysdata.hxx)
|
||||
* For VCL Virtualdevice, use platform native system graphics data (struct SystemGraphicsData in vcl/inc/sysdata.hxx)
|
||||
*
|
||||
* @return new Surface
|
||||
*/
|
||||
SurfaceSharedPtr createSurface( const OutputDevice& rRefDevice,
|
||||
int x, int y, int /* width */, int /* height */)
|
||||
{
|
||||
SurfaceSharedPtr surf;
|
||||
|
||||
if( rRefDevice.GetOutDevType() == OUTDEV_WINDOW )
|
||||
{
|
||||
const Window &rWindow = (const Window &) rRefDevice;
|
||||
const SystemEnvData* pSysData = GetSysData(&rWindow);
|
||||
if (pSysData && pSysData->hWnd)
|
||||
surf = SurfaceSharedPtr(new Win32Surface(GetDC((HWND) pSysData->hWnd), x, y));
|
||||
}
|
||||
else if( rRefDevice.GetOutDevType() == OUTDEV_VIRDEV )
|
||||
{
|
||||
SystemGraphicsData aSysData = ((const VirtualDevice&) rRefDevice).GetSystemGfxData();
|
||||
if (aSysData.hDC)
|
||||
surf = SurfaceSharedPtr(new Win32Surface((HDC) aSysData.hDC, x, y));
|
||||
}
|
||||
return surf;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* cairo::createBitmapSurface: Create platfrom native Canvas surface from BitmapSystemData
|
||||
* @param OutputDevice (not used)
|
||||
* @param rData Platform native image data (struct BitmapSystemData in vcl/inc/bitmap.hxx)
|
||||
* @param rSize width and height of the new surface
|
||||
*
|
||||
* Create a surface based on image data on rData
|
||||
*
|
||||
* @return new surface or empty surface
|
||||
**/
|
||||
SurfaceSharedPtr createBitmapSurface( const OutputDevice& /* rRefDevice */,
|
||||
const BitmapSystemData& rData,
|
||||
const Size& rSize )
|
||||
{
|
||||
OSL_TRACE( "requested size: %d x %d available size: %d x %d",
|
||||
rSize.Width(), rSize.Height(), rData.mnWidth, rData.mnHeight );
|
||||
|
||||
if ( rData.mnWidth == rSize.Width() && rData.mnHeight == rSize.Height() )
|
||||
return SurfaceSharedPtr(new Win32Surface( rData ));
|
||||
else
|
||||
return SurfaceSharedPtr();
|
||||
}
|
||||
|
||||
} // namespace cairo
|
||||
|
|
|
@ -7,8 +7,7 @@
|
|||
* OpenOffice.org - a multi-platform office productivity suite
|
||||
*
|
||||
* $RCSfile: cairo_xlib_cairo.cxx,v $
|
||||
*
|
||||
* $Revision: 1.3 $
|
||||
* $Revision: 1.4 $
|
||||
*
|
||||
* This file is part of OpenOffice.org.
|
||||
*
|
||||
|
@ -29,292 +28,328 @@
|
|||
*
|
||||
************************************************************************/
|
||||
|
||||
|
||||
// MARKER(update_precomp.py): autogen include statement, do not remove
|
||||
#include "precompiled_canvas.hxx"
|
||||
|
||||
// NOTE: (when needed) #if defined QUARTZ has to be before UNX.
|
||||
// since Mac OS X can have both X11 and QUARTZ versions
|
||||
// of cairo libraries at the same time.
|
||||
#if defined (UNX) && !defined (QUARTZ)
|
||||
|
||||
/************************************************************************
|
||||
* XLib/Xrender surface backend for OpenOffice.org Cairo Canvas *
|
||||
************************************************************************/
|
||||
|
||||
#include <prex.h>
|
||||
#include <X11/extensions/Xrender.h>
|
||||
#include <X11/Xlib.h>
|
||||
#include <postx.h>
|
||||
|
||||
#include <osl/diagnose.h>
|
||||
#include "cairo_xlib_cairo.hxx"
|
||||
|
||||
#include "cairo_cairo.hxx"
|
||||
|
||||
#ifdef CAIRO_HAS_XLIB_SURFACE
|
||||
|
||||
#ifdef USE_CAIRO10_APIS
|
||||
#include "cairo_xlib_helper.hxx"
|
||||
#endif
|
||||
|
||||
#include <cairo-xlib.h>
|
||||
#include <cairo-xlib-xrender.h>
|
||||
#include <vcl/sysdata.hxx>
|
||||
#include <vcl/bitmap.hxx>
|
||||
#include <vcl/virdev.hxx>
|
||||
#include <basegfx/vector/b2isize.hxx>
|
||||
|
||||
namespace cairo
|
||||
{
|
||||
|
||||
bool HasXRender( const void* pSysData )
|
||||
{
|
||||
Display *pDisplay = (Display*) ((const SystemEnvData*) pSysData)->pDisplay;
|
||||
int nDummy;
|
||||
return XQueryExtension( pDisplay, "RENDER", &nDummy, &nDummy, &nDummy );
|
||||
}
|
||||
#include <cairo-xlib.h>
|
||||
#include <cairo-xlib-xrender.h>
|
||||
|
||||
// TODO(F3): svp headless case!
|
||||
|
||||
#ifdef USE_CAIRO10_APIS
|
||||
Surface::Surface( const void* pSysData, void* pDisplay, long hDrawable, void* pRenderFormat, cairo_surface_t* pSurface )
|
||||
: mnRefCount( 1 ),
|
||||
mpSysData( pSysData ),
|
||||
mpDisplay( pDisplay ),
|
||||
mhDrawable( hDrawable ),
|
||||
mpRenderFormat( pRenderFormat ),
|
||||
mbFreePixmap( true ),
|
||||
mpSurface( pSurface )
|
||||
bool IsCairoWorking( OutputDevice* pOutDev )
|
||||
{
|
||||
if( !pOutDev )
|
||||
return false;
|
||||
|
||||
Display* pDisplay = (Display*)pOutDev->GetSystemGfxData().pDisplay;
|
||||
int nDummy;
|
||||
return XQueryExtension( pDisplay, "RENDER", &nDummy, &nDummy, &nDummy );
|
||||
}
|
||||
#endif
|
||||
|
||||
X11SysData::X11SysData() :
|
||||
pDisplay(NULL),
|
||||
hDrawable(0),
|
||||
pVisual(NULL),
|
||||
nScreen(0),
|
||||
nDepth(-1),
|
||||
aColormap(-1),
|
||||
pRenderFormat(NULL)
|
||||
{}
|
||||
|
||||
X11SysData::X11SysData( const SystemGraphicsData* pSysDat ) :
|
||||
pDisplay(pSysDat->pDisplay),
|
||||
hDrawable(pSysDat->hDrawable),
|
||||
pVisual(pSysDat->pVisual),
|
||||
nScreen(pSysDat->nScreen),
|
||||
nDepth(pSysDat->nDepth),
|
||||
aColormap(pSysDat->aColormap),
|
||||
pRenderFormat(pSysDat->pRenderFormat)
|
||||
{}
|
||||
|
||||
/**
|
||||
* Surface::Surface: Create generic Canvas surface using given Cairo Surface
|
||||
*
|
||||
* @param pSurface Cairo Surface
|
||||
*
|
||||
* This constructor only stores data, it does no processing.
|
||||
* It is used with e.g. cairo_image_surface_create_for_data()
|
||||
* and Surface::getSimilar()
|
||||
*
|
||||
* Set the mpSurface to the new surface or NULL
|
||||
**/
|
||||
Surface::Surface( cairo_surface_t* pSurface )
|
||||
: mnRefCount( 1 ),
|
||||
#ifdef USE_CAIRO10_APIS
|
||||
mpSysData( NULL ),
|
||||
mpDisplay( NULL ),
|
||||
mhDrawable( 0 ),
|
||||
mpRenderFormat( NULL ),
|
||||
mbFreePixmap( false ),
|
||||
#endif
|
||||
mpSurface( pSurface )
|
||||
X11SysData::X11SysData( const SystemEnvData* pSysDat ) :
|
||||
pDisplay(pSysDat->pDisplay),
|
||||
hDrawable(pSysDat->aWindow),
|
||||
pVisual(pSysDat->pVisual),
|
||||
nScreen(pSysDat->nScreen),
|
||||
nDepth(pSysDat->nDepth),
|
||||
aColormap(pSysDat->aColormap),
|
||||
pRenderFormat(NULL)
|
||||
{}
|
||||
|
||||
X11Pixmap::~X11Pixmap()
|
||||
{
|
||||
if( mpDisplay && mhDrawable )
|
||||
XFreePixmap( (Display*)mpDisplay, mhDrawable );
|
||||
}
|
||||
|
||||
/**
|
||||
* Surface::Surface: Create Canvas surface with existing data
|
||||
* @param pSysData Platform native system environment data (struct SystemEnvData in vcl/inc/sysdata.hxx)
|
||||
* @param pSurface Cairo surface
|
||||
*
|
||||
* pSysData contains the platform native Drawable reference
|
||||
* This constructor only stores data, it does no processing.
|
||||
* It is used by e.g. Surface::getSimilar()
|
||||
*
|
||||
* Set the mpSurface as pSurface
|
||||
**/
|
||||
X11Surface::X11Surface( const X11SysData& rSysData,
|
||||
const X11PixmapSharedPtr& rPixmap,
|
||||
const CairoSurfaceSharedPtr& pSurface ) :
|
||||
maSysData(rSysData),
|
||||
mpPixmap(rPixmap),
|
||||
mpSurface(pSurface)
|
||||
{}
|
||||
|
||||
/**
|
||||
* Surface::Surface: Create generic Canvas surface using given Cairo Surface
|
||||
*
|
||||
* @param pSurface Cairo Surface
|
||||
*
|
||||
* This constructor only stores data, it does no processing.
|
||||
* It is used with e.g. cairo_image_surface_create_for_data()
|
||||
* Unlike other constructors, mpSysData is set to NULL
|
||||
*
|
||||
* Set the mpSurface as pSurface
|
||||
**/
|
||||
X11Surface::X11Surface( const CairoSurfaceSharedPtr& pSurface ) :
|
||||
maSysData(),
|
||||
mpPixmap(),
|
||||
mpSurface(pSurface)
|
||||
{}
|
||||
|
||||
/**
|
||||
* Surface::Surface: Create Canvas surface from Window reference.
|
||||
* @param pSysData Platform native system environment data (struct SystemEnvData in vcl/inc/sysdata.hxx)
|
||||
* @param x horizontal location of the new surface
|
||||
* @param y vertical location of the new surface
|
||||
* @param width width of the new surface
|
||||
* @param height height of the new surface
|
||||
*
|
||||
* pSysData contains the platform native Window reference.
|
||||
*
|
||||
* pSysData is used to create a surface on the Window
|
||||
*
|
||||
* Set the mpSurface to the new surface or NULL
|
||||
**/
|
||||
X11Surface::X11Surface( const X11SysData& rSysData, int x, int y, int width, int height ) :
|
||||
maSysData(rSysData),
|
||||
mpPixmap(),
|
||||
mpSurface(
|
||||
cairo_xlib_surface_create( (Display*)rSysData.pDisplay,
|
||||
rSysData.hDrawable,
|
||||
(Visual*)rSysData.pVisual,
|
||||
width + x, height + y ),
|
||||
&cairo_surface_destroy)
|
||||
{
|
||||
cairo_surface_set_device_offset(mpSurface.get(), x, y );
|
||||
}
|
||||
|
||||
/**
|
||||
* Surface::Surface: Create platfrom native Canvas surface from BitmapSystemData
|
||||
* @param pSysData Platform native system environment data (struct SystemEnvData in vcl/inc/sysdata.hxx)
|
||||
* @param pBmpData Platform native image data (struct BitmapSystemData in vcl/inc/bitmap.hxx)
|
||||
* @param width width of the new surface
|
||||
* @param height height of the new surface
|
||||
*
|
||||
* The pBmpData provides the imagedata that the created surface should contain.
|
||||
*
|
||||
* Set the mpSurface to the new surface or NULL
|
||||
**/
|
||||
X11Surface::X11Surface( const X11SysData& rSysData,
|
||||
const BitmapSystemData& rData ) :
|
||||
maSysData( rSysData ),
|
||||
mpPixmap(),
|
||||
mpSurface(
|
||||
cairo_xlib_surface_create( (Display*)rSysData.pDisplay,
|
||||
(Drawable)rData.aPixmap,
|
||||
(Visual*) rSysData.pVisual,
|
||||
rData.mnWidth, rData.mnHeight ),
|
||||
&cairo_surface_destroy)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Surface::Surface: Create Canvas surface from Window reference.
|
||||
* @param pSysData Platform native system environment data (struct SystemEnvData in vcl/inc/sysdata.hxx)
|
||||
* @param x horizontal location of the new surface
|
||||
* @param y vertical location of the new surface
|
||||
* @param width width of the new surface
|
||||
* @param height height of the new surface
|
||||
*
|
||||
* pSysData contains the platform native Window reference.
|
||||
* pSysData is used to create a surface on the Window
|
||||
*
|
||||
* Set the mpSurface to the new surface or NULL
|
||||
**/
|
||||
Surface::Surface( const SystemEnvData* pSysData, int x, int y, int width, int height )
|
||||
: mnRefCount( 1 ),
|
||||
#ifdef USE_CAIRO10_APIS
|
||||
mpSysData( pSysData ),
|
||||
mpDisplay( NULL ),
|
||||
mhDrawable( 0 ),
|
||||
mpRenderFormat( NULL ),
|
||||
mbFreePixmap( false ),
|
||||
#endif
|
||||
mpSurface( NULL )
|
||||
/**
|
||||
* Surface::getCairo: Create Cairo (drawing object) for the Canvas surface
|
||||
*
|
||||
* @return new Cairo or NULL
|
||||
**/
|
||||
CairoSharedPtr X11Surface::getCairo() const
|
||||
{
|
||||
#ifdef USE_CAIRO10_APIS
|
||||
mpSurface = (cairo_surface_t*) cairoHelperGetSurface( pSysData, x, y, width, height );
|
||||
mpDisplay = (Display*) cairoHelperGetDisplay( pSysData );
|
||||
mhDrawable = cairoHelperGetWindow( pSysData );
|
||||
#else
|
||||
mpSurface = cairo_xlib_surface_create( (Display*) pSysData->pDisplay,
|
||||
pSysData->aWindow,
|
||||
(Visual*) pSysData->pVisual,
|
||||
width + x, height + y );
|
||||
cairo_surface_set_device_offset( mpSurface, x, y );
|
||||
// XSynchronize( (Display*) pSysData->pDisplay, TRUE );
|
||||
#endif
|
||||
return CairoSharedPtr( cairo_create(mpSurface.get()),
|
||||
&cairo_destroy );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Surface::Surface: Create platfrom native Canvas surface from BitmapSystemData
|
||||
* @param pSysData Platform native system environment data (struct SystemEnvData in vcl/inc/sysdata.hxx)
|
||||
* @param pBmpData Platform native image data (struct BitmapSystemData in vcl/inc/bitmap.hxx)
|
||||
* @param width width of the new surface
|
||||
* @param height height of the new surface
|
||||
*
|
||||
* Create a surface based on image data on pBmpData
|
||||
*
|
||||
* Set the mpSurface to the new surface or NULL
|
||||
**/
|
||||
Surface::Surface( const SystemEnvData* pSysData, const BitmapSystemData* pBmpData, int width, int height )
|
||||
: mnRefCount( 1 ),
|
||||
#ifdef USE_CAIRO10_APIS
|
||||
mpSysData( pSysData ),
|
||||
mpDisplay( NULL ),
|
||||
mhDrawable( 0 ),
|
||||
mpRenderFormat( NULL ),
|
||||
mbFreePixmap( false ),
|
||||
#endif
|
||||
mpSurface( NULL )
|
||||
{
|
||||
#ifdef USE_CAIRO10_APIS
|
||||
mpSurface = (cairo_surface_t*) cairoHelperGetSurface( pSysData, pBmpData, width, height );
|
||||
mpDisplay = (Display*) cairoHelperGetDisplay( pSysData );
|
||||
mhDrawable = cairoHelperGetWindow( pSysData );
|
||||
#else
|
||||
OSL_ASSERT (pBmpData->mnWidth == width && pBmpData->mnHeight == height);
|
||||
|
||||
mpSurface = cairo_xlib_surface_create( (Display*) pSysData->pDisplay,
|
||||
(Drawable) pBmpData->aPixmap,
|
||||
(Visual*) pSysData->pVisual,
|
||||
width, height );
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined USE_CAIRO10_APIS
|
||||
/**
|
||||
* Surface::~Surface: Destroy the Canvas surface
|
||||
*
|
||||
* Also free any image data and other references related to the Canvas.
|
||||
*
|
||||
**/
|
||||
Surface::~Surface()
|
||||
{
|
||||
if( mpSurface )
|
||||
{
|
||||
cairo_surface_destroy( mpSurface );
|
||||
mpSurface = NULL;
|
||||
}
|
||||
mpSysData = NULL;
|
||||
|
||||
// In cairo API < 1.2, explicit freeing is needed
|
||||
if( mbFreePixmap && mhDrawable )
|
||||
XFreePixmap( (Display*) mpDisplay, mhDrawable );
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* Surface::Resize: Resizes the Canvas surface.
|
||||
* @param width new width of the surface
|
||||
* @param height new height of the surface
|
||||
*
|
||||
* Only used on X11.
|
||||
*
|
||||
* @return The new surface or NULL
|
||||
**/
|
||||
void
|
||||
Surface::Resize( int width, int height )
|
||||
{
|
||||
cairo_xlib_surface_set_size( mpSurface, width, height );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Surface::getDepth: Get the color depth of the Canvas surface.
|
||||
*
|
||||
* @return color depth
|
||||
**/
|
||||
int
|
||||
Surface::getDepth()
|
||||
{
|
||||
#ifdef USE_CAIRO10_APIS
|
||||
if( mpRenderFormat )
|
||||
return ( ( XRenderPictFormat * ) mpRenderFormat )->depth;
|
||||
#else
|
||||
// TODO: verify that this works correctly
|
||||
return cairo_xlib_surface_get_depth( mpSurface );
|
||||
#endif
|
||||
return -1;
|
||||
}
|
||||
|
||||
#ifdef USE_CAIRO10_APIS
|
||||
// This function is platform dependent on Cairo < 1.2 API only.
|
||||
Surface* Surface::getSimilar( Content aContent, int width, int height )
|
||||
/**
|
||||
* Surface::getSimilar: Create new similar Canvas surface
|
||||
* @param aContent format of the new surface (cairo_content_t from cairo/src/cairo.h)
|
||||
* @param width width of the new surface
|
||||
* @param height height of the new surface
|
||||
*
|
||||
* Creates a new Canvas surface. This normally creates platform native surface, even though
|
||||
* generic function is used.
|
||||
*
|
||||
* Cairo surface from aContent (cairo_content_t)
|
||||
*
|
||||
* @return new surface or NULL
|
||||
**/
|
||||
SurfaceSharedPtr X11Surface::getSimilar( Content aContent, int width, int height ) const
|
||||
{
|
||||
Pixmap hPixmap;
|
||||
|
||||
if( mpSysData && mpDisplay && mhDrawable ) {
|
||||
XRenderPictFormat *pFormat;
|
||||
if( maSysData.pDisplay && maSysData.hDrawable )
|
||||
{
|
||||
XRenderPictFormat* pFormat;
|
||||
int nFormat;
|
||||
|
||||
pFormat = XRenderFindStandardFormat( (Display*) mpDisplay, getXFormat(aContent) );
|
||||
hPixmap = XCreatePixmap( (Display*) mpDisplay, cairoHelperGetWindow( mpSysData ),
|
||||
switch (aContent)
|
||||
{
|
||||
case CAIRO_CONTENT_ALPHA:
|
||||
nFormat = PictStandardA8;
|
||||
break;
|
||||
case CAIRO_CONTENT_COLOR:
|
||||
nFormat = PictStandardRGB24;
|
||||
break;
|
||||
case CAIRO_CONTENT_COLOR_ALPHA:
|
||||
default:
|
||||
nFormat = PictStandardARGB32;
|
||||
break;
|
||||
}
|
||||
|
||||
pFormat = XRenderFindStandardFormat( (Display*)maSysData.pDisplay, nFormat );
|
||||
hPixmap = XCreatePixmap( (Display*)maSysData.pDisplay, maSysData.hDrawable,
|
||||
width > 0 ? width : 1, height > 0 ? height : 1,
|
||||
pFormat->depth );
|
||||
|
||||
return new Surface( mpSysData, mpDisplay, (long) hPixmap, pFormat,
|
||||
cairo_xlib_surface_create_with_xrender_format( (Display*) mpDisplay, hPixmap,
|
||||
DefaultScreenOfDisplay( (Display *) mpDisplay ),
|
||||
pFormat, width, height ) );
|
||||
} else
|
||||
return new Surface( mpSysData, mpDisplay, 0, NULL, cairo_surface_create_similar( mpSurface, aContent, width, height ) );
|
||||
}
|
||||
#endif // USE_CAIRO10_APIS
|
||||
|
||||
/**
|
||||
* Surface::fillSystemGraphicsData: Fill SystemGraphicsData with native surface data
|
||||
* @param aSystemGraphicsData Platform native system graphics data (struct SystemGraphicsData in vcl/inc/sysdata.hxx)
|
||||
*
|
||||
*/
|
||||
void Surface::fillSystemGraphicsData( SystemGraphicsData& aSystemGraphicsData)
|
||||
{
|
||||
#ifdef USE_CAIRO10_APIS
|
||||
// Backward compatibility for Cairo 1.0
|
||||
aSystemGraphicsData.hDrawable = mhDrawable;
|
||||
aSystemGraphicsData.pRenderFormat = mpRenderFormat;
|
||||
#else
|
||||
aSystemGraphicsData.hDrawable = cairo_xlib_surface_get_drawable( mpSurface );
|
||||
aSystemGraphicsData.pRenderFormat = XRenderFindStandardFormat( cairo_xlib_surface_get_display (mpSurface),
|
||||
getXFormat(cairo_surface_get_content(mpSurface)) );
|
||||
#endif //USE_CAIRO10_APIS
|
||||
}
|
||||
|
||||
|
||||
int Surface::getXFormat(Content aContent)
|
||||
{
|
||||
switch(aContent)
|
||||
{
|
||||
case CAIRO_CONTENT_ALPHA: return PictStandardA8; break;
|
||||
case CAIRO_CONTENT_COLOR: return PictStandardRGB24; break;
|
||||
case CAIRO_CONTENT_COLOR_ALPHA:
|
||||
default: return PictStandardARGB32; break;
|
||||
X11SysData aSysData(maSysData);
|
||||
aSysData.pRenderFormat = pFormat;
|
||||
return SurfaceSharedPtr(
|
||||
new X11Surface( aSysData,
|
||||
X11PixmapSharedPtr(
|
||||
new X11Pixmap(hPixmap, maSysData.pDisplay)),
|
||||
CairoSurfaceSharedPtr(
|
||||
cairo_xlib_surface_create_with_xrender_format(
|
||||
(Display*)maSysData.pDisplay,
|
||||
hPixmap,
|
||||
ScreenOfDisplay((Display *)maSysData.pDisplay, maSysData.nScreen),
|
||||
pFormat, width, height ),
|
||||
&cairo_surface_destroy) ));
|
||||
}
|
||||
else
|
||||
return SurfaceSharedPtr(
|
||||
new X11Surface( maSysData,
|
||||
X11PixmapSharedPtr(),
|
||||
CairoSurfaceSharedPtr(
|
||||
cairo_surface_create_similar( mpSurface.get(), aContent, width, height ),
|
||||
&cairo_surface_destroy )));
|
||||
}
|
||||
|
||||
|
||||
/** Surface::flush Flush the platform native window
|
||||
*
|
||||
* @param pSysData Platform native system environment data (struct SystemEnvData in vcl/inc/sysdata.hxx)
|
||||
*
|
||||
**/
|
||||
void Surface::flush(const SystemEnvData* pSysData)
|
||||
boost::shared_ptr<VirtualDevice> X11Surface::createVirtualDevice() const
|
||||
{
|
||||
#ifdef USE_CAIRO10_APIS
|
||||
cairoHelperFlush( pSysData );
|
||||
#else
|
||||
XSync( (Display*) pSysData->pDisplay, false );
|
||||
#endif
|
||||
SystemGraphicsData aSystemGraphicsData;
|
||||
|
||||
aSystemGraphicsData.nSize = sizeof(SystemGraphicsData);
|
||||
aSystemGraphicsData.hDrawable = getDrawable();
|
||||
aSystemGraphicsData.pRenderFormat = getRenderFormat();
|
||||
|
||||
return boost::shared_ptr<VirtualDevice>(
|
||||
new VirtualDevice( &aSystemGraphicsData, getDepth() ));
|
||||
}
|
||||
|
||||
/**
|
||||
* Surface::Resize: Resizes the Canvas surface.
|
||||
* @param width new width of the surface
|
||||
* @param height new height of the surface
|
||||
*
|
||||
* Only used on X11.
|
||||
*
|
||||
* @return The new surface or NULL
|
||||
**/
|
||||
void X11Surface::Resize( int width, int height )
|
||||
{
|
||||
cairo_xlib_surface_set_size( mpSurface.get(), width, height );
|
||||
}
|
||||
|
||||
} // namespace cairo
|
||||
void X11Surface::flush() const
|
||||
{
|
||||
XSync( (Display*)maSysData.pDisplay, false );
|
||||
}
|
||||
|
||||
#endif // CAIRO_HAS_XLIB_SURFACE
|
||||
/**
|
||||
* Surface::getDepth: Get the color depth of the Canvas surface.
|
||||
*
|
||||
* @return color depth
|
||||
**/
|
||||
int X11Surface::getDepth() const
|
||||
{
|
||||
if( maSysData.pRenderFormat )
|
||||
return ((XRenderPictFormat*) maSysData.pRenderFormat)->depth;
|
||||
|
||||
#endif // defined (UNX) && !defined (QUARTZ)
|
||||
return -1;
|
||||
}
|
||||
|
||||
SurfaceSharedPtr createSurface( const CairoSurfaceSharedPtr& rSurface )
|
||||
{
|
||||
return SurfaceSharedPtr(new X11Surface(rSurface));
|
||||
}
|
||||
|
||||
static X11SysData getSysData( const Window& rWindow )
|
||||
{
|
||||
const SystemEnvData* pSysData = GetSysData(&rWindow);
|
||||
|
||||
if( !pSysData )
|
||||
return X11SysData();
|
||||
else
|
||||
return X11SysData(pSysData);
|
||||
}
|
||||
|
||||
static X11SysData getSysData( const VirtualDevice& rVirDev )
|
||||
{
|
||||
return X11SysData( &rVirDev.GetSystemGfxData() );
|
||||
}
|
||||
|
||||
SurfaceSharedPtr createSurface( const OutputDevice& rRefDevice,
|
||||
int x, int y, int width, int height )
|
||||
{
|
||||
if( rRefDevice.GetOutDevType() == OUTDEV_WINDOW )
|
||||
return SurfaceSharedPtr(new X11Surface(getSysData((const Window&)rRefDevice),
|
||||
x,y,width,height));
|
||||
else if( rRefDevice.GetOutDevType() == OUTDEV_VIRDEV )
|
||||
return SurfaceSharedPtr(new X11Surface(getSysData((const VirtualDevice&)rRefDevice),
|
||||
x,y,width,height));
|
||||
else
|
||||
return SurfaceSharedPtr();
|
||||
}
|
||||
|
||||
SurfaceSharedPtr createBitmapSurface( const OutputDevice& rRefDevice,
|
||||
const BitmapSystemData& rData,
|
||||
const Size& rSize )
|
||||
{
|
||||
OSL_TRACE( "requested size: %d x %d available size: %d x %d",
|
||||
rSize.Width(), rSize.Height(), rData.mnWidth, rData.mnHeight );
|
||||
if ( rData.mnWidth == rSize.Width() && rData.mnHeight == rSize.Height() )
|
||||
{
|
||||
if( rRefDevice.GetOutDevType() == OUTDEV_WINDOW )
|
||||
return SurfaceSharedPtr(new X11Surface(getSysData((const Window&)rRefDevice), rData ));
|
||||
else if( rRefDevice.GetOutDevType() == OUTDEV_VIRDEV )
|
||||
return SurfaceSharedPtr(new X11Surface(getSysData((const VirtualDevice&)rRefDevice), rData ));
|
||||
}
|
||||
|
||||
return SurfaceSharedPtr();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,31 +1,35 @@
|
|||
/*************************************************************************
|
||||
*
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
* OpenOffice.org - a multi-platform office productivity suite
|
||||
*
|
||||
* Copyright 2008 by Sun Microsystems, Inc.
|
||||
* $RCSfile: postx.h,v $
|
||||
*
|
||||
* OpenOffice.org - a multi-platform office productivity suite
|
||||
* $Revision: 1.4 $
|
||||
*
|
||||
* $RCSfile: postx.h,v $
|
||||
* last change: $Author: kz $ $Date: 2008-06-30 12:59:14 $
|
||||
*
|
||||
* $Revision: 1.3 $
|
||||
* The Contents of this file are made available subject to
|
||||
* the terms of GNU Lesser General Public License Version 2.1.
|
||||
*
|
||||
* This file is part of OpenOffice.org.
|
||||
*
|
||||
* OpenOffice.org is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 3
|
||||
* only, as published by the Free Software Foundation.
|
||||
* GNU Lesser General Public License Version 2.1
|
||||
* =============================================
|
||||
* Copyright 2005 by Sun Microsystems, Inc.
|
||||
* 901 San Antonio Road, Palo Alto, CA 94303, USA
|
||||
*
|
||||
* OpenOffice.org is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License version 3 for more details
|
||||
* (a copy is included in the LICENSE file that accompanied this code).
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License version 2.1, as published by the Free Software Foundation.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* version 3 along with OpenOffice.org. If not, see
|
||||
* <http://www.openoffice.org/license.html>
|
||||
* for a copy of the LGPLv3 License.
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
|
|
|
@ -1,31 +1,35 @@
|
|||
/*************************************************************************
|
||||
*
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
* OpenOffice.org - a multi-platform office productivity suite
|
||||
*
|
||||
* Copyright 2008 by Sun Microsystems, Inc.
|
||||
* $RCSfile: prex.h,v $
|
||||
*
|
||||
* OpenOffice.org - a multi-platform office productivity suite
|
||||
* $Revision: 1.4 $
|
||||
*
|
||||
* $RCSfile: prex.h,v $
|
||||
* last change: $Author: kz $ $Date: 2008-06-30 12:58:44 $
|
||||
*
|
||||
* $Revision: 1.3 $
|
||||
* The Contents of this file are made available subject to
|
||||
* the terms of GNU Lesser General Public License Version 2.1.
|
||||
*
|
||||
* This file is part of OpenOffice.org.
|
||||
*
|
||||
* OpenOffice.org is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License version 3
|
||||
* only, as published by the Free Software Foundation.
|
||||
* GNU Lesser General Public License Version 2.1
|
||||
* =============================================
|
||||
* Copyright 2005 by Sun Microsystems, Inc.
|
||||
* 901 San Antonio Road, Palo Alto, CA 94303, USA
|
||||
*
|
||||
* OpenOffice.org is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License version 3 for more details
|
||||
* (a copy is included in the LICENSE file that accompanied this code).
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License version 2.1, as published by the Free Software Foundation.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* version 3 along with OpenOffice.org. If not, see
|
||||
* <http://www.openoffice.org/license.html>
|
||||
* for a copy of the LGPLv3 License.
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
|
|
Loading…
Reference in a new issue