1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
23*b1cdbd2cSJim Jagielski #include "precompiled_canvas.hxx"
24*b1cdbd2cSJim Jagielski 
25*b1cdbd2cSJim Jagielski #include <canvas/debug.hxx>
26*b1cdbd2cSJim Jagielski #include <canvas/canvastools.hxx>
27*b1cdbd2cSJim Jagielski #include <toolkit/helper/vclunohelper.hxx>
28*b1cdbd2cSJim Jagielski #include <vcl/canvastools.hxx>
29*b1cdbd2cSJim Jagielski #include <basegfx/tools/canvastools.hxx>
30*b1cdbd2cSJim Jagielski #include <vcl/dibtools.hxx>
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski #include "spritedevicehelper.hxx"
33*b1cdbd2cSJim Jagielski #include "spritecanvas.hxx"
34*b1cdbd2cSJim Jagielski #include "spritecanvashelper.hxx"
35*b1cdbd2cSJim Jagielski #include "canvasbitmap.hxx"
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski namespace vclcanvas
40*b1cdbd2cSJim Jagielski {
SpriteDeviceHelper()41*b1cdbd2cSJim Jagielski     SpriteDeviceHelper::SpriteDeviceHelper() :
42*b1cdbd2cSJim Jagielski         mpBackBuffer()
43*b1cdbd2cSJim Jagielski     {
44*b1cdbd2cSJim Jagielski     }
45*b1cdbd2cSJim Jagielski 
init(const OutDevProviderSharedPtr & pOutDev)46*b1cdbd2cSJim Jagielski     void SpriteDeviceHelper::init( const OutDevProviderSharedPtr& pOutDev )
47*b1cdbd2cSJim Jagielski     {
48*b1cdbd2cSJim Jagielski         DeviceHelper::init(pOutDev);
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski         // setup back buffer
51*b1cdbd2cSJim Jagielski         OutputDevice& rOutDev( pOutDev->getOutDev() );
52*b1cdbd2cSJim Jagielski         mpBackBuffer.reset( new BackBuffer( rOutDev ));
53*b1cdbd2cSJim Jagielski         mpBackBuffer->setSize( rOutDev.GetOutputSizePixel() );
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski         // #i95645#
56*b1cdbd2cSJim Jagielski #if defined( QUARTZ )
57*b1cdbd2cSJim Jagielski         // use AA on VCLCanvas for Mac
58*b1cdbd2cSJim Jagielski         mpBackBuffer->getOutDev().SetAntialiasing( ANTIALIASING_ENABLE_B2DDRAW | mpBackBuffer->getOutDev().GetAntialiasing() );
59*b1cdbd2cSJim Jagielski #else
60*b1cdbd2cSJim Jagielski         // switch off AA for WIN32 and UNIX, the VCLCanvas does not look good with it and
61*b1cdbd2cSJim Jagielski         // is not required to do AA. It would need to be adapted to use it correctly
62*b1cdbd2cSJim Jagielski         // (especially gradient painting). This will need extra work.
63*b1cdbd2cSJim Jagielski         mpBackBuffer->getOutDev().SetAntialiasing(mpBackBuffer->getOutDev().GetAntialiasing() & ~ANTIALIASING_ENABLE_B2DDRAW);
64*b1cdbd2cSJim Jagielski #endif
65*b1cdbd2cSJim Jagielski     }
66*b1cdbd2cSJim Jagielski 
createBuffers(::sal_Int32 nBuffers)67*b1cdbd2cSJim Jagielski     ::sal_Int32 SpriteDeviceHelper::createBuffers( ::sal_Int32 nBuffers )
68*b1cdbd2cSJim Jagielski     {
69*b1cdbd2cSJim Jagielski         (void)nBuffers;
70*b1cdbd2cSJim Jagielski 
71*b1cdbd2cSJim Jagielski         // TODO(F3): implement XBufferStrategy interface. For now, we
72*b1cdbd2cSJim Jagielski         // _always_ will have exactly one backbuffer
73*b1cdbd2cSJim Jagielski         return 1;
74*b1cdbd2cSJim Jagielski     }
75*b1cdbd2cSJim Jagielski 
destroyBuffers()76*b1cdbd2cSJim Jagielski     void SpriteDeviceHelper::destroyBuffers()
77*b1cdbd2cSJim Jagielski     {
78*b1cdbd2cSJim Jagielski         // TODO(F3): implement XBufferStrategy interface. For now, we
79*b1cdbd2cSJim Jagielski         // _always_ will have exactly one backbuffer
80*b1cdbd2cSJim Jagielski     }
81*b1cdbd2cSJim Jagielski 
showBuffer(bool,::sal_Bool)82*b1cdbd2cSJim Jagielski     ::sal_Bool SpriteDeviceHelper::showBuffer( bool, ::sal_Bool )
83*b1cdbd2cSJim Jagielski     {
84*b1cdbd2cSJim Jagielski         OSL_ENSURE(false,"Not supposed to be called, handled by SpriteCanvas");
85*b1cdbd2cSJim Jagielski         return sal_False;
86*b1cdbd2cSJim Jagielski     }
87*b1cdbd2cSJim Jagielski 
switchBuffer(bool,::sal_Bool)88*b1cdbd2cSJim Jagielski     ::sal_Bool SpriteDeviceHelper::switchBuffer( bool, ::sal_Bool )
89*b1cdbd2cSJim Jagielski     {
90*b1cdbd2cSJim Jagielski         OSL_ENSURE(false,"Not supposed to be called, handled by SpriteCanvas");
91*b1cdbd2cSJim Jagielski         return sal_False;
92*b1cdbd2cSJim Jagielski     }
93*b1cdbd2cSJim Jagielski 
disposing()94*b1cdbd2cSJim Jagielski     void SpriteDeviceHelper::disposing()
95*b1cdbd2cSJim Jagielski     {
96*b1cdbd2cSJim Jagielski         // release all references
97*b1cdbd2cSJim Jagielski         mpBackBuffer.reset();
98*b1cdbd2cSJim Jagielski 
99*b1cdbd2cSJim Jagielski         DeviceHelper::disposing();
100*b1cdbd2cSJim Jagielski     }
101*b1cdbd2cSJim Jagielski 
isAccelerated() const102*b1cdbd2cSJim Jagielski     uno::Any SpriteDeviceHelper::isAccelerated() const
103*b1cdbd2cSJim Jagielski     {
104*b1cdbd2cSJim Jagielski         return DeviceHelper::isAccelerated();
105*b1cdbd2cSJim Jagielski     }
106*b1cdbd2cSJim Jagielski 
getDeviceHandle() const107*b1cdbd2cSJim Jagielski     uno::Any SpriteDeviceHelper::getDeviceHandle() const
108*b1cdbd2cSJim Jagielski     {
109*b1cdbd2cSJim Jagielski         return DeviceHelper::getDeviceHandle();
110*b1cdbd2cSJim Jagielski     }
111*b1cdbd2cSJim Jagielski 
getSurfaceHandle() const112*b1cdbd2cSJim Jagielski     uno::Any SpriteDeviceHelper::getSurfaceHandle() const
113*b1cdbd2cSJim Jagielski     {
114*b1cdbd2cSJim Jagielski         if( !mpBackBuffer )
115*b1cdbd2cSJim Jagielski             return uno::Any();
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski         return uno::makeAny(
118*b1cdbd2cSJim Jagielski             reinterpret_cast< sal_Int64 >(&mpBackBuffer->getOutDev()) );
119*b1cdbd2cSJim Jagielski     }
120*b1cdbd2cSJim Jagielski 
notifySizeUpdate(const awt::Rectangle & rBounds)121*b1cdbd2cSJim Jagielski     void SpriteDeviceHelper::notifySizeUpdate( const awt::Rectangle& rBounds )
122*b1cdbd2cSJim Jagielski     {
123*b1cdbd2cSJim Jagielski         if( mpBackBuffer )
124*b1cdbd2cSJim Jagielski             mpBackBuffer->setSize( ::Size(rBounds.Width,
125*b1cdbd2cSJim Jagielski                                           rBounds.Height) );
126*b1cdbd2cSJim Jagielski     }
127*b1cdbd2cSJim Jagielski 
dumpScreenContent() const128*b1cdbd2cSJim Jagielski     void SpriteDeviceHelper::dumpScreenContent() const
129*b1cdbd2cSJim Jagielski     {
130*b1cdbd2cSJim Jagielski         DeviceHelper::dumpScreenContent();
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski         static sal_uInt32 nFilePostfixCount(0);
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski         if( mpBackBuffer )
135*b1cdbd2cSJim Jagielski         {
136*b1cdbd2cSJim Jagielski             String aFilename( String::CreateFromAscii("dbg_backbuffer") );
137*b1cdbd2cSJim Jagielski             aFilename += String::CreateFromInt32(nFilePostfixCount);
138*b1cdbd2cSJim Jagielski             aFilename += String::CreateFromAscii(".bmp");
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski             SvFileStream aStream( aFilename, STREAM_STD_READWRITE );
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski             const ::Point aEmptyPoint;
143*b1cdbd2cSJim Jagielski             mpBackBuffer->getOutDev().EnableMapMode( sal_False );
144*b1cdbd2cSJim Jagielski             mpBackBuffer->getOutDev().SetAntialiasing( ANTIALIASING_ENABLE_B2DDRAW );
145*b1cdbd2cSJim Jagielski             WriteDIB(mpBackBuffer->getOutDev().GetBitmap(aEmptyPoint, mpBackBuffer->getOutDev().GetOutputSizePixel()), aStream, false, true);
146*b1cdbd2cSJim Jagielski         }
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski         ++nFilePostfixCount;
149*b1cdbd2cSJim Jagielski     }
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski }
152