summaryrefslogtreecommitdiff
path: root/vcl/unx/generic/gdi/xrender_peer.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'vcl/unx/generic/gdi/xrender_peer.hxx')
-rw-r--r--vcl/unx/generic/gdi/xrender_peer.hxx387
1 files changed, 387 insertions, 0 deletions
diff --git a/vcl/unx/generic/gdi/xrender_peer.hxx b/vcl/unx/generic/gdi/xrender_peer.hxx
new file mode 100644
index 000000000000..89dccfcef40b
--- /dev/null
+++ b/vcl/unx/generic/gdi/xrender_peer.hxx
@@ -0,0 +1,387 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _SV_XRENDER_PEER_HXX
+#define _SV_XRENDER_PEER_HXX
+
+#include <tools/prex.h>
+struct _XTrap; // on some older systems this is not declared within Xrender.h
+#include <X11/extensions/Xrender.h>
+#include <tools/postx.h>
+
+#include <vcl/salgtype.hxx>
+#include <osl/module.h>
+
+class XRenderPeer
+{
+public:
+ static XRenderPeer& GetInstance();
+ int GetVersion() const;
+
+ sal_uInt32 InitRenderText();
+
+protected:
+ XRenderPeer();
+ ~XRenderPeer();
+ void InitRenderLib();
+
+ Display* mpDisplay;
+ XRenderPictFormat* mpStandardFormatA8;
+ int mnRenderVersion;
+ oslModule mpRenderLib;
+
+public:
+ XRenderPictFormat* GetStandardFormatA8() const;
+ XRenderPictFormat* FindStandardFormat(int nFormat) const;
+
+ // the methods below are thin wrappers for the XRENDER API
+ XRenderPictFormat* FindVisualFormat( Visual* ) const;
+ XRenderPictFormat* FindPictureFormat( unsigned long nMask,
+ const XRenderPictFormat& ) const;
+ Picture CreatePicture( Drawable, const XRenderPictFormat*,
+ unsigned long nDrawable, const XRenderPictureAttributes* ) const;
+ void ChangePicture( Picture, unsigned long nValueMask,
+ const XRenderPictureAttributes* ) const;
+ void SetPictureClipRegion( Picture, XLIB_Region ) const;
+ void CompositePicture( int nOp, Picture aSrc, Picture aMask, Picture aDst,
+ int nXSrc, int nYSrc, int nXMask, int nYMask,
+ int nXDst, int nYDst, unsigned nWidth, unsigned nHeight ) const;
+ void FreePicture( Picture ) const;
+
+ GlyphSet CreateGlyphSet() const;
+ void FreeGlyphSet( GlyphSet ) const;
+ void AddGlyph( GlyphSet, Glyph nGlyphId, const XGlyphInfo&,
+ const char* pBuffer, int nBufSize ) const;
+ void FreeGlyph( GlyphSet, Glyph nGlyphId ) const;
+ void CompositeString32( Picture aSrc, Picture aDst, GlyphSet,
+ int nDstX, int nDstY, const unsigned* pText, int nTextLen ) const;
+ void FillRectangle( int nOp, Picture aDst, const XRenderColor*,
+ int nX, int nY, unsigned nW, unsigned nH ) const;
+ void CompositeTrapezoids( int nOp, Picture aSrc, Picture aDst,
+ const XRenderPictFormat*, int nXSrc, int nYSrc,
+ const XTrapezoid*, int nCount ) const;
+ bool AddTraps( Picture aDst, int nXOfs, int nYOfs,
+ const _XTrap*, int nCount ) const;
+
+ bool AreTrapezoidsSupported() const
+#ifdef XRENDER_LINK
+ { return true; }
+#else
+ { return mpXRenderCompositeTrapezoids!=NULL; }
+
+private:
+ XRenderPictFormat* (*mpXRenderFindFormat)(Display*,unsigned long,
+ const XRenderPictFormat*,int);
+ XRenderPictFormat* (*mpXRenderFindVisualFormat)(Display*,Visual*);
+ XRenderPictFormat* (*mpXRenderFindStandardFormat)(Display*,int);
+ Bool (*mpXRenderQueryExtension)(Display*,int*,int*);
+ void (*mpXRenderQueryVersion)(Display*,int*,int*);
+
+ Picture (*mpXRenderCreatePicture)(Display*,Drawable, const XRenderPictFormat*,
+ unsigned long,const XRenderPictureAttributes*);
+ void (*mpXRenderChangePicture)(Display*,Picture,
+ unsigned long,const XRenderPictureAttributes*);
+ void (*mpXRenderSetPictureClipRegion)(Display*,Picture,XLIB_Region);
+ void (*mpXRenderFreePicture)(Display*,Picture);
+ void (*mpXRenderComposite)(Display*,int,Picture,Picture,Picture,
+ int,int,int,int,int,int,unsigned,unsigned);
+
+ GlyphSet (*mpXRenderCreateGlyphSet)(Display*, const XRenderPictFormat*);
+ void (*mpXRenderFreeGlyphSet)(Display*,GlyphSet);
+ void (*mpXRenderAddGlyphs)(Display*,GlyphSet,Glyph*,
+ const XGlyphInfo*,int,const char*,int);
+ void (*mpXRenderFreeGlyphs)(Display*,GlyphSet,Glyph*,int);
+ void (*mpXRenderCompositeString32)(Display*,int,Picture,Picture,
+ const XRenderPictFormat*,GlyphSet,int,int,int,int,const unsigned*,int);
+ void (*mpXRenderFillRectangle)(Display*,int,Picture,
+ const XRenderColor*,int,int,unsigned int,unsigned int);
+ void (*mpXRenderCompositeTrapezoids)(Display*,int,Picture,Picture,
+ const XRenderPictFormat*,int,int,const XTrapezoid*,int);
+ void (*mpXRenderAddTraps)(Display*,Picture,int,int,const _XTrap*,int);
+#endif // XRENDER_LINK
+};
+
+//=====================================================================
+
+class ScopedPic
+{
+public:
+ ScopedPic( XRenderPeer& rPeer, Picture& rPic );
+ ~ScopedPic();
+ Picture& Get();
+
+private:
+ XRenderPeer& mrRenderPeer;
+ Picture maPicture;
+
+private: // prevent copy and assignmet
+ ScopedPic( const ScopedPic& );
+ void operator=( const ScopedPic& );
+};
+
+//=====================================================================
+
+inline int XRenderPeer::GetVersion() const
+{
+ return mnRenderVersion;
+}
+
+inline XRenderPictFormat* XRenderPeer::GetStandardFormatA8() const
+{
+ return mpStandardFormatA8;
+}
+
+inline XRenderPictFormat* XRenderPeer::FindStandardFormat(int nFormat) const
+{
+#ifdef XRENDER_LINK
+ return XRenderFindStandardFormat(mpDisplay, nFormat);
+#else
+ return (*mpXRenderFindStandardFormat)(mpDisplay, nFormat);
+#endif
+}
+
+inline XRenderPictFormat* XRenderPeer::FindVisualFormat( Visual* pVisual ) const
+{
+#ifdef XRENDER_LINK
+ return XRenderFindVisualFormat ( mpDisplay, pVisual );
+#else
+ return (*mpXRenderFindVisualFormat)( mpDisplay, pVisual );
+#endif
+}
+
+inline XRenderPictFormat* XRenderPeer::FindPictureFormat( unsigned long nFormatMask,
+ const XRenderPictFormat& rFormatAttr ) const
+{
+#ifdef XRENDER_LINK
+ return XRenderFindFormat( mpDisplay, nFormatMask, &rFormatAttr, 0 );
+#else
+ return (*mpXRenderFindFormat)( mpDisplay, nFormatMask, &rFormatAttr, 0 );
+#endif
+}
+
+inline Picture XRenderPeer::CreatePicture( Drawable aDrawable,
+ const XRenderPictFormat* pVisFormat, unsigned long nValueMask,
+ const XRenderPictureAttributes* pRenderAttr ) const
+{
+#ifdef XRENDER_LINK
+ return XRenderCreatePicture( mpDisplay, aDrawable, pVisFormat,
+ nValueMask, pRenderAttr );
+#else
+ return (*mpXRenderCreatePicture)( mpDisplay, aDrawable, pVisFormat,
+ nValueMask, pRenderAttr );
+#endif
+}
+
+inline void XRenderPeer::ChangePicture( Picture aPicture,
+ unsigned long nValueMask, const XRenderPictureAttributes* pRenderAttr ) const
+{
+#ifdef XRENDER_LINK
+ XRenderChangePicture( mpDisplay, aPicture, nValueMask, pRenderAttr );
+#else
+ (*mpXRenderChangePicture)( mpDisplay, aPicture, nValueMask, pRenderAttr );
+#endif
+}
+
+inline void XRenderPeer::SetPictureClipRegion( Picture aPicture,
+ XLIB_Region aXlibRegion ) const
+{
+#ifdef XRENDER_LINK
+ XRenderSetPictureClipRegion( mpDisplay, aPicture, aXlibRegion );
+#else
+ (*mpXRenderSetPictureClipRegion)( mpDisplay, aPicture, aXlibRegion );
+#endif
+}
+
+inline void XRenderPeer::CompositePicture( int nXRenderOp,
+ Picture aSrcPic, Picture aMaskPic, Picture aDstPic,
+ int nSrcX, int nSrcY, int nMaskX, int nMaskY, int nDstX, int nDstY,
+ unsigned nWidth, unsigned nHeight ) const
+{
+#ifdef XRENDER_LINK
+ XRenderComposite( mpDisplay, nXRenderOp, aSrcPic, aMaskPic, aDstPic,
+ nSrcX, nSrcY, nMaskX, nMaskY, nDstX, nDstY, nWidth, nHeight );
+#else
+ (*mpXRenderComposite)( mpDisplay, nXRenderOp, aSrcPic, aMaskPic, aDstPic,
+ nSrcX, nSrcY, nMaskX, nMaskY, nDstX, nDstY, nWidth, nHeight );
+#endif
+}
+
+inline void XRenderPeer::FreePicture( Picture aPicture ) const
+{
+#ifdef XRENDER_LINK
+ XRenderFreePicture( mpDisplay, aPicture );
+#else
+ (*mpXRenderFreePicture)( mpDisplay, aPicture );
+#endif
+}
+
+inline GlyphSet XRenderPeer::CreateGlyphSet() const
+{
+#ifdef XRENDER_LINK
+ return XRenderCreateGlyphSet( mpDisplay, mpStandardFormatA8 );
+#else
+ return (*mpXRenderCreateGlyphSet)( mpDisplay, mpStandardFormatA8 );
+#endif
+}
+
+inline void XRenderPeer::FreeGlyphSet( GlyphSet aGS ) const
+{
+#ifdef XRENDER_LINK
+ XRenderFreeGlyphSet( mpDisplay, aGS );
+#else
+ (*mpXRenderFreeGlyphSet)( mpDisplay, aGS );
+#endif
+}
+
+inline void XRenderPeer::AddGlyph( GlyphSet aGS, Glyph nGlyphId,
+ const XGlyphInfo& rGI, const char* pBuffer, int nBufSize ) const
+{
+#ifdef XRENDER_LINK
+ XRenderAddGlyphs( mpDisplay, aGS, &nGlyphId, &rGI, 1,
+ const_cast<char*>(pBuffer), nBufSize );
+#else
+ (*mpXRenderAddGlyphs)( mpDisplay, aGS, &nGlyphId, &rGI, 1,
+ const_cast<char*>(pBuffer), nBufSize );
+#endif
+}
+
+inline void XRenderPeer::FreeGlyph( GlyphSet aGS, Glyph nGlyphId ) const
+{
+ (void)aGS; (void)nGlyphId;
+
+ // XRenderFreeGlyphs not implemented yet for version<=0.2
+ // #108209# disabled because of crash potential,
+ // the glyph leak is not too bad because they will
+ // be cleaned up when the glyphset is released
+#if 0 // TODO: reenable when it works without problems
+ if( mnRenderVersion >= 0x05 )
+ {
+#ifdef XRENDER_LINK
+ XRenderFreeGlyphs( mpDisplay, aGS, &nGlyphId, 1 );
+#else
+ (*mpXRenderFreeGlyphs)( mpDisplay, aGS, &nGlyphId, 1 );
+#endif
+ }
+#endif
+}
+
+inline void XRenderPeer::CompositeString32( Picture aSrc, Picture aDst,
+ GlyphSet aGlyphSet, int nDstX, int nDstY,
+ const unsigned* pText, int nTextLen ) const
+{
+#ifdef XRENDER_LINK
+ XRenderCompositeString32( mpDisplay, PictOpOver, aSrc, aDst, NULL,
+ aGlyphSet, 0, 0, nDstX, nDstY, pText, nTextLen );
+#else
+ (*mpXRenderCompositeString32)( mpDisplay, PictOpOver, aSrc, aDst, NULL,
+ aGlyphSet, 0, 0, nDstX, nDstY, pText, nTextLen );
+#endif
+}
+
+inline void XRenderPeer::FillRectangle( int a, Picture b, const XRenderColor* c,
+ int d, int e, unsigned int f, unsigned int g) const
+{
+#ifdef XRENDER_LINK
+ XRenderFillRectangle( mpDisplay, a, b, c, d, e, f, g );
+#else
+ (*mpXRenderFillRectangle)( mpDisplay, a, b, c, d, e, f, g );
+#endif
+}
+
+
+inline void XRenderPeer::CompositeTrapezoids( int nOp,
+ Picture aSrc, Picture aDst, const XRenderPictFormat* pXRPF,
+ int nXSrc, int nYSrc, const XTrapezoid* pXT, int nCount ) const
+{
+#ifdef XRENDER_LINK
+ XRenderCompositeTrapezoids( mpDisplay, nOp, aSrc, aDst, pXRPF,
+ nXSrc, nYSrc, pXT, nCount );
+#else
+ (*mpXRenderCompositeTrapezoids)( mpDisplay, nOp, aSrc, aDst, pXRPF,
+ nXSrc, nYSrc, pXT, nCount );
+#endif
+}
+
+inline bool XRenderPeer::AddTraps( Picture aDst, int nXOfs, int nYOfs,
+ const _XTrap* pTraps, int nCount ) const
+{
+#ifdef XRENDER_LINK
+ XRenderAddTraps( mpDisplay, aDst, nXOfs, nYOfs, pTraps, nCount );
+#else
+ if( !mpXRenderAddTraps )
+ return false;
+ (*mpXRenderAddTraps)( mpDisplay, aDst, nXOfs, nYOfs, pTraps, nCount );
+#endif
+ return true;
+}
+
+//=====================================================================
+
+inline ScopedPic::ScopedPic( XRenderPeer& rPeer, Picture& rPic )
+: mrRenderPeer( rPeer)
+, maPicture( rPic )
+{}
+
+inline ScopedPic::~ScopedPic()
+{
+ if( maPicture )
+ mrRenderPeer.FreePicture( maPicture );
+}
+
+inline Picture& ScopedPic::Get()
+{
+ return maPicture;
+}
+
+//=====================================================================
+
+inline XRenderColor GetXRenderColor( const SalColor& rSalColor, double fTransparency = 0.0 )
+{
+ XRenderColor aRetVal;
+ // convert the SalColor
+ aRetVal.red = SALCOLOR_RED( rSalColor ); aRetVal.red |= (aRetVal.red << 8);
+ aRetVal.green = SALCOLOR_GREEN( rSalColor ); aRetVal.green |= (aRetVal.green << 8);
+ aRetVal.blue = SALCOLOR_BLUE( rSalColor ); aRetVal.blue |= (aRetVal.blue << 8);
+
+ // handle transparency
+ aRetVal.alpha = 0xFFFF; // default to opaque
+ if( fTransparency != 0 )
+ {
+ const double fAlpha = 1.0 - fTransparency;
+ aRetVal.alpha = static_cast<sal_uInt16>(fAlpha * 0xFFFF + 0.5);
+ // xrender wants pre-multiplied colors
+ aRetVal.red = static_cast<sal_uInt16>(fAlpha * aRetVal.red + 0.5);
+ aRetVal.green = static_cast<sal_uInt16>(fAlpha * aRetVal.green + 0.5);
+ aRetVal.blue = static_cast<sal_uInt16>(fAlpha * aRetVal.blue + 0.5);
+ }
+
+ return aRetVal;
+}
+
+//=====================================================================
+
+#endif // _SV_XRENDER_PEER_HXX