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 #ifndef _SV_XRENDER_PEER_HXX 25 #define _SV_XRENDER_PEER_HXX 26 27 #include <tools/prex.h> 28 struct _XTrap; // on some older systems this is not declared within Xrender.h 29 #include <X11/extensions/Xrender.h> 30 #include <tools/postx.h> 31 32 #include <vcl/salgtype.hxx> 33 #include <osl/module.h> 34 35 typedef Glyph XRenderGlyph; 36 37 class XRenderPeer 38 { 39 public: 40 static XRenderPeer& GetInstance(); 41 int GetVersion() const; 42 43 sal_uInt32 InitRenderText(); 44 45 protected: 46 XRenderPeer(); 47 ~XRenderPeer(); 48 void InitRenderLib(); 49 50 Display* mpDisplay; 51 XRenderPictFormat* mpStandardFormatA8; 52 int mnRenderVersion; 53 oslModule mpRenderLib; 54 55 public: 56 XRenderPictFormat* GetStandardFormatA8() const; 57 XRenderPictFormat* FindStandardFormat(int nFormat) const; 58 59 // the methods below are thin wrappers for the XRENDER API 60 XRenderPictFormat* FindVisualFormat( Visual* ) const; 61 XRenderPictFormat* FindPictureFormat( unsigned long nMask, 62 const XRenderPictFormat& ) const; 63 Picture CreatePicture( Drawable, const XRenderPictFormat*, 64 unsigned long nDrawable, const XRenderPictureAttributes* ) const; 65 void ChangePicture( Picture, unsigned long nValueMask, 66 const XRenderPictureAttributes* ) const; 67 void SetPictureClipRegion( Picture, XLIB_Region ) const; 68 void CompositePicture( int nOp, Picture aSrc, Picture aMask, Picture aDst, 69 int nXSrc, int nYSrc, int nXMask, int nYMask, 70 int nXDst, int nYDst, unsigned nWidth, unsigned nHeight ) const; 71 void FreePicture( Picture ) const; 72 73 GlyphSet CreateGlyphSet() const; 74 void FreeGlyphSet( GlyphSet ) const; 75 void AddGlyph( GlyphSet, XRenderGlyph nXRGlyph, const XGlyphInfo&, 76 const char* pBuffer, int nBufSize ) const; 77 void FreeGlyph( GlyphSet, XRenderGlyph nXRGlyphId ) const; 78 void CompositeString32( Picture aSrc, Picture aDst, GlyphSet, 79 int nDstX, int nDstY, const unsigned* pText, int nTextLen ) const; 80 void FillRectangle( int nOp, Picture aDst, const XRenderColor*, 81 int nX, int nY, unsigned nW, unsigned nH ) const; 82 void CompositeTrapezoids( int nOp, Picture aSrc, Picture aDst, 83 const XRenderPictFormat*, int nXSrc, int nYSrc, 84 const XTrapezoid*, int nCount ) const; 85 bool AddTraps( Picture aDst, int nXOfs, int nYOfs, 86 const _XTrap*, int nCount ) const; 87 88 bool AreTrapezoidsSupported() const 89 #ifdef XRENDER_LINK 90 { return true; } 91 #else 92 { return mpXRenderCompositeTrapezoids!=NULL; } 93 94 private: 95 XRenderPictFormat* (*mpXRenderFindFormat)(Display*,unsigned long, 96 const XRenderPictFormat*,int); 97 XRenderPictFormat* (*mpXRenderFindVisualFormat)(Display*,Visual*); 98 XRenderPictFormat* (*mpXRenderFindStandardFormat)(Display*,int); 99 Bool (*mpXRenderQueryExtension)(Display*,int*,int*); 100 void (*mpXRenderQueryVersion)(Display*,int*,int*); 101 102 Picture (*mpXRenderCreatePicture)(Display*,Drawable, const XRenderPictFormat*, 103 unsigned long,const XRenderPictureAttributes*); 104 void (*mpXRenderChangePicture)(Display*,Picture, 105 unsigned long,const XRenderPictureAttributes*); 106 void (*mpXRenderSetPictureClipRegion)(Display*,Picture,XLIB_Region); 107 void (*mpXRenderFreePicture)(Display*,Picture); 108 void (*mpXRenderComposite)(Display*,int,Picture,Picture,Picture, 109 int,int,int,int,int,int,unsigned,unsigned); 110 111 GlyphSet (*mpXRenderCreateGlyphSet)(Display*, const XRenderPictFormat*); 112 void (*mpXRenderFreeGlyphSet)(Display*,GlyphSet); 113 void (*mpXRenderAddGlyphs)(Display*,GlyphSet,Glyph*, 114 const XGlyphInfo*,int,const char*,int); 115 void (*mpXRenderFreeGlyphs)(Display*,GlyphSet,Glyph*,int); 116 void (*mpXRenderCompositeString32)(Display*,int,Picture,Picture, 117 const XRenderPictFormat*,GlyphSet,int,int,int,int,const unsigned*,int); 118 void (*mpXRenderFillRectangle)(Display*,int,Picture, 119 const XRenderColor*,int,int,unsigned int,unsigned int); 120 void (*mpXRenderCompositeTrapezoids)(Display*,int,Picture,Picture, 121 const XRenderPictFormat*,int,int,const XTrapezoid*,int); 122 void (*mpXRenderAddTraps)(Display*,Picture,int,int,const _XTrap*,int); 123 #endif // XRENDER_LINK 124 }; 125 126 //===================================================================== 127 128 class ScopedPic 129 { 130 public: 131 ScopedPic( XRenderPeer& rPeer, Picture& rPic ); 132 ~ScopedPic(); 133 Picture& Get(); 134 135 private: 136 XRenderPeer& mrRenderPeer; 137 Picture maPicture; 138 139 private: // prevent copy and assignmet 140 ScopedPic( const ScopedPic& ); 141 void operator=( const ScopedPic& ); 142 }; 143 144 //===================================================================== 145 146 inline int XRenderPeer::GetVersion() const 147 { 148 return mnRenderVersion; 149 } 150 151 inline XRenderPictFormat* XRenderPeer::GetStandardFormatA8() const 152 { 153 return mpStandardFormatA8; 154 } 155 156 inline XRenderPictFormat* XRenderPeer::FindStandardFormat(int nFormat) const 157 { 158 #ifdef XRENDER_LINK 159 return XRenderFindStandardFormat(mpDisplay, nFormat); 160 #else 161 return (*mpXRenderFindStandardFormat)(mpDisplay, nFormat); 162 #endif 163 } 164 165 inline XRenderPictFormat* XRenderPeer::FindVisualFormat( Visual* pVisual ) const 166 { 167 #ifdef XRENDER_LINK 168 return XRenderFindVisualFormat ( mpDisplay, pVisual ); 169 #else 170 return (*mpXRenderFindVisualFormat)( mpDisplay, pVisual ); 171 #endif 172 } 173 174 inline XRenderPictFormat* XRenderPeer::FindPictureFormat( unsigned long nFormatMask, 175 const XRenderPictFormat& rFormatAttr ) const 176 { 177 #ifdef XRENDER_LINK 178 return XRenderFindFormat( mpDisplay, nFormatMask, &rFormatAttr, 0 ); 179 #else 180 return (*mpXRenderFindFormat)( mpDisplay, nFormatMask, &rFormatAttr, 0 ); 181 #endif 182 } 183 184 inline Picture XRenderPeer::CreatePicture( Drawable aDrawable, 185 const XRenderPictFormat* pVisFormat, unsigned long nValueMask, 186 const XRenderPictureAttributes* pRenderAttr ) const 187 { 188 #ifdef XRENDER_LINK 189 return XRenderCreatePicture( mpDisplay, aDrawable, pVisFormat, 190 nValueMask, pRenderAttr ); 191 #else 192 return (*mpXRenderCreatePicture)( mpDisplay, aDrawable, pVisFormat, 193 nValueMask, pRenderAttr ); 194 #endif 195 } 196 197 inline void XRenderPeer::ChangePicture( Picture aPicture, 198 unsigned long nValueMask, const XRenderPictureAttributes* pRenderAttr ) const 199 { 200 #ifdef XRENDER_LINK 201 XRenderChangePicture( mpDisplay, aPicture, nValueMask, pRenderAttr ); 202 #else 203 (*mpXRenderChangePicture)( mpDisplay, aPicture, nValueMask, pRenderAttr ); 204 #endif 205 } 206 207 inline void XRenderPeer::SetPictureClipRegion( Picture aPicture, 208 XLIB_Region aXlibRegion ) const 209 { 210 #ifdef XRENDER_LINK 211 XRenderSetPictureClipRegion( mpDisplay, aPicture, aXlibRegion ); 212 #else 213 (*mpXRenderSetPictureClipRegion)( mpDisplay, aPicture, aXlibRegion ); 214 #endif 215 } 216 217 inline void XRenderPeer::CompositePicture( int nXRenderOp, 218 Picture aSrcPic, Picture aMaskPic, Picture aDstPic, 219 int nSrcX, int nSrcY, int nMaskX, int nMaskY, int nDstX, int nDstY, 220 unsigned nWidth, unsigned nHeight ) const 221 { 222 #ifdef XRENDER_LINK 223 XRenderComposite( mpDisplay, nXRenderOp, aSrcPic, aMaskPic, aDstPic, 224 nSrcX, nSrcY, nMaskX, nMaskY, nDstX, nDstY, nWidth, nHeight ); 225 #else 226 (*mpXRenderComposite)( mpDisplay, nXRenderOp, aSrcPic, aMaskPic, aDstPic, 227 nSrcX, nSrcY, nMaskX, nMaskY, nDstX, nDstY, nWidth, nHeight ); 228 #endif 229 } 230 231 inline void XRenderPeer::FreePicture( Picture aPicture ) const 232 { 233 #ifdef XRENDER_LINK 234 XRenderFreePicture( mpDisplay, aPicture ); 235 #else 236 (*mpXRenderFreePicture)( mpDisplay, aPicture ); 237 #endif 238 } 239 240 inline GlyphSet XRenderPeer::CreateGlyphSet() const 241 { 242 #ifdef XRENDER_LINK 243 return XRenderCreateGlyphSet( mpDisplay, mpStandardFormatA8 ); 244 #else 245 return (*mpXRenderCreateGlyphSet)( mpDisplay, mpStandardFormatA8 ); 246 #endif 247 } 248 249 inline void XRenderPeer::FreeGlyphSet( GlyphSet aGS ) const 250 { 251 #ifdef XRENDER_LINK 252 XRenderFreeGlyphSet( mpDisplay, aGS ); 253 #else 254 (*mpXRenderFreeGlyphSet)( mpDisplay, aGS ); 255 #endif 256 } 257 258 inline void XRenderPeer::AddGlyph( GlyphSet aGS, XRenderGlyph nXRGlyph, 259 const XGlyphInfo& rGI, const char* pBuffer, int nBufSize ) const 260 { 261 #ifdef XRENDER_LINK 262 XRenderAddGlyphs( mpDisplay, aGS, &nXRGlyph, &rGI, 1, 263 const_cast<char*>(pBuffer), nBufSize ); 264 #else 265 (*mpXRenderAddGlyphs)( mpDisplay, aGS, &nXRGlyph, &rGI, 1, 266 const_cast<char*>(pBuffer), nBufSize ); 267 #endif 268 } 269 270 inline void XRenderPeer::FreeGlyph( GlyphSet aGS, XRenderGlyph nXRGlyph ) const 271 { 272 (void)aGS; (void)nXRGlyph; 273 274 // XRenderFreeGlyphs not implemented yet for version<=0.2 275 // #108209# disabled because of crash potential, 276 // the glyph leak is not too bad because they will 277 // be cleaned up when the glyphset is released 278 #if 0 // TODO: reenable when it works without problems 279 if( mnRenderVersion >= 0x05 ) 280 { 281 #ifdef XRENDER_LINK 282 XRenderFreeGlyphs( mpDisplay, aGS, &nXRGlyph, 1 ); 283 #else 284 (*mpXRenderFreeGlyphs)( mpDisplay, aGS, &nXRGlyph, 1 ); 285 #endif 286 } 287 #endif 288 } 289 290 inline void XRenderPeer::CompositeString32( Picture aSrc, Picture aDst, 291 GlyphSet aGlyphSet, int nDstX, int nDstY, 292 const unsigned* pText, int nTextLen ) const 293 { 294 #ifdef XRENDER_LINK 295 XRenderCompositeString32( mpDisplay, PictOpOver, aSrc, aDst, NULL, 296 aGlyphSet, 0, 0, nDstX, nDstY, pText, nTextLen ); 297 #else 298 (*mpXRenderCompositeString32)( mpDisplay, PictOpOver, aSrc, aDst, NULL, 299 aGlyphSet, 0, 0, nDstX, nDstY, pText, nTextLen ); 300 #endif 301 } 302 303 inline void XRenderPeer::FillRectangle( int a, Picture b, const XRenderColor* c, 304 int d, int e, unsigned int f, unsigned int g) const 305 { 306 #ifdef XRENDER_LINK 307 XRenderFillRectangle( mpDisplay, a, b, c, d, e, f, g ); 308 #else 309 (*mpXRenderFillRectangle)( mpDisplay, a, b, c, d, e, f, g ); 310 #endif 311 } 312 313 314 inline void XRenderPeer::CompositeTrapezoids( int nOp, 315 Picture aSrc, Picture aDst, const XRenderPictFormat* pXRPF, 316 int nXSrc, int nYSrc, const XTrapezoid* pXT, int nCount ) const 317 { 318 #ifdef XRENDER_LINK 319 XRenderCompositeTrapezoids( mpDisplay, nOp, aSrc, aDst, pXRPF, 320 nXSrc, nYSrc, pXT, nCount ); 321 #else 322 (*mpXRenderCompositeTrapezoids)( mpDisplay, nOp, aSrc, aDst, pXRPF, 323 nXSrc, nYSrc, pXT, nCount ); 324 #endif 325 } 326 327 inline bool XRenderPeer::AddTraps( Picture aDst, int nXOfs, int nYOfs, 328 const _XTrap* pTraps, int nCount ) const 329 { 330 #ifdef XRENDER_LINK 331 XRenderAddTraps( mpDisplay, aDst, nXOfs, nYOfs, pTraps, nCount ); 332 #else 333 if( !mpXRenderAddTraps ) 334 return false; 335 (*mpXRenderAddTraps)( mpDisplay, aDst, nXOfs, nYOfs, pTraps, nCount ); 336 #endif 337 return true; 338 } 339 340 //===================================================================== 341 342 inline ScopedPic::ScopedPic( XRenderPeer& rPeer, Picture& rPic ) 343 : mrRenderPeer( rPeer) 344 , maPicture( rPic ) 345 {} 346 347 inline ScopedPic::~ScopedPic() 348 { 349 if( maPicture ) 350 mrRenderPeer.FreePicture( maPicture ); 351 } 352 353 inline Picture& ScopedPic::Get() 354 { 355 return maPicture; 356 } 357 358 //===================================================================== 359 360 inline XRenderColor GetXRenderColor( const SalColor& rSalColor, double fTransparency = 0.0 ) 361 { 362 XRenderColor aRetVal; 363 // convert the SalColor 364 aRetVal.red = SALCOLOR_RED( rSalColor ); aRetVal.red |= (aRetVal.red << 8); 365 aRetVal.green = SALCOLOR_GREEN( rSalColor ); aRetVal.green |= (aRetVal.green << 8); 366 aRetVal.blue = SALCOLOR_BLUE( rSalColor ); aRetVal.blue |= (aRetVal.blue << 8); 367 368 // handle transparency 369 aRetVal.alpha = 0xFFFF; // default to opaque 370 if( fTransparency != 0 ) 371 { 372 const double fAlpha = 1.0 - fTransparency; 373 aRetVal.alpha = static_cast<sal_uInt16>(fAlpha * 0xFFFF + 0.5); 374 // xrender wants pre-multiplied colors 375 aRetVal.red = static_cast<sal_uInt16>(fAlpha * aRetVal.red + 0.5); 376 aRetVal.green = static_cast<sal_uInt16>(fAlpha * aRetVal.green + 0.5); 377 aRetVal.blue = static_cast<sal_uInt16>(fAlpha * aRetVal.blue + 0.5); 378 } 379 380 return aRetVal; 381 } 382 383 //===================================================================== 384 385 #endif // _SV_XRENDER_PEER_HXX 386