1*25ea7f45SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*25ea7f45SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*25ea7f45SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*25ea7f45SAndrew Rist * distributed with this work for additional information 6*25ea7f45SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*25ea7f45SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*25ea7f45SAndrew Rist * "License"); you may not use this file except in compliance 9*25ea7f45SAndrew Rist * with the License. You may obtain a copy of the License at 10*25ea7f45SAndrew Rist * 11*25ea7f45SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*25ea7f45SAndrew Rist * 13*25ea7f45SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*25ea7f45SAndrew Rist * software distributed under the License is distributed on an 15*25ea7f45SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*25ea7f45SAndrew Rist * KIND, either express or implied. See the License for the 17*25ea7f45SAndrew Rist * specific language governing permissions and limitations 18*25ea7f45SAndrew Rist * under the License. 19*25ea7f45SAndrew Rist * 20*25ea7f45SAndrew Rist *************************************************************/ 21*25ea7f45SAndrew Rist 22*25ea7f45SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_canvas.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include <ctype.h> // don't ask. msdev breaks otherwise... 28cdf0e10cSrcweir #include <vcl/window.hxx> 29cdf0e10cSrcweir #include <vcl/canvastools.hxx> 30cdf0e10cSrcweir #include <canvas/debug.hxx> 31cdf0e10cSrcweir #include <canvas/verbosetrace.hxx> 32cdf0e10cSrcweir #include <canvas/canvastools.hxx> 33cdf0e10cSrcweir #include <tools/diagnose_ex.h> 34cdf0e10cSrcweir 35cdf0e10cSrcweir #include <osl/mutex.hxx> 36cdf0e10cSrcweir #include <cppuhelper/compbase1.hxx> 37cdf0e10cSrcweir 38cdf0e10cSrcweir #include <com/sun/star/lang/NoSupportException.hpp> 39cdf0e10cSrcweir #include <toolkit/helper/vclunohelper.hxx> 40cdf0e10cSrcweir #include <basegfx/tools/canvastools.hxx> 41cdf0e10cSrcweir #include "dx_linepolypolygon.hxx" 42cdf0e10cSrcweir #include "dx_spritecanvas.hxx" 43cdf0e10cSrcweir #include "dx_canvasbitmap.hxx" 44cdf0e10cSrcweir #include "dx_devicehelper.hxx" 45cdf0e10cSrcweir 46cdf0e10cSrcweir 47cdf0e10cSrcweir #undef WB_LEFT 48cdf0e10cSrcweir #undef WB_RIGHT 49cdf0e10cSrcweir #include "dx_winstuff.hxx" 50cdf0e10cSrcweir 51cdf0e10cSrcweir 52cdf0e10cSrcweir #include <vcl/sysdata.hxx> 53cdf0e10cSrcweir 54cdf0e10cSrcweir using namespace ::com::sun::star; 55cdf0e10cSrcweir 56cdf0e10cSrcweir namespace dxcanvas 57cdf0e10cSrcweir { DeviceHelper()58cdf0e10cSrcweir DeviceHelper::DeviceHelper() : 59cdf0e10cSrcweir mpDevice( NULL ), 60cdf0e10cSrcweir mnHDC(0) 61cdf0e10cSrcweir { 62cdf0e10cSrcweir } 63cdf0e10cSrcweir init(HDC hdc,rendering::XGraphicDevice & rDevice)64cdf0e10cSrcweir void DeviceHelper::init( HDC hdc, 65cdf0e10cSrcweir rendering::XGraphicDevice& rDevice ) 66cdf0e10cSrcweir { 67cdf0e10cSrcweir mnHDC = hdc; 68cdf0e10cSrcweir mpDevice = &rDevice; 69cdf0e10cSrcweir } 70cdf0e10cSrcweir disposing()71cdf0e10cSrcweir void DeviceHelper::disposing() 72cdf0e10cSrcweir { 73cdf0e10cSrcweir // release all references 74cdf0e10cSrcweir mnHDC = 0; 75cdf0e10cSrcweir mpDevice = NULL; 76cdf0e10cSrcweir } 77cdf0e10cSrcweir getPhysicalResolution()78cdf0e10cSrcweir geometry::RealSize2D DeviceHelper::getPhysicalResolution() 79cdf0e10cSrcweir { 80cdf0e10cSrcweir if( !mpDevice ) 81cdf0e10cSrcweir return ::canvas::tools::createInfiniteSize2D(); // we're disposed 82cdf0e10cSrcweir 83cdf0e10cSrcweir HDC hDC = getHDC(); 84cdf0e10cSrcweir ENSURE_OR_THROW( hDC, 85cdf0e10cSrcweir "DeviceHelper::getPhysicalResolution(): cannot retrieve HDC from window" ); 86cdf0e10cSrcweir 87cdf0e10cSrcweir const int nHorzRes( GetDeviceCaps( hDC, 88cdf0e10cSrcweir LOGPIXELSX ) ); 89cdf0e10cSrcweir const int nVertRes( GetDeviceCaps( hDC, 90cdf0e10cSrcweir LOGPIXELSY ) ); 91cdf0e10cSrcweir 92cdf0e10cSrcweir return geometry::RealSize2D( nHorzRes*25.4, 93cdf0e10cSrcweir nVertRes*25.4 ); 94cdf0e10cSrcweir } 95cdf0e10cSrcweir getPhysicalSize()96cdf0e10cSrcweir geometry::RealSize2D DeviceHelper::getPhysicalSize() 97cdf0e10cSrcweir { 98cdf0e10cSrcweir if( !mpDevice ) 99cdf0e10cSrcweir return ::canvas::tools::createInfiniteSize2D(); // we're disposed 100cdf0e10cSrcweir 101cdf0e10cSrcweir HDC hDC=getHDC(); 102cdf0e10cSrcweir ENSURE_OR_THROW( hDC, 103cdf0e10cSrcweir "DeviceHelper::getPhysicalSize(): cannot retrieve HDC from window" ); 104cdf0e10cSrcweir 105cdf0e10cSrcweir const int nHorzSize( GetDeviceCaps( hDC, 106cdf0e10cSrcweir HORZSIZE ) ); 107cdf0e10cSrcweir const int nVertSize( GetDeviceCaps( hDC, 108cdf0e10cSrcweir VERTSIZE ) ); 109cdf0e10cSrcweir 110cdf0e10cSrcweir return geometry::RealSize2D( nHorzSize, 111cdf0e10cSrcweir nVertSize ); 112cdf0e10cSrcweir } 113cdf0e10cSrcweir createCompatibleLinePolyPolygon(const uno::Reference<rendering::XGraphicDevice> &,const uno::Sequence<uno::Sequence<geometry::RealPoint2D>> & points)114cdf0e10cSrcweir uno::Reference< rendering::XLinePolyPolygon2D > DeviceHelper::createCompatibleLinePolyPolygon( 115cdf0e10cSrcweir const uno::Reference< rendering::XGraphicDevice >& /*rDevice*/, 116cdf0e10cSrcweir const uno::Sequence< uno::Sequence< geometry::RealPoint2D > >& points ) 117cdf0e10cSrcweir { 118cdf0e10cSrcweir if( !mpDevice ) 119cdf0e10cSrcweir return uno::Reference< rendering::XLinePolyPolygon2D >(); // we're disposed 120cdf0e10cSrcweir 121cdf0e10cSrcweir return uno::Reference< rendering::XLinePolyPolygon2D >( 122cdf0e10cSrcweir new LinePolyPolygon( 123cdf0e10cSrcweir ::basegfx::unotools::polyPolygonFromPoint2DSequenceSequence( points ) ) ); 124cdf0e10cSrcweir } 125cdf0e10cSrcweir createCompatibleBezierPolyPolygon(const uno::Reference<rendering::XGraphicDevice> &,const uno::Sequence<uno::Sequence<geometry::RealBezierSegment2D>> & points)126cdf0e10cSrcweir uno::Reference< rendering::XBezierPolyPolygon2D > DeviceHelper::createCompatibleBezierPolyPolygon( 127cdf0e10cSrcweir const uno::Reference< rendering::XGraphicDevice >& /*rDevice*/, 128cdf0e10cSrcweir const uno::Sequence< uno::Sequence< geometry::RealBezierSegment2D > >& points ) 129cdf0e10cSrcweir { 130cdf0e10cSrcweir if( !mpDevice ) 131cdf0e10cSrcweir return uno::Reference< rendering::XBezierPolyPolygon2D >(); // we're disposed 132cdf0e10cSrcweir 133cdf0e10cSrcweir return uno::Reference< rendering::XBezierPolyPolygon2D >( 134cdf0e10cSrcweir new LinePolyPolygon( 135cdf0e10cSrcweir ::basegfx::unotools::polyPolygonFromBezier2DSequenceSequence( points ) ) ); 136cdf0e10cSrcweir } 137cdf0e10cSrcweir createCompatibleBitmap(const uno::Reference<rendering::XGraphicDevice> &,const geometry::IntegerSize2D & size)138cdf0e10cSrcweir uno::Reference< rendering::XBitmap > DeviceHelper::createCompatibleBitmap( 139cdf0e10cSrcweir const uno::Reference< rendering::XGraphicDevice >& /*rDevice*/, 140cdf0e10cSrcweir const geometry::IntegerSize2D& size ) 141cdf0e10cSrcweir { 142cdf0e10cSrcweir if( !mpDevice ) 143cdf0e10cSrcweir return uno::Reference< rendering::XBitmap >(); // we're disposed 144cdf0e10cSrcweir 145cdf0e10cSrcweir DXBitmapSharedPtr pBitmap( 146cdf0e10cSrcweir new DXBitmap( 147cdf0e10cSrcweir ::basegfx::unotools::b2ISizeFromIntegerSize2D(size), 148cdf0e10cSrcweir false)); 149cdf0e10cSrcweir 150cdf0e10cSrcweir // create a 24bit RGB system memory surface 151cdf0e10cSrcweir return uno::Reference< rendering::XBitmap >(new CanvasBitmap(pBitmap,mpDevice)); 152cdf0e10cSrcweir } 153cdf0e10cSrcweir createVolatileBitmap(const uno::Reference<rendering::XGraphicDevice> &,const geometry::IntegerSize2D &)154cdf0e10cSrcweir uno::Reference< rendering::XVolatileBitmap > DeviceHelper::createVolatileBitmap( 155cdf0e10cSrcweir const uno::Reference< rendering::XGraphicDevice >& /*rDevice*/, 156cdf0e10cSrcweir const geometry::IntegerSize2D& /*size*/ ) 157cdf0e10cSrcweir { 158cdf0e10cSrcweir return uno::Reference< rendering::XVolatileBitmap >(); 159cdf0e10cSrcweir } 160cdf0e10cSrcweir createCompatibleAlphaBitmap(const uno::Reference<rendering::XGraphicDevice> &,const geometry::IntegerSize2D & size)161cdf0e10cSrcweir uno::Reference< rendering::XBitmap > DeviceHelper::createCompatibleAlphaBitmap( 162cdf0e10cSrcweir const uno::Reference< rendering::XGraphicDevice >& /*rDevice*/, 163cdf0e10cSrcweir const geometry::IntegerSize2D& size ) 164cdf0e10cSrcweir { 165cdf0e10cSrcweir if( !mpDevice ) 166cdf0e10cSrcweir return uno::Reference< rendering::XBitmap >(); // we're disposed 167cdf0e10cSrcweir 168cdf0e10cSrcweir DXBitmapSharedPtr pBitmap( 169cdf0e10cSrcweir new DXBitmap( 170cdf0e10cSrcweir ::basegfx::unotools::b2ISizeFromIntegerSize2D(size), 171cdf0e10cSrcweir true)); 172cdf0e10cSrcweir 173cdf0e10cSrcweir // create a 32bit ARGB system memory surface 174cdf0e10cSrcweir return uno::Reference< rendering::XBitmap >(new CanvasBitmap(pBitmap,mpDevice)); 175cdf0e10cSrcweir } 176cdf0e10cSrcweir createVolatileAlphaBitmap(const uno::Reference<rendering::XGraphicDevice> &,const geometry::IntegerSize2D &)177cdf0e10cSrcweir uno::Reference< rendering::XVolatileBitmap > DeviceHelper::createVolatileAlphaBitmap( 178cdf0e10cSrcweir const uno::Reference< rendering::XGraphicDevice >& /*rDevice*/, 179cdf0e10cSrcweir const geometry::IntegerSize2D& /*size*/ ) 180cdf0e10cSrcweir { 181cdf0e10cSrcweir return uno::Reference< rendering::XVolatileBitmap >(); 182cdf0e10cSrcweir } 183cdf0e10cSrcweir hasFullScreenMode()184cdf0e10cSrcweir sal_Bool DeviceHelper::hasFullScreenMode() 185cdf0e10cSrcweir { 186cdf0e10cSrcweir return false; 187cdf0e10cSrcweir } 188cdf0e10cSrcweir enterFullScreenMode(sal_Bool)189cdf0e10cSrcweir sal_Bool DeviceHelper::enterFullScreenMode( sal_Bool /*bEnter*/ ) 190cdf0e10cSrcweir { 191cdf0e10cSrcweir return false; 192cdf0e10cSrcweir } 193cdf0e10cSrcweir isAccelerated() const194cdf0e10cSrcweir uno::Any DeviceHelper::isAccelerated() const 195cdf0e10cSrcweir { 196cdf0e10cSrcweir return ::com::sun::star::uno::makeAny(false); 197cdf0e10cSrcweir } 198cdf0e10cSrcweir getDeviceHandle() const199cdf0e10cSrcweir uno::Any DeviceHelper::getDeviceHandle() const 200cdf0e10cSrcweir { 201cdf0e10cSrcweir HDC hdc( getHDC() ); 202cdf0e10cSrcweir if( hdc ) 203cdf0e10cSrcweir return uno::makeAny( reinterpret_cast< sal_Int64 >(hdc) ); 204cdf0e10cSrcweir else 205cdf0e10cSrcweir return uno::Any(); 206cdf0e10cSrcweir } 207cdf0e10cSrcweir getSurfaceHandle() const208cdf0e10cSrcweir uno::Any DeviceHelper::getSurfaceHandle() const 209cdf0e10cSrcweir { 210cdf0e10cSrcweir // TODO(F1): expose DirectDraw object 211cdf0e10cSrcweir //return mpBackBuffer->getBitmap().get(); 212cdf0e10cSrcweir return uno::Any(); 213cdf0e10cSrcweir } 214cdf0e10cSrcweir 215cdf0e10cSrcweir namespace 216cdf0e10cSrcweir { 217cdf0e10cSrcweir struct DeviceColorSpace: public rtl::StaticWithInit<uno::Reference<rendering::XColorSpace>, 218cdf0e10cSrcweir DeviceColorSpace> 219cdf0e10cSrcweir { operator ()dxcanvas::__anonba93ca500111::DeviceColorSpace220cdf0e10cSrcweir uno::Reference<rendering::XColorSpace> operator()() 221cdf0e10cSrcweir { 222cdf0e10cSrcweir return vcl::unotools::createStandardColorSpace(); 223cdf0e10cSrcweir } 224cdf0e10cSrcweir }; 225cdf0e10cSrcweir } 226cdf0e10cSrcweir getColorSpace() const227cdf0e10cSrcweir uno::Reference<rendering::XColorSpace> DeviceHelper::getColorSpace() const 228cdf0e10cSrcweir { 229cdf0e10cSrcweir // always the same 230cdf0e10cSrcweir return DeviceColorSpace::get(); 231cdf0e10cSrcweir } 232cdf0e10cSrcweir } 233