xref: /trunk/main/toolkit/source/awt/vclxdevice.cxx (revision b0724fc6)
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_toolkit.hxx"
26 #include <com/sun/star/awt/DeviceCapability.hpp>
27 
28 #include <com/sun/star/util/MeasureUnit.hpp>
29 
30 #include <toolkit/awt/vclxdevice.hxx>
31 #include <toolkit/awt/vclxfont.hxx>
32 #include <toolkit/awt/vclxbitmap.hxx>
33 #include <toolkit/helper/vclunohelper.hxx>
34 #include <toolkit/helper/macros.hxx>
35 #include <cppuhelper/typeprovider.hxx>
36 
37 #include <rtl/memory.h>
38 #include <rtl/uuid.h>
39 
40 #include <vcl/svapp.hxx>
41 #include <vcl/outdev.hxx>
42 #include <vcl/window.hxx>
43 #include <vcl/print.hxx>
44 #include <vcl/virdev.hxx>
45 #include <vcl/bitmapex.hxx>
46 #include <vcl/font.hxx>
47 
48 //	----------------------------------------------------
49 //	class VCLXDevice
50 //	----------------------------------------------------
VCLXDevice()51 VCLXDevice::VCLXDevice() : mrMutex( Application::GetSolarMutex() )
52 {
53 	mpOutputDevice = NULL;
54 	nFlags = 0;
55 }
56 
~VCLXDevice()57 VCLXDevice::~VCLXDevice()
58 {
59 // Was thought for #88347#, but didn't help, because the interface will not be released
60 // But would be a good idea anyway, check after 6.0, it's a little bit dangerous now
61 //    if( mpOutputDevice && IsCreatedWithToolkit() )
62 //    {
63 //        delete mpOutputDevice;
64 //    }
65 }
66 
DestroyOutputDevice()67 void VCLXDevice::DestroyOutputDevice()
68 {
69     delete mpOutputDevice;
70 	mpOutputDevice = NULL;
71 }
72 
SetCreatedWithToolkit(sal_Bool bCreatedWithToolkit)73 void VCLXDevice::SetCreatedWithToolkit( sal_Bool bCreatedWithToolkit )
74 {
75     if ( bCreatedWithToolkit )
76         nFlags |= FLAGS_CREATEDWITHTOOLKIT;
77     else
78         nFlags &= ~FLAGS_CREATEDWITHTOOLKIT;
79 }
80 
IsCreatedWithToolkit() const81 sal_Bool VCLXDevice::IsCreatedWithToolkit() const
82 {
83     return ( nFlags & FLAGS_CREATEDWITHTOOLKIT ) != 0;
84 }
85 
86 // ::com::sun::star::uno::XInterface
queryInterface(const::com::sun::star::uno::Type & rType)87 ::com::sun::star::uno::Any VCLXDevice::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException)
88 {
89 	::com::sun::star::uno::Any aRet = ::cppu::queryInterface( rType,
90 										SAL_STATIC_CAST( ::com::sun::star::awt::XDevice*, this ),
91 										SAL_STATIC_CAST( ::com::sun::star::lang::XUnoTunnel*, this ),
92 										SAL_STATIC_CAST( ::com::sun::star::lang::XTypeProvider*, this ),
93 										SAL_STATIC_CAST( ::com::sun::star::awt::XUnitConversion*, this ) );
94 	return (aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType ));
95 }
96 
97 // ::com::sun::star::lang::XUnoTunnel
98 IMPL_XUNOTUNNEL( VCLXDevice )
99 
100 // ::com::sun::star::lang::XTypeProvider
IMPL_XTYPEPROVIDER_START(VCLXDevice)101 IMPL_XTYPEPROVIDER_START( VCLXDevice )
102 	getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XDevice>* ) NULL ),
103 	getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XUnitConversion>* ) NULL )
104 IMPL_XTYPEPROVIDER_END
105 
106 
107 // ::com::sun::star::awt::XDevice,
108 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XGraphics > VCLXDevice::createGraphics(  ) throw(::com::sun::star::uno::RuntimeException)
109 {
110 	::vos::OGuard aGuard( GetMutex() );
111 
112 	::com::sun::star::uno::Reference< ::com::sun::star::awt::XGraphics > xRef;
113 
114 	if ( mpOutputDevice )
115 		xRef = mpOutputDevice->CreateUnoGraphics();
116 
117 	return xRef;
118 }
119 
createDevice(sal_Int32 nWidth,sal_Int32 nHeight)120 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XDevice > VCLXDevice::createDevice( sal_Int32 nWidth, sal_Int32 nHeight ) throw(::com::sun::star::uno::RuntimeException)
121 {
122 	::vos::OGuard aGuard( GetMutex() );
123 
124 	::com::sun::star::uno::Reference< ::com::sun::star::awt::XDevice >  xRef;
125 	if ( GetOutputDevice() )
126 	{
127 		VCLXVirtualDevice* pVDev = new VCLXVirtualDevice;
128 		VirtualDevice* pVclVDev = new VirtualDevice( *GetOutputDevice() );
129 		pVclVDev->SetOutputSizePixel( Size( nWidth, nHeight ) );
130 		pVDev->SetVirtualDevice( pVclVDev );
131 		xRef = pVDev;
132 	}
133 	return xRef;
134 }
135 
getInfo()136 ::com::sun::star::awt::DeviceInfo VCLXDevice::getInfo() throw(::com::sun::star::uno::RuntimeException)
137 {
138 	::vos::OGuard aGuard( GetMutex() );
139 
140 	::com::sun::star::awt::DeviceInfo aInfo;
141 
142 	if( mpOutputDevice )
143 	{
144 		Size aDevSz;
145 		OutDevType eDevType = mpOutputDevice->GetOutDevType();
146 		if ( eDevType == OUTDEV_WINDOW )
147 		{
148 			aDevSz = ((Window*)mpOutputDevice)->GetSizePixel();
149 			((Window*)mpOutputDevice)->GetBorder( aInfo.LeftInset, aInfo.TopInset, aInfo.RightInset, aInfo.BottomInset );
150 		}
151 		else if ( eDevType == OUTDEV_PRINTER )
152 		{
153 			aDevSz = ((Printer*)mpOutputDevice)->GetPaperSizePixel();
154 			Size aOutSz = mpOutputDevice->GetOutputSizePixel();
155 			Point aOffset = ((Printer*)mpOutputDevice)->GetPageOffset();
156 			aInfo.LeftInset = aOffset.X();
157 			aInfo.TopInset = aOffset.Y();
158 			aInfo.RightInset = aDevSz.Width() - aOutSz.Width() - aOffset.X();
159 			aInfo.BottomInset = aDevSz.Height() - aOutSz.Height() - aOffset.Y();
160 		}
161 		else // VirtualDevice
162 		{
163 			aDevSz = mpOutputDevice->GetOutputSizePixel();
164 			aInfo.LeftInset = 0;
165 			aInfo.TopInset = 0;
166 			aInfo.RightInset = 0;
167 			aInfo.BottomInset = 0;
168 		}
169 
170 		aInfo.Width = aDevSz.Width();
171 		aInfo.Height = aDevSz.Height();
172 
173 		Size aTmpSz = mpOutputDevice->LogicToPixel( Size( 1000, 1000 ), MapMode( MAP_CM ) );
174 		aInfo.PixelPerMeterX = aTmpSz.Width()/10;
175 		aInfo.PixelPerMeterY = aTmpSz.Height()/10;
176 
177 		aInfo.BitsPerPixel = mpOutputDevice->GetBitCount();
178 
179 		aInfo.Capabilities = 0;
180 		if ( mpOutputDevice->GetOutDevType() != OUTDEV_PRINTER )
181 			aInfo.Capabilities = ::com::sun::star::awt::DeviceCapability::RASTEROPERATIONS|::com::sun::star::awt::DeviceCapability::GETBITS;
182 	}
183 
184 	return aInfo;
185 }
186 
getFontDescriptors()187 ::com::sun::star::uno::Sequence< ::com::sun::star::awt::FontDescriptor > VCLXDevice::getFontDescriptors(  ) throw(::com::sun::star::uno::RuntimeException)
188 {
189 	::vos::OGuard aGuard( GetMutex() );
190 
191 	::com::sun::star::uno::Sequence< ::com::sun::star::awt::FontDescriptor> aFonts;
192 	if( mpOutputDevice )
193 	{
194 		int nFonts = mpOutputDevice->GetDevFontCount();
195 		if ( nFonts )
196 		{
197 			aFonts = ::com::sun::star::uno::Sequence< ::com::sun::star::awt::FontDescriptor>( nFonts );
198 			::com::sun::star::awt::FontDescriptor* pFonts = aFonts.getArray();
199 			for ( int n = 0; n < nFonts; n++ )
200 				pFonts[n] = VCLUnoHelper::CreateFontDescriptor( mpOutputDevice->GetDevFont( n ) );
201 		}
202 	}
203 	return aFonts;
204 }
205 
getFont(const::com::sun::star::awt::FontDescriptor & rDescriptor)206 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XFont > VCLXDevice::getFont( const ::com::sun::star::awt::FontDescriptor& rDescriptor ) throw(::com::sun::star::uno::RuntimeException)
207 {
208 	::vos::OGuard aGuard( GetMutex() );
209 
210 	::com::sun::star::uno::Reference< ::com::sun::star::awt::XFont >  xRef;
211 	if( mpOutputDevice )
212 	{
213 		VCLXFont* pMetric = new VCLXFont;
214 		pMetric->Init( *this, VCLUnoHelper::CreateFont( rDescriptor, mpOutputDevice->GetFont() ) );
215 		xRef = pMetric;
216 	}
217 	return xRef;
218 }
219 
createBitmap(sal_Int32 nX,sal_Int32 nY,sal_Int32 nWidth,sal_Int32 nHeight)220 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XBitmap > VCLXDevice::createBitmap( sal_Int32 nX, sal_Int32 nY, sal_Int32 nWidth, sal_Int32 nHeight ) throw(::com::sun::star::uno::RuntimeException)
221 {
222 	::vos::OGuard aGuard( GetMutex() );
223 
224 	::com::sun::star::uno::Reference< ::com::sun::star::awt::XBitmap >  xBmp;
225 	if( mpOutputDevice )
226 	{
227 		Bitmap aBmp = mpOutputDevice->GetBitmap( Point( nX, nY ), Size( nWidth, nHeight ) );
228 
229 		VCLXBitmap* pBmp = new VCLXBitmap;
230 		pBmp->SetBitmap( BitmapEx( aBmp ) );
231 		xBmp = pBmp;
232 	}
233 	return xBmp;
234 }
235 
createDisplayBitmap(const::com::sun::star::uno::Reference<::com::sun::star::awt::XBitmap> & rxBitmap)236 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XDisplayBitmap > VCLXDevice::createDisplayBitmap( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XBitmap >& rxBitmap ) throw(::com::sun::star::uno::RuntimeException)
237 {
238 	::vos::OGuard aGuard( GetMutex() );
239 
240 	BitmapEx aBmp = VCLUnoHelper::GetBitmap( rxBitmap );
241 	VCLXBitmap* pBmp = new VCLXBitmap;
242 	pBmp->SetBitmap( aBmp );
243 	::com::sun::star::uno::Reference< ::com::sun::star::awt::XDisplayBitmap >  xDBmp = pBmp;
244 	return xDBmp;
245 }
246 
247 
~VCLXVirtualDevice()248 VCLXVirtualDevice::~VCLXVirtualDevice()
249 {
250 	::vos::OGuard aGuard( GetMutex() );
251 
252     DestroyOutputDevice();
253 }
254 
255 
256 // -----------------------------------------------------------------------------
257 // ::com::sun::star::awt::XTextConstraints
258 // -----------------------------------------------------------------------------
259 // ::sal_Int32 SAL_CALL VCLXDevice::getTextWidth( const ::rtl::OUString& Text ) throw (::com::sun::star::uno::RuntimeException)
260 // {
261 // 	::vos::OGuard aGuard( GetMutex() );
262 //     if (Text.getLength() == 0)
263 //     {
264 //         return 0;
265 //     }
266 //
267 //     return 1;
268 // }
269 //
270 // ::sal_Int32 SAL_CALL VCLXDevice::getTextHeight(  ) throw (::com::sun::star::uno::RuntimeException)
271 // {
272 // 	::vos::OGuard aGuard( GetMutex() );
273 //     return 1;
274 // }
275 
276 
277 // -----------------------------------------------------------------------------
278 // Interface implementation of ::com::sun::star::awt::XUnitConversion
279 // -----------------------------------------------------------------------------
280 
convertPointToLogic(const::com::sun::star::awt::Point & aPoint,::sal_Int16 TargetUnit)281 ::com::sun::star::awt::Point SAL_CALL VCLXDevice::convertPointToLogic( const ::com::sun::star::awt::Point& aPoint, ::sal_Int16 TargetUnit ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
282 {
283     (void)aPoint;
284 	::vos::OGuard aGuard( GetMutex() );
285     if (TargetUnit == com::sun::star::util::MeasureUnit::PERCENT )
286     {
287         // percentage not allowed here
288         throw ::com::sun::star::lang::IllegalArgumentException();
289     }
290 
291     ::com::sun::star::awt::Point aAWTPoint(0,0);
292     // X,Y
293 
294 	if( mpOutputDevice )
295 	{
296         MapMode aMode(VCLUnoHelper::ConvertToMapModeUnit(TargetUnit));
297 		::Point aVCLPoint = VCLUnoHelper::ConvertToVCLPoint(aPoint);
298 		::Point aDevPoint = mpOutputDevice->PixelToLogic(aVCLPoint, aMode );
299         aAWTPoint = VCLUnoHelper::ConvertToAWTPoint(aDevPoint);
300     }
301 
302     return aAWTPoint;
303 }
304 
305 
convertPointToPixel(const::com::sun::star::awt::Point & aPoint,::sal_Int16 SourceUnit)306 ::com::sun::star::awt::Point SAL_CALL VCLXDevice::convertPointToPixel( const ::com::sun::star::awt::Point& aPoint, ::sal_Int16 SourceUnit ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
307 {
308     (void)aPoint;
309 	::vos::OGuard aGuard( GetMutex() );
310     if (SourceUnit == com::sun::star::util::MeasureUnit::PERCENT ||
311         SourceUnit == com::sun::star::util::MeasureUnit::PIXEL )
312     {
313         // pixel or percentage not allowed here
314         throw ::com::sun::star::lang::IllegalArgumentException();
315     }
316 
317     ::com::sun::star::awt::Point aAWTPoint(0,0);
318 
319 	if( mpOutputDevice )
320 	{
321         MapMode aMode(VCLUnoHelper::ConvertToMapModeUnit(SourceUnit));
322 		::Point aVCLPoint = VCLUnoHelper::ConvertToVCLPoint(aPoint);
323 		::Point aDevPoint = mpOutputDevice->LogicToPixel(aVCLPoint, aMode );
324         aAWTPoint = VCLUnoHelper::ConvertToAWTPoint(aDevPoint);
325     }
326 
327     return aAWTPoint;
328 }
329 
convertSizeToLogic(const::com::sun::star::awt::Size & aSize,::sal_Int16 TargetUnit)330 ::com::sun::star::awt::Size SAL_CALL VCLXDevice::convertSizeToLogic( const ::com::sun::star::awt::Size& aSize, ::sal_Int16 TargetUnit ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
331 {
332     (void)aSize;
333 	::vos::OGuard aGuard( GetMutex() );
334     if (TargetUnit == com::sun::star::util::MeasureUnit::PERCENT)
335     {
336         // percentage not allowed here
337         throw ::com::sun::star::lang::IllegalArgumentException();
338     }
339 
340     ::com::sun::star::awt::Size aAWTSize(0,0);
341     // Width, Height
342 
343 
344 	if( mpOutputDevice )
345 	{
346         MapMode aMode(VCLUnoHelper::ConvertToMapModeUnit(TargetUnit));
347 		::Size aVCLSize = VCLUnoHelper::ConvertToVCLSize(aSize);
348 		::Size aDevSz = mpOutputDevice->PixelToLogic(aVCLSize, aMode );
349         aAWTSize = VCLUnoHelper::ConvertToAWTSize(aDevSz);
350     }
351 
352     return aAWTSize;
353 }
354 
convertSizeToPixel(const::com::sun::star::awt::Size & aSize,::sal_Int16 SourceUnit)355 ::com::sun::star::awt::Size SAL_CALL VCLXDevice::convertSizeToPixel( const ::com::sun::star::awt::Size& aSize, ::sal_Int16 SourceUnit ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
356 {
357     (void)aSize;
358 	::vos::OGuard aGuard( GetMutex() );
359     if (SourceUnit == com::sun::star::util::MeasureUnit::PERCENT ||
360         SourceUnit == com::sun::star::util::MeasureUnit::PIXEL)
361     {
362         // pixel or percentage not allowed here
363         throw ::com::sun::star::lang::IllegalArgumentException();
364     }
365 
366     ::com::sun::star::awt::Size aAWTSize(0,0);
367     // Width, Height
368 	if( mpOutputDevice )
369 	{
370         MapMode aMode(VCLUnoHelper::ConvertToMapModeUnit(SourceUnit));
371 		::Size aVCLSize = VCLUnoHelper::ConvertToVCLSize(aSize);
372 		::Size aDevSz = mpOutputDevice->LogicToPixel(aVCLSize, aMode );
373         aAWTSize = VCLUnoHelper::ConvertToAWTSize(aDevSz);
374     }
375 
376     return aAWTSize;
377 }
378 
379