xref: /aoo42x/main/canvas/source/vcl/devicehelper.cxx (revision 45fd3b9a)
125ea7f45SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
325ea7f45SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
425ea7f45SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
525ea7f45SAndrew Rist  * distributed with this work for additional information
625ea7f45SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
725ea7f45SAndrew Rist  * to you under the Apache License, Version 2.0 (the
825ea7f45SAndrew Rist  * "License"); you may not use this file except in compliance
925ea7f45SAndrew Rist  * with the License.  You may obtain a copy of the License at
1025ea7f45SAndrew Rist  *
1125ea7f45SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
1225ea7f45SAndrew Rist  *
1325ea7f45SAndrew Rist  * Unless required by applicable law or agreed to in writing,
1425ea7f45SAndrew Rist  * software distributed under the License is distributed on an
1525ea7f45SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1625ea7f45SAndrew Rist  * KIND, either express or implied.  See the License for the
1725ea7f45SAndrew Rist  * specific language governing permissions and limitations
1825ea7f45SAndrew Rist  * under the License.
1925ea7f45SAndrew Rist  *
2025ea7f45SAndrew Rist  *************************************************************/
2125ea7f45SAndrew Rist 
22cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
23cdf0e10cSrcweir #include "precompiled_canvas.hxx"
24cdf0e10cSrcweir 
25cdf0e10cSrcweir #include <canvas/debug.hxx>
26cdf0e10cSrcweir #include <tools/diagnose_ex.h>
27cdf0e10cSrcweir #include <canvas/canvastools.hxx>
28cdf0e10cSrcweir #include <rtl/instance.hxx>
29cdf0e10cSrcweir #include <toolkit/helper/vclunohelper.hxx>
30cdf0e10cSrcweir #include <vcl/canvastools.hxx>
31cdf0e10cSrcweir #include <basegfx/tools/canvastools.hxx>
32cdf0e10cSrcweir #include <basegfx/tools/unopolypolygon.hxx>
33*45fd3b9aSArmin Le Grand #include <vcl/dibtools.hxx>
34cdf0e10cSrcweir 
35cdf0e10cSrcweir #include "devicehelper.hxx"
36cdf0e10cSrcweir #include "spritecanvas.hxx"
37cdf0e10cSrcweir #include "spritecanvashelper.hxx"
38cdf0e10cSrcweir #include "canvasbitmap.hxx"
39cdf0e10cSrcweir 
40cdf0e10cSrcweir using namespace ::com::sun::star;
41cdf0e10cSrcweir 
42cdf0e10cSrcweir namespace vclcanvas
43cdf0e10cSrcweir {
DeviceHelper()44cdf0e10cSrcweir     DeviceHelper::DeviceHelper() :
45cdf0e10cSrcweir         mpOutDev()
46cdf0e10cSrcweir     {}
47cdf0e10cSrcweir 
init(const OutDevProviderSharedPtr & rOutDev)48cdf0e10cSrcweir     void DeviceHelper::init( const OutDevProviderSharedPtr& rOutDev )
49cdf0e10cSrcweir     {
50cdf0e10cSrcweir         mpOutDev = rOutDev;
51cdf0e10cSrcweir     }
52cdf0e10cSrcweir 
getPhysicalResolution()53cdf0e10cSrcweir     geometry::RealSize2D DeviceHelper::getPhysicalResolution()
54cdf0e10cSrcweir     {
55cdf0e10cSrcweir         if( !mpOutDev )
56cdf0e10cSrcweir             return ::canvas::tools::createInfiniteSize2D(); // we're disposed
57cdf0e10cSrcweir 
58cdf0e10cSrcweir         // Map a one-by-one millimeter box to pixel
59cdf0e10cSrcweir         OutputDevice& rOutDev = mpOutDev->getOutDev();
60cdf0e10cSrcweir         const MapMode aOldMapMode( rOutDev.GetMapMode() );
61cdf0e10cSrcweir         rOutDev.SetMapMode( MapMode(MAP_MM) );
62cdf0e10cSrcweir         const Size aPixelSize( rOutDev.LogicToPixel(Size(1,1)) );
63cdf0e10cSrcweir         rOutDev.SetMapMode( aOldMapMode );
64cdf0e10cSrcweir 
65cdf0e10cSrcweir         return ::vcl::unotools::size2DFromSize( aPixelSize );
66cdf0e10cSrcweir     }
67cdf0e10cSrcweir 
getPhysicalSize()68cdf0e10cSrcweir     geometry::RealSize2D DeviceHelper::getPhysicalSize()
69cdf0e10cSrcweir     {
70cdf0e10cSrcweir         if( !mpOutDev )
71cdf0e10cSrcweir             return ::canvas::tools::createInfiniteSize2D(); // we're disposed
72cdf0e10cSrcweir 
73cdf0e10cSrcweir         // Map the pixel dimensions of the output window to millimeter
74cdf0e10cSrcweir         OutputDevice& rOutDev = mpOutDev->getOutDev();
75cdf0e10cSrcweir         const MapMode aOldMapMode( rOutDev.GetMapMode() );
76cdf0e10cSrcweir         rOutDev.SetMapMode( MapMode(MAP_MM) );
77cdf0e10cSrcweir         const Size aLogSize( rOutDev.PixelToLogic(rOutDev.GetOutputSizePixel()) );
78cdf0e10cSrcweir         rOutDev.SetMapMode( aOldMapMode );
79cdf0e10cSrcweir 
80cdf0e10cSrcweir         return ::vcl::unotools::size2DFromSize( aLogSize );
81cdf0e10cSrcweir     }
82cdf0e10cSrcweir 
createCompatibleLinePolyPolygon(const uno::Reference<rendering::XGraphicDevice> &,const uno::Sequence<uno::Sequence<geometry::RealPoint2D>> & points)83cdf0e10cSrcweir     uno::Reference< rendering::XLinePolyPolygon2D > DeviceHelper::createCompatibleLinePolyPolygon(
84cdf0e10cSrcweir         const uno::Reference< rendering::XGraphicDevice >& 				,
85cdf0e10cSrcweir         const uno::Sequence< uno::Sequence< geometry::RealPoint2D > >&	points )
86cdf0e10cSrcweir     {
87cdf0e10cSrcweir         uno::Reference< rendering::XLinePolyPolygon2D > xPoly;
88cdf0e10cSrcweir         if( !mpOutDev )
89cdf0e10cSrcweir             return xPoly; // we're disposed
90cdf0e10cSrcweir 
91cdf0e10cSrcweir         xPoly.set( new ::basegfx::unotools::UnoPolyPolygon(
92cdf0e10cSrcweir                        ::basegfx::unotools::polyPolygonFromPoint2DSequenceSequence( points ) ) );
93cdf0e10cSrcweir         // vcl only handles even_odd polygons
94cdf0e10cSrcweir         xPoly->setFillRule(rendering::FillRule_EVEN_ODD);
95cdf0e10cSrcweir 
96cdf0e10cSrcweir         return xPoly;
97cdf0e10cSrcweir     }
98cdf0e10cSrcweir 
createCompatibleBezierPolyPolygon(const uno::Reference<rendering::XGraphicDevice> &,const uno::Sequence<uno::Sequence<geometry::RealBezierSegment2D>> & points)99cdf0e10cSrcweir     uno::Reference< rendering::XBezierPolyPolygon2D > DeviceHelper::createCompatibleBezierPolyPolygon(
100cdf0e10cSrcweir         const uno::Reference< rendering::XGraphicDevice >& 						,
101cdf0e10cSrcweir         const uno::Sequence< uno::Sequence< geometry::RealBezierSegment2D > >&	points )
102cdf0e10cSrcweir     {
103cdf0e10cSrcweir         uno::Reference< rendering::XBezierPolyPolygon2D > xPoly;
104cdf0e10cSrcweir         if( !mpOutDev )
105cdf0e10cSrcweir             return xPoly; // we're disposed
106cdf0e10cSrcweir 
107cdf0e10cSrcweir         xPoly.set( new ::basegfx::unotools::UnoPolyPolygon(
108cdf0e10cSrcweir                        ::basegfx::unotools::polyPolygonFromBezier2DSequenceSequence( points ) ) );
109cdf0e10cSrcweir         // vcl only handles even_odd polygons
110cdf0e10cSrcweir         xPoly->setFillRule(rendering::FillRule_EVEN_ODD);
111cdf0e10cSrcweir 
112cdf0e10cSrcweir         return xPoly;
113cdf0e10cSrcweir     }
114cdf0e10cSrcweir 
createCompatibleBitmap(const uno::Reference<rendering::XGraphicDevice> & rDevice,const geometry::IntegerSize2D & size)115cdf0e10cSrcweir     uno::Reference< rendering::XBitmap > DeviceHelper::createCompatibleBitmap(
116cdf0e10cSrcweir         const uno::Reference< rendering::XGraphicDevice >& rDevice,
117cdf0e10cSrcweir         const geometry::IntegerSize2D& 					   size )
118cdf0e10cSrcweir     {
119cdf0e10cSrcweir         if( !mpOutDev )
120cdf0e10cSrcweir             return uno::Reference< rendering::XBitmap >(); // we're disposed
121cdf0e10cSrcweir 
122cdf0e10cSrcweir         return uno::Reference< rendering::XBitmap >(
123cdf0e10cSrcweir             new CanvasBitmap( ::vcl::unotools::sizeFromIntegerSize2D(size),
124cdf0e10cSrcweir                               false,
125cdf0e10cSrcweir                               *rDevice.get(),
126cdf0e10cSrcweir                               mpOutDev ) );
127cdf0e10cSrcweir     }
128cdf0e10cSrcweir 
createVolatileBitmap(const uno::Reference<rendering::XGraphicDevice> &,const geometry::IntegerSize2D &)129cdf0e10cSrcweir     uno::Reference< rendering::XVolatileBitmap > DeviceHelper::createVolatileBitmap(
130cdf0e10cSrcweir         const uno::Reference< rendering::XGraphicDevice >& 	,
131cdf0e10cSrcweir         const geometry::IntegerSize2D& 						 )
132cdf0e10cSrcweir     {
133cdf0e10cSrcweir         return uno::Reference< rendering::XVolatileBitmap >();
134cdf0e10cSrcweir     }
135cdf0e10cSrcweir 
createCompatibleAlphaBitmap(const uno::Reference<rendering::XGraphicDevice> & rDevice,const geometry::IntegerSize2D & size)136cdf0e10cSrcweir     uno::Reference< rendering::XBitmap > DeviceHelper::createCompatibleAlphaBitmap(
137cdf0e10cSrcweir         const uno::Reference< rendering::XGraphicDevice >& rDevice,
138cdf0e10cSrcweir         const geometry::IntegerSize2D&                     size )
139cdf0e10cSrcweir     {
140cdf0e10cSrcweir         if( !mpOutDev )
141cdf0e10cSrcweir             return uno::Reference< rendering::XBitmap >(); // we're disposed
142cdf0e10cSrcweir 
143cdf0e10cSrcweir         return uno::Reference< rendering::XBitmap >(
144cdf0e10cSrcweir             new CanvasBitmap( ::vcl::unotools::sizeFromIntegerSize2D(size),
145cdf0e10cSrcweir                               true,
146cdf0e10cSrcweir                               *rDevice.get(),
147cdf0e10cSrcweir                               mpOutDev ) );
148cdf0e10cSrcweir     }
149cdf0e10cSrcweir 
createVolatileAlphaBitmap(const uno::Reference<rendering::XGraphicDevice> &,const geometry::IntegerSize2D &)150cdf0e10cSrcweir     uno::Reference< rendering::XVolatileBitmap > DeviceHelper::createVolatileAlphaBitmap(
151cdf0e10cSrcweir         const uno::Reference< rendering::XGraphicDevice >& 	,
152cdf0e10cSrcweir         const geometry::IntegerSize2D& 						 )
153cdf0e10cSrcweir     {
154cdf0e10cSrcweir         return uno::Reference< rendering::XVolatileBitmap >();
155cdf0e10cSrcweir     }
156cdf0e10cSrcweir 
hasFullScreenMode()157cdf0e10cSrcweir     sal_Bool DeviceHelper::hasFullScreenMode()
158cdf0e10cSrcweir     {
159cdf0e10cSrcweir         return false;
160cdf0e10cSrcweir     }
161cdf0e10cSrcweir 
enterFullScreenMode(sal_Bool bEnter)162cdf0e10cSrcweir     sal_Bool DeviceHelper::enterFullScreenMode( sal_Bool bEnter )
163cdf0e10cSrcweir     {
164cdf0e10cSrcweir         (void)bEnter;
165cdf0e10cSrcweir         return false;
166cdf0e10cSrcweir     }
167cdf0e10cSrcweir 
disposing()168cdf0e10cSrcweir     void DeviceHelper::disposing()
169cdf0e10cSrcweir     {
170cdf0e10cSrcweir         // release all references
171cdf0e10cSrcweir         mpOutDev.reset();
172cdf0e10cSrcweir     }
173cdf0e10cSrcweir 
isAccelerated() const174cdf0e10cSrcweir     uno::Any DeviceHelper::isAccelerated() const
175cdf0e10cSrcweir     {
176cdf0e10cSrcweir         return ::com::sun::star::uno::makeAny(false);
177cdf0e10cSrcweir     }
178cdf0e10cSrcweir 
getDeviceHandle() const179cdf0e10cSrcweir     uno::Any DeviceHelper::getDeviceHandle() const
180cdf0e10cSrcweir     {
181cdf0e10cSrcweir         if( !mpOutDev )
182cdf0e10cSrcweir             return uno::Any();
183cdf0e10cSrcweir 
184cdf0e10cSrcweir         return uno::makeAny(
185cdf0e10cSrcweir             reinterpret_cast< sal_Int64 >(&mpOutDev->getOutDev()) );
186cdf0e10cSrcweir     }
187cdf0e10cSrcweir 
getSurfaceHandle() const188cdf0e10cSrcweir     uno::Any DeviceHelper::getSurfaceHandle() const
189cdf0e10cSrcweir     {
190cdf0e10cSrcweir         return getDeviceHandle();
191cdf0e10cSrcweir     }
192cdf0e10cSrcweir 
193cdf0e10cSrcweir     namespace
194cdf0e10cSrcweir     {
195cdf0e10cSrcweir         struct DeviceColorSpace: public rtl::StaticWithInit<uno::Reference<rendering::XColorSpace>,
196cdf0e10cSrcweir                                                             DeviceColorSpace>
197cdf0e10cSrcweir         {
operator ()vclcanvas::__anon0450bc470111::DeviceColorSpace198cdf0e10cSrcweir             uno::Reference<rendering::XColorSpace> operator()()
199cdf0e10cSrcweir             {
200cdf0e10cSrcweir                 return vcl::unotools::createStandardColorSpace();
201cdf0e10cSrcweir             }
202cdf0e10cSrcweir         };
203cdf0e10cSrcweir     }
204cdf0e10cSrcweir 
getColorSpace() const205cdf0e10cSrcweir     uno::Reference<rendering::XColorSpace> DeviceHelper::getColorSpace() const
206cdf0e10cSrcweir     {
207cdf0e10cSrcweir         // always the same
208cdf0e10cSrcweir         return DeviceColorSpace::get();
209cdf0e10cSrcweir     }
210cdf0e10cSrcweir 
dumpScreenContent() const211cdf0e10cSrcweir     void DeviceHelper::dumpScreenContent() const
212cdf0e10cSrcweir     {
213cdf0e10cSrcweir         static sal_uInt32 nFilePostfixCount(0);
214cdf0e10cSrcweir 
215cdf0e10cSrcweir         if( mpOutDev )
216cdf0e10cSrcweir         {
217cdf0e10cSrcweir             String aFilename( String::CreateFromAscii("dbg_frontbuffer") );
218cdf0e10cSrcweir             aFilename += String::CreateFromInt32(nFilePostfixCount);
219cdf0e10cSrcweir             aFilename += String::CreateFromAscii(".bmp");
220cdf0e10cSrcweir 
221cdf0e10cSrcweir             SvFileStream aStream( aFilename, STREAM_STD_READWRITE );
222cdf0e10cSrcweir 
223cdf0e10cSrcweir             const ::Point aEmptyPoint;
224cdf0e10cSrcweir             OutputDevice& rOutDev = mpOutDev->getOutDev();
225cdf0e10cSrcweir             bool bOldMap( rOutDev.IsMapModeEnabled() );
226cdf0e10cSrcweir             rOutDev.EnableMapMode( sal_False );
227*45fd3b9aSArmin Le Grand             WriteDIB(rOutDev.GetBitmap(aEmptyPoint, rOutDev.GetOutputSizePixel()), aStream, false, true);
228cdf0e10cSrcweir             rOutDev.EnableMapMode( bOldMap );
229cdf0e10cSrcweir 
230cdf0e10cSrcweir             ++nFilePostfixCount;
231cdf0e10cSrcweir         }
232cdf0e10cSrcweir     }
233cdf0e10cSrcweir 
234cdf0e10cSrcweir }
235