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_INC_UNX_SALBMP_H 21 #define INCLUDED_VCL_INC_UNX_SALBMP_H 22 23 #include <X11/Xlib.h> 24 25 #include <vcl/salgtype.hxx> 26 #include <unx/saldisp.hxx> 27 #include <salbmp.hxx> 28 #include <vclpluginapi.h> 29 30 struct BitmapBuffer; 31 class BitmapPalette; 32 class SalGraphics; 33 class ImplSalDDB; 34 class ImplSalBitmapCache; 35 36 37 class VCLPLUG_GEN_PUBLIC X11SalBitmap final : public SalBitmap 38 { 39 private: 40 41 static std::unique_ptr<BitmapBuffer> 42 ImplCreateDIB( 43 const Size& rSize, 44 sal_uInt16 nBitCount, 45 const BitmapPalette& rPal 46 ); 47 48 static std::unique_ptr<BitmapBuffer> 49 ImplCreateDIB( 50 Drawable aDrawable, 51 SalX11Screen nXScreen, 52 long nDrawableDepth, 53 long nX, 54 long nY, 55 long nWidth, 56 long nHeight, 57 bool bGrey 58 ); 59 60 public: 61 62 static ImplSalBitmapCache* mpCache; 63 static unsigned int mnCacheInstCount; 64 65 static void ImplCreateCache(); 66 static void ImplDestroyCache(); 67 void ImplRemovedFromCache(); 68 69 private: 70 71 std::unique_ptr<BitmapBuffer> mpDIB; 72 mutable std::unique_ptr<ImplSalDDB> mpDDB; 73 bool mbGrey; 74 75 public: 76 77 SAL_DLLPRIVATE bool ImplCreateFromDrawable( 78 Drawable aDrawable, 79 SalX11Screen nXScreen, 80 long nDrawableDepth, 81 long nX, 82 long nY, 83 long nWidth, 84 long nHeight 85 ); 86 87 SAL_DLLPRIVATE XImage* ImplCreateXImage( 88 SalDisplay const * pSalDisp, 89 SalX11Screen nXScreen, 90 long nDepth, 91 const SalTwoRect& rTwoRect 92 ) const; 93 94 SAL_DLLPRIVATE ImplSalDDB* ImplGetDDB( 95 Drawable, 96 SalX11Screen nXScreen, 97 long nDrawableDepth, 98 const SalTwoRect& 99 ) const; 100 101 void ImplDraw( 102 Drawable aDrawable, 103 SalX11Screen nXScreen, 104 long nDrawableDepth, 105 const SalTwoRect& rTwoRect, 106 const GC& rGC 107 ) const; 108 109 public: 110 111 X11SalBitmap(); 112 virtual ~X11SalBitmap() override; 113 114 // override pure virtual methods 115 virtual bool Create( 116 const Size& rSize, 117 sal_uInt16 nBitCount, 118 const BitmapPalette& rPal 119 ) override; 120 121 virtual bool Create( const SalBitmap& rSalBmp ) override; 122 virtual bool Create( 123 const SalBitmap& rSalBmp, 124 SalGraphics* pGraphics 125 ) override; 126 127 virtual bool Create( 128 const SalBitmap& rSalBmp, 129 sal_uInt16 nNewBitCount 130 ) override; 131 132 virtual bool Create( 133 const css::uno::Reference< css::rendering::XBitmapCanvas >& rBitmapCanvas, 134 Size& rSize, 135 bool bMask = false 136 ) override; 137 138 virtual void Destroy() override; 139 140 virtual Size GetSize() const override; 141 virtual sal_uInt16 GetBitCount() const override; 142 143 virtual BitmapBuffer* AcquireBuffer( BitmapAccessMode nMode ) override; 144 virtual void ReleaseBuffer( BitmapBuffer* pBuffer, BitmapAccessMode nMode ) override; 145 virtual bool GetSystemData( BitmapSystemData& rData ) override; 146 147 virtual bool ScalingSupported() const override; 148 virtual bool Scale( const double& rScaleX, const double& rScaleY, BmpScaleFlag nScaleFlag ) override; 149 virtual bool Replace( const Color& rSearchColor, const Color& rReplaceColor, sal_uInt8 nTol ) override; 150 }; 151 152 153 class ImplSalDDB 154 { 155 private: 156 157 Pixmap maPixmap; 158 SalTwoRect maTwoRect; 159 long const mnDepth; 160 SalX11Screen const mnXScreen; 161 162 static void ImplDraw( 163 Drawable aSrcDrawable, 164 long nSrcDrawableDepth, 165 Drawable aDstDrawable, 166 long nSrcX, 167 long nSrcY, 168 long nDestWidth, 169 long nDestHeight, 170 long nDestX, 171 long nDestY, 172 const GC& rGC 173 ); 174 175 public: 176 177 ImplSalDDB( 178 XImage* pImage, 179 Drawable aDrawable, 180 SalX11Screen nXScreen, 181 const SalTwoRect& rTwoRect 182 ); 183 184 ImplSalDDB( 185 Drawable aDrawable, 186 SalX11Screen nXScreen, 187 long nDrawableDepth, 188 long nX, 189 long nY, 190 long nWidth, 191 long nHeight 192 ); 193 194 ~ImplSalDDB(); 195 ImplGetPixmap()196 Pixmap ImplGetPixmap() const { return maPixmap; } ImplGetWidth()197 long ImplGetWidth() const { return maTwoRect.mnDestWidth; } ImplGetHeight()198 long ImplGetHeight() const { return maTwoRect.mnDestHeight; } ImplGetDepth()199 long ImplGetDepth() const { return mnDepth; } ImplGetScreen()200 const SalX11Screen& ImplGetScreen() const { return mnXScreen; } 201 202 bool ImplMatches( SalX11Screen nXScreen, long nDepth, const SalTwoRect& rTwoRect ) const; 203 204 void ImplDraw( 205 Drawable aDrawable, 206 const SalTwoRect& rTwoRect, 207 const GC& rGC 208 ) const; 209 }; 210 211 212 class X11SalBitmap; 213 214 class ImplSalBitmapCache 215 { 216 private: 217 std::vector<X11SalBitmap*> maBmpList; 218 219 public: 220 221 ImplSalBitmapCache(); 222 ~ImplSalBitmapCache(); 223 224 void ImplAdd( X11SalBitmap* pBmp ); 225 void ImplRemove( X11SalBitmap const * pBmp ); 226 void ImplClear(); 227 }; 228 229 #endif // INCLUDED_VCL_INC_UNX_SALBMP_H 230 231 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ 232