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_canvas.hxx"
26 
27 #include <canvas/debug.hxx>
28 #include <tools/diagnose_ex.h>
29 
30 #include "cachedbitmap.hxx"
31 #include "repainttarget.hxx"
32 
33 #include <com/sun/star/rendering/RepaintResult.hpp>
34 #include <com/sun/star/rendering/XPolyPolygon2D.hpp>
35 
36 #include <basegfx/matrix/b2dhommatrix.hxx>
37 #include <basegfx/tools/canvastools.hxx>
38 
39 
40 using namespace ::com::sun::star;
41 
42 namespace vclcanvas
43 {
CachedBitmap(const GraphicObjectSharedPtr & rGraphicObject,const::Point & rPoint,const::Size & rSize,const GraphicAttr & rAttr,const rendering::ViewState & rUsedViewState,const rendering::RenderState & rUsedRenderState,const uno::Reference<rendering::XCanvas> & rTarget)44     CachedBitmap::CachedBitmap( const GraphicObjectSharedPtr& 				rGraphicObject,
45                                 const ::Point& 								rPoint,
46                                 const ::Size& 								rSize,
47                                 const GraphicAttr&							rAttr,
48                                 const rendering::ViewState&	  				rUsedViewState,
49                                 const rendering::RenderState&	  			rUsedRenderState,
50                                 const uno::Reference< rendering::XCanvas >& rTarget ) :
51         CachedPrimitiveBase( rUsedViewState, rTarget, true ),
52         mpGraphicObject( rGraphicObject ),
53         maRenderState(rUsedRenderState),
54         maPoint( rPoint ),
55         maSize( rSize ),
56         maAttributes( rAttr )
57     {
58     }
59 
disposing()60     void SAL_CALL CachedBitmap::disposing()
61     {
62         ::osl::MutexGuard aGuard( m_aMutex );
63 
64         mpGraphicObject.reset();
65 
66         CachedPrimitiveBase::disposing();
67     }
68 
doRedraw(const rendering::ViewState & rNewState,const rendering::ViewState & rOldState,const uno::Reference<rendering::XCanvas> & rTargetCanvas,bool bSameViewTransform)69     ::sal_Int8 CachedBitmap::doRedraw( const rendering::ViewState&					rNewState,
70                                        const rendering::ViewState&					rOldState,
71                                        const uno::Reference< rendering::XCanvas >& 	rTargetCanvas,
72                                        bool											bSameViewTransform )
73     {
74         ENSURE_OR_THROW( bSameViewTransform,
75                          "CachedBitmap::doRedraw(): base called with changed view transform "
76                          "(told otherwise during construction)" );
77 
78         // TODO(P1): Could adapt to modified clips as well
79         if( rNewState.Clip != rOldState.Clip )
80             return rendering::RepaintResult::FAILED;
81 
82         RepaintTarget* pTarget = dynamic_cast< RepaintTarget* >(rTargetCanvas.get());
83 
84         ENSURE_OR_THROW( pTarget,
85                           "CachedBitmap::redraw(): cannot cast target to RepaintTarget" );
86 
87         if( !pTarget->repaint( mpGraphicObject,
88                                rNewState,
89                                maRenderState,
90                                maPoint,
91                                maSize,
92                                maAttributes ) )
93         {
94             // target failed to repaint
95             return rendering::RepaintResult::FAILED;
96         }
97 
98         return rendering::RepaintResult::REDRAWN;
99     }
100 }
101