1*91c99ff4SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*91c99ff4SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*91c99ff4SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*91c99ff4SAndrew Rist  * distributed with this work for additional information
6*91c99ff4SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*91c99ff4SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*91c99ff4SAndrew Rist  * "License"); you may not use this file except in compliance
9*91c99ff4SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*91c99ff4SAndrew Rist  *
11*91c99ff4SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*91c99ff4SAndrew Rist  *
13*91c99ff4SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*91c99ff4SAndrew Rist  * software distributed under the License is distributed on an
15*91c99ff4SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*91c99ff4SAndrew Rist  * KIND, either express or implied.  See the License for the
17*91c99ff4SAndrew Rist  * specific language governing permissions and limitations
18*91c99ff4SAndrew Rist  * under the License.
19*91c99ff4SAndrew Rist  *
20*91c99ff4SAndrew Rist  *************************************************************/
21*91c99ff4SAndrew Rist 
22*91c99ff4SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #ifndef _CAIROCANVAS_XLIB_CAIRO_HXX
25cdf0e10cSrcweir #define _CAIROCANVAS_XLIB_CAIRO_HXX
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include "cairo_cairo.hxx"
28cdf0e10cSrcweir 
29cdf0e10cSrcweir struct SystemEnvData;
30cdf0e10cSrcweir struct SystemGraphicsData;
31cdf0e10cSrcweir 
32cdf0e10cSrcweir namespace cairo {
33cdf0e10cSrcweir 
34cdf0e10cSrcweir     /// Holds all X11-output relevant data
35cdf0e10cSrcweir     struct X11SysData
36cdf0e10cSrcweir     {
37cdf0e10cSrcweir         X11SysData();
38cdf0e10cSrcweir         explicit X11SysData( const SystemGraphicsData& );
39cdf0e10cSrcweir         explicit X11SysData( const SystemEnvData& );
40cdf0e10cSrcweir 
41cdf0e10cSrcweir         void*	pDisplay;		// the relevant display connection
42cdf0e10cSrcweir         long	hDrawable;      // a drawable
43cdf0e10cSrcweir         void*	pVisual;		// the visual in use
44cdf0e10cSrcweir         int	nScreen;		// the current screen of the drawable
45cdf0e10cSrcweir         int		nDepth; 		// depth of said visual
46cdf0e10cSrcweir         long	aColormap;		// the colormap being used
47cdf0e10cSrcweir         void*	pRenderFormat;  // render format for drawable
48cdf0e10cSrcweir     };
49cdf0e10cSrcweir 
50cdf0e10cSrcweir     /// RAII wrapper for a pixmap
51cdf0e10cSrcweir     struct X11Pixmap
52cdf0e10cSrcweir     {
53cdf0e10cSrcweir         void* mpDisplay;  // the relevant display connection
54cdf0e10cSrcweir         long  mhDrawable; // a drawable
55cdf0e10cSrcweir 
X11Pixmapcairo::X11Pixmap56cdf0e10cSrcweir         X11Pixmap( long hDrawable, void* pDisplay ) :
57cdf0e10cSrcweir             mpDisplay(pDisplay),
58cdf0e10cSrcweir             mhDrawable(hDrawable)
59cdf0e10cSrcweir         {}
60cdf0e10cSrcweir 
61cdf0e10cSrcweir         ~X11Pixmap();
62cdf0e10cSrcweir 
clearcairo::X11Pixmap63cdf0e10cSrcweir         void clear() { mpDisplay=NULL; mhDrawable=0; }
64cdf0e10cSrcweir     };
65cdf0e10cSrcweir 
66cdf0e10cSrcweir     typedef boost::shared_ptr<X11Pixmap>       X11PixmapSharedPtr;
67cdf0e10cSrcweir 
68cdf0e10cSrcweir 	class X11Surface : public Surface
69cdf0e10cSrcweir     {
70cdf0e10cSrcweir 		const X11SysData      maSysData;
71cdf0e10cSrcweir         X11PixmapSharedPtr    mpPixmap;
72cdf0e10cSrcweir 		CairoSurfaceSharedPtr mpSurface;
73cdf0e10cSrcweir 
74cdf0e10cSrcweir 		X11Surface( const X11SysData& rSysData, const X11PixmapSharedPtr& rPixmap, const CairoSurfaceSharedPtr& pSurface );
75cdf0e10cSrcweir 
76cdf0e10cSrcweir 	public:
77cdf0e10cSrcweir         /// takes over ownership of passed cairo_surface
78cdf0e10cSrcweir 		explicit X11Surface( const CairoSurfaceSharedPtr& pSurface );
79cdf0e10cSrcweir         /// create surface on subarea of given drawable
80cdf0e10cSrcweir 		X11Surface( const X11SysData& rSysData, int x, int y, int width, int height );
81cdf0e10cSrcweir         /// create surface for given bitmap data
82cdf0e10cSrcweir 		X11Surface( const X11SysData& rSysData, const BitmapSystemData& rBmpData );
83cdf0e10cSrcweir 
84cdf0e10cSrcweir         // Surface interface
85cdf0e10cSrcweir 		virtual CairoSharedPtr getCairo() const;
getCairoSurface() const86cdf0e10cSrcweir 		virtual CairoSurfaceSharedPtr getCairoSurface() const { return mpSurface; }
87cdf0e10cSrcweir 		virtual SurfaceSharedPtr getSimilar( Content aContent, int width, int height ) const;
88cdf0e10cSrcweir 
89cdf0e10cSrcweir         virtual boost::shared_ptr<VirtualDevice> createVirtualDevice() const;
90cdf0e10cSrcweir 
91cdf0e10cSrcweir 		virtual void Resize( int width, int height );
92cdf0e10cSrcweir 
93cdf0e10cSrcweir         virtual void flush() const;
94cdf0e10cSrcweir 
95cdf0e10cSrcweir 		int getDepth() const;
getPixmap() const96cdf0e10cSrcweir 		X11PixmapSharedPtr getPixmap() const { return mpPixmap; }
getRenderFormat() const97cdf0e10cSrcweir 		void* getRenderFormat() const { return maSysData.pRenderFormat; }
getDrawable() const98cdf0e10cSrcweir         long getDrawable() const { return mpPixmap ? mpPixmap->mhDrawable : maSysData.hDrawable; }
99cdf0e10cSrcweir 	};
100cdf0e10cSrcweir }
101cdf0e10cSrcweir 
102cdf0e10cSrcweir #endif
103