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 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_drawinglayer.hxx" 26 27 #include <vclhelperbufferdevice.hxx> 28 #include <basegfx/range/b2drange.hxx> 29 #include <vcl/bitmapex.hxx> 30 #include <basegfx/matrix/b2dhommatrix.hxx> 31 #include <tools/stream.hxx> 32 33 ////////////////////////////////////////////////////////////////////////////// 34 // support for rendering Bitmap and BitmapEx contents 35 36 namespace drawinglayer 37 { 38 impBufferDevice::impBufferDevice( 39 OutputDevice& rOutDev, 40 const basegfx::B2DRange& rRange, 41 bool bAddOffsetToMapping) 42 : mrOutDev(rOutDev), 43 maContent(rOutDev), 44 mpMask(0L), 45 mpAlpha(0L) 46 { 47 basegfx::B2DRange aRangePixel(rRange); 48 aRangePixel.transform(rOutDev.GetViewTransformation()); 49 const Rectangle aRectPixel( 50 (sal_Int32)floor(aRangePixel.getMinX()), (sal_Int32)floor(aRangePixel.getMinY()), 51 (sal_Int32)ceil(aRangePixel.getMaxX()), (sal_Int32)ceil(aRangePixel.getMaxY())); 52 const Point aEmptyPoint; 53 maDestPixel = Rectangle(aEmptyPoint, rOutDev.GetOutputSizePixel()); 54 maDestPixel.Intersection(aRectPixel); 55 56 if(isVisible()) 57 { 58 maContent.SetOutputSizePixel(maDestPixel.GetSize(), false); 59 60 // #i93485# assert when copying from window to VDev is used 61 OSL_ENSURE(rOutDev.GetOutDevType() != OUTDEV_WINDOW, 62 "impBufferDevice render helper: Copying from Window to VDev, this should be avoided (!)"); 63 64 const bool bWasEnabledSrc(rOutDev.IsMapModeEnabled()); 65 rOutDev.EnableMapMode(false); 66 maContent.DrawOutDev(aEmptyPoint, maDestPixel.GetSize(), maDestPixel.TopLeft(), maDestPixel.GetSize(), rOutDev); 67 rOutDev.EnableMapMode(bWasEnabledSrc); 68 69 MapMode aNewMapMode(rOutDev.GetMapMode()); 70 71 if(bAddOffsetToMapping) 72 { 73 const Point aLogicTopLeft(rOutDev.PixelToLogic(maDestPixel.TopLeft())); 74 aNewMapMode.SetOrigin(Point(-aLogicTopLeft.X(), -aLogicTopLeft.Y())); 75 } 76 77 maContent.SetMapMode(aNewMapMode); 78 79 // copy AA flag for new target 80 maContent.SetAntialiasing(mrOutDev.GetAntialiasing()); 81 } 82 } 83 84 impBufferDevice::~impBufferDevice() 85 { 86 delete mpMask; 87 delete mpAlpha; 88 } 89 90 void impBufferDevice::paint(double fTrans) 91 { 92 const Point aEmptyPoint; 93 const Size aSizePixel(maContent.GetOutputSizePixel()); 94 const bool bWasEnabledDst(mrOutDev.IsMapModeEnabled()); 95 static bool bDoSaveForVisualControl(false); 96 97 mrOutDev.EnableMapMode(false); 98 maContent.EnableMapMode(false); 99 Bitmap aContent(maContent.GetBitmap(aEmptyPoint, aSizePixel)); 100 101 if(bDoSaveForVisualControl) 102 { 103 SvFileStream aNew((const String&)String(ByteString( "c:\\content.bmp" ), RTL_TEXTENCODING_UTF8), STREAM_WRITE|STREAM_TRUNC); 104 aNew << aContent; 105 } 106 107 if(mpAlpha) 108 { 109 mpAlpha->EnableMapMode(false); 110 const AlphaMask aAlphaMask(mpAlpha->GetBitmap(aEmptyPoint, aSizePixel)); 111 112 if(bDoSaveForVisualControl) 113 { 114 SvFileStream aNew((const String&)String(ByteString( "c:\\transparence.bmp" ), RTL_TEXTENCODING_UTF8), STREAM_WRITE|STREAM_TRUNC); 115 aNew << aAlphaMask.GetBitmap(); 116 } 117 118 mrOutDev.DrawBitmapEx(maDestPixel.TopLeft(), BitmapEx(aContent, aAlphaMask)); 119 } 120 else if(mpMask) 121 { 122 mpMask->EnableMapMode(false); 123 const Bitmap aMask(mpMask->GetBitmap(aEmptyPoint, aSizePixel)); 124 125 if(bDoSaveForVisualControl) 126 { 127 SvFileStream aNew((const String&)String(ByteString( "c:\\mask.bmp" ), RTL_TEXTENCODING_UTF8), STREAM_WRITE|STREAM_TRUNC); 128 aNew << aMask; 129 } 130 131 mrOutDev.DrawBitmapEx(maDestPixel.TopLeft(), BitmapEx(aContent, aMask)); 132 } 133 else if(0.0 != fTrans) 134 { 135 sal_uInt8 nMaskValue((sal_uInt8)basegfx::fround(fTrans * 255.0)); 136 const AlphaMask aAlphaMask(aSizePixel, &nMaskValue); 137 mrOutDev.DrawBitmapEx(maDestPixel.TopLeft(), BitmapEx(aContent, aAlphaMask)); 138 } 139 else 140 { 141 mrOutDev.DrawBitmap(maDestPixel.TopLeft(), aContent); 142 } 143 144 mrOutDev.EnableMapMode(bWasEnabledDst); 145 } 146 147 VirtualDevice& impBufferDevice::getMask() 148 { 149 if(!mpMask) 150 { 151 mpMask = new VirtualDevice(mrOutDev, 1); 152 mpMask->SetOutputSizePixel(maDestPixel.GetSize(), true); 153 mpMask->SetMapMode(maContent.GetMapMode()); 154 155 // do NOT copy AA flag for mask! 156 } 157 158 return *mpMask; 159 } 160 161 VirtualDevice& impBufferDevice::getTransparence() 162 { 163 if(!mpAlpha) 164 { 165 mpAlpha = new VirtualDevice(); 166 mpAlpha->SetOutputSizePixel(maDestPixel.GetSize(), true); 167 mpAlpha->SetMapMode(maContent.GetMapMode()); 168 169 // copy AA flag for new target; masking needs to be smooth 170 mpAlpha->SetAntialiasing(maContent.GetAntialiasing()); 171 } 172 173 return *mpAlpha; 174 } 175 } // end of namespace drawinglayer 176 177 ////////////////////////////////////////////////////////////////////////////// 178 // eof 179