xref: /AOO41X/main/vcl/unx/generic/gdi/salvd.cxx (revision c82f28778d59b20a7e6c0f9982d1bc73807a432a)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_vcl.hxx"
26 
27 #include <vcl/sysdata.hxx>
28 
29 #include <tools/prex.h>
30 #include <X11/extensions/Xrender.h>
31 #include <tools/postx.h>
32 
33 #include <unx/salunx.h>
34 #include <unx/saldata.hxx>
35 #include <unx/saldisp.hxx>
36 #include <unx/salgdi.h>
37 #include <unx/salvd.h>
38 
39 #include <salinst.hxx>
40 
41 // -=-= SalInstance =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
42 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
CreateVirtualDevice(SalGraphics * pGraphics,long nDX,long nDY,sal_uInt16 nBitCount,const SystemGraphicsData * pData)43 SalVirtualDevice* X11SalInstance::CreateVirtualDevice( SalGraphics* pGraphics,
44                                                        long nDX, long nDY,
45                                                        sal_uInt16 nBitCount, const SystemGraphicsData *pData )
46 {
47     X11SalVirtualDevice *pVDev = new X11SalVirtualDevice();
48     if( !nBitCount && pGraphics )
49         nBitCount = pGraphics->GetBitCount();
50 
51     if( pData && pData->hDrawable != None )
52     {
53         XLIB_Window aRoot;
54         int x, y;
55         unsigned int w = 0, h = 0, bw, d;
56         Display* pDisp = GetX11SalData()->GetDisplay()->GetDisplay();
57         XGetGeometry( pDisp, pData->hDrawable,
58                       &aRoot, &x, &y, &w, &h, &bw, &d );
59         int nScreen = 0;
60         while( nScreen < ScreenCount( pDisp ) )
61         {
62             if( RootWindow( pDisp, nScreen ) == aRoot )
63                 break;
64             nScreen++;
65         }
66         nDX = (long)w;
67         nDY = (long)h;
68         if( !pVDev->Init( GetX11SalData()->GetDisplay(), nDX, nDY, nBitCount, nScreen, pData->hDrawable, pData->pRenderFormat ) )
69         {
70             delete pVDev;
71             return NULL;
72         }
73     }
74     else if( !pVDev->Init( GetX11SalData()->GetDisplay(), nDX, nDY, nBitCount,
75                            pGraphics ? static_cast<X11SalGraphics*>(pGraphics)->GetScreenNumber() :
76                                        GetX11SalData()->GetDisplay()->GetDefaultScreenNumber() ) )
77     {
78         delete pVDev;
79         return NULL;
80     }
81 
82     pVDev->InitGraphics( pVDev );
83     return pVDev;
84 }
85 
DestroyVirtualDevice(SalVirtualDevice * pDevice)86 void X11SalInstance::DestroyVirtualDevice( SalVirtualDevice* pDevice )
87 {
88     delete pDevice;
89 }
90 
91 // -=-= SalGraphicsData =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
92 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Init(X11SalVirtualDevice * pDevice,SalColormap * pColormap,bool bDeleteColormap)93 void X11SalGraphics::Init( X11SalVirtualDevice *pDevice, SalColormap* pColormap, bool bDeleteColormap )
94 {
95     SalColormap *pOrigDeleteColormap = m_pDeleteColormap;
96 
97     SalDisplay *pDisplay  = pDevice->GetDisplay();
98     m_nScreen = pDevice->GetScreenNumber();
99 
100     int nVisualDepth = pDisplay->GetColormap( m_nScreen ).GetVisual().GetDepth();
101     int nDeviceDepth = pDevice->GetDepth();
102 
103     if( pColormap )
104     {
105         m_pColormap = pColormap;
106         if( bDeleteColormap )
107             m_pDeleteColormap = pColormap;
108     }
109     else
110     if( nDeviceDepth == nVisualDepth )
111         m_pColormap = &pDisplay->GetColormap( m_nScreen );
112     else
113     if( nDeviceDepth == 1 )
114         m_pColormap = m_pDeleteColormap = new SalColormap();
115 
116     if (m_pDeleteColormap != pOrigDeleteColormap)
117         delete pOrigDeleteColormap;
118 
119     const Drawable aVdevDrawable = pDevice->GetDrawable();
120     SetDrawable( aVdevDrawable, m_nScreen );
121 
122     m_pVDev      = pDevice;
123     m_pFrame     = NULL;
124 
125     bWindow_     = pDisplay->IsDisplay();
126     bVirDev_     = sal_True;
127 }
128 
129 // -=-= SalVirDevData / SalVirtualDevice -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
130 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Init(SalDisplay * pDisplay,long nDX,long nDY,sal_uInt16 nBitCount,int nScreen,Pixmap hDrawable,void * pRenderFormatVoid)131 sal_Bool X11SalVirtualDevice::Init( SalDisplay *pDisplay,
132                                 long nDX, long nDY,
133                                 sal_uInt16 nBitCount,
134                                 int nScreen,
135                                 Pixmap hDrawable,
136                                 void* pRenderFormatVoid )
137 {
138     SalColormap* pColormap = NULL;
139     bool bDeleteColormap = false;
140 
141     pDisplay_               = pDisplay;
142     pGraphics_              = new X11SalGraphics();
143     m_nScreen               = nScreen;
144     if( pRenderFormatVoid ) {
145         XRenderPictFormat *pRenderFormat = ( XRenderPictFormat* )pRenderFormatVoid;
146         pGraphics_->SetXRenderFormat( pRenderFormat );
147         if( pRenderFormat->colormap )
148             pColormap = new SalColormap( pDisplay, pRenderFormat->colormap, m_nScreen );
149         else
150             pColormap = new SalColormap( nBitCount );
151         bDeleteColormap = true;
152     }
153     else if( nBitCount != pDisplay->GetVisual( m_nScreen ).GetDepth() )
154     {
155         pColormap = new SalColormap( nBitCount );
156         bDeleteColormap = true;
157     }
158     pGraphics_->SetLayout( 0 ); // by default no! mirroring for VirtualDevices, can be enabled with EnableRTL()
159     nDX_                    = nDX;
160     nDY_                    = nDY;
161     nDepth_                 = nBitCount;
162 
163     if( hDrawable == None )
164         hDrawable_          = XCreatePixmap( GetXDisplay(),
165                                              pDisplay_->GetDrawable( m_nScreen ),
166                                              nDX_, nDY_,
167                                              GetDepth() );
168     else
169     {
170         hDrawable_ = hDrawable;
171         bExternPixmap_ = sal_True;
172     }
173 
174     pGraphics_->Init( this, pColormap, bDeleteColormap );
175 
176     return hDrawable_ != None ? sal_True : sal_False;
177 }
178 
179 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
X11SalVirtualDevice()180 X11SalVirtualDevice::X11SalVirtualDevice()
181 {
182     pDisplay_               = (SalDisplay*)ILLEGAL_POINTER;
183     pGraphics_              = NULL;
184     hDrawable_              = None;
185     nDX_                    = 0;
186     nDY_                    = 0;
187     nDepth_                 = 0;
188     bGraphics_              = sal_False;
189     bExternPixmap_          = sal_False;
190 }
191 
192 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
~X11SalVirtualDevice()193 X11SalVirtualDevice::~X11SalVirtualDevice()
194 {
195     if( pGraphics_ )
196         delete pGraphics_;
197     pGraphics_ = NULL;
198 
199     if( GetDrawable() && !bExternPixmap_ )
200         XFreePixmap( GetXDisplay(), GetDrawable() );
201 }
202 
GetGraphics()203 SalGraphics* X11SalVirtualDevice::GetGraphics()
204 {
205     if( bGraphics_ )
206         return NULL;
207 
208     if( pGraphics_ )
209         bGraphics_ = sal_True;
210 
211     return pGraphics_;
212 }
213 
ReleaseGraphics(SalGraphics *)214 void X11SalVirtualDevice::ReleaseGraphics( SalGraphics* )
215 { bGraphics_ = sal_False; }
216 
SetSize(long nDX,long nDY)217 sal_Bool X11SalVirtualDevice::SetSize( long nDX, long nDY )
218 {
219     if( bExternPixmap_ )
220         return sal_False;
221 
222     // #144688#
223     // the X protocol request CreatePixmap puts an upper bound
224     // of 16 bit to the size. Beyond that there may be implementation
225     // limits of the Xserver; which we should catch by a failed XCreatePixmap
226     // call. However extra large values should be caught here since we'd run into
227     // 16 bit truncation here without noticing.
228     if( nDX < 0 || nDX > 65535 ||
229         nDY < 0 || nDY > 65535 )
230         return sal_False;
231 
232     if( !nDX ) nDX = 1;
233     if( !nDY ) nDY = 1;
234 
235     Pixmap h = XCreatePixmap( GetXDisplay(),
236                               pDisplay_->GetDrawable( m_nScreen ),
237                               nDX, nDY, nDepth_ );
238 
239     if( !h )
240     {
241         if( !GetDrawable() )
242         {
243             hDrawable_ = XCreatePixmap( GetXDisplay(),
244                                         pDisplay_->GetDrawable( m_nScreen ),
245                                         1, 1, nDepth_ );
246             nDX_ = 1;
247             nDY_ = 1;
248         }
249         return sal_False;
250     }
251 
252     if( GetDrawable() )
253         XFreePixmap( GetXDisplay(), GetDrawable() );
254     hDrawable_ = h;
255 
256     nDX_ = nDX;
257     nDY_ = nDY;
258 
259     if( pGraphics_ )
260         InitGraphics( this );
261 
262     return sal_True;
263 }
264 
GetSize(long & rWidth,long & rHeight)265 void X11SalVirtualDevice::GetSize( long& rWidth, long& rHeight )
266 {
267     rWidth  = GetWidth();
268     rHeight = GetHeight();
269 }
270 
271