From a56c109d5f26fe063352a47311a08f588eaeecff Mon Sep 17 00:00:00 2001 From: Luboš Luňák Date: Mon, 17 Jan 2011 16:06:05 +0100 Subject: cleanup into one patch: do not mix unrelated X11 Visuals (fdo#33108) Do not assume that there is just one generic Visual, as today's XServers are ARGB-capable and cases of both the default depth and 32bit visuals can happen. Signed-off-by: Michael Meeks --- vcl/inc/vcl/sysdata.hxx | 2 +- vcl/unx/headless/svpgdi.cxx | 2 +- vcl/unx/headless/svppspgraphics.cxx | 2 +- vcl/unx/inc/salgdi.h | 8 +++---- vcl/unx/inc/salvd.h | 2 +- vcl/unx/source/gdi/pspgraphics.cxx | 2 +- vcl/unx/source/gdi/salgdi.cxx | 46 ++++++++++++++++++------------------- vcl/unx/source/gdi/salgdi3.cxx | 10 +------- vcl/unx/source/gdi/salvd.cxx | 14 +++++------ 9 files changed, 39 insertions(+), 49 deletions(-) (limited to 'vcl') diff --git a/vcl/inc/vcl/sysdata.hxx b/vcl/inc/vcl/sysdata.hxx index 2fd41c5df383..b25a1275673e 100644 --- a/vcl/inc/vcl/sysdata.hxx +++ b/vcl/inc/vcl/sysdata.hxx @@ -122,7 +122,7 @@ struct SystemGraphicsData int nScreen; // the current screen of the drawable int nDepth; // depth of said visual long aColormap; // the colormap being used - void* pRenderFormat; // render format for drawable + void* pXRenderFormat; // render format for drawable #endif }; diff --git a/vcl/unx/headless/svpgdi.cxx b/vcl/unx/headless/svpgdi.cxx index 2a717352d84c..a639369bb89e 100644 --- a/vcl/unx/headless/svpgdi.cxx +++ b/vcl/unx/headless/svpgdi.cxx @@ -577,7 +577,7 @@ SystemGraphicsData SvpSalGraphics::GetGraphicsData() const SystemGraphicsData aRes; aRes.nSize = sizeof(aRes); aRes.hDrawable = 0; - aRes.pRenderFormat = 0; + aRes.pXRenderFormat = 0; return aRes; } diff --git a/vcl/unx/headless/svppspgraphics.cxx b/vcl/unx/headless/svppspgraphics.cxx index 20990841f785..cd4a39fbb0fc 100644 --- a/vcl/unx/headless/svppspgraphics.cxx +++ b/vcl/unx/headless/svppspgraphics.cxx @@ -1363,7 +1363,7 @@ SystemGraphicsData PspGraphics::GetGraphicsData() const SystemGraphicsData aRes; aRes.nSize = sizeof(aRes); aRes.hDrawable = 0; - aRes.pRenderFormat = 0; + aRes.pXRenderFormat = 0; return aRes; } diff --git a/vcl/unx/inc/salgdi.h b/vcl/unx/inc/salgdi.h index 41a4d276f55c..efe201aa9d66 100644 --- a/vcl/unx/inc/salgdi.h +++ b/vcl/unx/inc/salgdi.h @@ -89,8 +89,8 @@ protected: SalColormap *m_pDeleteColormap; Drawable hDrawable_; // use int m_nScreen; - void* m_pRenderFormat; - XID m_aRenderPicture; + mutable XRenderPictFormat* m_pXRenderFormat; + XID m_aXRenderPicture; CairoFontsCache m_aCairoFontsCache; XLIB_Region pPaintRegion_; @@ -221,8 +221,8 @@ public: inline Drawable GetDrawable() const { return hDrawable_; } void SetDrawable( Drawable d, int nScreen ); XID GetXRenderPicture(); - void* GetXRenderFormat() const { return m_pRenderFormat; } - inline void SetXRenderFormat( void* pRenderFormat ) { m_pRenderFormat = pRenderFormat; } + XRenderPictFormat* GetXRenderFormat() const; + inline void SetXRenderFormat( XRenderPictFormat* pXRenderFormat ) { m_pXRenderFormat = pXRenderFormat; } inline const SalColormap& GetColormap() const { return *m_pColormap; } using SalGraphics::GetPixel; inline Pixel GetPixel( SalColor nSalColor ) const; diff --git a/vcl/unx/inc/salvd.h b/vcl/unx/inc/salvd.h index 0ed0cedad31b..e1c2b91d1627 100644 --- a/vcl/unx/inc/salvd.h +++ b/vcl/unx/inc/salvd.h @@ -62,7 +62,7 @@ public: USHORT nBitCount, int nScreen, Pixmap hDrawable = None, - void* pRenderFormat = NULL ); + XRenderPictFormat* pXRenderFormat = NULL ); inline void InitGraphics( X11SalVirtualDevice *pVD ); inline Display *GetXDisplay() const; diff --git a/vcl/unx/source/gdi/pspgraphics.cxx b/vcl/unx/source/gdi/pspgraphics.cxx index 0c4650a88dcc..dcbb689265b5 100644 --- a/vcl/unx/source/gdi/pspgraphics.cxx +++ b/vcl/unx/source/gdi/pspgraphics.cxx @@ -1472,7 +1472,7 @@ SystemGraphicsData PspGraphics::GetGraphicsData() const SystemGraphicsData aRes; aRes.nSize = sizeof(aRes); aRes.hDrawable = 0; - aRes.pRenderFormat = 0; + aRes.pXRenderFormat = 0; return aRes; } diff --git a/vcl/unx/source/gdi/salgdi.cxx b/vcl/unx/source/gdi/salgdi.cxx index 9ad8854c59dd..27c3ce806fd1 100644 --- a/vcl/unx/source/gdi/salgdi.cxx +++ b/vcl/unx/source/gdi/salgdi.cxx @@ -102,8 +102,8 @@ X11SalGraphics::X11SalGraphics() m_pVDev = NULL; m_pDeleteColormap = NULL; hDrawable_ = None; - m_aRenderPicture = 0; - m_pRenderFormat = NULL; + m_aXRenderPicture = 0; + m_pXRenderFormat = NULL; pClipRegion_ = NULL; pPaintRegion_ = NULL; @@ -187,8 +187,8 @@ void X11SalGraphics::freeResources() if( m_pDeleteColormap ) delete m_pDeleteColormap, m_pColormap = m_pDeleteColormap = NULL; - if( m_aRenderPicture ) - XRenderPeer::GetInstance().FreePicture( m_aRenderPicture ), m_aRenderPicture = 0; + if( m_aXRenderPicture ) + XRenderPeer::GetInstance().FreePicture( m_aXRenderPicture ), m_aXRenderPicture = 0; bPenGC_ = bFontGC_ = bBrushGC_ = bMonoGC_ = bCopyGC_ = bInvertGC_ = bInvert50GC_ = bStippleGC_ = bTrackingGC_ = false; } @@ -209,10 +209,10 @@ void X11SalGraphics::SetDrawable( Drawable aDrawable, int nScreen ) hDrawable_ = aDrawable; SetXRenderFormat( NULL ); - if( m_aRenderPicture ) + if( m_aXRenderPicture ) { - XRenderPeer::GetInstance().FreePicture( m_aRenderPicture ); - m_aRenderPicture = 0; + XRenderPeer::GetInstance().FreePicture( m_aXRenderPicture ); + m_aXRenderPicture = 0; } if( hDrawable_ ) @@ -1021,23 +1021,14 @@ XID X11SalGraphics::GetXRenderPicture() { XRenderPeer& rRenderPeer = XRenderPeer::GetInstance(); - if( !m_aRenderPicture ) + if( !m_aXRenderPicture ) { // check xrender support for matching visual - // find a XRenderPictFormat compatible with the Drawable - XRenderPictFormat* pVisualFormat = static_cast(GetXRenderFormat()); - if( !pVisualFormat ) - { - Visual* pVisual = GetDisplay()->GetVisual( m_nScreen ).GetVisual(); - pVisualFormat = rRenderPeer.FindVisualFormat( pVisual ); - if( !pVisualFormat ) - return 0; - // cache the XRenderPictFormat - SetXRenderFormat( static_cast(pVisualFormat) ); - } - + XRenderPictFormat* pXRenderFormat = GetXRenderFormat(); + if( !pXRenderFormat ) + return 0; // get the matching xrender target for drawable - m_aRenderPicture = rRenderPeer.CreatePicture( hDrawable_, pVisualFormat, 0, NULL ); + m_aXRenderPicture = rRenderPeer.CreatePicture( hDrawable_, pXRenderFormat, 0, NULL ); } { @@ -1045,10 +1036,17 @@ XID X11SalGraphics::GetXRenderPicture() // TODO: avoid clip reset if already done XRenderPictureAttributes aAttr; aAttr.clip_mask = None; - rRenderPeer.ChangePicture( m_aRenderPicture, CPClipMask, &aAttr ); + rRenderPeer.ChangePicture( m_aXRenderPicture, CPClipMask, &aAttr ); } - return m_aRenderPicture; + return m_aXRenderPicture; +} + +XRenderPictFormat* X11SalGraphics::GetXRenderFormat() const +{ + if( m_pXRenderFormat == NULL ) + m_pXRenderFormat = XRenderPeer::GetInstance().FindVisualFormat( GetVisual().visual ); + return m_pXRenderFormat; } // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= @@ -1064,7 +1062,7 @@ SystemGraphicsData X11SalGraphics::GetGraphicsData() const aRes.nScreen = m_nScreen; aRes.nDepth = GetDisplay()->GetVisual( m_nScreen ).GetDepth(); aRes.aColormap = GetDisplay()->GetColormap( m_nScreen ).GetXColormap(); - aRes.pRenderFormat = m_pRenderFormat; + aRes.pXRenderFormat = m_pXRenderFormat; return aRes; } diff --git a/vcl/unx/source/gdi/salgdi3.cxx b/vcl/unx/source/gdi/salgdi3.cxx index fa0f695dee8b..aaaec1222868 100644 --- a/vcl/unx/source/gdi/salgdi3.cxx +++ b/vcl/unx/source/gdi/salgdi3.cxx @@ -985,15 +985,7 @@ void X11SalGraphics::DrawCairoAAFontString( const ServerFontLayout& rLayout ) return; // find a XRenderPictFormat compatible with the Drawable - XRenderPictFormat* pVisualFormat = static_cast(GetXRenderFormat()); - if( !pVisualFormat ) - { - Visual* pVisual = GetDisplay()->GetVisual( m_nScreen ).GetVisual(); - pVisualFormat = XRenderPeer::GetInstance().FindVisualFormat( pVisual ); - // cache the XRenderPictFormat - SetXRenderFormat( static_cast(pVisualFormat) ); - } - + XRenderPictFormat* pVisualFormat = GetXRenderFormat(); DBG_ASSERT( pVisualFormat!=NULL, "no matching XRenderPictFormat for text" ); if( !pVisualFormat ) return; diff --git a/vcl/unx/source/gdi/salvd.cxx b/vcl/unx/source/gdi/salvd.cxx index c883acfa1973..ce8421f14f49 100644 --- a/vcl/unx/source/gdi/salvd.cxx +++ b/vcl/unx/source/gdi/salvd.cxx @@ -68,7 +68,8 @@ SalVirtualDevice* X11SalInstance::CreateVirtualDevice( SalGraphics* pGraphics, } nDX = (long)w; nDY = (long)h; - if( !pVDev->Init( GetX11SalData()->GetDisplay(), nDX, nDY, nBitCount, nScreen, pData->hDrawable, pData->pRenderFormat ) ) + if( !pVDev->Init( GetX11SalData()->GetDisplay(), nDX, nDY, nBitCount, nScreen, pData->hDrawable, + static_cast< XRenderPictFormat* >( pData->pXRenderFormat )) ) { delete pVDev; return NULL; @@ -136,7 +137,7 @@ BOOL X11SalVirtualDevice::Init( SalDisplay *pDisplay, USHORT nBitCount, int nScreen, Pixmap hDrawable, - void* pRenderFormatVoid ) + XRenderPictFormat* pXRenderFormat ) { SalColormap* pColormap = NULL; bool bDeleteColormap = false; @@ -144,11 +145,10 @@ BOOL X11SalVirtualDevice::Init( SalDisplay *pDisplay, pDisplay_ = pDisplay; pGraphics_ = new X11SalGraphics(); m_nScreen = nScreen; - if( pRenderFormatVoid ) { - XRenderPictFormat *pRenderFormat = ( XRenderPictFormat* )pRenderFormatVoid; - pGraphics_->SetXRenderFormat( pRenderFormat ); - if( pRenderFormat->colormap ) - pColormap = new SalColormap( pDisplay, pRenderFormat->colormap, m_nScreen ); + if( pXRenderFormat ) { + pGraphics_->SetXRenderFormat( pXRenderFormat ); + if( pXRenderFormat->colormap ) + pColormap = new SalColormap( pDisplay, pXRenderFormat->colormap, m_nScreen ); else pColormap = new SalColormap( nBitCount ); bDeleteColormap = true; -- cgit v1.2.3