xref: /aoo4110/main/vcl/unx/generic/gdi/salgdi2.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_vcl.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <stdio.h>
28*b1cdbd2cSJim Jagielski #include <poll.h>
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski #include "vcl/salbtype.hxx"
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski #include "unx/salunx.h"
33*b1cdbd2cSJim Jagielski #include "unx/saldata.hxx"
34*b1cdbd2cSJim Jagielski #include "unx/saldisp.hxx"
35*b1cdbd2cSJim Jagielski #include "unx/salbmp.h"
36*b1cdbd2cSJim Jagielski #include "unx/salgdi.h"
37*b1cdbd2cSJim Jagielski #include "unx/salframe.h"
38*b1cdbd2cSJim Jagielski #include "unx/salvd.h"
39*b1cdbd2cSJim Jagielski #include "xrender_peer.hxx"
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski #include "printergfx.hxx"
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski #include "vcl/bmpacc.hxx"
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski #undef SALGDI2_TESTTRANS
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski // -=-= debugging =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
48*b1cdbd2cSJim Jagielski // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
49*b1cdbd2cSJim Jagielski #if 0
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski static void sal_PrintImage( char *s, XImage*p )
52*b1cdbd2cSJim Jagielski {
53*b1cdbd2cSJim Jagielski 	fprintf( stderr, "%s %d %d %d\n", s, p->depth, p->width, p->height );
54*b1cdbd2cSJim Jagielski 	int nW = Min( 64, p->width*p->bits_per_pixel >> 3 );
55*b1cdbd2cSJim Jagielski 	for( int i = 0; i < Min( 16, p->height ); i++ )
56*b1cdbd2cSJim Jagielski 	{
57*b1cdbd2cSJim Jagielski 		for( int j = 0; j < nW; j++ )
58*b1cdbd2cSJim Jagielski 			fprintf( stderr, "%02X", (UINT8)p->data[i*p->bytes_per_line+j] );
59*b1cdbd2cSJim Jagielski 		fprintf( stderr, "\n" );
60*b1cdbd2cSJim Jagielski 	}
61*b1cdbd2cSJim Jagielski }
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski #endif // DBG_UTIL
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski #if (OSL_DEBUG_LEVEL > 1) && defined SALGDI2_TESTTRANS
68*b1cdbd2cSJim Jagielski #define DBG_TESTTRANS( _def_drawable )								\
69*b1cdbd2cSJim Jagielski {																	\
70*b1cdbd2cSJim Jagielski 	XCopyArea( pXDisp, _def_drawable, aDrawable, GetCopyGC(),		\
71*b1cdbd2cSJim Jagielski 			   0, 0,												\
72*b1cdbd2cSJim Jagielski 			   pPosAry->mnDestWidth, pPosAry->mnDestHeight,			\
73*b1cdbd2cSJim Jagielski 			   0, 0 );												\
74*b1cdbd2cSJim Jagielski }
75*b1cdbd2cSJim Jagielski #else // (OSL_DEBUG_LEVEL > 1) && defined SALGDI2_TESTTRANS
76*b1cdbd2cSJim Jagielski #define DBG_TESTTRANS( _def_drawable )
77*b1cdbd2cSJim Jagielski #endif // (OSL_DEBUG_LEVEL > 1) && defined SALGDI2_TESTTRANS
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski // -=-= X11SalGraphics =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
80*b1cdbd2cSJim Jagielski // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
CopyScreenArea(Display * pDisplay,Drawable aSrc,int nScreenSrc,int nSrcDepth,Drawable aDest,int nScreenDest,int nDestDepth,GC aDestGC,int src_x,int src_y,unsigned int w,unsigned int h,int dest_x,int dest_y)81*b1cdbd2cSJim Jagielski void X11SalGraphics::CopyScreenArea( Display* pDisplay,
82*b1cdbd2cSJim Jagielski                                Drawable aSrc, int nScreenSrc, int nSrcDepth,
83*b1cdbd2cSJim Jagielski                                Drawable aDest, int nScreenDest, int nDestDepth,
84*b1cdbd2cSJim Jagielski                                GC aDestGC,
85*b1cdbd2cSJim Jagielski                                int src_x, int src_y,
86*b1cdbd2cSJim Jagielski                                unsigned int w, unsigned int h,
87*b1cdbd2cSJim Jagielski                                int dest_x, int dest_y )
88*b1cdbd2cSJim Jagielski {
89*b1cdbd2cSJim Jagielski     if( nSrcDepth == nDestDepth )
90*b1cdbd2cSJim Jagielski     {
91*b1cdbd2cSJim Jagielski         if( nScreenSrc == nScreenDest )
92*b1cdbd2cSJim Jagielski             XCopyArea( pDisplay, aSrc, aDest, aDestGC,
93*b1cdbd2cSJim Jagielski                        src_x, src_y, w, h, dest_x, dest_y );
94*b1cdbd2cSJim Jagielski         else
95*b1cdbd2cSJim Jagielski         {
96*b1cdbd2cSJim Jagielski             SalXLib* pLib = GetX11SalData()->GetDisplay()->GetXLib();
97*b1cdbd2cSJim Jagielski             pLib->PushXErrorLevel( true );
98*b1cdbd2cSJim Jagielski             XImage* pImage = XGetImage( pDisplay, aSrc, src_x, src_y, w, h,
99*b1cdbd2cSJim Jagielski                                         AllPlanes, ZPixmap );
100*b1cdbd2cSJim Jagielski             if( pImage )
101*b1cdbd2cSJim Jagielski             {
102*b1cdbd2cSJim Jagielski                 if( pImage->data )
103*b1cdbd2cSJim Jagielski                 {
104*b1cdbd2cSJim Jagielski                     XPutImage( pDisplay, aDest, aDestGC, pImage,
105*b1cdbd2cSJim Jagielski                                0, 0, dest_x, dest_y, w, h );
106*b1cdbd2cSJim Jagielski                 }
107*b1cdbd2cSJim Jagielski                 XDestroyImage( pImage );
108*b1cdbd2cSJim Jagielski             }
109*b1cdbd2cSJim Jagielski             pLib->PopXErrorLevel();
110*b1cdbd2cSJim Jagielski         }
111*b1cdbd2cSJim Jagielski     }
112*b1cdbd2cSJim Jagielski     else
113*b1cdbd2cSJim Jagielski     {
114*b1cdbd2cSJim Jagielski         X11SalBitmap aBM;
115*b1cdbd2cSJim Jagielski         aBM.ImplCreateFromDrawable( aSrc, nScreenSrc, nSrcDepth, src_x, src_y, w, h );
116*b1cdbd2cSJim Jagielski         SalTwoRect aTwoRect;
117*b1cdbd2cSJim Jagielski         aTwoRect.mnSrcX = aTwoRect.mnSrcY = 0;
118*b1cdbd2cSJim Jagielski         aTwoRect.mnSrcWidth = aTwoRect.mnDestWidth = w;
119*b1cdbd2cSJim Jagielski         aTwoRect.mnSrcHeight = aTwoRect.mnDestHeight = h;
120*b1cdbd2cSJim Jagielski         aTwoRect.mnDestX = dest_x;
121*b1cdbd2cSJim Jagielski         aTwoRect.mnDestY = dest_y;
122*b1cdbd2cSJim Jagielski         aBM.ImplDraw( aDest, nScreenDest, nDestDepth, aTwoRect,aDestGC );
123*b1cdbd2cSJim Jagielski     }
124*b1cdbd2cSJim Jagielski }
125*b1cdbd2cSJim Jagielski 
CreateGC(Drawable hDrawable,unsigned long nMask)126*b1cdbd2cSJim Jagielski GC X11SalGraphics::CreateGC( Drawable hDrawable, unsigned long nMask )
127*b1cdbd2cSJim Jagielski {
128*b1cdbd2cSJim Jagielski 	XGCValues values;
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski 	values.graphics_exposures	= False;
131*b1cdbd2cSJim Jagielski 	values.foreground			= m_pColormap->GetBlackPixel()
132*b1cdbd2cSJim Jagielski 		                          ^ m_pColormap->GetWhitePixel();
133*b1cdbd2cSJim Jagielski 	values.function				= GXxor;
134*b1cdbd2cSJim Jagielski 	values.line_width			= 1;
135*b1cdbd2cSJim Jagielski 	values.fill_style			= FillStippled;
136*b1cdbd2cSJim Jagielski 	values.stipple				= GetDisplay()->GetInvert50( m_nScreen );
137*b1cdbd2cSJim Jagielski     values.subwindow_mode		= ClipByChildren;
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski 	return XCreateGC( GetXDisplay(), hDrawable, nMask | GCSubwindowMode, &values );
140*b1cdbd2cSJim Jagielski }
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
GetMonoGC(Pixmap hPixmap)143*b1cdbd2cSJim Jagielski inline GC X11SalGraphics::GetMonoGC( Pixmap hPixmap )
144*b1cdbd2cSJim Jagielski {
145*b1cdbd2cSJim Jagielski 	if( !pMonoGC_ )
146*b1cdbd2cSJim Jagielski 		pMonoGC_ = CreateGC( hPixmap );
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski 	if( !bMonoGC_ )
149*b1cdbd2cSJim Jagielski 	{
150*b1cdbd2cSJim Jagielski 		SetClipRegion( pMonoGC_ );
151*b1cdbd2cSJim Jagielski 		bMonoGC_ = sal_True;
152*b1cdbd2cSJim Jagielski 	}
153*b1cdbd2cSJim Jagielski 
154*b1cdbd2cSJim Jagielski 	return pMonoGC_;
155*b1cdbd2cSJim Jagielski }
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
GetCopyGC()158*b1cdbd2cSJim Jagielski inline GC X11SalGraphics::GetCopyGC()
159*b1cdbd2cSJim Jagielski {
160*b1cdbd2cSJim Jagielski 	if( bXORMode_ ) return GetInvertGC();
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski 	if( !pCopyGC_ )
163*b1cdbd2cSJim Jagielski 		pCopyGC_ = CreateGC( GetDrawable() );
164*b1cdbd2cSJim Jagielski 
165*b1cdbd2cSJim Jagielski 	if( !bCopyGC_ )
166*b1cdbd2cSJim Jagielski 	{
167*b1cdbd2cSJim Jagielski 		SetClipRegion( pCopyGC_ );
168*b1cdbd2cSJim Jagielski 		bCopyGC_ = sal_True;
169*b1cdbd2cSJim Jagielski 	}
170*b1cdbd2cSJim Jagielski 	return pCopyGC_;
171*b1cdbd2cSJim Jagielski }
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
GetInvertGC()174*b1cdbd2cSJim Jagielski GC X11SalGraphics::GetInvertGC()
175*b1cdbd2cSJim Jagielski {
176*b1cdbd2cSJim Jagielski 	if( !pInvertGC_ )
177*b1cdbd2cSJim Jagielski 		pInvertGC_ = CreateGC( GetDrawable(),
178*b1cdbd2cSJim Jagielski 							   GCGraphicsExposures
179*b1cdbd2cSJim Jagielski 							   | GCForeground
180*b1cdbd2cSJim Jagielski 							   | GCFunction
181*b1cdbd2cSJim Jagielski 							   | GCLineWidth );
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski 	if( !bInvertGC_ )
184*b1cdbd2cSJim Jagielski 	{
185*b1cdbd2cSJim Jagielski 		SetClipRegion( pInvertGC_ );
186*b1cdbd2cSJim Jagielski 		bInvertGC_ = sal_True;
187*b1cdbd2cSJim Jagielski 	}
188*b1cdbd2cSJim Jagielski 	return pInvertGC_;
189*b1cdbd2cSJim Jagielski }
190*b1cdbd2cSJim Jagielski 
191*b1cdbd2cSJim Jagielski // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
GetInvert50GC()192*b1cdbd2cSJim Jagielski GC X11SalGraphics::GetInvert50GC()
193*b1cdbd2cSJim Jagielski {
194*b1cdbd2cSJim Jagielski 	if( !pInvert50GC_ )
195*b1cdbd2cSJim Jagielski 	{
196*b1cdbd2cSJim Jagielski 		XGCValues values;
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski 		values.graphics_exposures	= False;
199*b1cdbd2cSJim Jagielski 		values.foreground			= m_pColormap->GetWhitePixel();
200*b1cdbd2cSJim Jagielski 		values.background			= m_pColormap->GetBlackPixel();
201*b1cdbd2cSJim Jagielski 		values.function				= GXinvert;
202*b1cdbd2cSJim Jagielski 		values.line_width			= 1;
203*b1cdbd2cSJim Jagielski 		values.line_style			= LineSolid;
204*b1cdbd2cSJim Jagielski 		unsigned long nValueMask =
205*b1cdbd2cSJim Jagielski 								  GCGraphicsExposures
206*b1cdbd2cSJim Jagielski 								  | GCForeground
207*b1cdbd2cSJim Jagielski 								  | GCBackground
208*b1cdbd2cSJim Jagielski 								  | GCFunction
209*b1cdbd2cSJim Jagielski 								  | GCLineWidth
210*b1cdbd2cSJim Jagielski 								  | GCLineStyle
211*b1cdbd2cSJim Jagielski 								  | GCFillStyle
212*b1cdbd2cSJim Jagielski 								  | GCStipple;
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski 		char* pEnv = getenv( "SAL_DO_NOT_USE_INVERT50" );
215*b1cdbd2cSJim Jagielski 		if( pEnv && ! strcasecmp( pEnv, "true" ) )
216*b1cdbd2cSJim Jagielski 		{
217*b1cdbd2cSJim Jagielski 			values.fill_style = FillSolid;
218*b1cdbd2cSJim Jagielski 			nValueMask &= ~ GCStipple;
219*b1cdbd2cSJim Jagielski 		}
220*b1cdbd2cSJim Jagielski 		else
221*b1cdbd2cSJim Jagielski 		{
222*b1cdbd2cSJim Jagielski 			values.fill_style			= FillStippled;
223*b1cdbd2cSJim Jagielski 			values.stipple				= GetDisplay()->GetInvert50( m_nScreen );
224*b1cdbd2cSJim Jagielski 		}
225*b1cdbd2cSJim Jagielski 
226*b1cdbd2cSJim Jagielski 		pInvert50GC_ = XCreateGC( GetXDisplay(), GetDrawable(),
227*b1cdbd2cSJim Jagielski 								  nValueMask,
228*b1cdbd2cSJim Jagielski 								  &values );
229*b1cdbd2cSJim Jagielski 	}
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski 	if( !bInvert50GC_ )
232*b1cdbd2cSJim Jagielski 	{
233*b1cdbd2cSJim Jagielski 		SetClipRegion( pInvert50GC_ );
234*b1cdbd2cSJim Jagielski 		bInvert50GC_ = sal_True;
235*b1cdbd2cSJim Jagielski 	}
236*b1cdbd2cSJim Jagielski 	return pInvert50GC_;
237*b1cdbd2cSJim Jagielski }
238*b1cdbd2cSJim Jagielski 
239*b1cdbd2cSJim Jagielski // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
GetStippleGC()240*b1cdbd2cSJim Jagielski inline GC X11SalGraphics::GetStippleGC()
241*b1cdbd2cSJim Jagielski {
242*b1cdbd2cSJim Jagielski 	if( !pStippleGC_ )
243*b1cdbd2cSJim Jagielski 		pStippleGC_ = CreateGC( GetDrawable(),
244*b1cdbd2cSJim Jagielski 								GCGraphicsExposures
245*b1cdbd2cSJim Jagielski 								| GCFillStyle
246*b1cdbd2cSJim Jagielski 								| GCLineWidth );
247*b1cdbd2cSJim Jagielski 
248*b1cdbd2cSJim Jagielski 	if( !bStippleGC_ )
249*b1cdbd2cSJim Jagielski 	{
250*b1cdbd2cSJim Jagielski 		XSetFunction( GetXDisplay(), pStippleGC_, bXORMode_ ? GXxor : GXcopy );
251*b1cdbd2cSJim Jagielski 		SetClipRegion( pStippleGC_ );
252*b1cdbd2cSJim Jagielski 		bStippleGC_ = sal_True;
253*b1cdbd2cSJim Jagielski 	}
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski 	return pStippleGC_;
256*b1cdbd2cSJim Jagielski }
257*b1cdbd2cSJim Jagielski 
258*b1cdbd2cSJim Jagielski // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Clip(XLIB_Region pRegion,int & nX,int & nY,unsigned int & nDX,unsigned int & nDY,int & nSrcX,int & nSrcY) const259*b1cdbd2cSJim Jagielski int X11SalGraphics::Clip( XLIB_Region   pRegion,
260*b1cdbd2cSJim Jagielski 								 int          &nX,
261*b1cdbd2cSJim Jagielski 								 int          &nY,
262*b1cdbd2cSJim Jagielski 								 unsigned int &nDX,
263*b1cdbd2cSJim Jagielski 								 unsigned int &nDY,
264*b1cdbd2cSJim Jagielski 								 int          &nSrcX,
265*b1cdbd2cSJim Jagielski 								 int          &nSrcY ) const
266*b1cdbd2cSJim Jagielski {
267*b1cdbd2cSJim Jagielski 	XRectangle aRect;
268*b1cdbd2cSJim Jagielski 	XClipBox( pRegion, &aRect );
269*b1cdbd2cSJim Jagielski 
270*b1cdbd2cSJim Jagielski 	if( int(nX + nDX) <= int(aRect.x) || nX >= int(aRect.x + aRect.width) )
271*b1cdbd2cSJim Jagielski 		return RectangleOut;
272*b1cdbd2cSJim Jagielski 	if( int(nY + nDY) <= int(aRect.y) || nY >= int(aRect.y + aRect.height) )
273*b1cdbd2cSJim Jagielski 		return RectangleOut;
274*b1cdbd2cSJim Jagielski 
275*b1cdbd2cSJim Jagielski 	if( nX < aRect.x )
276*b1cdbd2cSJim Jagielski 	{
277*b1cdbd2cSJim Jagielski 		nSrcX += aRect.x - nX;
278*b1cdbd2cSJim Jagielski 		nDX   -= aRect.x - nX;
279*b1cdbd2cSJim Jagielski 		nX     = aRect.x;
280*b1cdbd2cSJim Jagielski 	}
281*b1cdbd2cSJim Jagielski 	else if( int(nX + nDX) > int(aRect.x + aRect.width) )
282*b1cdbd2cSJim Jagielski 		nDX = aRect.x + aRect.width - nX;
283*b1cdbd2cSJim Jagielski 
284*b1cdbd2cSJim Jagielski 	if( nY < aRect.y )
285*b1cdbd2cSJim Jagielski 	{
286*b1cdbd2cSJim Jagielski 		nSrcY += aRect.y - nY;
287*b1cdbd2cSJim Jagielski 		nDY   -= aRect.y - nY;
288*b1cdbd2cSJim Jagielski 		nY     = aRect.y;
289*b1cdbd2cSJim Jagielski 	}
290*b1cdbd2cSJim Jagielski 	else if( int(nY + nDY) > int(aRect.y + aRect.height) )
291*b1cdbd2cSJim Jagielski 		nDY = aRect.y + aRect.height - nY;
292*b1cdbd2cSJim Jagielski 
293*b1cdbd2cSJim Jagielski 	return RectangleIn;
294*b1cdbd2cSJim Jagielski }
295*b1cdbd2cSJim Jagielski 
296*b1cdbd2cSJim Jagielski // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Clip(int & nX,int & nY,unsigned int & nDX,unsigned int & nDY,int & nSrcX,int & nSrcY) const297*b1cdbd2cSJim Jagielski int X11SalGraphics::Clip( int          &nX,
298*b1cdbd2cSJim Jagielski 								 int          &nY,
299*b1cdbd2cSJim Jagielski 								 unsigned int &nDX,
300*b1cdbd2cSJim Jagielski 								 unsigned int &nDY,
301*b1cdbd2cSJim Jagielski 								 int          &nSrcX,
302*b1cdbd2cSJim Jagielski 								 int          &nSrcY ) const
303*b1cdbd2cSJim Jagielski 
304*b1cdbd2cSJim Jagielski {
305*b1cdbd2cSJim Jagielski 	if( pPaintRegion_
306*b1cdbd2cSJim Jagielski 		&& RectangleOut == Clip( pPaintRegion_, nX, nY, nDX, nDY, nSrcX, nSrcY ) )
307*b1cdbd2cSJim Jagielski 		return RectangleOut;
308*b1cdbd2cSJim Jagielski 
309*b1cdbd2cSJim Jagielski 	if( mpClipRegion
310*b1cdbd2cSJim Jagielski 		&& RectangleOut == Clip( mpClipRegion,  nX, nY, nDX, nDY, nSrcX, nSrcY ) )
311*b1cdbd2cSJim Jagielski 		return RectangleOut;
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski 	int nPaint;
314*b1cdbd2cSJim Jagielski 	if( pPaintRegion_ )
315*b1cdbd2cSJim Jagielski 	{
316*b1cdbd2cSJim Jagielski 		nPaint = XRectInRegion( pPaintRegion_, nX, nY, nDX, nDY );
317*b1cdbd2cSJim Jagielski 		if( RectangleOut == nPaint )
318*b1cdbd2cSJim Jagielski 			return RectangleOut;
319*b1cdbd2cSJim Jagielski 	}
320*b1cdbd2cSJim Jagielski 	else
321*b1cdbd2cSJim Jagielski 		nPaint = RectangleIn;
322*b1cdbd2cSJim Jagielski 
323*b1cdbd2cSJim Jagielski 	int nClip;
324*b1cdbd2cSJim Jagielski 	if( mpClipRegion )
325*b1cdbd2cSJim Jagielski 	{
326*b1cdbd2cSJim Jagielski 		nClip = XRectInRegion( mpClipRegion, nX, nY, nDX, nDY );
327*b1cdbd2cSJim Jagielski 		if( RectangleOut == nClip )
328*b1cdbd2cSJim Jagielski 			return RectangleOut;
329*b1cdbd2cSJim Jagielski 	}
330*b1cdbd2cSJim Jagielski 	else
331*b1cdbd2cSJim Jagielski 		nClip = RectangleIn;
332*b1cdbd2cSJim Jagielski 
333*b1cdbd2cSJim Jagielski 	return RectangleIn == nClip && RectangleIn == nPaint
334*b1cdbd2cSJim Jagielski 		   ? RectangleIn
335*b1cdbd2cSJim Jagielski 		   : RectanglePart;
336*b1cdbd2cSJim Jagielski }
337*b1cdbd2cSJim Jagielski 
338*b1cdbd2cSJim Jagielski // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
SetMask(int & nX,int & nY,unsigned int & nDX,unsigned int & nDY,int & nSrcX,int & nSrcY,Pixmap hClipMask)339*b1cdbd2cSJim Jagielski GC X11SalGraphics::SetMask( int           &nX,
340*b1cdbd2cSJim Jagielski 								   int           &nY,
341*b1cdbd2cSJim Jagielski 								   unsigned int &nDX,
342*b1cdbd2cSJim Jagielski 								   unsigned int &nDY,
343*b1cdbd2cSJim Jagielski 								   int          &nSrcX,
344*b1cdbd2cSJim Jagielski 								   int          &nSrcY,
345*b1cdbd2cSJim Jagielski 								   Pixmap        hClipMask )
346*b1cdbd2cSJim Jagielski {
347*b1cdbd2cSJim Jagielski 	int n = Clip( nX, nY, nDX, nDY, nSrcX, nSrcY );
348*b1cdbd2cSJim Jagielski 	if( RectangleOut == n )
349*b1cdbd2cSJim Jagielski 		return NULL;
350*b1cdbd2cSJim Jagielski 
351*b1cdbd2cSJim Jagielski 	Display *pDisplay = GetXDisplay();
352*b1cdbd2cSJim Jagielski 
353*b1cdbd2cSJim Jagielski 	if( !pMaskGC_ )
354*b1cdbd2cSJim Jagielski 		pMaskGC_ = CreateGC( GetDrawable() );
355*b1cdbd2cSJim Jagielski 
356*b1cdbd2cSJim Jagielski 	if( RectangleIn == n )
357*b1cdbd2cSJim Jagielski 	{
358*b1cdbd2cSJim Jagielski 		XSetClipMask( pDisplay, pMaskGC_, hClipMask );
359*b1cdbd2cSJim Jagielski 		XSetClipOrigin( pDisplay, pMaskGC_, nX - nSrcX, nY - nSrcY );
360*b1cdbd2cSJim Jagielski 		return pMaskGC_;
361*b1cdbd2cSJim Jagielski 	}
362*b1cdbd2cSJim Jagielski 
363*b1cdbd2cSJim Jagielski 	// - - - - create alternate clip pixmap for region clipping - - - -
364*b1cdbd2cSJim Jagielski 	Pixmap hPixmap	= XCreatePixmap( pDisplay, hClipMask, nDX, nDY, 1 );
365*b1cdbd2cSJim Jagielski 
366*b1cdbd2cSJim Jagielski 	if( !hPixmap )
367*b1cdbd2cSJim Jagielski 	{
368*b1cdbd2cSJim Jagielski #if (OSL_DEBUG_LEVEL > 1) || defined DBG_UTIL
369*b1cdbd2cSJim Jagielski 		fprintf( stderr, "X11SalGraphics::SetMask !hPixmap\n" );
370*b1cdbd2cSJim Jagielski #endif
371*b1cdbd2cSJim Jagielski 		return NULL;
372*b1cdbd2cSJim Jagielski 	}
373*b1cdbd2cSJim Jagielski 
374*b1cdbd2cSJim Jagielski 	// - - - - reset pixmap; all 0 - - - - - - - - - - - - - - - - - - -
375*b1cdbd2cSJim Jagielski 	XFillRectangle( pDisplay,
376*b1cdbd2cSJim Jagielski 					hPixmap,
377*b1cdbd2cSJim Jagielski 					GetDisplay()->GetMonoGC( m_nScreen ),
378*b1cdbd2cSJim Jagielski 					0,   0,
379*b1cdbd2cSJim Jagielski 					nDX, nDY );
380*b1cdbd2cSJim Jagielski 
381*b1cdbd2cSJim Jagielski 	// - - - - copy pixmap only within region - - - - - - - - - - - - -
382*b1cdbd2cSJim Jagielski 	GC pMonoGC = GetMonoGC( hPixmap );
383*b1cdbd2cSJim Jagielski 	XSetClipOrigin( pDisplay, pMonoGC, -nX, -nY );
384*b1cdbd2cSJim Jagielski 	XCopyArea( pDisplay,
385*b1cdbd2cSJim Jagielski 			   hClipMask,			// Source
386*b1cdbd2cSJim Jagielski 			   hPixmap,				// Destination
387*b1cdbd2cSJim Jagielski 			   pMonoGC,
388*b1cdbd2cSJim Jagielski 			   nSrcX, nSrcY,		// Source
389*b1cdbd2cSJim Jagielski 			   nDX,   nDY,			// Width & Height
390*b1cdbd2cSJim Jagielski 			   0,     0 );			// Destination
391*b1cdbd2cSJim Jagielski 
392*b1cdbd2cSJim Jagielski 	XSetClipMask( pDisplay, pMaskGC_, hPixmap );
393*b1cdbd2cSJim Jagielski 	XSetClipOrigin( pDisplay, pMaskGC_, nX, nY );
394*b1cdbd2cSJim Jagielski 
395*b1cdbd2cSJim Jagielski 	XFreePixmap( pDisplay, hPixmap );
396*b1cdbd2cSJim Jagielski 	return pMaskGC_;
397*b1cdbd2cSJim Jagielski }
398*b1cdbd2cSJim Jagielski 
399*b1cdbd2cSJim Jagielski // -=-= SalGraphics =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
400*b1cdbd2cSJim Jagielski // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
401*b1cdbd2cSJim Jagielski 
402*b1cdbd2cSJim Jagielski extern "C"
403*b1cdbd2cSJim Jagielski {
GraphicsExposePredicate(Display *,XEvent * pEvent,XPointer pFrameWindow)404*b1cdbd2cSJim Jagielski     static Bool GraphicsExposePredicate( Display*, XEvent* pEvent, XPointer pFrameWindow )
405*b1cdbd2cSJim Jagielski     {
406*b1cdbd2cSJim Jagielski         Bool bRet = False;
407*b1cdbd2cSJim Jagielski         if( (pEvent->type == GraphicsExpose || pEvent->type == NoExpose) &&
408*b1cdbd2cSJim Jagielski             pEvent->xnoexpose.drawable == (Drawable)pFrameWindow )
409*b1cdbd2cSJim Jagielski         {
410*b1cdbd2cSJim Jagielski             bRet = True;
411*b1cdbd2cSJim Jagielski         }
412*b1cdbd2cSJim Jagielski         return bRet;
413*b1cdbd2cSJim Jagielski     }
414*b1cdbd2cSJim Jagielski }
415*b1cdbd2cSJim Jagielski 
416*b1cdbd2cSJim Jagielski 
YieldGraphicsExpose()417*b1cdbd2cSJim Jagielski void X11SalGraphics::YieldGraphicsExpose()
418*b1cdbd2cSJim Jagielski {
419*b1cdbd2cSJim Jagielski     // get frame if necessary
420*b1cdbd2cSJim Jagielski     SalFrame* pFrame    = m_pFrame;
421*b1cdbd2cSJim Jagielski     Display* pDisplay   = GetXDisplay();
422*b1cdbd2cSJim Jagielski     XLIB_Window aWindow = GetDrawable();
423*b1cdbd2cSJim Jagielski     if( ! pFrame )
424*b1cdbd2cSJim Jagielski     {
425*b1cdbd2cSJim Jagielski         const std::list< SalFrame* >& rFrames = GetX11SalData()->GetDisplay()->getFrames();
426*b1cdbd2cSJim Jagielski         for( std::list< SalFrame* >::const_iterator it = rFrames.begin(); it != rFrames.end() && ! pFrame; ++it )
427*b1cdbd2cSJim Jagielski         {
428*b1cdbd2cSJim Jagielski             const SystemEnvData* pEnvData = (*it)->GetSystemData();
429*b1cdbd2cSJim Jagielski             if( Drawable(pEnvData->aWindow) == aWindow )
430*b1cdbd2cSJim Jagielski                 pFrame = *it;
431*b1cdbd2cSJim Jagielski         }
432*b1cdbd2cSJim Jagielski         if( ! pFrame )
433*b1cdbd2cSJim Jagielski             return;
434*b1cdbd2cSJim Jagielski     }
435*b1cdbd2cSJim Jagielski 
436*b1cdbd2cSJim Jagielski     XEvent aEvent;
437*b1cdbd2cSJim Jagielski     while( XCheckTypedWindowEvent( pDisplay, aWindow, Expose, &aEvent ) )
438*b1cdbd2cSJim Jagielski     {
439*b1cdbd2cSJim Jagielski         SalPaintEvent aPEvt( aEvent.xexpose.x, aEvent.xexpose.y, aEvent.xexpose.width+1, aEvent.xexpose.height+1 );
440*b1cdbd2cSJim Jagielski         pFrame->CallCallback( SALEVENT_PAINT, &aPEvt );
441*b1cdbd2cSJim Jagielski     }
442*b1cdbd2cSJim Jagielski 
443*b1cdbd2cSJim Jagielski     do
444*b1cdbd2cSJim Jagielski     {
445*b1cdbd2cSJim Jagielski         if( ! GetDisplay()->XIfEventWithTimeout( &aEvent, (XPointer)aWindow, GraphicsExposePredicate ) )
446*b1cdbd2cSJim Jagielski             // this should not happen at all; still sometimes it happens
447*b1cdbd2cSJim Jagielski             break;
448*b1cdbd2cSJim Jagielski 
449*b1cdbd2cSJim Jagielski         if( aEvent.type == NoExpose )
450*b1cdbd2cSJim Jagielski             break;
451*b1cdbd2cSJim Jagielski 
452*b1cdbd2cSJim Jagielski         if( pFrame )
453*b1cdbd2cSJim Jagielski         {
454*b1cdbd2cSJim Jagielski             SalPaintEvent aPEvt( aEvent.xgraphicsexpose.x, aEvent.xgraphicsexpose.y, aEvent.xgraphicsexpose.width+1, aEvent.xgraphicsexpose.height+1 );
455*b1cdbd2cSJim Jagielski             pFrame->CallCallback( SALEVENT_PAINT, &aPEvt );
456*b1cdbd2cSJim Jagielski         }
457*b1cdbd2cSJim Jagielski     } while( aEvent.xgraphicsexpose.count != 0 );
458*b1cdbd2cSJim Jagielski }
459*b1cdbd2cSJim Jagielski 
copyBits(const SalTwoRect & rPosAry,SalGraphics * pSSrcGraphics)460*b1cdbd2cSJim Jagielski void X11SalGraphics::copyBits( const SalTwoRect& rPosAry,
461*b1cdbd2cSJim Jagielski 								  SalGraphics	   *pSSrcGraphics )
462*b1cdbd2cSJim Jagielski {
463*b1cdbd2cSJim Jagielski     X11SalGraphics* pSrcGraphics = pSSrcGraphics
464*b1cdbd2cSJim Jagielski         ? static_cast<X11SalGraphics*>(pSSrcGraphics)
465*b1cdbd2cSJim Jagielski         : this;
466*b1cdbd2cSJim Jagielski 
467*b1cdbd2cSJim Jagielski     if( rPosAry.mnSrcWidth <= 0
468*b1cdbd2cSJim Jagielski         || rPosAry.mnSrcHeight <= 0
469*b1cdbd2cSJim Jagielski         || rPosAry.mnDestWidth <= 0
470*b1cdbd2cSJim Jagielski         || rPosAry.mnDestHeight <= 0 )
471*b1cdbd2cSJim Jagielski     {
472*b1cdbd2cSJim Jagielski         return;
473*b1cdbd2cSJim Jagielski     }
474*b1cdbd2cSJim Jagielski 
475*b1cdbd2cSJim Jagielski     int n;
476*b1cdbd2cSJim Jagielski     if( pSrcGraphics == this )
477*b1cdbd2cSJim Jagielski     {
478*b1cdbd2cSJim Jagielski         n = 2;
479*b1cdbd2cSJim Jagielski     }
480*b1cdbd2cSJim Jagielski     else if( pSrcGraphics->bWindow_ )
481*b1cdbd2cSJim Jagielski     {
482*b1cdbd2cSJim Jagielski         // window or compatible virtual device
483*b1cdbd2cSJim Jagielski         if( pSrcGraphics->GetDisplay() == GetDisplay() &&
484*b1cdbd2cSJim Jagielski             pSrcGraphics->m_nScreen == m_nScreen &&
485*b1cdbd2cSJim Jagielski             pSrcGraphics->GetVisual().GetDepth() == GetVisual().GetDepth()
486*b1cdbd2cSJim Jagielski             )
487*b1cdbd2cSJim Jagielski             n = 2; // same Display
488*b1cdbd2cSJim Jagielski         else
489*b1cdbd2cSJim Jagielski             n = 1; // printer or other display
490*b1cdbd2cSJim Jagielski     }
491*b1cdbd2cSJim Jagielski     else if( pSrcGraphics->bVirDev_ )
492*b1cdbd2cSJim Jagielski     {
493*b1cdbd2cSJim Jagielski         // printer compatible virtual device
494*b1cdbd2cSJim Jagielski         if( bPrinter_ )
495*b1cdbd2cSJim Jagielski             n = 2; // printer or compatible virtual device == same display
496*b1cdbd2cSJim Jagielski         else
497*b1cdbd2cSJim Jagielski             n = 1; // window or compatible virtual device
498*b1cdbd2cSJim Jagielski     }
499*b1cdbd2cSJim Jagielski     else
500*b1cdbd2cSJim Jagielski         n = 0;
501*b1cdbd2cSJim Jagielski 
502*b1cdbd2cSJim Jagielski     if( n == 2
503*b1cdbd2cSJim Jagielski         && rPosAry.mnSrcWidth	== rPosAry.mnDestWidth
504*b1cdbd2cSJim Jagielski         && rPosAry.mnSrcHeight == rPosAry.mnDestHeight
505*b1cdbd2cSJim Jagielski         )
506*b1cdbd2cSJim Jagielski     {
507*b1cdbd2cSJim Jagielski         // #i60699# Need to generate graphics exposures (to repaint
508*b1cdbd2cSJim Jagielski         // obscured areas beneath overlapping windows), src and dest
509*b1cdbd2cSJim Jagielski         // are the same window.
510*b1cdbd2cSJim Jagielski         const bool bNeedGraphicsExposures( pSrcGraphics == this &&
511*b1cdbd2cSJim Jagielski                                            !bVirDev_ &&
512*b1cdbd2cSJim Jagielski                                            pSrcGraphics->bWindow_ );
513*b1cdbd2cSJim Jagielski 
514*b1cdbd2cSJim Jagielski         GC pCopyGC;
515*b1cdbd2cSJim Jagielski 
516*b1cdbd2cSJim Jagielski         if( bXORMode_
517*b1cdbd2cSJim Jagielski             && !pSrcGraphics->bVirDev_
518*b1cdbd2cSJim Jagielski             && (GetDisplay()->GetProperties() & PROPERTY_BUG_XCopyArea_GXxor) )
519*b1cdbd2cSJim Jagielski         {
520*b1cdbd2cSJim Jagielski             Pixmap hPixmap = XCreatePixmap( GetXDisplay(),
521*b1cdbd2cSJim Jagielski                                             pSrcGraphics->GetDrawable(),		// source
522*b1cdbd2cSJim Jagielski                                             rPosAry.mnSrcWidth, rPosAry.mnSrcHeight,
523*b1cdbd2cSJim Jagielski                                             pSrcGraphics->GetBitCount() );
524*b1cdbd2cSJim Jagielski 
525*b1cdbd2cSJim Jagielski             pCopyGC = GetDisplay()->GetCopyGC( m_nScreen );
526*b1cdbd2cSJim Jagielski 
527*b1cdbd2cSJim Jagielski             if( bNeedGraphicsExposures )
528*b1cdbd2cSJim Jagielski                 XSetGraphicsExposures( GetXDisplay(),
529*b1cdbd2cSJim Jagielski                                        pCopyGC,
530*b1cdbd2cSJim Jagielski                                        True );
531*b1cdbd2cSJim Jagielski 
532*b1cdbd2cSJim Jagielski             XCopyArea( GetXDisplay(),
533*b1cdbd2cSJim Jagielski                        pSrcGraphics->GetDrawable(),		// source
534*b1cdbd2cSJim Jagielski                        hPixmap,							// destination
535*b1cdbd2cSJim Jagielski                        pCopyGC,							// no clipping
536*b1cdbd2cSJim Jagielski                        rPosAry.mnSrcX,     rPosAry.mnSrcY,
537*b1cdbd2cSJim Jagielski                        rPosAry.mnSrcWidth, rPosAry.mnSrcHeight,
538*b1cdbd2cSJim Jagielski                        0,    				0 );			// destination
539*b1cdbd2cSJim Jagielski             XCopyArea( GetXDisplay(),
540*b1cdbd2cSJim Jagielski                        hPixmap,								// source
541*b1cdbd2cSJim Jagielski                        GetDrawable(),						// destination
542*b1cdbd2cSJim Jagielski                        GetInvertGC(),		// destination clipping
543*b1cdbd2cSJim Jagielski                        0,				    0,				// source
544*b1cdbd2cSJim Jagielski                        rPosAry.mnSrcWidth, rPosAry.mnSrcHeight,
545*b1cdbd2cSJim Jagielski                        rPosAry.mnDestX,    rPosAry.mnDestY );
546*b1cdbd2cSJim Jagielski             XFreePixmap( GetXDisplay(), hPixmap );
547*b1cdbd2cSJim Jagielski         }
548*b1cdbd2cSJim Jagielski         else
549*b1cdbd2cSJim Jagielski         {
550*b1cdbd2cSJim Jagielski             pCopyGC = GetCopyGC();
551*b1cdbd2cSJim Jagielski 
552*b1cdbd2cSJim Jagielski             if( bNeedGraphicsExposures )
553*b1cdbd2cSJim Jagielski                 XSetGraphicsExposures( GetXDisplay(),
554*b1cdbd2cSJim Jagielski                                        pCopyGC,
555*b1cdbd2cSJim Jagielski                                        True );
556*b1cdbd2cSJim Jagielski 
557*b1cdbd2cSJim Jagielski             XCopyArea( GetXDisplay(),
558*b1cdbd2cSJim Jagielski                        pSrcGraphics->GetDrawable(),		// source
559*b1cdbd2cSJim Jagielski                        GetDrawable(),					// destination
560*b1cdbd2cSJim Jagielski                        pCopyGC,							// destination clipping
561*b1cdbd2cSJim Jagielski                        rPosAry.mnSrcX,     rPosAry.mnSrcY,
562*b1cdbd2cSJim Jagielski                        rPosAry.mnSrcWidth, rPosAry.mnSrcHeight,
563*b1cdbd2cSJim Jagielski                        rPosAry.mnDestX,    rPosAry.mnDestY );
564*b1cdbd2cSJim Jagielski         }
565*b1cdbd2cSJim Jagielski 
566*b1cdbd2cSJim Jagielski         if( bNeedGraphicsExposures )
567*b1cdbd2cSJim Jagielski         {
568*b1cdbd2cSJim Jagielski             YieldGraphicsExpose();
569*b1cdbd2cSJim Jagielski 
570*b1cdbd2cSJim Jagielski             if( pCopyGC )
571*b1cdbd2cSJim Jagielski                 XSetGraphicsExposures( GetXDisplay(),
572*b1cdbd2cSJim Jagielski                                        pCopyGC,
573*b1cdbd2cSJim Jagielski                                        False );
574*b1cdbd2cSJim Jagielski         }
575*b1cdbd2cSJim Jagielski     }
576*b1cdbd2cSJim Jagielski     else if( n )
577*b1cdbd2cSJim Jagielski     {
578*b1cdbd2cSJim Jagielski         // #i60699# No chance to handle graphics exposures - we copy
579*b1cdbd2cSJim Jagielski         // to a temp bitmap first, into which no repaints are
580*b1cdbd2cSJim Jagielski         // technically possible.
581*b1cdbd2cSJim Jagielski         SalBitmap *pDDB = pSrcGraphics->getBitmap( rPosAry.mnSrcX,
582*b1cdbd2cSJim Jagielski                                                    rPosAry.mnSrcY,
583*b1cdbd2cSJim Jagielski                                                    rPosAry.mnSrcWidth,
584*b1cdbd2cSJim Jagielski                                                    rPosAry.mnSrcHeight );
585*b1cdbd2cSJim Jagielski 
586*b1cdbd2cSJim Jagielski         if( !pDDB )
587*b1cdbd2cSJim Jagielski         {
588*b1cdbd2cSJim Jagielski             stderr0( "SalGraphics::CopyBits !pSrcGraphics->GetBitmap()\n" );
589*b1cdbd2cSJim Jagielski             return;
590*b1cdbd2cSJim Jagielski         }
591*b1cdbd2cSJim Jagielski 
592*b1cdbd2cSJim Jagielski         SalTwoRect aPosAry( rPosAry );
593*b1cdbd2cSJim Jagielski 
594*b1cdbd2cSJim Jagielski         aPosAry.mnSrcX = 0,	aPosAry.mnSrcY = 0;
595*b1cdbd2cSJim Jagielski         drawBitmap( aPosAry, *pDDB );
596*b1cdbd2cSJim Jagielski 
597*b1cdbd2cSJim Jagielski         delete pDDB;
598*b1cdbd2cSJim Jagielski     }
599*b1cdbd2cSJim Jagielski     else {
600*b1cdbd2cSJim Jagielski         stderr0( "X11SalGraphics::CopyBits from Printer not yet implemented\n" );
601*b1cdbd2cSJim Jagielski     }
602*b1cdbd2cSJim Jagielski }
603*b1cdbd2cSJim Jagielski 
604*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------------
605*b1cdbd2cSJim Jagielski 
copyArea(long nDestX,long nDestY,long nSrcX,long nSrcY,long nSrcWidth,long nSrcHeight,sal_uInt16)606*b1cdbd2cSJim Jagielski void X11SalGraphics::copyArea ( long nDestX,    long nDestY,
607*b1cdbd2cSJim Jagielski                                 long nSrcX,     long nSrcY,
608*b1cdbd2cSJim Jagielski                                 long nSrcWidth, long nSrcHeight,
609*b1cdbd2cSJim Jagielski                                 sal_uInt16 )
610*b1cdbd2cSJim Jagielski {
611*b1cdbd2cSJim Jagielski     SalTwoRect aPosAry;
612*b1cdbd2cSJim Jagielski 
613*b1cdbd2cSJim Jagielski     aPosAry.mnDestX = nDestX;
614*b1cdbd2cSJim Jagielski     aPosAry.mnDestY = nDestY;
615*b1cdbd2cSJim Jagielski     aPosAry.mnDestWidth  = nSrcWidth;
616*b1cdbd2cSJim Jagielski     aPosAry.mnDestHeight = nSrcHeight;
617*b1cdbd2cSJim Jagielski 
618*b1cdbd2cSJim Jagielski     aPosAry.mnSrcX = nSrcX;
619*b1cdbd2cSJim Jagielski     aPosAry.mnSrcY = nSrcY;
620*b1cdbd2cSJim Jagielski     aPosAry.mnSrcWidth  = nSrcWidth;
621*b1cdbd2cSJim Jagielski     aPosAry.mnSrcHeight = nSrcHeight;
622*b1cdbd2cSJim Jagielski 
623*b1cdbd2cSJim Jagielski     copyBits ( aPosAry, 0 );
624*b1cdbd2cSJim Jagielski }
625*b1cdbd2cSJim Jagielski 
626*b1cdbd2cSJim Jagielski // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
drawBitmap(const SalTwoRect & rPosAry,const SalBitmap & rSalBitmap)627*b1cdbd2cSJim Jagielski void X11SalGraphics::drawBitmap( const SalTwoRect& rPosAry, const SalBitmap& rSalBitmap )
628*b1cdbd2cSJim Jagielski {
629*b1cdbd2cSJim Jagielski     const SalDisplay*   pSalDisp = GetDisplay();
630*b1cdbd2cSJim Jagielski     Display*			pXDisp = pSalDisp->GetDisplay();
631*b1cdbd2cSJim Jagielski     const Drawable		aDrawable( GetDrawable() );
632*b1cdbd2cSJim Jagielski     const SalColormap&	rColMap = pSalDisp->GetColormap( m_nScreen );
633*b1cdbd2cSJim Jagielski     const long			nDepth = GetDisplay()->GetVisual( m_nScreen ).GetDepth();
634*b1cdbd2cSJim Jagielski     GC					aGC( GetCopyGC() );
635*b1cdbd2cSJim Jagielski     XGCValues			aOldVal, aNewVal;
636*b1cdbd2cSJim Jagielski     int					nValues = GCForeground | GCBackground;
637*b1cdbd2cSJim Jagielski 
638*b1cdbd2cSJim Jagielski     if( rSalBitmap.GetBitCount() == 1 )
639*b1cdbd2cSJim Jagielski     {
640*b1cdbd2cSJim Jagielski         // set foreground/background values for 1Bit bitmaps
641*b1cdbd2cSJim Jagielski         XGetGCValues( pXDisp, aGC, nValues, &aOldVal );
642*b1cdbd2cSJim Jagielski         aNewVal.foreground = rColMap.GetWhitePixel(), aNewVal.background = rColMap.GetBlackPixel();
643*b1cdbd2cSJim Jagielski         XChangeGC( pXDisp, aGC, nValues, &aNewVal );
644*b1cdbd2cSJim Jagielski     }
645*b1cdbd2cSJim Jagielski 
646*b1cdbd2cSJim Jagielski     static_cast<const X11SalBitmap&>(rSalBitmap).ImplDraw( aDrawable, m_nScreen, nDepth, rPosAry, aGC );
647*b1cdbd2cSJim Jagielski 
648*b1cdbd2cSJim Jagielski     if( rSalBitmap.GetBitCount() == 1 )
649*b1cdbd2cSJim Jagielski         XChangeGC( pXDisp, aGC, nValues, &aOldVal );
650*b1cdbd2cSJim Jagielski     XFlush( pXDisp );
651*b1cdbd2cSJim Jagielski }
652*b1cdbd2cSJim Jagielski 
653*b1cdbd2cSJim Jagielski // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
654*b1cdbd2cSJim Jagielski 
drawBitmap(const SalTwoRect & rPosAry,const SalBitmap & rSrcBitmap,const SalBitmap & rMaskBitmap)655*b1cdbd2cSJim Jagielski void X11SalGraphics::drawBitmap( const SalTwoRect& rPosAry,
656*b1cdbd2cSJim Jagielski                                  const SalBitmap& rSrcBitmap,
657*b1cdbd2cSJim Jagielski                                  const SalBitmap& rMaskBitmap )
658*b1cdbd2cSJim Jagielski {
659*b1cdbd2cSJim Jagielski     DBG_ASSERT( !bPrinter_, "Drawing of transparent bitmaps on printer devices is strictly forbidden" );
660*b1cdbd2cSJim Jagielski 
661*b1cdbd2cSJim Jagielski     // decide if alpha masking or transparency masking is needed
662*b1cdbd2cSJim Jagielski     BitmapBuffer* pAlphaBuffer = const_cast<SalBitmap&>(rMaskBitmap).AcquireBuffer( sal_True );
663*b1cdbd2cSJim Jagielski     if( pAlphaBuffer != NULL )
664*b1cdbd2cSJim Jagielski     {
665*b1cdbd2cSJim Jagielski         int nMaskFormat = pAlphaBuffer->mnFormat;
666*b1cdbd2cSJim Jagielski         const_cast<SalBitmap&>(rMaskBitmap).ReleaseBuffer( pAlphaBuffer, sal_True );
667*b1cdbd2cSJim Jagielski         if( nMaskFormat == BMP_FORMAT_8BIT_PAL )
668*b1cdbd2cSJim Jagielski             drawAlphaBitmap( rPosAry, rSrcBitmap, rMaskBitmap );
669*b1cdbd2cSJim Jagielski     }
670*b1cdbd2cSJim Jagielski 
671*b1cdbd2cSJim Jagielski     drawMaskedBitmap( rPosAry, rSrcBitmap, rMaskBitmap );
672*b1cdbd2cSJim Jagielski }
673*b1cdbd2cSJim Jagielski 
674*b1cdbd2cSJim Jagielski // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
675*b1cdbd2cSJim Jagielski 
drawMaskedBitmap(const SalTwoRect & rPosAry,const SalBitmap & rSalBitmap,const SalBitmap & rTransBitmap)676*b1cdbd2cSJim Jagielski void X11SalGraphics::drawMaskedBitmap( const SalTwoRect& rPosAry,
677*b1cdbd2cSJim Jagielski                                        const SalBitmap& rSalBitmap,
678*b1cdbd2cSJim Jagielski                                        const SalBitmap& rTransBitmap )
679*b1cdbd2cSJim Jagielski {
680*b1cdbd2cSJim Jagielski     const SalDisplay*   pSalDisp = GetDisplay();
681*b1cdbd2cSJim Jagielski     Display*            pXDisp = pSalDisp->GetDisplay();
682*b1cdbd2cSJim Jagielski     Drawable            aDrawable( GetDrawable() );
683*b1cdbd2cSJim Jagielski 
684*b1cdbd2cSJim Jagielski     // figure work mode depth. If this is a VDev Drawable, use its
685*b1cdbd2cSJim Jagielski     // bitdepth to create pixmaps for, otherwise, XCopyArea will
686*b1cdbd2cSJim Jagielski     // refuse to work.
687*b1cdbd2cSJim Jagielski     const sal_uInt16	nDepth( m_pVDev ?
688*b1cdbd2cSJim Jagielski                             m_pVDev->GetDepth() :
689*b1cdbd2cSJim Jagielski                             pSalDisp->GetVisual( m_nScreen ).GetDepth() );
690*b1cdbd2cSJim Jagielski     Pixmap			aFG( XCreatePixmap( pXDisp, aDrawable, rPosAry.mnDestWidth,
691*b1cdbd2cSJim Jagielski                                         rPosAry.mnDestHeight, nDepth ) );
692*b1cdbd2cSJim Jagielski     Pixmap			aBG( XCreatePixmap( pXDisp, aDrawable, rPosAry.mnDestWidth,
693*b1cdbd2cSJim Jagielski                                         rPosAry.mnDestHeight, nDepth ) );
694*b1cdbd2cSJim Jagielski 
695*b1cdbd2cSJim Jagielski     if( aFG && aBG )
696*b1cdbd2cSJim Jagielski     {
697*b1cdbd2cSJim Jagielski         GC					aTmpGC;
698*b1cdbd2cSJim Jagielski         XGCValues			aValues;
699*b1cdbd2cSJim Jagielski         const SalColormap&	rColMap = pSalDisp->GetColormap( m_nScreen );
700*b1cdbd2cSJim Jagielski         const int			nBlack = rColMap.GetBlackPixel(), nWhite = rColMap.GetWhitePixel();
701*b1cdbd2cSJim Jagielski         const int			nValues = GCFunction | GCForeground | GCBackground;
702*b1cdbd2cSJim Jagielski         SalTwoRect			aTmpRect( rPosAry ); aTmpRect.mnDestX = aTmpRect.mnDestY = 0;
703*b1cdbd2cSJim Jagielski 
704*b1cdbd2cSJim Jagielski         // draw paint bitmap in pixmap #1
705*b1cdbd2cSJim Jagielski         aValues.function = GXcopy, aValues.foreground = nWhite, aValues.background = nBlack;
706*b1cdbd2cSJim Jagielski         aTmpGC = XCreateGC( pXDisp, aFG, nValues, &aValues );
707*b1cdbd2cSJim Jagielski         static_cast<const X11SalBitmap&>(rSalBitmap).ImplDraw( aFG, m_nScreen, nDepth, aTmpRect, aTmpGC );
708*b1cdbd2cSJim Jagielski         DBG_TESTTRANS( aFG );
709*b1cdbd2cSJim Jagielski 
710*b1cdbd2cSJim Jagielski         // draw background in pixmap #2
711*b1cdbd2cSJim Jagielski         XCopyArea( pXDisp, aDrawable, aBG, aTmpGC,
712*b1cdbd2cSJim Jagielski                    rPosAry.mnDestX, rPosAry.mnDestY,
713*b1cdbd2cSJim Jagielski                    rPosAry.mnDestWidth, rPosAry.mnDestHeight,
714*b1cdbd2cSJim Jagielski                    0, 0 );
715*b1cdbd2cSJim Jagielski 
716*b1cdbd2cSJim Jagielski         DBG_TESTTRANS( aBG );
717*b1cdbd2cSJim Jagielski 
718*b1cdbd2cSJim Jagielski         // mask out paint bitmap in pixmap #1 (transparent areas 0)
719*b1cdbd2cSJim Jagielski         aValues.function = GXand, aValues.foreground = 0x00000000, aValues.background = 0xffffffff;
720*b1cdbd2cSJim Jagielski         XChangeGC( pXDisp, aTmpGC, nValues, &aValues );
721*b1cdbd2cSJim Jagielski         static_cast<const X11SalBitmap&>(rTransBitmap).ImplDraw( aFG, m_nScreen, 1, aTmpRect, aTmpGC );
722*b1cdbd2cSJim Jagielski 
723*b1cdbd2cSJim Jagielski         DBG_TESTTRANS( aFG );
724*b1cdbd2cSJim Jagielski 
725*b1cdbd2cSJim Jagielski         // #105055# For XOR mode, keep background behind bitmap intact
726*b1cdbd2cSJim Jagielski         if( !bXORMode_ )
727*b1cdbd2cSJim Jagielski         {
728*b1cdbd2cSJim Jagielski             // mask out background in pixmap #2 (nontransparent areas 0)
729*b1cdbd2cSJim Jagielski             aValues.function = GXand, aValues.foreground = 0xffffffff, aValues.background = 0x00000000;
730*b1cdbd2cSJim Jagielski             XChangeGC( pXDisp, aTmpGC, nValues, &aValues );
731*b1cdbd2cSJim Jagielski             static_cast<const X11SalBitmap&>(rTransBitmap).ImplDraw( aBG, m_nScreen, 1, aTmpRect, aTmpGC );
732*b1cdbd2cSJim Jagielski 
733*b1cdbd2cSJim Jagielski             DBG_TESTTRANS( aBG );
734*b1cdbd2cSJim Jagielski         }
735*b1cdbd2cSJim Jagielski 
736*b1cdbd2cSJim Jagielski         // merge pixmap #1 and pixmap #2 in pixmap #2
737*b1cdbd2cSJim Jagielski         aValues.function = GXxor, aValues.foreground = 0xffffffff, aValues.background = 0x00000000;
738*b1cdbd2cSJim Jagielski         XChangeGC( pXDisp, aTmpGC, nValues, &aValues );
739*b1cdbd2cSJim Jagielski         XCopyArea( pXDisp, aFG, aBG, aTmpGC,
740*b1cdbd2cSJim Jagielski                    0, 0,
741*b1cdbd2cSJim Jagielski                    rPosAry.mnDestWidth, rPosAry.mnDestHeight,
742*b1cdbd2cSJim Jagielski 				   0, 0 );
743*b1cdbd2cSJim Jagielski         DBG_TESTTRANS( aBG );
744*b1cdbd2cSJim Jagielski 
745*b1cdbd2cSJim Jagielski         // #105055# Disable XOR temporarily
746*b1cdbd2cSJim Jagielski         sal_Bool bOldXORMode( bXORMode_ );
747*b1cdbd2cSJim Jagielski         bXORMode_ = sal_False;
748*b1cdbd2cSJim Jagielski 
749*b1cdbd2cSJim Jagielski         // copy pixmap #2 (result) to background
750*b1cdbd2cSJim Jagielski         XCopyArea( pXDisp, aBG, aDrawable, GetCopyGC(),
751*b1cdbd2cSJim Jagielski                    0, 0,
752*b1cdbd2cSJim Jagielski                    rPosAry.mnDestWidth, rPosAry.mnDestHeight,
753*b1cdbd2cSJim Jagielski                    rPosAry.mnDestX, rPosAry.mnDestY );
754*b1cdbd2cSJim Jagielski 
755*b1cdbd2cSJim Jagielski         DBG_TESTTRANS( aBG );
756*b1cdbd2cSJim Jagielski 
757*b1cdbd2cSJim Jagielski         bXORMode_ = bOldXORMode;
758*b1cdbd2cSJim Jagielski 
759*b1cdbd2cSJim Jagielski         XFreeGC( pXDisp, aTmpGC );
760*b1cdbd2cSJim Jagielski         XFlush( pXDisp );
761*b1cdbd2cSJim Jagielski     }
762*b1cdbd2cSJim Jagielski     else
763*b1cdbd2cSJim Jagielski         drawBitmap( rPosAry, rSalBitmap );
764*b1cdbd2cSJim Jagielski 
765*b1cdbd2cSJim Jagielski     if( aFG )
766*b1cdbd2cSJim Jagielski         XFreePixmap( pXDisp, aFG );
767*b1cdbd2cSJim Jagielski 
768*b1cdbd2cSJim Jagielski     if( aBG )
769*b1cdbd2cSJim Jagielski         XFreePixmap( pXDisp, aBG );
770*b1cdbd2cSJim Jagielski }
771*b1cdbd2cSJim Jagielski 
772*b1cdbd2cSJim Jagielski // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
drawAlphaBitmap(const SalTwoRect & rTR,const SalBitmap & rSrcBitmap,const SalBitmap & rAlphaBmp)773*b1cdbd2cSJim Jagielski bool X11SalGraphics::drawAlphaBitmap( const SalTwoRect& rTR,
774*b1cdbd2cSJim Jagielski     const SalBitmap& rSrcBitmap, const SalBitmap& rAlphaBmp )
775*b1cdbd2cSJim Jagielski {
776*b1cdbd2cSJim Jagielski     // non 8-bit alpha not implemented yet
777*b1cdbd2cSJim Jagielski     if( rAlphaBmp.GetBitCount() != 8 )
778*b1cdbd2cSJim Jagielski         return false;
779*b1cdbd2cSJim Jagielski 
780*b1cdbd2cSJim Jagielski     // horizontal mirroring not implemented yet
781*b1cdbd2cSJim Jagielski     if( rTR.mnDestWidth < 0 )
782*b1cdbd2cSJim Jagielski         return false;
783*b1cdbd2cSJim Jagielski 
784*b1cdbd2cSJim Jagielski     // stretched conversion is not implemented yet
785*b1cdbd2cSJim Jagielski     if( rTR.mnDestWidth != rTR.mnSrcWidth )
786*b1cdbd2cSJim Jagielski         return false;
787*b1cdbd2cSJim Jagielski     if( rTR.mnDestHeight!= rTR.mnSrcHeight )
788*b1cdbd2cSJim Jagielski         return false;
789*b1cdbd2cSJim Jagielski 
790*b1cdbd2cSJim Jagielski     XRenderPeer& rPeer = XRenderPeer::GetInstance();
791*b1cdbd2cSJim Jagielski     if( rPeer.GetVersion() < 0x02 )
792*b1cdbd2cSJim Jagielski         return false;
793*b1cdbd2cSJim Jagielski 
794*b1cdbd2cSJim Jagielski     // create destination picture
795*b1cdbd2cSJim Jagielski     Picture aDstPic = GetXRenderPicture();
796*b1cdbd2cSJim Jagielski     if( !aDstPic )
797*b1cdbd2cSJim Jagielski         return false;
798*b1cdbd2cSJim Jagielski 
799*b1cdbd2cSJim Jagielski     const SalDisplay* pSalDisp = GetDisplay();
800*b1cdbd2cSJim Jagielski     const SalVisual& rSalVis = pSalDisp->GetVisual( m_nScreen );
801*b1cdbd2cSJim Jagielski     Display* pXDisplay = pSalDisp->GetDisplay();
802*b1cdbd2cSJim Jagielski 
803*b1cdbd2cSJim Jagielski     // create source Picture
804*b1cdbd2cSJim Jagielski     int nDepth = m_pVDev ? m_pVDev->GetDepth() : rSalVis.GetDepth();
805*b1cdbd2cSJim Jagielski     const X11SalBitmap& rSrcX11Bmp = static_cast<const X11SalBitmap&>( rSrcBitmap );
806*b1cdbd2cSJim Jagielski     ImplSalDDB* pSrcDDB = rSrcX11Bmp.ImplGetDDB( hDrawable_, m_nScreen, nDepth, rTR );
807*b1cdbd2cSJim Jagielski     if( !pSrcDDB )
808*b1cdbd2cSJim Jagielski         return false;
809*b1cdbd2cSJim Jagielski 
810*b1cdbd2cSJim Jagielski     //#i75249# workaround for ImplGetDDB() giving us back a different depth than
811*b1cdbd2cSJim Jagielski     // we requested. E.g. mask pixmaps are always compatible with the drawable
812*b1cdbd2cSJim Jagielski     // TODO: find an appropriate picture format for these cases
813*b1cdbd2cSJim Jagielski     //       then remove the workaround below and the one for #i75531#
814*b1cdbd2cSJim Jagielski     if( nDepth != pSrcDDB->ImplGetDepth() )
815*b1cdbd2cSJim Jagielski         return false;
816*b1cdbd2cSJim Jagielski 
817*b1cdbd2cSJim Jagielski     Pixmap aSrcPM = pSrcDDB->ImplGetPixmap();
818*b1cdbd2cSJim Jagielski     if( !aSrcPM )
819*b1cdbd2cSJim Jagielski         return false;
820*b1cdbd2cSJim Jagielski 
821*b1cdbd2cSJim Jagielski     // create source picture
822*b1cdbd2cSJim Jagielski     // TODO: use scoped picture
823*b1cdbd2cSJim Jagielski     Visual* pSrcXVisual = rSalVis.GetVisual();
824*b1cdbd2cSJim Jagielski     XRenderPictFormat* pSrcVisFmt = rPeer.FindVisualFormat( pSrcXVisual );
825*b1cdbd2cSJim Jagielski     if( !pSrcVisFmt )
826*b1cdbd2cSJim Jagielski         return false;
827*b1cdbd2cSJim Jagielski     Picture aSrcPic = rPeer.CreatePicture( aSrcPM, pSrcVisFmt, 0, NULL );
828*b1cdbd2cSJim Jagielski     if( !aSrcPic )
829*b1cdbd2cSJim Jagielski         return false;
830*b1cdbd2cSJim Jagielski 
831*b1cdbd2cSJim Jagielski     // create alpha Picture
832*b1cdbd2cSJim Jagielski 
833*b1cdbd2cSJim Jagielski     // TODO: use SalX11Bitmap functionality and caching for the Alpha Pixmap
834*b1cdbd2cSJim Jagielski     // problem is that they don't provide an 8bit Pixmap on a non-8bit display
835*b1cdbd2cSJim Jagielski     BitmapBuffer* pAlphaBuffer = const_cast<SalBitmap&>(rAlphaBmp).AcquireBuffer( sal_True );
836*b1cdbd2cSJim Jagielski 
837*b1cdbd2cSJim Jagielski     // an XImage needs its data top_down
838*b1cdbd2cSJim Jagielski     // TODO: avoid wrongly oriented images in upper layers!
839*b1cdbd2cSJim Jagielski     const int nImageSize = pAlphaBuffer->mnHeight * pAlphaBuffer->mnScanlineSize;
840*b1cdbd2cSJim Jagielski     const char* pSrcBits = (char*)pAlphaBuffer->mpBits;
841*b1cdbd2cSJim Jagielski     char* pAlphaBits = new char[ nImageSize ];
842*b1cdbd2cSJim Jagielski     if( BMP_SCANLINE_ADJUSTMENT( pAlphaBuffer->mnFormat ) == BMP_FORMAT_TOP_DOWN )
843*b1cdbd2cSJim Jagielski         memcpy( pAlphaBits, pSrcBits, nImageSize );
844*b1cdbd2cSJim Jagielski     else
845*b1cdbd2cSJim Jagielski     {
846*b1cdbd2cSJim Jagielski         char* pDstBits = pAlphaBits + nImageSize;
847*b1cdbd2cSJim Jagielski         const int nLineSize = pAlphaBuffer->mnScanlineSize;
848*b1cdbd2cSJim Jagielski         for(; (pDstBits -= nLineSize) >= pAlphaBits; pSrcBits += nLineSize )
849*b1cdbd2cSJim Jagielski             memcpy( pDstBits, pSrcBits, nLineSize );
850*b1cdbd2cSJim Jagielski     }
851*b1cdbd2cSJim Jagielski 
852*b1cdbd2cSJim Jagielski     // the alpha values need to be inverted for XRender
853*b1cdbd2cSJim Jagielski     // TODO: make upper layers use standard alpha
854*b1cdbd2cSJim Jagielski     long* pLDst = (long*)pAlphaBits;
855*b1cdbd2cSJim Jagielski     for( int i = nImageSize/sizeof(long); --i >= 0; ++pLDst )
856*b1cdbd2cSJim Jagielski         *pLDst = ~*pLDst;
857*b1cdbd2cSJim Jagielski 
858*b1cdbd2cSJim Jagielski     char* pCDst = (char*)pLDst;
859*b1cdbd2cSJim Jagielski     for( int i = nImageSize & (sizeof(long)-1); --i >= 0; ++pCDst )
860*b1cdbd2cSJim Jagielski         *pCDst = ~*pCDst;
861*b1cdbd2cSJim Jagielski 
862*b1cdbd2cSJim Jagielski     const XRenderPictFormat* pAlphaFormat = rPeer.GetStandardFormatA8();
863*b1cdbd2cSJim Jagielski     XImage* pAlphaImg = XCreateImage( pXDisplay, pSrcXVisual, 8, ZPixmap, 0,
864*b1cdbd2cSJim Jagielski         pAlphaBits, pAlphaBuffer->mnWidth, pAlphaBuffer->mnHeight,
865*b1cdbd2cSJim Jagielski         pAlphaFormat->depth, pAlphaBuffer->mnScanlineSize );
866*b1cdbd2cSJim Jagielski 
867*b1cdbd2cSJim Jagielski     Pixmap aAlphaPM = XCreatePixmap( pXDisplay, hDrawable_,
868*b1cdbd2cSJim Jagielski         rTR.mnDestWidth, rTR.mnDestHeight, 8 );
869*b1cdbd2cSJim Jagielski 
870*b1cdbd2cSJim Jagielski     XGCValues aAlphaGCV;
871*b1cdbd2cSJim Jagielski     aAlphaGCV.function = GXcopy;
872*b1cdbd2cSJim Jagielski     GC aAlphaGC = XCreateGC( pXDisplay, aAlphaPM, GCFunction, &aAlphaGCV );
873*b1cdbd2cSJim Jagielski     XPutImage( pXDisplay, aAlphaPM, aAlphaGC, pAlphaImg,
874*b1cdbd2cSJim Jagielski         rTR.mnSrcX, rTR.mnSrcY, 0, 0, rTR.mnDestWidth, rTR.mnDestHeight );
875*b1cdbd2cSJim Jagielski     XFreeGC( pXDisplay, aAlphaGC );
876*b1cdbd2cSJim Jagielski     XFree( pAlphaImg );
877*b1cdbd2cSJim Jagielski     if( pAlphaBits != (char*)pAlphaBuffer->mpBits )
878*b1cdbd2cSJim Jagielski         delete[] pAlphaBits;
879*b1cdbd2cSJim Jagielski 
880*b1cdbd2cSJim Jagielski     const_cast<SalBitmap&>(rAlphaBmp).ReleaseBuffer( pAlphaBuffer, sal_True );
881*b1cdbd2cSJim Jagielski 
882*b1cdbd2cSJim Jagielski     XRenderPictureAttributes aAttr;
883*b1cdbd2cSJim Jagielski     aAttr.repeat = true;
884*b1cdbd2cSJim Jagielski     Picture aAlphaPic = rPeer.CreatePicture( aAlphaPM, pAlphaFormat, CPRepeat, &aAttr );
885*b1cdbd2cSJim Jagielski     if( !aAlphaPic )
886*b1cdbd2cSJim Jagielski         return false;
887*b1cdbd2cSJim Jagielski 
888*b1cdbd2cSJim Jagielski     // set clipping
889*b1cdbd2cSJim Jagielski     if( mpClipRegion && !XEmptyRegion( mpClipRegion ) )
890*b1cdbd2cSJim Jagielski         rPeer.SetPictureClipRegion( aDstPic, mpClipRegion );
891*b1cdbd2cSJim Jagielski 
892*b1cdbd2cSJim Jagielski     // paint source * mask over destination picture
893*b1cdbd2cSJim Jagielski     rPeer.CompositePicture( PictOpOver, aSrcPic, aAlphaPic, aDstPic,
894*b1cdbd2cSJim Jagielski         rTR.mnSrcX, rTR.mnSrcY, 0, 0,
895*b1cdbd2cSJim Jagielski         rTR.mnDestX, rTR.mnDestY, rTR.mnDestWidth, rTR.mnDestHeight );
896*b1cdbd2cSJim Jagielski 
897*b1cdbd2cSJim Jagielski     // TODO: used ScopedPic
898*b1cdbd2cSJim Jagielski     rPeer.FreePicture( aAlphaPic );
899*b1cdbd2cSJim Jagielski     XFreePixmap(pXDisplay, aAlphaPM);
900*b1cdbd2cSJim Jagielski     rPeer.FreePicture( aSrcPic );
901*b1cdbd2cSJim Jagielski     return true;
902*b1cdbd2cSJim Jagielski }
903*b1cdbd2cSJim Jagielski 
904*b1cdbd2cSJim Jagielski // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
drawTransformedBitmap(const basegfx::B2DPoint & rNull,const basegfx::B2DPoint & rX,const basegfx::B2DPoint & rY,const SalBitmap & rSourceBitmap,const SalBitmap * pAlphaBitmap)905*b1cdbd2cSJim Jagielski bool X11SalGraphics::drawTransformedBitmap(
906*b1cdbd2cSJim Jagielski     const basegfx::B2DPoint& rNull,
907*b1cdbd2cSJim Jagielski     const basegfx::B2DPoint& rX,
908*b1cdbd2cSJim Jagielski     const basegfx::B2DPoint& rY,
909*b1cdbd2cSJim Jagielski     const SalBitmap& rSourceBitmap,
910*b1cdbd2cSJim Jagielski     const SalBitmap* pAlphaBitmap)
911*b1cdbd2cSJim Jagielski {
912*b1cdbd2cSJim Jagielski     // here direct support for transformed bitmaps can be impemented
913*b1cdbd2cSJim Jagielski     (void)rNull; (void)rX; (void)rY; (void)rSourceBitmap; (void)pAlphaBitmap;
914*b1cdbd2cSJim Jagielski     return false;
915*b1cdbd2cSJim Jagielski }
916*b1cdbd2cSJim Jagielski 
917*b1cdbd2cSJim Jagielski // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
drawAlphaRect(long nX,long nY,long nWidth,long nHeight,sal_uInt8 nTransparency)918*b1cdbd2cSJim Jagielski bool X11SalGraphics::drawAlphaRect( long nX, long nY, long nWidth,
919*b1cdbd2cSJim Jagielski                                     long nHeight, sal_uInt8 nTransparency )
920*b1cdbd2cSJim Jagielski {
921*b1cdbd2cSJim Jagielski     if( ! m_pFrame && ! m_pVDev )
922*b1cdbd2cSJim Jagielski         return false;
923*b1cdbd2cSJim Jagielski 
924*b1cdbd2cSJim Jagielski     if( bPenGC_ || !bBrushGC_ || bXORMode_ )
925*b1cdbd2cSJim Jagielski         return false; // can only perform solid fills without XOR.
926*b1cdbd2cSJim Jagielski 
927*b1cdbd2cSJim Jagielski     if( m_pVDev && m_pVDev->GetDepth() < 8 )
928*b1cdbd2cSJim Jagielski         return false;
929*b1cdbd2cSJim Jagielski 
930*b1cdbd2cSJim Jagielski     XRenderPeer& rPeer = XRenderPeer::GetInstance();
931*b1cdbd2cSJim Jagielski     if( rPeer.GetVersion() < 0x02 ) // TODO: replace with better test
932*b1cdbd2cSJim Jagielski         return false;
933*b1cdbd2cSJim Jagielski 
934*b1cdbd2cSJim Jagielski     Picture aDstPic = GetXRenderPicture();
935*b1cdbd2cSJim Jagielski     if( !aDstPic )
936*b1cdbd2cSJim Jagielski         return false;
937*b1cdbd2cSJim Jagielski 
938*b1cdbd2cSJim Jagielski 	const double fTransparency = (100 - nTransparency) * (1.0/100);
939*b1cdbd2cSJim Jagielski 	const XRenderColor aRenderColor = GetXRenderColor( nBrushColor_ , fTransparency);
940*b1cdbd2cSJim Jagielski 
941*b1cdbd2cSJim Jagielski     rPeer.FillRectangle( PictOpOver,
942*b1cdbd2cSJim Jagielski                          aDstPic,
943*b1cdbd2cSJim Jagielski                          &aRenderColor,
944*b1cdbd2cSJim Jagielski                          nX, nY,
945*b1cdbd2cSJim Jagielski                          nWidth, nHeight );
946*b1cdbd2cSJim Jagielski 
947*b1cdbd2cSJim Jagielski     return true;
948*b1cdbd2cSJim Jagielski }
949*b1cdbd2cSJim Jagielski 
950*b1cdbd2cSJim Jagielski // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
drawBitmap(const SalTwoRect &,const SalBitmap &,SalColor)951*b1cdbd2cSJim Jagielski void X11SalGraphics::drawBitmap( const SalTwoRect&,
952*b1cdbd2cSJim Jagielski                                  const SalBitmap&,
953*b1cdbd2cSJim Jagielski                                  SalColor )
954*b1cdbd2cSJim Jagielski {
955*b1cdbd2cSJim Jagielski     DBG_ERROR( "::DrawBitmap with transparent color not supported" );
956*b1cdbd2cSJim Jagielski }
957*b1cdbd2cSJim Jagielski 
958*b1cdbd2cSJim Jagielski // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
drawMask(const SalTwoRect & rPosAry,const SalBitmap & rSalBitmap,SalColor nMaskColor)959*b1cdbd2cSJim Jagielski void X11SalGraphics::drawMask( const SalTwoRect& rPosAry,
960*b1cdbd2cSJim Jagielski                                const SalBitmap &rSalBitmap,
961*b1cdbd2cSJim Jagielski                                SalColor nMaskColor )
962*b1cdbd2cSJim Jagielski {
963*b1cdbd2cSJim Jagielski     const SalDisplay*   pSalDisp = GetDisplay();
964*b1cdbd2cSJim Jagielski     Display*	        pXDisp = pSalDisp->GetDisplay();
965*b1cdbd2cSJim Jagielski     Drawable            aDrawable( GetDrawable() );
966*b1cdbd2cSJim Jagielski     Pixmap              aStipple( XCreatePixmap( pXDisp, aDrawable,
967*b1cdbd2cSJim Jagielski                                                  rPosAry.mnDestWidth,
968*b1cdbd2cSJim Jagielski                                                  rPosAry.mnDestHeight, 1 ) );
969*b1cdbd2cSJim Jagielski 
970*b1cdbd2cSJim Jagielski     if( aStipple )
971*b1cdbd2cSJim Jagielski     {
972*b1cdbd2cSJim Jagielski         SalTwoRect	aTwoRect( rPosAry ); aTwoRect.mnDestX = aTwoRect.mnDestY = 0;
973*b1cdbd2cSJim Jagielski         GC			aTmpGC;
974*b1cdbd2cSJim Jagielski         XGCValues	aValues;
975*b1cdbd2cSJim Jagielski 
976*b1cdbd2cSJim Jagielski         // create a stipple bitmap first (set bits are changed to unset bits and vice versa)
977*b1cdbd2cSJim Jagielski         aValues.function = GXcopyInverted;
978*b1cdbd2cSJim Jagielski         aValues.foreground = 1, aValues.background = 0;
979*b1cdbd2cSJim Jagielski         aTmpGC = XCreateGC( pXDisp, aStipple, GCFunction | GCForeground | GCBackground, &aValues );
980*b1cdbd2cSJim Jagielski         static_cast<const X11SalBitmap&>(rSalBitmap).ImplDraw( aStipple, m_nScreen, 1, aTwoRect, aTmpGC );
981*b1cdbd2cSJim Jagielski 
982*b1cdbd2cSJim Jagielski         XFreeGC( pXDisp, aTmpGC );
983*b1cdbd2cSJim Jagielski 
984*b1cdbd2cSJim Jagielski         // Set stipple and draw rectangle
985*b1cdbd2cSJim Jagielski         GC	aStippleGC( GetStippleGC() );
986*b1cdbd2cSJim Jagielski         int	nX = rPosAry.mnDestX, nY = rPosAry.mnDestY;
987*b1cdbd2cSJim Jagielski 
988*b1cdbd2cSJim Jagielski         XSetStipple( pXDisp, aStippleGC, aStipple );
989*b1cdbd2cSJim Jagielski         XSetTSOrigin( pXDisp, aStippleGC, nX, nY );
990*b1cdbd2cSJim Jagielski         XSetForeground( pXDisp, aStippleGC, GetPixel( nMaskColor ) );
991*b1cdbd2cSJim Jagielski         XFillRectangle( pXDisp, aDrawable, aStippleGC,
992*b1cdbd2cSJim Jagielski                         nX, nY,
993*b1cdbd2cSJim Jagielski                         rPosAry.mnDestWidth, rPosAry.mnDestHeight );
994*b1cdbd2cSJim Jagielski         XFreePixmap( pXDisp, aStipple );
995*b1cdbd2cSJim Jagielski         XFlush( pXDisp );
996*b1cdbd2cSJim Jagielski     }
997*b1cdbd2cSJim Jagielski     else
998*b1cdbd2cSJim Jagielski         drawBitmap( rPosAry, rSalBitmap );
999*b1cdbd2cSJim Jagielski }
1000*b1cdbd2cSJim Jagielski 
1001*b1cdbd2cSJim Jagielski // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
getBitmap(long nX,long nY,long nDX,long nDY)1002*b1cdbd2cSJim Jagielski SalBitmap *X11SalGraphics::getBitmap( long nX, long nY, long nDX, long nDY )
1003*b1cdbd2cSJim Jagielski {
1004*b1cdbd2cSJim Jagielski     if( bPrinter_ && !bVirDev_ )
1005*b1cdbd2cSJim Jagielski         return NULL;
1006*b1cdbd2cSJim Jagielski 
1007*b1cdbd2cSJim Jagielski     bool bFakeWindowBG = false;
1008*b1cdbd2cSJim Jagielski 
1009*b1cdbd2cSJim Jagielski     // normalize
1010*b1cdbd2cSJim Jagielski     if( nDX < 0 )
1011*b1cdbd2cSJim Jagielski     {
1012*b1cdbd2cSJim Jagielski         nX += nDX;
1013*b1cdbd2cSJim Jagielski         nDX = -nDX;
1014*b1cdbd2cSJim Jagielski     }
1015*b1cdbd2cSJim Jagielski     if ( nDY < 0 )
1016*b1cdbd2cSJim Jagielski     {
1017*b1cdbd2cSJim Jagielski         nY += nDY;
1018*b1cdbd2cSJim Jagielski         nDY = -nDY;
1019*b1cdbd2cSJim Jagielski     }
1020*b1cdbd2cSJim Jagielski 
1021*b1cdbd2cSJim Jagielski     if( bWindow_ && !bVirDev_ )
1022*b1cdbd2cSJim Jagielski     {
1023*b1cdbd2cSJim Jagielski         XWindowAttributes aAttrib;
1024*b1cdbd2cSJim Jagielski 
1025*b1cdbd2cSJim Jagielski         XGetWindowAttributes( GetXDisplay(), GetDrawable(), &aAttrib );
1026*b1cdbd2cSJim Jagielski         if( aAttrib.map_state != IsViewable )
1027*b1cdbd2cSJim Jagielski             bFakeWindowBG = true;
1028*b1cdbd2cSJim Jagielski         else
1029*b1cdbd2cSJim Jagielski         {
1030*b1cdbd2cSJim Jagielski             long nOrgDX = nDX, nOrgDY = nDY;
1031*b1cdbd2cSJim Jagielski 
1032*b1cdbd2cSJim Jagielski             // clip to window size
1033*b1cdbd2cSJim Jagielski             if ( nX < 0 )
1034*b1cdbd2cSJim Jagielski             {
1035*b1cdbd2cSJim Jagielski                 nDX += nX;
1036*b1cdbd2cSJim Jagielski                 nX   = 0;
1037*b1cdbd2cSJim Jagielski             }
1038*b1cdbd2cSJim Jagielski             if ( nY < 0 )
1039*b1cdbd2cSJim Jagielski             {
1040*b1cdbd2cSJim Jagielski                 nDY += nY;
1041*b1cdbd2cSJim Jagielski                 nY   = 0;
1042*b1cdbd2cSJim Jagielski             }
1043*b1cdbd2cSJim Jagielski             if( nX + nDX > aAttrib.width )
1044*b1cdbd2cSJim Jagielski                 nDX = aAttrib.width  - nX;
1045*b1cdbd2cSJim Jagielski             if( nY + nDY > aAttrib.height )
1046*b1cdbd2cSJim Jagielski                 nDY = aAttrib.height - nY;
1047*b1cdbd2cSJim Jagielski 
1048*b1cdbd2cSJim Jagielski             // inside ?
1049*b1cdbd2cSJim Jagielski             if( nDX <= 0 || nDY <= 0 )
1050*b1cdbd2cSJim Jagielski             {
1051*b1cdbd2cSJim Jagielski                 bFakeWindowBG = true;
1052*b1cdbd2cSJim Jagielski                 nDX = nOrgDX;
1053*b1cdbd2cSJim Jagielski                 nDY = nOrgDY;
1054*b1cdbd2cSJim Jagielski             }
1055*b1cdbd2cSJim Jagielski         }
1056*b1cdbd2cSJim Jagielski     }
1057*b1cdbd2cSJim Jagielski 
1058*b1cdbd2cSJim Jagielski     X11SalBitmap*	pSalBitmap = new X11SalBitmap;
1059*b1cdbd2cSJim Jagielski     sal_uInt16			nBitCount = GetBitCount();
1060*b1cdbd2cSJim Jagielski 
1061*b1cdbd2cSJim Jagielski     if( &GetDisplay()->GetColormap( m_nScreen ) != &GetColormap() )
1062*b1cdbd2cSJim Jagielski         nBitCount = 1;
1063*b1cdbd2cSJim Jagielski 
1064*b1cdbd2cSJim Jagielski     if( ! bFakeWindowBG )
1065*b1cdbd2cSJim Jagielski         pSalBitmap->ImplCreateFromDrawable( GetDrawable(), m_nScreen, nBitCount, nX, nY, nDX, nDY );
1066*b1cdbd2cSJim Jagielski     else
1067*b1cdbd2cSJim Jagielski         pSalBitmap->Create( Size( nDX, nDY ), (nBitCount > 8) ? 24 : nBitCount, BitmapPalette( nBitCount > 8 ? nBitCount : 0 ) );
1068*b1cdbd2cSJim Jagielski 
1069*b1cdbd2cSJim Jagielski     return pSalBitmap;
1070*b1cdbd2cSJim Jagielski }
1071*b1cdbd2cSJim Jagielski 
1072*b1cdbd2cSJim Jagielski // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
getPixel(long nX,long nY)1073*b1cdbd2cSJim Jagielski SalColor X11SalGraphics::getPixel( long nX, long nY )
1074*b1cdbd2cSJim Jagielski {
1075*b1cdbd2cSJim Jagielski     if( bWindow_ && !bVirDev_ )
1076*b1cdbd2cSJim Jagielski     {
1077*b1cdbd2cSJim Jagielski         XWindowAttributes aAttrib;
1078*b1cdbd2cSJim Jagielski 
1079*b1cdbd2cSJim Jagielski         XGetWindowAttributes( GetXDisplay(), GetDrawable(), &aAttrib );
1080*b1cdbd2cSJim Jagielski         if( aAttrib.map_state != IsViewable )
1081*b1cdbd2cSJim Jagielski         {
1082*b1cdbd2cSJim Jagielski             stderr0( "X11SalGraphics::GetPixel drawable not viewable\n" );
1083*b1cdbd2cSJim Jagielski             return 0;
1084*b1cdbd2cSJim Jagielski         }
1085*b1cdbd2cSJim Jagielski     }
1086*b1cdbd2cSJim Jagielski 
1087*b1cdbd2cSJim Jagielski     XImage *pXImage = XGetImage( GetXDisplay(),
1088*b1cdbd2cSJim Jagielski                                      GetDrawable(),
1089*b1cdbd2cSJim Jagielski                                  nX, nY,
1090*b1cdbd2cSJim Jagielski                                  1,  1,
1091*b1cdbd2cSJim Jagielski                                  AllPlanes,
1092*b1cdbd2cSJim Jagielski                                  ZPixmap );
1093*b1cdbd2cSJim Jagielski     if( !pXImage )
1094*b1cdbd2cSJim Jagielski     {
1095*b1cdbd2cSJim Jagielski         stderr0( "X11SalGraphics::GetPixel !XGetImage()\n" );
1096*b1cdbd2cSJim Jagielski         return 0;
1097*b1cdbd2cSJim Jagielski     }
1098*b1cdbd2cSJim Jagielski 
1099*b1cdbd2cSJim Jagielski     XColor aXColor;
1100*b1cdbd2cSJim Jagielski 
1101*b1cdbd2cSJim Jagielski     aXColor.pixel = XGetPixel( pXImage, 0, 0 );
1102*b1cdbd2cSJim Jagielski     XDestroyImage( pXImage );
1103*b1cdbd2cSJim Jagielski 
1104*b1cdbd2cSJim Jagielski     return GetColormap().GetColor( aXColor.pixel );
1105*b1cdbd2cSJim Jagielski }
1106*b1cdbd2cSJim Jagielski 
1107*b1cdbd2cSJim Jagielski // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
invert(long nX,long nY,long nDX,long nDY,SalInvert nFlags)1108*b1cdbd2cSJim Jagielski void X11SalGraphics::invert( long		nX,
1109*b1cdbd2cSJim Jagielski 								long		nY,
1110*b1cdbd2cSJim Jagielski 								long		nDX,
1111*b1cdbd2cSJim Jagielski 								long		nDY,
1112*b1cdbd2cSJim Jagielski 								SalInvert	nFlags )
1113*b1cdbd2cSJim Jagielski {
1114*b1cdbd2cSJim Jagielski     GC pGC;
1115*b1cdbd2cSJim Jagielski     if( SAL_INVERT_50 & nFlags )
1116*b1cdbd2cSJim Jagielski     {
1117*b1cdbd2cSJim Jagielski         pGC = GetInvert50GC();
1118*b1cdbd2cSJim Jagielski         XFillRectangle( GetXDisplay(), GetDrawable(), pGC, nX, nY, nDX, nDY );
1119*b1cdbd2cSJim Jagielski     }
1120*b1cdbd2cSJim Jagielski     else
1121*b1cdbd2cSJim Jagielski     {
1122*b1cdbd2cSJim Jagielski         if ( SAL_INVERT_TRACKFRAME & nFlags )
1123*b1cdbd2cSJim Jagielski         {
1124*b1cdbd2cSJim Jagielski             pGC = GetTrackingGC();
1125*b1cdbd2cSJim Jagielski             XDrawRectangle( GetXDisplay(), GetDrawable(),  pGC, nX, nY, nDX, nDY );
1126*b1cdbd2cSJim Jagielski         }
1127*b1cdbd2cSJim Jagielski         else
1128*b1cdbd2cSJim Jagielski         {
1129*b1cdbd2cSJim Jagielski             pGC = GetInvertGC();
1130*b1cdbd2cSJim Jagielski             XFillRectangle( GetXDisplay(), GetDrawable(),  pGC, nX, nY, nDX, nDY );
1131*b1cdbd2cSJim Jagielski         }
1132*b1cdbd2cSJim Jagielski     }
1133*b1cdbd2cSJim Jagielski }
1134*b1cdbd2cSJim Jagielski 
supportsOperation(OutDevSupportType eType) const1135*b1cdbd2cSJim Jagielski bool X11SalGraphics::supportsOperation( OutDevSupportType eType ) const
1136*b1cdbd2cSJim Jagielski {
1137*b1cdbd2cSJim Jagielski     bool bRet = false;
1138*b1cdbd2cSJim Jagielski     switch( eType )
1139*b1cdbd2cSJim Jagielski     {
1140*b1cdbd2cSJim Jagielski     case OutDevSupport_TransparentRect:
1141*b1cdbd2cSJim Jagielski     case OutDevSupport_B2DDraw:
1142*b1cdbd2cSJim Jagielski         {
1143*b1cdbd2cSJim Jagielski             XRenderPeer& rPeer = XRenderPeer::GetInstance();
1144*b1cdbd2cSJim Jagielski             if( rPeer.GetVersion() >= 0x02 )
1145*b1cdbd2cSJim Jagielski             {
1146*b1cdbd2cSJim Jagielski                 const SalDisplay* pSalDisp = GetDisplay();
1147*b1cdbd2cSJim Jagielski                 const SalVisual& rSalVis = pSalDisp->GetVisual( m_nScreen );
1148*b1cdbd2cSJim Jagielski 
1149*b1cdbd2cSJim Jagielski                 Visual* pDstXVisual = rSalVis.GetVisual();
1150*b1cdbd2cSJim Jagielski                 XRenderPictFormat* pDstVisFmt = rPeer.FindVisualFormat( pDstXVisual );
1151*b1cdbd2cSJim Jagielski                 if( pDstVisFmt )
1152*b1cdbd2cSJim Jagielski                     bRet = true;
1153*b1cdbd2cSJim Jagielski             }
1154*b1cdbd2cSJim Jagielski         }
1155*b1cdbd2cSJim Jagielski         break;
1156*b1cdbd2cSJim Jagielski     default: break;
1157*b1cdbd2cSJim Jagielski     }
1158*b1cdbd2cSJim Jagielski     return bRet;
1159*b1cdbd2cSJim Jagielski }
1160*b1cdbd2cSJim Jagielski 
1161