1ddde725dSArmin Le Grand /************************************************************** 2ddde725dSArmin Le Grand * 3ddde725dSArmin Le Grand * Licensed to the Apache Software Foundation (ASF) under one 4ddde725dSArmin Le Grand * or more contributor license agreements. See the NOTICE file 5ddde725dSArmin Le Grand * distributed with this work for additional information 6ddde725dSArmin Le Grand * regarding copyright ownership. The ASF licenses this file 7ddde725dSArmin Le Grand * to you under the Apache License, Version 2.0 (the 8ddde725dSArmin Le Grand * "License"); you may not use this file except in compliance 9ddde725dSArmin Le Grand * with the License. You may obtain a copy of the License at 10ddde725dSArmin Le Grand * 112b45cf47SArmin Le Grand * http://www.apache.org/licenses/LICENSE-2.0 12ddde725dSArmin Le Grand * 13ddde725dSArmin Le Grand * Unless required by applicable law or agreed to in writing, 14ddde725dSArmin Le Grand * software distributed under the License is distributed on an 15ddde725dSArmin Le Grand * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16ddde725dSArmin Le Grand * KIND, either express or implied. See the License for the 17ddde725dSArmin Le Grand * specific language governing permissions and limitations 18ddde725dSArmin Le Grand * under the License. 19ddde725dSArmin Le Grand * 20ddde725dSArmin Le Grand *************************************************************/ 21ddde725dSArmin Le Grand 22ddde725dSArmin Le Grand // MARKER(update_precomp.py): autogen include statement, do not remove 23ddde725dSArmin Le Grand #include "precompiled_drawinglayer.hxx" 24ddde725dSArmin Le Grand 25ddde725dSArmin Le Grand #include <drawinglayer/tools/converters.hxx> 26ddde725dSArmin Le Grand #include <drawinglayer/geometry/viewinformation2d.hxx> 27ddde725dSArmin Le Grand #include <drawinglayer/primitive2d/modifiedcolorprimitive2d.hxx> 28ddde725dSArmin Le Grand #include <basegfx/matrix/b2dhommatrixtools.hxx> 29ddde725dSArmin Le Grand #include <drawinglayer/primitive2d/transformprimitive2d.hxx> 30a7185797SArmin Le Grand #include <drawinglayer/processor2d/processor2dtools.hxx> 31ddde725dSArmin Le Grand #include <vcl/virdev.hxx> 32ddde725dSArmin Le Grand 33ddde725dSArmin Le Grand #ifdef DBG_UTIL 34ddde725dSArmin Le Grand #include <tools/stream.hxx> 3545fd3b9aSArmin Le Grand #include <vcl/pngwrite.hxx> 36ddde725dSArmin Le Grand #endif 37ddde725dSArmin Le Grand 38ddde725dSArmin Le Grand ////////////////////////////////////////////////////////////////////////////// 39ddde725dSArmin Le Grand 40ddde725dSArmin Le Grand namespace drawinglayer 41ddde725dSArmin Le Grand { 42ddde725dSArmin Le Grand namespace tools 43ddde725dSArmin Le Grand { 44a7185797SArmin Le Grand BitmapEx convertToBitmapEx( 45ddde725dSArmin Le Grand const drawinglayer::primitive2d::Primitive2DSequence& rSeq, 46ddde725dSArmin Le Grand const geometry::ViewInformation2D& rViewInformation2D, 47ddde725dSArmin Le Grand sal_uInt32 nDiscreteWidth, 48ddde725dSArmin Le Grand sal_uInt32 nDiscreteHeight, 49ddde725dSArmin Le Grand sal_uInt32 nMaxQuadratPixels) 50ddde725dSArmin Le Grand { 51ddde725dSArmin Le Grand BitmapEx aRetval; 52*7eeb9ceeSArmin Le Grand #ifdef DBG_UTIL 53*7eeb9ceeSArmin Le Grand static bool bDoSaveForVisualControl(false); 54*7eeb9ceeSArmin Le Grand #endif 55ddde725dSArmin Le Grand 56ddde725dSArmin Le Grand if(rSeq.hasElements() && nDiscreteWidth && nDiscreteHeight) 57ddde725dSArmin Le Grand { 58ddde725dSArmin Le Grand // get destination size in pixels 59ddde725dSArmin Le Grand const MapMode aMapModePixel(MAP_PIXEL); 60ddde725dSArmin Le Grand const sal_uInt32 nViewVisibleArea(nDiscreteWidth * nDiscreteHeight); 61ddde725dSArmin Le Grand double fReduceFactor(1.0); 62ddde725dSArmin Le Grand drawinglayer::primitive2d::Primitive2DSequence aSequence(rSeq); 63ddde725dSArmin Le Grand 64ddde725dSArmin Le Grand if(nViewVisibleArea > nMaxQuadratPixels) 65ddde725dSArmin Le Grand { 66ddde725dSArmin Le Grand // reduce render size 67ddde725dSArmin Le Grand fReduceFactor = sqrt((double)nMaxQuadratPixels / (double)nViewVisibleArea); 68ddde725dSArmin Le Grand nDiscreteWidth = basegfx::fround((double)nDiscreteWidth * fReduceFactor); 69ddde725dSArmin Le Grand nDiscreteHeight = basegfx::fround((double)nDiscreteHeight * fReduceFactor); 70ddde725dSArmin Le Grand 71ddde725dSArmin Le Grand const drawinglayer::primitive2d::Primitive2DReference aEmbed( 72ddde725dSArmin Le Grand new drawinglayer::primitive2d::TransformPrimitive2D( 73ddde725dSArmin Le Grand basegfx::tools::createScaleB2DHomMatrix(fReduceFactor, fReduceFactor), 74ddde725dSArmin Le Grand rSeq)); 75ddde725dSArmin Le Grand 76ddde725dSArmin Le Grand aSequence = drawinglayer::primitive2d::Primitive2DSequence(&aEmbed, 1); 77ddde725dSArmin Le Grand } 78ddde725dSArmin Le Grand 79ddde725dSArmin Le Grand const Point aEmptyPoint; 80ddde725dSArmin Le Grand const Size aSizePixel(nDiscreteWidth, nDiscreteHeight); 81ddde725dSArmin Le Grand geometry::ViewInformation2D aViewInformation2D(rViewInformation2D); 82ddde725dSArmin Le Grand VirtualDevice maContent; 83ddde725dSArmin Le Grand 84ddde725dSArmin Le Grand // prepare vdev 85ddde725dSArmin Le Grand maContent.SetOutputSizePixel(aSizePixel, false); 86ddde725dSArmin Le Grand maContent.SetMapMode(aMapModePixel); 87ddde725dSArmin Le Grand 88ddde725dSArmin Le Grand // set to all white 89ddde725dSArmin Le Grand maContent.SetBackground(Wallpaper(Color(COL_WHITE))); 90ddde725dSArmin Le Grand maContent.Erase(); 91ddde725dSArmin Le Grand 92*7eeb9ceeSArmin Le Grand // create pixel processor, also already takes care of AAing and 93*7eeb9ceeSArmin Le Grand // checking the getOptionsDrawinglayer().IsAntiAliasing() switch. If 94*7eeb9ceeSArmin Le Grand // not wanted, change after this call as needed 95a7185797SArmin Le Grand processor2d::BaseProcessor2D* pContentProcessor = processor2d::createPixelProcessor2DFromOutputDevice( 96a7185797SArmin Le Grand maContent, 97a7185797SArmin Le Grand aViewInformation2D); 98ddde725dSArmin Le Grand 99a7185797SArmin Le Grand if(pContentProcessor) 100a7185797SArmin Le Grand { 101a7185797SArmin Le Grand // render content 102a7185797SArmin Le Grand pContentProcessor->process(aSequence); 103a7185797SArmin Le Grand 104a7185797SArmin Le Grand // get content 105a7185797SArmin Le Grand maContent.EnableMapMode(false); 106a7185797SArmin Le Grand const Bitmap aContent(maContent.GetBitmap(aEmptyPoint, aSizePixel)); 107a7185797SArmin Le Grand 108*7eeb9ceeSArmin Le Grand #ifdef DBG_UTIL 109*7eeb9ceeSArmin Le Grand if(bDoSaveForVisualControl) 110*7eeb9ceeSArmin Le Grand { 111*7eeb9ceeSArmin Le Grand SvFileStream aNew((const String&)String(ByteString( "c:\\test_content.png" ), RTL_TEXTENCODING_UTF8), STREAM_WRITE|STREAM_TRUNC); 112*7eeb9ceeSArmin Le Grand ::vcl::PNGWriter aPNGWriter(aContent); 113*7eeb9ceeSArmin Le Grand aPNGWriter.Write(aNew); 114*7eeb9ceeSArmin Le Grand } 115*7eeb9ceeSArmin Le Grand #endif 116a7185797SArmin Le Grand // prepare for mask creation 117a7185797SArmin Le Grand maContent.SetMapMode(aMapModePixel); 118a7185797SArmin Le Grand 119a7185797SArmin Le Grand // set alpha to all white (fully transparent) 120a7185797SArmin Le Grand maContent.Erase(); 121a7185797SArmin Le Grand 122a7185797SArmin Le Grand // embed primitives to paint them black 123*7eeb9ceeSArmin Le Grand static basegfx::BColorModifyMode aMode = basegfx::BCOLORMODIFYMODE_REPLACE; 124a7185797SArmin Le Grand const primitive2d::Primitive2DReference xRef( 125a7185797SArmin Le Grand new primitive2d::ModifiedColorPrimitive2D( 126a7185797SArmin Le Grand aSequence, 127a7185797SArmin Le Grand basegfx::BColorModifier( 128a7185797SArmin Le Grand basegfx::BColor(0.0, 0.0, 0.0), 129a7185797SArmin Le Grand 0.5, 130*7eeb9ceeSArmin Le Grand aMode))); 131a7185797SArmin Le Grand const primitive2d::Primitive2DSequence xSeq(&xRef, 1); 132a7185797SArmin Le Grand 133a7185797SArmin Le Grand // render 134a7185797SArmin Le Grand pContentProcessor->process(xSeq); 135a7185797SArmin Le Grand delete pContentProcessor; 136a7185797SArmin Le Grand 137a7185797SArmin Le Grand // get alpha cahannel from vdev 138a7185797SArmin Le Grand maContent.EnableMapMode(false); 139*7eeb9ceeSArmin Le Grand const Bitmap aAlpha(maContent.GetBitmap(aEmptyPoint, aSizePixel)); 140*7eeb9ceeSArmin Le Grand #ifdef DBG_UTIL 141*7eeb9ceeSArmin Le Grand if(bDoSaveForVisualControl) 142*7eeb9ceeSArmin Le Grand { 143*7eeb9ceeSArmin Le Grand SvFileStream aNew((const String&)String(ByteString( "c:\\test_alpha.png" ), RTL_TEXTENCODING_UTF8), STREAM_WRITE|STREAM_TRUNC); 144*7eeb9ceeSArmin Le Grand ::vcl::PNGWriter aPNGWriter(aAlpha); 145*7eeb9ceeSArmin Le Grand aPNGWriter.Write(aNew); 146*7eeb9ceeSArmin Le Grand } 147*7eeb9ceeSArmin Le Grand #endif 148a7185797SArmin Le Grand 149a7185797SArmin Le Grand // create BitmapEx result 150*7eeb9ceeSArmin Le Grand aRetval = BitmapEx(aContent, AlphaMask(aAlpha)); 151ddde725dSArmin Le Grand #ifdef DBG_UTIL 152*7eeb9ceeSArmin Le Grand if(bDoSaveForVisualControl) 153*7eeb9ceeSArmin Le Grand { 154*7eeb9ceeSArmin Le Grand SvFileStream aNew((const String&)String(ByteString( "c:\\test_combined.png" ), RTL_TEXTENCODING_UTF8), STREAM_WRITE|STREAM_TRUNC); 155*7eeb9ceeSArmin Le Grand ::vcl::PNGWriter aPNGWriter(aRetval); 156*7eeb9ceeSArmin Le Grand aPNGWriter.Write(aNew); 157*7eeb9ceeSArmin Le Grand } 158ddde725dSArmin Le Grand #endif 159*7eeb9ceeSArmin Le Grand } 160*7eeb9ceeSArmin Le Grand } 161ddde725dSArmin Le Grand 162ddde725dSArmin Le Grand return aRetval; 163ddde725dSArmin Le Grand } 164ddde725dSArmin Le Grand 165ddde725dSArmin Le Grand } // end of namespace tools 166ddde725dSArmin Le Grand } // end of namespace drawinglayer 167ddde725dSArmin Le Grand 168ddde725dSArmin Le Grand ////////////////////////////////////////////////////////////////////////////// 169ddde725dSArmin Le Grand // eof 170