diff options
author | Kurt Zenker <kz@openoffice.org> | 2008-04-02 08:45:00 +0000 |
---|---|---|
committer | Kurt Zenker <kz@openoffice.org> | 2008-04-02 08:45:00 +0000 |
commit | a42c6fa1b56802a5e4cd0cda3d45928739757736 (patch) | |
tree | 8a089b8aa83e722319b8d7cf91411df31d3982a1 /canvas | |
parent | 4eb43e86607768ceb4df4f218f0dfc3d8640370c (diff) |
INTEGRATION: CWS cairoquartz01 (1.1.2); FILE ADDED
2008/02/29 16:37:12 thb 1.1.2.13: Fixed build breakage for X11 case
2008/02/23 13:11:05 mox 1.1.2.12: Fix CWS resync to DEV300_m0
2008/01/18 19:02:39 mox 1.1.2.11: Fix namespace of headers on other platforms - win32 & Xlib.
2007/07/25 11:14:31 radekdoulik 1.1.2.10: Issue number: 69066
Submitted by: radekdoulik
Reviewed by: radekdoulik
Fixed xlib build.
Removed old glitz code.
2007/07/20 10:11:48 mox 1.1.2.9: Cleanup includes and revise code comments
2007/07/19 17:25:50 mox 1.1.2.8: Cleanup - We don't need to store mpSysData inside the Surface (in 1.2 API).
2007/07/19 07:26:35 mox 1.1.2.7: Legacy cairo API support is not needed on Win32 and Mac OS X Quartz.
2007/07/19 05:41:24 mox 1.1.2.6: Consolidating Xlib prex.h/postx.h headers to one place, same as premac.h/postmac.h
2007/07/19 04:35:56 mox 1.1.2.5: Removed platform dependend code from cairo_devicehelper.cxx
2007/07/18 23:07:47 mox 1.1.2.4: Use format converter function to simplify
2007/07/18 21:32:40 radekdoulik 1.1.2.3: Issue number: 69066
Submitted by: radekdoulik
Reviewed by: radekdoulik
Removed platform dependend code from cairo_canvashelper_text.cxx
2007/07/18 20:48:35 radekdoulik 1.1.2.2: Issue number: 69066
Submitted by: radekdoulik
Reviewed by: radekdoulik
Fixed xlib backend build.
Fixed pixmap double free in xlib backend.
Fixed render format generation in xlib backend.
2007/07/17 22:34:42 mox 1.1.2.1: Rework cross-platform files to be separate for each platform.
The <1.2 API support is now mostly in platform specific files.
Diffstat (limited to 'canvas')
-rw-r--r-- | canvas/source/cairo/cairo_xlib_cairo.cxx | 324 |
1 files changed, 324 insertions, 0 deletions
diff --git a/canvas/source/cairo/cairo_xlib_cairo.cxx b/canvas/source/cairo/cairo_xlib_cairo.cxx new file mode 100644 index 000000000000..78a5028a68fd --- /dev/null +++ b/canvas/source/cairo/cairo_xlib_cairo.cxx @@ -0,0 +1,324 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: cairo_xlib_cairo.cxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: kz $ $Date: 2008-04-02 09:45:00 $ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * 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. + * + * 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 + * + ************************************************************************/ + + +// 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_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> + +namespace cairo +{ + +bool HasXRender( const void* pSysData ) +{ + Display *pDisplay = (Display*) ((const SystemEnvData*) pSysData)->pDisplay; + int nDummy; + return XQueryExtension( pDisplay, "RENDER", &nDummy, &nDummy, &nDummy ); +} + + +#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 ) + { + } +#endif + + + + /** + * 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 ) + { + } + + + + /** + * 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 ) + { +#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 + } + + + /** + * 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 ) + { + Pixmap hPixmap; + + if( mpSysData && mpDisplay && mhDrawable ) { + XRenderPictFormat *pFormat; + + pFormat = XRenderFindStandardFormat( (Display*) mpDisplay, getXFormat(aContent) ); + hPixmap = XCreatePixmap( (Display*) mpDisplay, cairoHelperGetWindow( mpSysData ), + 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; + } + } + + + /** 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) + { +#ifdef USE_CAIRO10_APIS + cairoHelperFlush( pSysData ); +#else + XSync( (Display*) pSysData->pDisplay, false ); +#endif + } + + +} // namespace cairo + +#endif // CAIRO_HAS_XLIB_SURFACE + +#endif // defined (UNX) && !defined (QUARTZ) |