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 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 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 86 void X11SalInstance::DestroyVirtualDevice( SalVirtualDevice* pDevice ) 87 { 88 delete pDevice; 89 } 90 91 // -=-= SalGraphicsData =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 92 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 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 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 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 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 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 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 193 X11SalVirtualDevice::~X11SalVirtualDevice() 194 { 195 if( pGraphics_ ) 196 delete pGraphics_; 197 pGraphics_ = NULL; 198 199 if( GetDrawable() && !bExternPixmap_ ) 200 XFreePixmap( GetXDisplay(), GetDrawable() ); 201 } 202 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 214 void X11SalVirtualDevice::ReleaseGraphics( SalGraphics* ) 215 { bGraphics_ = sal_False; } 216 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 265 void X11SalVirtualDevice::GetSize( long& rWidth, long& rHeight ) 266 { 267 rWidth = GetWidth(); 268 rHeight = GetHeight(); 269 } 270 271