summaryrefslogtreecommitdiff
path: root/canvas
diff options
context:
space:
mode:
authorKurt Zenker <kz@openoffice.org>2008-04-02 08:45:00 +0000
committerKurt Zenker <kz@openoffice.org>2008-04-02 08:45:00 +0000
commita42c6fa1b56802a5e4cd0cda3d45928739757736 (patch)
tree8a089b8aa83e722319b8d7cf91411df31d3982a1 /canvas
parent4eb43e86607768ceb4df4f218f0dfc3d8640370c (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.cxx324
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)