23 #include <boost/cast.hpp>
35 using namespace ::
cairo;
48 const ::canvas::Sprite::Reference& rSprite )
52 ::boost::polymorphic_downcast< Sprite* >(rSprite.get())->redraw( pCairo,
true);
57 const ::basegfx::B2DRange& rArea )
59 cairo_save( pCairo.get() );
60 cairo_rectangle( pCairo.get(), ceil( rArea.getMinX() ), ceil( rArea.getMinY() ),
61 floor( rArea.getWidth() ), floor( rArea.getHeight() ) );
62 cairo_clip( pCairo.get() );
63 cairo_set_source_surface( pCairo.get(), pBackgroundSurface->getCairoSurface().get(), 0, 0 );
64 cairo_set_operator( pCairo.get(), CAIRO_OPERATOR_SOURCE );
65 cairo_paint( pCairo.get() );
66 cairo_restore( pCairo.get() );
69 void opaqueUpdateSpriteArea( const ::canvas::Sprite::Reference& rSprite,
71 const ::basegfx::B2IRange& rArea )
76 cairo_save( pCairo.get() );
77 cairo_rectangle( pCairo.get(), rArea.getMinX(), rArea.getMinY(),
78 sal::static_int_cast<sal_Int32>(rArea.getWidth()),
79 sal::static_int_cast<sal_Int32>(rArea.getHeight()) );
80 cairo_clip( pCairo.get() );
85 ::boost::polymorphic_downcast< Sprite* >( rSprite.get() )->redraw( pCairo,
false );
87 cairo_restore( pCairo.get() );
92 mpRedrawManager( nullptr ),
93 mpOwningSpriteCanvas( nullptr ),
94 mpCompositingSurface(),
95 maCompositingSurfaceSize(),
96 mbCompositingSurfaceDirty(true)
102 const ::basegfx::B2ISize& rSize )
121 const uno::Reference< rendering::XAnimation >& )
123 return uno::Reference< rendering::XAnimatedSprite >();
127 const uno::Sequence< uno::Reference< rendering::XBitmap > >& ,
130 return uno::Reference< rendering::XAnimatedSprite >();
136 return uno::Reference< rendering::XCustomSprite >();
138 return uno::Reference< rendering::XCustomSprite >(
139 new CanvasCustomSprite( spriteSize,
144 const uno::Reference< rendering::XSprite >& )
146 return uno::Reference< rendering::XSprite >();
151 bool& io_bSurfaceDirty )
161 SAL_INFO(
"canvas.cairo",
"SpriteCanvasHelper::updateScreen called");
169 CairoSharedPtr pCompositingCairo = pCompositingSurface->getCairo();
185 SAL_INFO(
"canvas.cairo",
"SpriteCanvasHelper::updateScreen update ALL");
190 cairo_rectangle( pCompositingCairo.get(), 0, 0, rSize.getX(), rSize.getY() );
191 cairo_clip( pCompositingCairo.get() );
192 cairo_save( pCompositingCairo.get() );
193 cairo_set_source_surface( pCompositingCairo.get(),
196 cairo_set_operator( pCompositingCairo.get(), CAIRO_OPERATOR_SOURCE );
197 cairo_paint( pCompositingCairo.get() );
198 cairo_restore( pCompositingCairo.get() );
204 { spriteRedraw( pCompositingCairo, rSprite ); }
208 cairo_rectangle( pWindowCairo.get(), 0, 0, rSize.getX(), rSize.getY() );
209 cairo_clip( pWindowCairo.get() );
210 cairo_set_source_surface( pWindowCairo.get(),
211 pCompositingSurface->getCairoSurface().get(),
213 cairo_set_operator( pWindowCairo.get(), CAIRO_OPERATOR_SOURCE );
214 cairo_paint( pWindowCairo.get() );
222 io_bSurfaceDirty =
false;
239 const ::basegfx::B2DRange& rMoveEnd,
240 const ::canvas::SpriteRedrawManager::UpdateArea& rUpdateArea )
244 "SpriteCanvasHelper::scrollUpdate(): NULL device pointer " );
246 SAL_INFO(
"canvas.cairo",
"SpriteCanvasHelper::scrollUpdate called");
249 const ::basegfx::B2IRange aOutputBounds( 0,0,
255 CairoSharedPtr pCompositingCairo = pCompositingSurface->getCairo();
265 const ::basegfx::B2IRange& rDestRect(
269 std::vector< ::basegfx::B2IRange > aUnscrollableAreas;
288 for(
const auto& rComponent : rUpdateArea.maComponentList )
290 const ::canvas::Sprite::Reference& rSprite( rComponent.second.getSprite() );
292 ::boost::polymorphic_downcast< Sprite* >( rSprite.get() )->redraw(
293 pCompositingCairo,
true );
298 const ::basegfx::B2IVector aSourceUpperLeftPos( aSourceRect.
getMinimum() );
302 aDestRect.intersect( aOutputBounds );
308 cairo_save( pScrollCairo.get() );
311 cairo_set_source_surface( pScrollCairo.get(),
312 pCompositingSurface->getCairoSurface().get(),
313 aDestPos.getX() - aSourceUpperLeftPos.getX(),
314 aDestPos.getY() - aSourceUpperLeftPos.getY() );
315 cairo_rectangle( pScrollCairo.get(),
316 aDestPos.getX(), aDestPos.getY(),
317 aScrollSize.getX(), aScrollSize.getY() );
318 cairo_clip( pScrollCairo.get() );
319 cairo_set_operator( pScrollCairo.get(), CAIRO_OPERATOR_SOURCE );
320 cairo_paint( pScrollCairo.get() );
321 cairo_restore( pScrollCairo.get() );
323 cairo_save( pCompositingCairo.get() );
325 cairo_set_source_surface( pCompositingCairo.get(),
326 pScrollSurface->getCairoSurface().get(),
328 cairo_rectangle( pCompositingCairo.get(),
329 aDestPos.getX(), aDestPos.getY(),
330 aScrollSize.getX(), aScrollSize.getY() );
331 cairo_clip( pCompositingCairo.get() );
332 cairo_set_operator( pCompositingCairo.get(), CAIRO_OPERATOR_SOURCE );
333 cairo_paint( pCompositingCairo.get() );
334 cairo_restore( pCompositingCairo.get() );
336 const ::canvas::SpriteRedrawManager::SpriteConnectedRanges::ComponentListType::const_iterator
337 aFirst( rUpdateArea.maComponentList.begin() );
338 ::canvas::SpriteRedrawManager::SpriteConnectedRanges::ComponentListType::const_iterator
343 "VCLCanvas::scrollUpdate(): no sprite" );
348 for(
const auto& rArea : aUnscrollableAreas )
349 opaqueUpdateSpriteArea( aFirst->second.getSprite(),
350 pCompositingCairo, rArea );
356 std::vector< ::basegfx::B2DRange > aUncoveredAreas;
357 ::basegfx::computeSetDifference( aUncoveredAreas,
358 rUpdateArea.maTotalBounds,
360 for(
const auto& rArea : aUncoveredAreas )
361 repaintBackground( pCompositingCairo,
364 cairo_rectangle( pWindowCairo.get(), 0, 0, rSize.getX(), rSize.getY() );
365 cairo_clip( pWindowCairo.get() );
366 cairo_set_source_surface( pWindowCairo.get(),
367 pCompositingSurface->getCairoSurface().get(),
369 cairo_set_operator( pWindowCairo.get(), CAIRO_OPERATOR_SOURCE );
370 cairo_paint( pWindowCairo.get() );
374 const std::vector< ::canvas::Sprite::Reference >& rSortedUpdateSprites )
378 "SpriteCanvasHelper::opaqueUpdate(): NULL device pointer " );
380 SAL_INFO(
"canvas.cairo",
"SpriteCanvasHelper::opaqueUpdate called");
386 CairoSharedPtr pCompositingCairo = pCompositingSurface->getCairo();
389 cairo_rectangle( pCompositingCairo.get(), 0, 0, rDeviceSize.getX(), rDeviceSize.getY() );
390 cairo_clip( pCompositingCairo.get() );
393 ::basegfx::B2DVector aSize( floor( rTotalArea.getMaxX() - aPos.getX() ), floor( rTotalArea.getMaxY() - aPos.getY() ) );
395 cairo_rectangle( pCompositingCairo.get(), aPos.getX(), aPos.getY(), aSize.
getX(), aSize.
getY() );
396 cairo_clip( pCompositingCairo.get() );
399 for(
const auto& rSprite : rSortedUpdateSprites )
402 ::boost::polymorphic_downcast< Sprite* >( rSprite.get() )->redraw(
403 pCompositingCairo,
false );
407 cairo_rectangle( pWindowCairo.get(), 0, 0, rDeviceSize.getX(), rDeviceSize.getY() );
408 cairo_clip( pWindowCairo.get() );
409 cairo_rectangle( pWindowCairo.get(), aPos.getX(), aPos.getY(), aSize.
getX(), aSize.
getY() );
410 cairo_clip( pWindowCairo.get() );
411 cairo_set_source_surface( pWindowCairo.get(),
412 pCompositingSurface->getCairoSurface().get(),
414 cairo_set_operator( pWindowCairo.get(), CAIRO_OPERATOR_SOURCE );
415 cairo_paint( pWindowCairo.get() );
419 const std::vector< ::canvas::Sprite::Reference >& rSortedUpdateSprites )
422 SAL_INFO(
"canvas.cairo",
"SpriteCanvasHelper::genericUpdate called");
426 "SpriteCanvasHelper::genericUpdate(): NULL device pointer " );
433 CairoSharedPtr pCompositingCairo = pCompositingSurface->getCairo();
440 const Point aOutputPosition(
442 static_cast< sal_Int32 >(rRequestedArea.getMinX()) ),
444 static_cast< sal_Int32 >(rRequestedArea.getMinY()) ) );
448 const Size aOutputSize(
450 ::canvas::tools::roundUp( rRequestedArea.getMaxX() - aOutputPosition.X()) ),
452 ::canvas::tools::roundUp( rRequestedArea.getMaxY() - aOutputPosition.Y()) ) );
454 cairo_rectangle( pCompositingCairo.get(), aOutputPosition.X(), aOutputPosition.Y(), aOutputSize.Width(), aOutputSize.Height() );
455 cairo_clip( pCompositingCairo.get() );
458 cairo_save( pCompositingCairo.get() );
459 cairo_set_source_surface( pCompositingCairo.get(),
462 cairo_set_operator( pCompositingCairo.get(), CAIRO_OPERATOR_SOURCE );
463 cairo_paint( pCompositingCairo.get() );
464 cairo_restore( pCompositingCairo.get() );
468 for(
const auto& rSprite : rSortedUpdateSprites )
471 ::boost::polymorphic_downcast< Sprite* >( rSprite.get() )->redraw(
472 pCompositingCairo,
true );
476 cairo_rectangle( pWindowCairo.get(), aOutputPosition.X(), aOutputPosition.Y(), aOutputSize.Width(), aOutputSize.Height() );
477 cairo_clip( pWindowCairo.get() );
478 cairo_set_source_surface( pWindowCairo.get(),
479 pCompositingSurface->getCairoSurface().get(),
481 cairo_set_operator( pWindowCairo.get(), CAIRO_OPERATOR_SOURCE );
482 cairo_paint( pWindowCairo.get() );
516 rNeededSize.getX(), rNeededSize.getY() );
void clearChangeRecords()
Clear sprite change records (typically directly after a screen update)
void backgroundPaint(const ::basegfx::B2DRange &rUpdateRect)
Gets called for simple background repaints.
void forEachSpriteArea(Functor &rFunc) const
Call given functor for each sprite area that needs an update.
const ::basegfx::B2ISize & getSizePixel() const
css::uno::Reference< css::rendering::XAnimatedSprite > createSpriteFromAnimation(const css::uno::Reference< css::rendering::XAnimation > &animation)
css::uno::Reference< css::rendering::XCustomSprite > createCustomSprite(const css::geometry::RealSize2D &spriteSize)
void opaqueUpdate(const ::basegfx::B2DRange &rTotalArea, const std::vector< ::canvas::Sprite::Reference > &rSortedUpdateSprites)
void genericUpdate(const ::basegfx::B2DRange &rTotalArea, const std::vector< ::canvas::Sprite::Reference > &rSortedUpdateSprites)
void disposing()
Release all references.
::cairo::SurfaceSharedPtr mpCompositingSurface
a surface used to composite the frontbuffer image
std::shared_ptr< cairo_t > CairoSharedPtr
This class manages smooth SpriteCanvas updates.
css::uno::Reference< css::rendering::XSprite > createClonedSprite(const css::uno::Reference< css::rendering::XSprite > &original)
bool updateScreen(const ::basegfx::B2IRange &rCurrArea, bool bUpdateAll, bool &io_bSurfaceDirty)
Actually perform the screen update.
std::shared_ptr< Surface > SurfaceSharedPtr
bool mbCompositingSurfaceDirty
::canvas::SpriteRedrawManager * mpRedrawManager
Set from the SpriteCanvas: instance coordinating sprite redraw.
::basegfx::B2ISize maCompositingSurfaceSize
B2IPoint getMinimum() const
::cairo::SurfaceSharedPtr const & getCompositingSurface(const ::basegfx::B2ISize &rNeededSize)
void init(::canvas::SpriteRedrawManager &rManager, SpriteCanvas &rOwningSpriteCanvas, const ::basegfx::B2ISize &rSize)
void forEachSprite(const Functor &rFunc) const
Call given functor for each active sprite.
void scrollUpdate(const ::basegfx::B2DRange &rMoveStart, const ::basegfx::B2DRange &rMoveEnd, const ::canvas::SpriteRedrawManager::UpdateArea &rUpdateArea)
Gets called when area can be handled by scrolling.
::cairo::SurfaceSharedPtr const & getWindowSurface() const
#define ENSURE_OR_THROW(c, m)
Product of this component's factory.
void init(const ::basegfx::B2ISize &rSizePixel, SurfaceProvider &rSurfaceProvider, css::rendering::XGraphicDevice *pDevice)
Initialize canvas helper.
::cairo::SurfaceSharedPtr createSurface(const ::basegfx::B2ISize &rNeededSize) const
#define SAL_INFO(area, stream)
css::uno::Reference< css::rendering::XAnimatedSprite > createSpriteFromBitmaps(const css::uno::Sequence< css::uno::Reference< css::rendering::XBitmap > > &animationBitmaps, sal_Int8 interpolationMode)
SpriteCanvas * mpOwningSpriteCanvas
Set from the init method. used to generate sprites.
::cairo::SurfaceSharedPtr mpTemporarySurface
a temporary surface that is guaranteed to be the same size
::cairo::SurfaceSharedPtr const & getTemporarySurface()
void disposing()
Dispose all internal references.
::cairo::SurfaceSharedPtr const & getBufferSurface() const