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