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> 30*a7185797SArmin 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 { 44*a7185797SArmin 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; 52ddde725dSArmin Le Grand 53ddde725dSArmin Le Grand if(rSeq.hasElements() && nDiscreteWidth && nDiscreteHeight) 54ddde725dSArmin Le Grand { 55ddde725dSArmin Le Grand // get destination size in pixels 56ddde725dSArmin Le Grand const MapMode aMapModePixel(MAP_PIXEL); 57ddde725dSArmin Le Grand const sal_uInt32 nViewVisibleArea(nDiscreteWidth * nDiscreteHeight); 58ddde725dSArmin Le Grand double fReduceFactor(1.0); 59ddde725dSArmin Le Grand drawinglayer::primitive2d::Primitive2DSequence aSequence(rSeq); 60ddde725dSArmin Le Grand 61ddde725dSArmin Le Grand if(nViewVisibleArea > nMaxQuadratPixels) 62ddde725dSArmin Le Grand { 63ddde725dSArmin Le Grand // reduce render size 64ddde725dSArmin Le Grand fReduceFactor = sqrt((double)nMaxQuadratPixels / (double)nViewVisibleArea); 65ddde725dSArmin Le Grand nDiscreteWidth = basegfx::fround((double)nDiscreteWidth * fReduceFactor); 66ddde725dSArmin Le Grand nDiscreteHeight = basegfx::fround((double)nDiscreteHeight * fReduceFactor); 67ddde725dSArmin Le Grand 68ddde725dSArmin Le Grand const drawinglayer::primitive2d::Primitive2DReference aEmbed( 69ddde725dSArmin Le Grand new drawinglayer::primitive2d::TransformPrimitive2D( 70ddde725dSArmin Le Grand basegfx::tools::createScaleB2DHomMatrix(fReduceFactor, fReduceFactor), 71ddde725dSArmin Le Grand rSeq)); 72ddde725dSArmin Le Grand 73ddde725dSArmin Le Grand aSequence = drawinglayer::primitive2d::Primitive2DSequence(&aEmbed, 1); 74ddde725dSArmin Le Grand } 75ddde725dSArmin Le Grand 76ddde725dSArmin Le Grand const Point aEmptyPoint; 77ddde725dSArmin Le Grand const Size aSizePixel(nDiscreteWidth, nDiscreteHeight); 78ddde725dSArmin Le Grand geometry::ViewInformation2D aViewInformation2D(rViewInformation2D); 79ddde725dSArmin Le Grand VirtualDevice maContent; 80ddde725dSArmin Le Grand 81ddde725dSArmin Le Grand // prepare vdev 82ddde725dSArmin Le Grand maContent.SetOutputSizePixel(aSizePixel, false); 83ddde725dSArmin Le Grand maContent.SetMapMode(aMapModePixel); 84ddde725dSArmin Le Grand maContent.SetAntialiasing(true); 85ddde725dSArmin Le Grand 86ddde725dSArmin Le Grand // set to all white 87ddde725dSArmin Le Grand maContent.SetBackground(Wallpaper(Color(COL_WHITE))); 88ddde725dSArmin Le Grand maContent.Erase(); 89ddde725dSArmin Le Grand 90*a7185797SArmin Le Grand // create pixel processor 91*a7185797SArmin Le Grand processor2d::BaseProcessor2D* pContentProcessor = processor2d::createPixelProcessor2DFromOutputDevice( 92*a7185797SArmin Le Grand maContent, 93*a7185797SArmin Le Grand aViewInformation2D); 94ddde725dSArmin Le Grand 95*a7185797SArmin Le Grand if(pContentProcessor) 96*a7185797SArmin Le Grand { 97*a7185797SArmin Le Grand // render content 98*a7185797SArmin Le Grand pContentProcessor->process(aSequence); 99*a7185797SArmin Le Grand 100*a7185797SArmin Le Grand // get content 101*a7185797SArmin Le Grand maContent.EnableMapMode(false); 102*a7185797SArmin Le Grand const Bitmap aContent(maContent.GetBitmap(aEmptyPoint, aSizePixel)); 103*a7185797SArmin Le Grand 104*a7185797SArmin Le Grand // prepare for mask creation 105*a7185797SArmin Le Grand maContent.SetMapMode(aMapModePixel); 106*a7185797SArmin Le Grand maContent.SetAntialiasing(true); 107*a7185797SArmin Le Grand 108*a7185797SArmin Le Grand // set alpha to all white (fully transparent) 109*a7185797SArmin Le Grand maContent.Erase(); 110*a7185797SArmin Le Grand 111*a7185797SArmin Le Grand // embed primitives to paint them black 112*a7185797SArmin Le Grand const primitive2d::Primitive2DReference xRef( 113*a7185797SArmin Le Grand new primitive2d::ModifiedColorPrimitive2D( 114*a7185797SArmin Le Grand aSequence, 115*a7185797SArmin Le Grand basegfx::BColorModifier( 116*a7185797SArmin Le Grand basegfx::BColor(0.0, 0.0, 0.0), 117*a7185797SArmin Le Grand 0.5, 118*a7185797SArmin Le Grand basegfx::BCOLORMODIFYMODE_REPLACE))); 119*a7185797SArmin Le Grand const primitive2d::Primitive2DSequence xSeq(&xRef, 1); 120*a7185797SArmin Le Grand 121*a7185797SArmin Le Grand // render 122*a7185797SArmin Le Grand pContentProcessor->process(xSeq); 123*a7185797SArmin Le Grand delete pContentProcessor; 124*a7185797SArmin Le Grand 125*a7185797SArmin Le Grand // get alpha cahannel from vdev 126*a7185797SArmin Le Grand maContent.EnableMapMode(false); 127*a7185797SArmin Le Grand const AlphaMask aAlphaMask(maContent.GetBitmap(aEmptyPoint, aSizePixel)); 128*a7185797SArmin Le Grand 129*a7185797SArmin Le Grand // create BitmapEx result 130*a7185797SArmin Le Grand aRetval = BitmapEx(aContent, aAlphaMask); 131*a7185797SArmin Le Grand } 132ddde725dSArmin Le Grand } 133ddde725dSArmin Le Grand 134ddde725dSArmin Le Grand #ifdef DBG_UTIL 135ddde725dSArmin Le Grand static bool bDoSaveForVisualControl(false); 136ddde725dSArmin Le Grand if(bDoSaveForVisualControl) 137ddde725dSArmin Le Grand { 138ddde725dSArmin Le Grand SvFileStream aNew((const String&)String(ByteString( "c:\\test.png" ), RTL_TEXTENCODING_UTF8), STREAM_WRITE|STREAM_TRUNC); 13945fd3b9aSArmin Le Grand ::vcl::PNGWriter aPNGWriter(aRetval); 14045fd3b9aSArmin Le Grand aPNGWriter.Write(aNew); 141ddde725dSArmin Le Grand } 142ddde725dSArmin Le Grand #endif 143ddde725dSArmin Le Grand 144ddde725dSArmin Le Grand return aRetval; 145ddde725dSArmin Le Grand } 146ddde725dSArmin Le Grand 147ddde725dSArmin Le Grand } // end of namespace tools 148ddde725dSArmin Le Grand } // end of namespace drawinglayer 149ddde725dSArmin Le Grand 150ddde725dSArmin Le Grand ////////////////////////////////////////////////////////////////////////////// 151ddde725dSArmin Le Grand // eof 152