26#include <rtl/math.hxx>
29#include <com/sun/star/rendering/PanoseLetterForm.hpp>
30#include <com/sun/star/awt/FontSlant.hpp>
53 const ::cppcanvas::CanvasSharedPtr& rDestinationCanvas,
58 "ViewShape::prefetch(): no valid metafile!" );
60 if( rMtf != io_rCacheEntry.
mpMtf ||
72 if( rAttr->isFillColorValid() )
78 rAttr->getFillColor().getIntegerColor();
80 if( rAttr->isLineColorValid() )
86 rAttr->getLineColor().getIntegerColor();
88 if( rAttr->isCharColorValid() )
94 rAttr->getCharColor().getIntegerColor();
96 if( rAttr->isDimColorValid() )
106 rAttr->getDimColor().getIntegerColor();
108 if( rAttr->isFontFamilyValid() )
111 rAttr->getFontFamily();
113 if( rAttr->isCharScaleValid() )
121 aMatrix.
scale( rAttr->getCharScale(),
122 rAttr->getCharScale() );
127 if( rAttr->isCharWeightValid() )
134 rAttr->getCharWeight() / 20.0 ) ) ) );
136 if( rAttr->isCharPostureValid() )
139 rAttr->getCharPosture() == sal_Int16(awt::FontSlant_NONE) ?
140 rendering::PanoseLetterForm::ANYTHING :
141 rendering::PanoseLetterForm::OBLIQUE_CONTACT;
143 if( rAttr->isUnderlineModeValid() )
146 rAttr->getUnderlineMode();
154 io_rCacheEntry.
mpMtf = rMtf;
168 return static_cast< bool >(io_rCacheEntry.
mpRenderer);
174 const ::basegfx::B2DHomMatrix& rTransform,
175 const ::basegfx::B2DPolyPolygon* pClip,
183 pRenderer->setTransformation( rTransform );
184#if OSL_DEBUG_LEVEL >= 2
185 rendering::RenderState aRenderState;
186 ::canvas::tools::initRenderState(aRenderState);
187 ::canvas::tools::setRenderStateTransform(aRenderState,
189 aRenderState.DeviceColor.realloc(4);
190 aRenderState.DeviceColor[0] = 1.0;
191 aRenderState.DeviceColor[1] = 0.0;
192 aRenderState.DeviceColor[2] = 0.0;
193 aRenderState.DeviceColor[3] = 1.0;
197 rDestinationCanvas->getUNOCanvas()->drawLine( geometry::RealPoint2D(0.0,0.0),
198 geometry::RealPoint2D(1.0,1.0),
199 rDestinationCanvas->getViewState(),
201 rDestinationCanvas->getUNOCanvas()->drawLine( geometry::RealPoint2D(1.0,0.0),
202 geometry::RealPoint2D(0.0,1.0),
203 rDestinationCanvas->getViewState(),
206 catch( uno::Exception& )
212 pRenderer->setClip( *pClip );
214 pRenderer->setClip();
216 if( rSubsets.empty() )
218 return pRenderer->draw();
226 for(
const auto& rSubset : rSubsets )
228 if( !pRenderer->drawSubset( rSubset.getStartIndex(),
229 rSubset.getEndIndex() ) )
241 const ::basegfx::B2DRectangle& rUntransformedArea )
252 ::canvas::tools::calcTransformedRectBounds( aBoundsPixel,
254 rCanvasTransformation );
265 const ::basegfx::B2DHomMatrix& rShapeTransformation,
266 const ::basegfx::B2DHomMatrix& rCanvasTransformation,
271 return shapeArea2AreaPixel( rCanvasTransformation,
273 rShapeTransformation,
280 const ::basegfx::B2DRectangle& rOrigBounds,
281 const ::basegfx::B2DRectangle& rBounds,
282 const ::basegfx::B2DRectangle& rUnitBounds,
287 bool bIsVisible )
const
294 rUnitBounds.isEmpty() ||
295 rOrigBounds.isEmpty() ||
314 aNonTranslationalShapeTransformation.
scale( rOrigBounds.getWidth(),
315 rOrigBounds.getHeight() );
317 aShapeTransformation.
translate( rOrigBounds.getMinX(),
318 rOrigBounds.getMinY() );
320 const ::basegfx::B2DHomMatrix& rCanvasTransform(
321 rViewLayer->getSpriteTransformation() );
324 const ::basegfx::B2DRectangle& rSpriteBoundsPixel(
325 calcUpdateAreaPixel( rUnitBounds,
326 aShapeTransformation,
332 const ::basegfx::B2DRectangle& rShapeBoundsPixel(
334 aShapeTransformation,
343 const ::basegfx::B2DRectangle& rNominalShapeBoundsPixel(
344 shapeArea2AreaPixel( rCanvasTransform,
345 ::canvas::tools::calcTransformedRectBounds(
348 aNonTranslationalShapeTransformation ) ) );
352 auto aRange = rSpriteBoundsPixel.getRange();
364 mpSprite->resize( rSpriteSizePixel );
369 SAL_INFO(
"slideshow",
"ViewShape::renderSprite(): Rendering sprite " <<
384 aSpritePosPixel *= rCanvasTransform;
385 aSpritePosPixel -= rShapeBoundsPixel.getCenter() - rSpriteBoundsPixel.getMinimum();
391 auto aDifference = rSpriteBoundsPixel.getMinimum() - rNominalShapeBoundsPixel.getMinimum();
392 const basegfx::B2DSize rSpriteCorrectionOffset(aDifference.getX(), aDifference.getY());
397 const ::basegfx::B2DSize aAAOffset(
412 ::basegfx::fround( rSpriteCorrectionOffset.
getWidth() ),
413 ::basegfx::fround( rSpriteCorrectionOffset.
getHeight() ) ) );
418 mpSprite->movePixel( aSpritePosPixel );
420 rOrigBounds.getRange(),
431 mpSprite->setAlpha( (pAttr && pAttr->isAlphaValid()) ?
439 if( pAttr && pAttr->isClipValid() )
447 aViewTransform.
set( 0, 2, 0.0 );
448 aViewTransform.
set( 1, 2, 0.0 );
468 bRedrawRequired =
true;
480 if( !bRedrawRequired )
489 return draw( pContentCanvas,
492 aShapeTransformation,
499 const ::basegfx::B2DRectangle& rBounds,
500 const ::basegfx::B2DRectangle& rUpdateBounds,
504 bool bIsVisible )
const
512 SAL_INFO(
"slideshow",
"ViewShape::render(): skipping shape " <<
this );
534 if( !bRedrawRequired )
537 SAL_INFO(
"slideshow",
"ViewShape::render(): rendering shape " <<
540 rBounds.getMinX() <<
"," <<
541 rBounds.getMinY() <<
")" );
547 std::optional<basegfx::B2DPolyPolygon> aClip;
552 if( pAttr->isClipValid() )
553 aClip = pAttr->getClip();
559 if( pAttr->isAlphaValid() )
561 const double nAlpha( pAttr->getAlpha() );
563 if( !::basegfx::fTools::equalZero( nAlpha ) &&
564 !::rtl::math::approxEqual(nAlpha, 1.0) )
571 const ::basegfx::B2DHomMatrix aTransform(
583 const ::basegfx::B2DHomMatrix aCanvasTransform(
584 rDestinationCanvas->getTransformation() );
586 ::canvas::tools::calcTransformedRectBounds( aTmpRect,
592 const ::basegfx::B2ISize aBmpSize(
static_cast<sal_Int32
>( aTmpRect.
getWidth() )+1,
593 static_cast<sal_Int32
>( aTmpRect.
getHeight() )+1 );
600 const RendererCacheVector::iterator aCompositingSurface(
603 if( !aCompositingSurface->mpLastBitmapCanvas ||
604 aCompositingSurface->mpLastBitmapCanvas->getSize() != aBmpSize )
613 "ViewShape::render(): Could not create compositing surface");
615 aCompositingSurface->mpDestinationCanvas = rDestinationCanvas;
616 aCompositingSurface->mpLastBitmap = pBitmap;
617 aCompositingSurface->mpLastBitmapCanvas = pBitmap->getBitmapCanvas();
624 aCompositingSurface->mpLastBitmapCanvas );
627 aCompositingSurface->mpLastBitmap);
647 pBitmapCanvas->setTransformation( aAdjustedCanvasTransform );
657 if( !
draw( pBitmapCanvas,
661 !aClip ?
nullptr : &(*aClip),
677 "ViewShape::render(): View transformation is singular!" );
679 aBitmapTransform.
invert();
684 aBitmapTransform = aBitmapTransform * aTranslation;
685 pBitmap->setTransformation( aBitmapTransform );
688 pBitmap->drawAlphaModulated( nAlpha );
697 const ::basegfx::B2DHomMatrix aTransform(
701 return draw( rDestinationCanvas,
705 !aClip ?
nullptr : &(*aClip),
711 mpViewLayer(
std::move( xViewLayer )),
714 mbAnimationMode( false ),
715 mbForceUpdate( true )
729 RendererCacheVector::iterator aIter;
730 const RendererCacheVector::iterator aEnd(
maRenderers.end() );
736 { return rDestinationCanvas == rCacheEntry.getDestinationCanvas(); } ) ) == aEnd )
766 const RendererCacheVector::iterator aIter(
778 return aIter->mpRenderer;
783 return ::cppcanvas::RendererSharedPtr();
797 "ViewShape::getAntialiasingBorder(): Invalid ViewLayer canvas" );
799 const ::basegfx::B2DHomMatrix& rViewTransform(
809 return ::basegfx::B2DSize( nXBorder,
829 bool bIsVisible )
const
static T clamp(const T &rIn)
bool isInvertible() const
void set(sal_uInt16 nRow, sal_uInt16 nColumn, double fValue)
void translate(double fX, double fY)
void scale(double fX, double fY)
void transform(const basegfx::B2DHomMatrix &rMatrix)
static BitmapSharedPtr createAlphaBitmap(const CanvasSharedPtr &, const ::basegfx::B2ISize &rSize)
static constexpr auto ANTIALIASING_EXTRA_SIZE
static RendererSharedPtr createRenderer(const CanvasSharedPtr &rCanvas, const ::GDIMetaFile &rMtf, const Renderer::Parameters &rParms)
bool update(const GDIMetaFileSharedPtr &rMtf, const RenderArgs &rArgs, UpdateFlags nUpdateFlags, bool bIsVisible) const
Update the ViewShape.
::cppcanvas::RendererSharedPtr getRenderer(const ::cppcanvas::CanvasSharedPtr &rDestinationCanvas, const GDIMetaFileSharedPtr &rMtf, const ShapeAttributeLayerSharedPtr &rAttr) const
Retrieve renderer for given canvas and metafile.
::basegfx::B2DSize getAntialiasingBorder() const
Query dimension of a safety border around the shape for AA.
@ MAX_RENDER_CACHE_ENTRIES
bool render(const ::cppcanvas::CanvasSharedPtr &rDestinationCanvas, const GDIMetaFileSharedPtr &rMtf, const ::basegfx::B2DRectangle &rBounds, const ::basegfx::B2DRectangle &rUpdateBounds, UpdateFlags nUpdateFlags, const ShapeAttributeLayerSharedPtr &pAttr, const VectorOfDocTreeNodes &rSubsets, bool bIsVisible) const
Render shape to given canvas.
RendererCacheVector maRenderers
A set of cached mtf/canvas combinations.
bool renderSprite(const ViewLayerSharedPtr &rViewLayer, const GDIMetaFileSharedPtr &rMtf, const ::basegfx::B2DRectangle &rOrigBounds, const ::basegfx::B2DRectangle &rBounds, const ::basegfx::B2DRectangle &rUnitBounds, UpdateFlags nUpdateFlags, const ShapeAttributeLayerSharedPtr &pAttr, const VectorOfDocTreeNodes &rSubsets, double nPrio, bool bIsVisible) const
Render shape to an active sprite.
const ViewLayerSharedPtr & getViewLayer() const
Query the associated view layer of this shape.
void enterAnimationMode()
Notify the ViewShape that an animation starts now.
AnimatedSpriteSharedPtr mpSprite
The sprite object.
bool mbAnimationMode
If true, render() calls go to the sprite.
bool draw(const ::cppcanvas::CanvasSharedPtr &rDestinationCanvas, const GDIMetaFileSharedPtr &rMtf, const ShapeAttributeLayerSharedPtr &rAttr, const ::basegfx::B2DHomMatrix &rTransform, const ::basegfx::B2DPolyPolygon *pClip, const VectorOfDocTreeNodes &rSubsets) const
Draw with prefetched Renderer to stored canvas.
static bool prefetch(RendererCacheEntry &io_rCacheEntry, const ::cppcanvas::CanvasSharedPtr &rDestinationCanvas, const GDIMetaFileSharedPtr &rMtf, const ShapeAttributeLayerSharedPtr &rAttr)
Prefetch Renderer for given canvas.
RendererCacheVector::iterator getCacheEntry(const ::cppcanvas::CanvasSharedPtr &rDestinationCanvas) const
Retrieve a valid iterator to renderer cache entry.
ViewLayerSharedPtr mpViewLayer
The view layer this object is part of.
void leaveAnimationMode()
Notify the ViewShape that it is no longer animated.
ViewShape(ViewLayerSharedPtr xViewLayer)
Create a ViewShape for the given View.
bool mbForceUpdate
If true, shape needs full repaint (and the sprite a setup, if any)
void invalidateRenderer() const
#define ENSURE_OR_RETURN_FALSE(c, m)
#define ENSURE_OR_THROW(c, m)
#define DBG_UNHANDLED_EXCEPTION(...)
#define SAL_INFO(area, stream)
B2DHomMatrix createTranslateB2DHomMatrix(double fTranslateX, double fTranslateY)
std::shared_ptr< ::cppcanvas::Renderer > RendererSharedPtr
std::shared_ptr< BitmapCanvas > BitmapCanvasSharedPtr
std::shared_ptr< ::cppcanvas::Bitmap > BitmapSharedPtr
std::shared_ptr< Canvas > CanvasSharedPtr
::basegfx::B2DRectangle getShapeUpdateArea(const ::basegfx::B2DRectangle &rUnitBounds, const ::basegfx::B2DHomMatrix &rShapeTransform, const ShapeAttributeLayerSharedPtr &pAttr)
::std::shared_ptr< ShapeAttributeLayer > ShapeAttributeLayerSharedPtr
::std::vector< DocTreeNode > VectorOfDocTreeNodes
std::shared_ptr< ViewLayer > ViewLayerSharedPtr
::basegfx::B2DHomMatrix getShapeTransformation(const ::basegfx::B2DRectangle &rShapeBounds, const ShapeAttributeLayerSharedPtr &pAttr)
std::shared_ptr< GDIMetaFile > GDIMetaFileSharedPtr
::basegfx::B2DHomMatrix getSpriteTransformation(const ::basegfx::B2DVector &rPixelSize, const ::basegfx::B2DVector &rOrigSize, const ShapeAttributeLayerSharedPtr &pAttr)
std::weak_ptr< cppcanvas::CustomSprite > mpSprite
output surface (necessarily a sprite, won't otherwise be able to display anything before other sprite...
::std::optional< IntSRGBA > maFillColor
::std::optional< IntSRGBA > maTextColor
::std::optional< ::basegfx::B2DHomMatrix > maTextTransformation
::std::optional< IntSRGBA > maLineColor
::std::optional< OUString > maFontName
::std::optional< sal_Int8 > maFontWeight
::std::optional< bool > maFontUnderline
::std::optional< sal_Int8 > maFontLetterForm
const double mnShapePriority
const ::basegfx::B2DRectangle maUpdateBounds
const ::basegfx::B2DRectangle maOrigBounds
const ::basegfx::B2DRectangle maBounds
const VectorOfDocTreeNodes & mrSubsets
const ::basegfx::B2DRectangle maUnitBounds
const ShapeAttributeLayerSharedPtr & mrAttr
::cppcanvas::RendererSharedPtr mpRenderer
GDIMetaFileSharedPtr mpMtf
::cppcanvas::BitmapCanvasSharedPtr mpLastBitmapCanvas
::cppcanvas::BitmapSharedPtr mpLastBitmap
const ::cppcanvas::CanvasSharedPtr & getDestinationCanvas() const
::cppcanvas::CanvasSharedPtr mpDestinationCanvas