1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  *   Licensed to the Apache Software Foundation (ASF) under one or more
12  *   contributor license agreements. See the NOTICE file distributed
13  *   with this work for additional information regarding copyright
14  *   ownership. The ASF licenses this file to you under the Apache
15  *   License, Version 2.0 (the "License"); you may not use this file
16  *   except in compliance with the License. You may obtain a copy of
17  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #ifndef INCLUDED_VCL_UNX_X11_XRENDER_PEER_HXX
21 #define INCLUDED_VCL_UNX_X11_XRENDER_PEER_HXX
22 
23 #include <X11/Xlib.h>
24 #include <X11/Xutil.h>
25 struct _XTrap; // on some older systems this is not declared within Xrender.h
26 #include <X11/extensions/Xrender.h>
27 
28 #include <tools/color.hxx>
29 
30 
31 class XRenderPeer
32 {
33 public:
34     static XRenderPeer& GetInstance();
35 
36 private:
37                         XRenderPeer();
38     void                InitRenderLib();
39 
40     Display* const      mpDisplay;
41     XRenderPictFormat*  mpStandardFormatA8;
42 
43 public:
44     XRenderPictFormat* GetStandardFormatA8() const;
45     XRenderPictFormat* FindStandardFormat(int nFormat) const;
46 
47     // the methods below are thin wrappers for the XRENDER API
48     XRenderPictFormat* FindVisualFormat( Visual const * ) const;
49     Picture     CreatePicture( Drawable, const XRenderPictFormat*,
50                     unsigned long nDrawable, const XRenderPictureAttributes* ) const;
51     void        ChangePicture( Picture, unsigned long nValueMask,
52                     const XRenderPictureAttributes* ) const;
53     void        SetPictureClipRegion( Picture, Region ) const;
54     void        CompositePicture( int nOp, Picture aSrc, Picture aMask, Picture aDst,
55                     int nXSrc, int nYSrc,
56                     int nXDst, int nYDst, unsigned nWidth, unsigned nHeight ) const;
57     void        FreePicture( Picture ) const;
58 
59     void        FillRectangle( int nOp, Picture aDst, const XRenderColor*,
60                                int nX, int nY, unsigned nW, unsigned nH ) const;
61     void        CompositeTrapezoids( int nOp, Picture aSrc, Picture aDst,
62                     const XRenderPictFormat*, int nXSrc, int nYSrc,
63                     const XTrapezoid*, int nCount ) const;
64     void        CompositeTriangles( int nOp, Picture aSrc, Picture aDst,
65                     const XRenderPictFormat*, int nXSrc, int nYSrc,
66                     const XTriangle*, int nCount ) const;
67 };
68 
GetStandardFormatA8() const69 inline XRenderPictFormat* XRenderPeer::GetStandardFormatA8() const
70 {
71     return mpStandardFormatA8;
72 }
73 
FindStandardFormat(int nFormat) const74 inline XRenderPictFormat* XRenderPeer::FindStandardFormat(int nFormat) const
75 {
76     return XRenderFindStandardFormat(mpDisplay, nFormat);
77 }
78 
FindVisualFormat(Visual const * pVisual) const79 inline XRenderPictFormat* XRenderPeer::FindVisualFormat( Visual const * pVisual ) const
80 {
81     return XRenderFindVisualFormat ( mpDisplay, pVisual );
82 }
83 
CreatePicture(Drawable aDrawable,const XRenderPictFormat * pVisFormat,unsigned long nValueMask,const XRenderPictureAttributes * pRenderAttr) const84 inline Picture XRenderPeer::CreatePicture( Drawable aDrawable,
85     const XRenderPictFormat* pVisFormat, unsigned long nValueMask,
86     const XRenderPictureAttributes* pRenderAttr ) const
87 {
88     return XRenderCreatePicture( mpDisplay, aDrawable, pVisFormat,
89                                  nValueMask, pRenderAttr );
90 }
91 
ChangePicture(Picture aPicture,unsigned long nValueMask,const XRenderPictureAttributes * pRenderAttr) const92 inline void XRenderPeer::ChangePicture( Picture aPicture,
93     unsigned long nValueMask, const XRenderPictureAttributes* pRenderAttr ) const
94 {
95     XRenderChangePicture( mpDisplay, aPicture, nValueMask, pRenderAttr );
96 }
97 
SetPictureClipRegion(Picture aPicture,Region aXlibRegion) const98 inline void XRenderPeer::SetPictureClipRegion( Picture aPicture,
99     Region aXlibRegion ) const
100 {
101     XRenderSetPictureClipRegion( mpDisplay, aPicture, aXlibRegion );
102 }
103 
CompositePicture(int nXRenderOp,Picture aSrcPic,Picture aMaskPic,Picture aDstPic,int nSrcX,int nSrcY,int nDstX,int nDstY,unsigned nWidth,unsigned nHeight) const104 inline void XRenderPeer::CompositePicture( int nXRenderOp,
105     Picture aSrcPic, Picture aMaskPic, Picture aDstPic,
106     int nSrcX, int nSrcY, int nDstX, int nDstY,
107     unsigned nWidth, unsigned nHeight ) const
108 {
109     XRenderComposite( mpDisplay, nXRenderOp, aSrcPic, aMaskPic, aDstPic,
110                       nSrcX, nSrcY, 0/*nMaskX*/, 0/*nMaskY*/, nDstX, nDstY, nWidth, nHeight );
111 }
112 
FreePicture(Picture aPicture) const113 inline void XRenderPeer::FreePicture( Picture aPicture ) const
114 {
115     XRenderFreePicture( mpDisplay, aPicture );
116 }
117 
FillRectangle(int a,Picture b,const XRenderColor * c,int d,int e,unsigned int f,unsigned int g) const118 inline void XRenderPeer::FillRectangle( int a, Picture b, const XRenderColor* c,
119     int d, int e, unsigned int f, unsigned int g) const
120 {
121     XRenderFillRectangle( mpDisplay, a, b, c, d, e, f, g );
122 }
123 
CompositeTrapezoids(int nOp,Picture aSrc,Picture aDst,const XRenderPictFormat * pXRPF,int nXSrc,int nYSrc,const XTrapezoid * pXT,int nCount) const124 inline void XRenderPeer::CompositeTrapezoids( int nOp,
125     Picture aSrc, Picture aDst, const XRenderPictFormat* pXRPF,
126     int nXSrc, int nYSrc, const XTrapezoid* pXT, int nCount ) const
127 {
128     XRenderCompositeTrapezoids( mpDisplay, nOp, aSrc, aDst, pXRPF,
129         nXSrc, nYSrc, pXT, nCount );
130 }
131 
CompositeTriangles(int nOp,Picture aSrc,Picture aDst,const XRenderPictFormat * pXRPF,int nXSrc,int nYSrc,const XTriangle * pXT,int nCount) const132 inline void XRenderPeer::CompositeTriangles( int nOp,
133     Picture aSrc, Picture aDst, const XRenderPictFormat* pXRPF,
134     int nXSrc, int nYSrc, const XTriangle* pXT, int nCount ) const
135 {
136     XRenderCompositeTriangles( mpDisplay, nOp, aSrc, aDst, pXRPF,
137         nXSrc, nYSrc, pXT, nCount );
138 }
139 
GetXRenderColor(Color rColor,double fTransparency)140 inline XRenderColor GetXRenderColor( Color rColor, double fTransparency )
141 {
142     XRenderColor aRetVal;
143     // convert the Color
144     aRetVal.red   = rColor.GetRed(); aRetVal.red   |= (aRetVal.red   << 8);
145     aRetVal.green = rColor.GetGreen(); aRetVal.green |= (aRetVal.green << 8);
146     aRetVal.blue  = rColor.GetBlue(); aRetVal.blue  |= (aRetVal.blue  << 8);
147 
148     // handle transparency
149     aRetVal.alpha = 0xFFFF; // default to opaque
150     if( fTransparency != 0 )
151     {
152         const double fAlpha = 1.0 - fTransparency;
153         aRetVal.alpha = static_cast<sal_uInt16>(fAlpha * 0xFFFF + 0.5);
154         // xrender wants pre-multiplied colors
155         aRetVal.red   = static_cast<sal_uInt16>(fAlpha * aRetVal.red + 0.5);
156         aRetVal.green = static_cast<sal_uInt16>(fAlpha * aRetVal.green + 0.5);
157         aRetVal.blue  = static_cast<sal_uInt16>(fAlpha * aRetVal.blue + 0.5);
158     }
159 
160     return aRetVal;
161 }
162 
163 #endif // INCLUDED_VCL_UNX_X11_XRENDER_PEER_HXX
164 
165 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
166