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