xref: /AOO41X/main/toolkit/source/awt/vclxdevice.cxx (revision b0724fc6948542b2496e16ea247f985ee5987cfe)
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