canvas/source/cairo/cairo_canvashelper.cxx | 19 canvas/source/directx/dx_vcltools.cxx | 6 cppcanvas/source/mtfrenderer/bitmapaction.cxx | 22 - cppcanvas/source/mtfrenderer/bitmapaction.hxx | 4 cppcanvas/source/mtfrenderer/implrenderer.cxx | 24 - cppcanvas/source/mtfrenderer/transparencygroupaction.cxx | 4 cppcanvas/source/wrapper/vclfactory.cxx | 4 drawinglayer/source/drawinglayeruno/xprimitive2drenderer.cxx | 10 include/cppcanvas/vclfactory.hxx | 4 include/vcl/BitmapTools.hxx | 1 include/vcl/canvastools.hxx | 8 sd/source/ui/presenter/PresenterHelper.cxx | 2 sd/source/ui/presenter/PresenterPreviewCache.cxx | 2 sd/source/ui/presenter/SlideRenderer.cxx | 2 sd/source/ui/slideshow/slideshowimpl.cxx | 10 slideshow/source/engine/shapes/viewmediashape.cxx | 4 vcl/source/bitmap/BitmapTools.cxx | 221 ++++++++++- vcl/source/helper/canvastools.cxx | 12 18 files changed, 279 insertions(+), 80 deletions(-)
New commits: commit 09298d001e98ed494ecb1df5cb563b081da050e8 Author: Noel Grandin <noelgran...@gmail.com> AuthorDate: Tue Jul 29 19:59:53 2025 +0200 Commit: Noel Grandin <noelgran...@gmail.com> CommitDate: Thu Aug 7 13:09:57 2025 +0200 BitmapEx->Bitmap in bitmapExFromXBitmap now that Bitmap can handle transparency Change-Id: Id87889a0e5ca0a3398f9baceee3474369eb0f7aa Reviewed-on: https://gerrit.libreoffice.org/c/core/+/188539 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/canvas/source/cairo/cairo_canvashelper.cxx b/canvas/source/cairo/cairo_canvashelper.cxx index 701ad1e47859..0170499c6abb 100644 --- a/canvas/source/cairo/cairo_canvashelper.cxx +++ b/canvas/source/cairo/cairo_canvashelper.cxx @@ -303,20 +303,20 @@ constexpr OUStringLiteral PARAMETRICPOLYPOLYGON_IMPLEMENTATION_NAME = u"Canvas:: return SurfaceSharedPtr(); } - static ::BitmapEx bitmapExFromXBitmap( const uno::Reference< rendering::XBitmap >& xBitmap ) + static ::Bitmap bitmapFromXBitmap( const uno::Reference< rendering::XBitmap >& xBitmap ) { // TODO(F1): Add support for floating point bitmap formats uno::Reference<rendering::XIntegerReadOnlyBitmap> xIntBmp(xBitmap, uno::UNO_QUERY_THROW); - ::BitmapEx aBmpEx = vcl::unotools::bitmapExFromXBitmap(xIntBmp); - if( !aBmpEx.IsEmpty() ) - return aBmpEx; + ::Bitmap aBmp = vcl::unotools::bitmapFromXBitmap(xIntBmp); + if( !aBmp.IsEmpty() ) + return aBmp; // TODO(F1): extract pixel from XBitmap interface ENSURE_OR_THROW( false, - "bitmapExFromXBitmap(): could not extract BitmapEx" ); + "bitmapFromXBitmap(): could not extract BitmapEx" ); - return ::BitmapEx(); + return ::Bitmap(); } /** surfaceFromXBitmap Create a surface from XBitmap @@ -338,13 +338,12 @@ constexpr OUStringLiteral PARAMETRICPOLYPOLYGON_IMPLEMENTATION_NAME = u"Canvas:: data = nullptr; else { - ::BitmapEx aBmpEx = bitmapExFromXBitmap(xBitmap); - ::Bitmap aBitmap = aBmpEx.GetBitmap(); + ::Bitmap aBitmap = bitmapFromXBitmap(xBitmap); // there's no pixmap for alpha bitmap. we might still // use rgb pixmap and only access alpha pixels the // slow way. now we just speedup rgb bitmaps - if( !aBmpEx.IsAlpha() ) + if( !aBitmap.HasAlpha() ) { pSurface = rSurfaceProvider->createSurface( aBitmap ); data = nullptr; @@ -355,7 +354,7 @@ constexpr OUStringLiteral PARAMETRICPOLYPOLYGON_IMPLEMENTATION_NAME = u"Canvas:: { tools::Long nWidth; tools::Long nHeight; - vcl::bitmap::CanvasCairoExtractBitmapData(aBmpEx, aBitmap, data, bHasAlpha, nWidth, nHeight); + vcl::bitmap::CanvasCairoExtractBitmapData(aBitmap, data, bHasAlpha, nWidth, nHeight); pSurface = rSurfaceProvider->getOutputDevice()->CreateSurface( CairoSurfaceSharedPtr( diff --git a/canvas/source/directx/dx_vcltools.cxx b/canvas/source/directx/dx_vcltools.cxx index 8e1201ae692f..4b11ffaea6d5 100644 --- a/canvas/source/directx/dx_vcltools.cxx +++ b/canvas/source/directx/dx_vcltools.cxx @@ -295,11 +295,11 @@ namespace dxcanvas::tools if( !xIntBmp.is() ) return false; - ::BitmapEx aBmpEx = vcl::unotools::bitmapExFromXBitmap( xIntBmp ); - if( aBmpEx.IsEmpty() ) + ::Bitmap aBmp = vcl::unotools::bitmapFromXBitmap( xIntBmp ); + if( aBmp.IsEmpty() ) return false; - return drawVCLBitmapEx( rGraphics, aBmpEx ); + return drawVCLBitmapEx( rGraphics, BitmapEx(aBmp) ); } } diff --git a/cppcanvas/source/mtfrenderer/bitmapaction.cxx b/cppcanvas/source/mtfrenderer/bitmapaction.cxx index 24e1f46faeb8..e205dd35fa10 100644 --- a/cppcanvas/source/mtfrenderer/bitmapaction.cxx +++ b/cppcanvas/source/mtfrenderer/bitmapaction.cxx @@ -46,11 +46,11 @@ namespace cppcanvas::internal class BitmapAction : public CachedPrimitiveBase { public: - BitmapAction( const ::BitmapEx&, + BitmapAction( const ::Bitmap&, const ::basegfx::B2DPoint& rDstPoint, const CanvasSharedPtr&, const OutDevState& ); - BitmapAction( const ::BitmapEx&, + BitmapAction( const ::Bitmap&, const ::basegfx::B2DPoint& rDstPoint, const ::basegfx::B2DVector& rDstSize, const CanvasSharedPtr&, @@ -76,12 +76,12 @@ namespace cppcanvas::internal }; - BitmapAction::BitmapAction( const ::BitmapEx& rBmpEx, + BitmapAction::BitmapAction( const ::Bitmap& rBmpEx, const ::basegfx::B2DPoint& rDstPoint, const CanvasSharedPtr& rCanvas, const OutDevState& rState ) : CachedPrimitiveBase( rCanvas, true ), - mxBitmap( vcl::unotools::xBitmapFromBitmapEx( rBmpEx ) ), + mxBitmap( vcl::unotools::xBitmapFromBitmap( rBmpEx ) ), mpCanvas( rCanvas ) { tools::initRenderState(maState,rState); @@ -101,13 +101,13 @@ namespace cppcanvas::internal nullptr ); } - BitmapAction::BitmapAction( const ::BitmapEx& rBmpEx, + BitmapAction::BitmapAction( const ::Bitmap& rBmp, const ::basegfx::B2DPoint& rDstPoint, const ::basegfx::B2DVector& rDstSize, const CanvasSharedPtr& rCanvas, const OutDevState& rState ) : CachedPrimitiveBase( rCanvas, true ), - mxBitmap( vcl::unotools::xBitmapFromBitmapEx( rBmpEx ) ), + mxBitmap( vcl::unotools::xBitmapFromBitmap( rBmp ) ), mpCanvas( rCanvas ) { tools::initRenderState(maState,rState); @@ -115,7 +115,7 @@ namespace cppcanvas::internal // Setup transformation such that the next render call is // moved rPoint away, and scaled according to the ratio // given by src and dst size. - const ::Size aBmpSize( rBmpEx.GetSizePixel() ); + const ::Size aBmpSize( rBmp.GetSizePixel() ); const ::basegfx::B2DVector aScale( rDstSize.getX() / aBmpSize.Width(), rDstSize.getY() / aBmpSize.Height() ); @@ -192,21 +192,21 @@ namespace cppcanvas::internal } } - std::shared_ptr<Action> BitmapActionFactory::createBitmapAction( const ::BitmapEx& rBmpEx, + std::shared_ptr<Action> BitmapActionFactory::createBitmapAction( const ::Bitmap& rBmp, const ::basegfx::B2DPoint& rDstPoint, const CanvasSharedPtr& rCanvas, const OutDevState& rState ) { - return std::make_shared<BitmapAction>(rBmpEx, rDstPoint, rCanvas, rState ); + return std::make_shared<BitmapAction>(rBmp, rDstPoint, rCanvas, rState ); } - std::shared_ptr<Action> BitmapActionFactory::createBitmapAction( const ::BitmapEx& rBmpEx, + std::shared_ptr<Action> BitmapActionFactory::createBitmapAction( const ::Bitmap& rBmp, const ::basegfx::B2DPoint& rDstPoint, const ::basegfx::B2DVector& rDstSize, const CanvasSharedPtr& rCanvas, const OutDevState& rState ) { - return std::make_shared<BitmapAction>(rBmpEx, + return std::make_shared<BitmapAction>(rBmp, rDstPoint, rDstSize, rCanvas, diff --git a/cppcanvas/source/mtfrenderer/bitmapaction.hxx b/cppcanvas/source/mtfrenderer/bitmapaction.hxx index 59bf841dabc0..d88686f59d09 100644 --- a/cppcanvas/source/mtfrenderer/bitmapaction.hxx +++ b/cppcanvas/source/mtfrenderer/bitmapaction.hxx @@ -44,13 +44,13 @@ namespace cppcanvas::internal namespace BitmapActionFactory { /// Unscaled bitmap action, only references destination point - std::shared_ptr<Action> createBitmapAction( const ::BitmapEx&, + std::shared_ptr<Action> createBitmapAction( const ::Bitmap&, const ::basegfx::B2DPoint& rDstPoint, const CanvasSharedPtr&, const OutDevState& ); /// Scaled bitmap action, dest point and dest size - std::shared_ptr<Action> createBitmapAction( const ::BitmapEx&, + std::shared_ptr<Action> createBitmapAction( const ::Bitmap&, const ::basegfx::B2DPoint& rDstPoint, const ::basegfx::B2DVector& rDstSize, const CanvasSharedPtr&, diff --git a/cppcanvas/source/mtfrenderer/implrenderer.cxx b/cppcanvas/source/mtfrenderer/implrenderer.cxx index 56cc42a9a432..bdedd4633a15 100644 --- a/cppcanvas/source/mtfrenderer/implrenderer.cxx +++ b/cppcanvas/source/mtfrenderer/implrenderer.cxx @@ -1683,8 +1683,8 @@ namespace cppcanvas::internal Graphic aGraphic; aFill.getGraphic( aGraphic ); - BitmapEx aBmpEx( aGraphic.GetBitmapEx() ); - const ::Size aBmpSize( aBmpEx.GetSizePixel() ); + Bitmap aBmp( aGraphic.GetBitmapEx() ); + const ::Size aBmpSize( aBmp.GetSizePixel() ); ::SvtGraphicFill::Transform aTransform; aFill.getTransform( aTransform ); @@ -1723,7 +1723,7 @@ namespace cppcanvas::internal aMatrix ); aTexture.Alpha = 1.0 - aFill.getTransparency(); - aTexture.Bitmap = vcl::unotools::xBitmapFromBitmapEx( aBmpEx ); + aTexture.Bitmap = vcl::unotools::xBitmapFromBitmap( aBmp ); if( aFill.isTiling() ) { aTexture.RepeatModeX = rendering::TexturingMode::REPEAT; @@ -2111,7 +2111,7 @@ namespace cppcanvas::internal std::shared_ptr<Action> pBmpAction( internal::BitmapActionFactory::createBitmapAction( - BitmapEx(pAct->GetBitmap()), + pAct->GetBitmap(), rStates.getState().mapModeTransform * vcl::unotools::b2DPointFromPoint( pAct->GetPoint() ), rCanvas, @@ -2134,7 +2134,7 @@ namespace cppcanvas::internal std::shared_ptr<Action> pBmpAction( internal::BitmapActionFactory::createBitmapAction( - BitmapEx(pAct->GetBitmap()), + pAct->GetBitmap(), rStates.getState().mapModeTransform * vcl::unotools::b2DPointFromPoint( pAct->GetPoint() ), rStates.getState().mapModeTransform * vcl::unotools::b2DVectorFromSize( pAct->GetSize() ), rCanvas, @@ -2164,7 +2164,7 @@ namespace cppcanvas::internal std::shared_ptr<Action> pBmpAction( internal::BitmapActionFactory::createBitmapAction( - BitmapEx(aBmp), + aBmp, rStates.getState().mapModeTransform * vcl::unotools::b2DPointFromPoint( pAct->GetDestPoint() ), rStates.getState().mapModeTransform * @@ -2189,7 +2189,7 @@ namespace cppcanvas::internal std::shared_ptr<Action> pBmpAction( internal::BitmapActionFactory::createBitmapAction( - pAct->GetBitmapEx(), + Bitmap(pAct->GetBitmapEx()), rStates.getState().mapModeTransform * vcl::unotools::b2DPointFromPoint( pAct->GetPoint() ), rCanvas, @@ -2212,7 +2212,7 @@ namespace cppcanvas::internal std::shared_ptr<Action> pBmpAction( internal::BitmapActionFactory::createBitmapAction( - pAct->GetBitmapEx(), + Bitmap(pAct->GetBitmapEx()), rStates.getState().mapModeTransform * vcl::unotools::b2DPointFromPoint( pAct->GetPoint() ), rStates.getState().mapModeTransform * @@ -2237,7 +2237,7 @@ namespace cppcanvas::internal // crop bitmap to given source rectangle (no // need to copy and convert the whole bitmap) - BitmapEx aBmp( pAct->GetBitmapEx() ); + Bitmap aBmp( pAct->GetBitmapEx() ); const ::tools::Rectangle aCropRect( pAct->GetSrcPoint(), pAct->GetSrcSize() ); aBmp.Crop( aCropRect ); @@ -2270,7 +2270,7 @@ namespace cppcanvas::internal // create masked BitmapEx right here, as the // canvas does not provide equivalent // functionality - BitmapEx aBmp( createMaskBmpEx( pAct->GetBitmap(), + Bitmap aBmp( createMaskBmpEx( pAct->GetBitmap(), pAct->GetColor() )); std::shared_ptr<Action> pBmpAction( @@ -2299,7 +2299,7 @@ namespace cppcanvas::internal // create masked BitmapEx right here, as the // canvas does not provide equivalent // functionality - BitmapEx aBmp( createMaskBmpEx( pAct->GetBitmap(), + Bitmap aBmp( createMaskBmpEx( pAct->GetBitmap(), pAct->GetColor() )); std::shared_ptr<Action> pBmpAction( @@ -2330,7 +2330,7 @@ namespace cppcanvas::internal // create masked BitmapEx right here, as the // canvas does not provide equivalent // functionality - BitmapEx aBmp( createMaskBmpEx( pAct->GetBitmap(), + Bitmap aBmp( createMaskBmpEx( pAct->GetBitmap(), pAct->GetColor() )); // crop bitmap to given source rectangle (no diff --git a/cppcanvas/source/mtfrenderer/transparencygroupaction.cxx b/cppcanvas/source/mtfrenderer/transparencygroupaction.cxx index dcf9c2aa9a68..9eea8f610a29 100644 --- a/cppcanvas/source/mtfrenderer/transparencygroupaction.cxx +++ b/cppcanvas/source/mtfrenderer/transparencygroupaction.cxx @@ -383,9 +383,9 @@ namespace cppcanvas::internal // update buffered bitmap and transformation BitmapSharedPtr aBmp( VCLFactory::createBitmap( mpCanvas, - BitmapEx(aVDev->GetBitmap( + aVDev->GetBitmap( aBitmapPoint, - aBitmapSizePixel ) ) )); + aBitmapSizePixel ) ) ); mxBufferBitmap = aBmp->getUNOBitmap(); maLastTransformation = aTotalTransform; maLastSubset = rSubset; diff --git a/cppcanvas/source/wrapper/vclfactory.cxx b/cppcanvas/source/wrapper/vclfactory.cxx index 825368859d1e..1c0137f82ccc 100644 --- a/cppcanvas/source/wrapper/vclfactory.cxx +++ b/cppcanvas/source/wrapper/vclfactory.cxx @@ -54,7 +54,7 @@ namespace cppcanvas } BitmapSharedPtr VCLFactory::createBitmap( const CanvasSharedPtr& rCanvas, - const ::BitmapEx& rBmpEx ) + const ::Bitmap& rBmp ) { OSL_ENSURE( rCanvas && rCanvas->getUNOCanvas().is(), "VCLFactory::createBitmap(): Invalid canvas" ); @@ -67,7 +67,7 @@ namespace cppcanvas return BitmapSharedPtr(); return std::make_shared<internal::ImplBitmap>( rCanvas, - vcl::unotools::xBitmapFromBitmapEx(rBmpEx) ); + vcl::unotools::xBitmapFromBitmap(rBmp) ); } RendererSharedPtr VCLFactory::createRenderer( const CanvasSharedPtr& rCanvas, diff --git a/drawinglayer/source/drawinglayeruno/xprimitive2drenderer.cxx b/drawinglayer/source/drawinglayeruno/xprimitive2drenderer.cxx index 0fea457deab3..bcb30cfcef90 100644 --- a/drawinglayer/source/drawinglayeruno/xprimitive2drenderer.cxx +++ b/drawinglayer/source/drawinglayeruno/xprimitive2drenderer.cxx @@ -143,7 +143,7 @@ namespace drawinglayer::unorenderer aPrimitive2DSequence)); primitive2d::Primitive2DContainer xEmbedSeq { xEmbedRef }; - BitmapEx aBitmapEx( + Bitmap aBitmap( convertToBitmapEx( std::move(xEmbedSeq), aViewInformation2D, @@ -151,11 +151,11 @@ namespace drawinglayer::unorenderer nDiscreteHeight, MaximumQuadraticPixels)); - if(!aBitmapEx.IsEmpty()) + if(!aBitmap.IsEmpty()) { - aBitmapEx.SetPrefMapMode(MapMode(MapUnit::Map100thMM)); - aBitmapEx.SetPrefSize(Size(basegfx::fround<tools::Long>(fWidth), basegfx::fround<tools::Long>(fHeight))); - XBitmap = vcl::unotools::xBitmapFromBitmapEx(aBitmapEx); + aBitmap.SetPrefMapMode(MapMode(MapUnit::Map100thMM)); + aBitmap.SetPrefSize(Size(basegfx::fround<tools::Long>(fWidth), basegfx::fround<tools::Long>(fHeight))); + XBitmap = vcl::unotools::xBitmapFromBitmap(aBitmap); } } } diff --git a/include/cppcanvas/vclfactory.hxx b/include/cppcanvas/vclfactory.hxx index 3d6ab24482ee..87929a87493f 100644 --- a/include/cppcanvas/vclfactory.hxx +++ b/include/cppcanvas/vclfactory.hxx @@ -28,7 +28,7 @@ #include <cppcanvas/cppcanvasdllapi.h> namespace vcl { class Window; } -class BitmapEx; +class Bitmap; class GDIMetaFile; @@ -62,7 +62,7 @@ namespace cppcanvas /** Create a bitmap from a VCL Bitmap */ - static BitmapSharedPtr createBitmap( const CanvasSharedPtr&, const ::BitmapEx& rBmpEx ); + static BitmapSharedPtr createBitmap( const CanvasSharedPtr&, const ::Bitmap& rBmp ); /** Create a renderer object from a Metafile diff --git a/include/vcl/BitmapTools.hxx b/include/vcl/BitmapTools.hxx index 0587f53196a0..675310212960 100644 --- a/include/vcl/BitmapTools.hxx +++ b/include/vcl/BitmapTools.hxx @@ -79,6 +79,7 @@ VCL_DLLPUBLIC css::uno::Sequence< sal_Int8 > GetMaskDIB(BitmapEx const & aBmpEx) * @param bHasAlpha will be set to true if resulting surface has alpha **/ VCL_DLLPUBLIC void CanvasCairoExtractBitmapData( BitmapEx const & rBmpEx, Bitmap const & rBitmap, unsigned char*& data, bool& bHasAlpha, tools::Long& rnWidth, tools::Long& rnHeight ); +VCL_DLLPUBLIC void CanvasCairoExtractBitmapData( Bitmap const & rBitmap, unsigned char*& data, bool& bHasAlpha, tools::Long& rnWidth, tools::Long& rnHeight ); VCL_DLLPUBLIC css::uno::Sequence< sal_Int8 > CanvasExtractBitmapData(BitmapEx const & rBitmapEx, const css::geometry::IntegerRectangle2D& rect); diff --git a/include/vcl/canvastools.hxx b/include/vcl/canvastools.hxx index 587283ebc58b..9d565634906e 100644 --- a/include/vcl/canvastools.hxx +++ b/include/vcl/canvastools.hxx @@ -31,7 +31,6 @@ class Point; class Size; namespace tools { class Rectangle; } class Bitmap; -class BitmapEx; class Color; namespace basegfx @@ -65,18 +64,11 @@ namespace vcl::unotools // Bitmap conversions - /** Create an XBitmap from VCL BitmapEx - */ - css::uno::Reference< css::rendering::XBitmap > - VCL_DLLPUBLIC xBitmapFromBitmapEx( const ::BitmapEx& inputBitmap ); /** Create an XBitmap from VCL Bitmap( */ css::uno::Reference< css::rendering::XBitmap > VCL_DLLPUBLIC xBitmapFromBitmap( const ::Bitmap& inputBitmap ); - /** Create a BitmapEx from an XBitmap - */ - ::BitmapEx VCL_DLLPUBLIC bitmapExFromXBitmap( const css::uno::Reference< css::rendering::XIntegerReadOnlyBitmap >& xInputBitmap ); /** Create a Bitmap from an XBitmap */ ::Bitmap VCL_DLLPUBLIC bitmapFromXBitmap( const css::uno::Reference< css::rendering::XIntegerReadOnlyBitmap >& xInputBitmap ); diff --git a/sd/source/ui/presenter/PresenterHelper.cxx b/sd/source/ui/presenter/PresenterHelper.cxx index 99e7d835a7b9..4c47322515ee 100644 --- a/sd/source/ui/presenter/PresenterHelper.cxx +++ b/sd/source/ui/presenter/PresenterHelper.cxx @@ -328,7 +328,7 @@ Reference<rendering::XBitmap> PresenterHelper::loadBitmap ( BitmapEx aBitmapEx(bmpid); cppcanvas::BitmapSharedPtr xBitmap( cppcanvas::VCLFactory::createBitmap(pCanvas, - aBitmapEx)); + Bitmap(aBitmapEx))); if (!xBitmap) return nullptr; return xBitmap->getUNOBitmap(); diff --git a/sd/source/ui/presenter/PresenterPreviewCache.cxx b/sd/source/ui/presenter/PresenterPreviewCache.cxx index ea1d65400980..84e53d4202f4 100644 --- a/sd/source/ui/presenter/PresenterPreviewCache.cxx +++ b/sd/source/ui/presenter/PresenterPreviewCache.cxx @@ -137,7 +137,7 @@ Reference<rendering::XBitmap> PresenterPreviewCache::getSlidePreview ( else return cppcanvas::VCLFactory::createBitmap( pCanvas, - aPreview)->getUNOBitmap(); + Bitmap(aPreview))->getUNOBitmap(); } void PresenterPreviewCache::addPreviewCreationNotifyListener ( diff --git a/sd/source/ui/presenter/SlideRenderer.cxx b/sd/source/ui/presenter/SlideRenderer.cxx index 54d13cd0eb08..149a4b229794 100644 --- a/sd/source/ui/presenter/SlideRenderer.cxx +++ b/sd/source/ui/presenter/SlideRenderer.cxx @@ -53,7 +53,7 @@ Reference<rendering::XBitmap> SlideRenderer::createPreviewForCanvas ( if (pCanvas) return cppcanvas::VCLFactory::createBitmap( pCanvas, - CreatePreview(rxSlide, rMaximalSize, nSuperSampleFactor))->getUNOBitmap(); + Bitmap(CreatePreview(rxSlide, rMaximalSize, nSuperSampleFactor)))->getUNOBitmap(); else return nullptr; } diff --git a/sd/source/ui/slideshow/slideshowimpl.cxx b/sd/source/ui/slideshow/slideshowimpl.cxx index e45eb04bbf4a..08ff8b9a6c5d 100644 --- a/sd/source/ui/slideshow/slideshowimpl.cxx +++ b/sd/source/ui/slideshow/slideshowimpl.cxx @@ -1258,7 +1258,7 @@ bool SlideshowImpl::startShowImpl( const Sequence< beans::PropertyValue >& aProp { BitmapEx waitSymbolBitmap(BMP_WAIT_ICON); const Reference<rendering::XBitmap> xBitmap( - vcl::unotools::xBitmapFromBitmapEx( waitSymbolBitmap ) ); + vcl::unotools::xBitmapFromBitmap( Bitmap(waitSymbolBitmap) ) ); if (xBitmap.is()) { mxShow->setProperty( @@ -1270,7 +1270,7 @@ bool SlideshowImpl::startShowImpl( const Sequence< beans::PropertyValue >& aProp BitmapEx pointerSymbolBitmap(BMP_POINTER_ICON); const Reference<rendering::XBitmap> xPointerBitmap( - vcl::unotools::xBitmapFromBitmapEx( pointerSymbolBitmap ) ); + vcl::unotools::xBitmapFromBitmap( Bitmap(pointerSymbolBitmap) ) ); if (xPointerBitmap.is()) { mxShow->setProperty( @@ -1313,7 +1313,7 @@ bool SlideshowImpl::startShowImpl( const Sequence< beans::PropertyValue >& aProp } BitmapEx prevSlideBm(prevSlidePath); const Reference<rendering::XBitmap> xPrevSBitmap( - vcl::unotools::xBitmapFromBitmapEx(prevSlideBm)); + vcl::unotools::xBitmapFromBitmap(Bitmap(prevSlideBm))); if (xPrevSBitmap.is()) { mxShow->setProperty(beans::PropertyValue(u"NavigationSlidePrev"_ustr, -1, @@ -1322,7 +1322,7 @@ bool SlideshowImpl::startShowImpl( const Sequence< beans::PropertyValue >& aProp } BitmapEx menuSlideBm(menuPath); const Reference<rendering::XBitmap> xMenuSBitmap( - vcl::unotools::xBitmapFromBitmapEx(menuSlideBm)); + vcl::unotools::xBitmapFromBitmap(Bitmap(menuSlideBm))); if (xMenuSBitmap.is()) { mxShow->setProperty(beans::PropertyValue(u"NavigationSlideMenu"_ustr, -1, @@ -1331,7 +1331,7 @@ bool SlideshowImpl::startShowImpl( const Sequence< beans::PropertyValue >& aProp } BitmapEx nextSlideBm(nextSlidePath); const Reference<rendering::XBitmap> xNextSBitmap( - vcl::unotools::xBitmapFromBitmapEx(nextSlideBm)); + vcl::unotools::xBitmapFromBitmap(Bitmap(nextSlideBm))); if (xNextSBitmap.is()) { mxShow->setProperty(beans::PropertyValue(u"NavigationSlideNext"_ustr, -1, diff --git a/slideshow/source/engine/shapes/viewmediashape.cxx b/slideshow/source/engine/shapes/viewmediashape.cxx index dbdb172fc40f..b773a5782cc4 100644 --- a/slideshow/source/engine/shapes/viewmediashape.cxx +++ b/slideshow/source/engine/shapes/viewmediashape.cxx @@ -175,9 +175,9 @@ namespace slideshow::internal } Graphic aGraphic(xGraphic); - const BitmapEx aBmp = aGraphic.GetBitmapEx(); + const Bitmap aBmp(aGraphic.GetBitmapEx()); - uno::Reference< rendering::XBitmap > xBitmap(vcl::unotools::xBitmapFromBitmapEx(aBmp)); + uno::Reference< rendering::XBitmap > xBitmap(vcl::unotools::xBitmapFromBitmap(aBmp)); rendering::ViewState aViewState; aViewState.AffineTransform = pCanvas->getViewState().AffineTransform; diff --git a/vcl/source/bitmap/BitmapTools.cxx b/vcl/source/bitmap/BitmapTools.cxx index 24cda45d4bc0..e176b48152e6 100644 --- a/vcl/source/bitmap/BitmapTools.cxx +++ b/vcl/source/bitmap/BitmapTools.cxx @@ -114,7 +114,7 @@ void loadFromSvg(SvStream& rStream, const OUString& sPath, Bitmap& rBitmap, doub if (xBitmap.is()) { const css::uno::Reference<css::rendering::XIntegerReadOnlyBitmap> xIntBmp(xBitmap, uno::UNO_QUERY_THROW); - rBitmap = Bitmap(vcl::unotools::bitmapExFromXBitmap(xIntBmp)); + rBitmap = vcl::unotools::bitmapFromXBitmap(xIntBmp); } } @@ -988,6 +988,225 @@ void CanvasCairoExtractBitmapData( BitmapEx const & aBmpEx, const Bitmap & aBitm } +/** + * @param data will be filled with alpha data, if xBitmap is alpha/transparent image + * @param bHasAlpha will be set to true if resulting surface has alpha + **/ +void CanvasCairoExtractBitmapData( const Bitmap & aBitmap, unsigned char*& data, bool& bHasAlpha, tools::Long& rnWidth, tools::Long& rnHeight ) +{ + BitmapScopedReadAccess pBitmapReadAcc( aBitmap ); + const tools::Long nWidth = rnWidth = pBitmapReadAcc->Width(); + const tools::Long nHeight = rnHeight = pBitmapReadAcc->Height(); + tools::Long nX, nY; + bool bIsAlpha = false; + + data = static_cast<unsigned char*>(malloc( nWidth*nHeight*4 )); + + tools::Long nOff = 0; + ::Color aColor; + unsigned int nAlpha = 255; + +#if !ENABLE_WASM_STRIP_PREMULTIPLY + vcl::bitmap::lookup_table const & premultiply_table = vcl::bitmap::get_premultiply_table(); +#endif + for( nY = 0; nY < nHeight; nY++ ) + { + ::Scanline pReadScan; + + switch( pBitmapReadAcc->GetScanlineFormat() ) + { + case ScanlineFormat::N8BitPal: + pReadScan = pBitmapReadAcc->GetScanline( nY ); + + for( nX = 0; nX < nWidth; nX++ ) + { +#ifdef OSL_BIGENDIAN + nAlpha = data[ nOff++ ] = 255; +#else + nAlpha = data[ nOff + 3 ] = 255; +#endif + aColor = pBitmapReadAcc->GetPaletteColor(*pReadScan++); + +#ifdef OSL_BIGENDIAN +#if ENABLE_WASM_STRIP_PREMULTIPLY + data[ nOff++ ] = vcl::bitmap::premultiply(aColor.GetRed(), nAlpha); + data[ nOff++ ] = vcl::bitmap::premultiply(aColor.GetGreen(), nAlpha); + data[ nOff++ ] = vcl::bitmap::premultiply(aColor.GetBlue(), nAlpha); +#else + data[ nOff++ ] = premultiply_table[nAlpha][aColor.GetRed()]; + data[ nOff++ ] = premultiply_table[nAlpha][aColor.GetGreen()]; + data[ nOff++ ] = premultiply_table[nAlpha][aColor.GetBlue()]; +#endif +#else +#if ENABLE_WASM_STRIP_PREMULTIPLY + data[ nOff++ ] = vcl::bitmap::premultiply(aColor.GetBlue(), nAlpha); + data[ nOff++ ] = vcl::bitmap::premultiply(aColor.GetGreen(), nAlpha); + data[ nOff++ ] = vcl::bitmap::premultiply(aColor.GetRed(), nAlpha); +#else + data[ nOff++ ] = premultiply_table[nAlpha][aColor.GetBlue()]; + data[ nOff++ ] = premultiply_table[nAlpha][aColor.GetGreen()]; + data[ nOff++ ] = premultiply_table[nAlpha][aColor.GetRed()]; +#endif + nOff++; +#endif + } + break; + case ScanlineFormat::N24BitTcBgr: + pReadScan = pBitmapReadAcc->GetScanline( nY ); + + for( nX = 0; nX < nWidth; nX++ ) + { +#ifdef OSL_BIGENDIAN + nAlpha = data[ nOff ] = 255; +#if ENABLE_WASM_STRIP_PREMULTIPLY + data[ nOff + 3 ] = vcl::bitmap::premultiply(*pReadScan++, nAlpha); + data[ nOff + 2 ] = vcl::bitmap::premultiply(*pReadScan++, nAlpha); + data[ nOff + 1 ] = vcl::bitmap::premultiply(*pReadScan++, nAlpha); +#else + data[ nOff + 3 ] = premultiply_table[nAlpha][*pReadScan++]; + data[ nOff + 2 ] = premultiply_table[nAlpha][*pReadScan++]; + data[ nOff + 1 ] = premultiply_table[nAlpha][*pReadScan++]; +#endif + nOff += 4; +#else + nAlpha = data[ nOff + 3 ] = 255; +#if ENABLE_WASM_STRIP_PREMULTIPLY + data[ nOff++ ] = vcl::bitmap::premultiply(*pReadScan++, nAlpha); + data[ nOff++ ] = vcl::bitmap::premultiply(*pReadScan++, nAlpha); + data[ nOff++ ] = vcl::bitmap::premultiply(*pReadScan++, nAlpha); +#else + data[ nOff++ ] = premultiply_table[nAlpha][*pReadScan++]; + data[ nOff++ ] = premultiply_table[nAlpha][*pReadScan++]; + data[ nOff++ ] = premultiply_table[nAlpha][*pReadScan++]; +#endif + nOff++; +#endif + } + break; + case ScanlineFormat::N24BitTcRgb: + pReadScan = pBitmapReadAcc->GetScanline( nY ); + + for( nX = 0; nX < nWidth; nX++ ) + { +#ifdef OSL_BIGENDIAN + nAlpha = data[ nOff++ ] = 255; +#if ENABLE_WASM_STRIP_PREMULTIPLY + data[ nOff++ ] = vcl::bitmap::premultiply(*pReadScan++, nAlpha); + data[ nOff++ ] = vcl::bitmap::premultiply(*pReadScan++, nAlpha); + data[ nOff++ ] = vcl::bitmap::premultiply(*pReadScan++, nAlpha); +#else + data[ nOff++ ] = premultiply_table[nAlpha][*pReadScan++]; + data[ nOff++ ] = premultiply_table[nAlpha][*pReadScan++]; + data[ nOff++ ] = premultiply_table[nAlpha][*pReadScan++]; +#endif +#else + nAlpha = data[ nOff + 3 ] = 255; +#if ENABLE_WASM_STRIP_PREMULTIPLY + data[ nOff++ ] = vcl::bitmap::premultiply(pReadScan[ 2 ], nAlpha); + data[ nOff++ ] = vcl::bitmap::premultiply(pReadScan[ 1 ], nAlpha); + data[ nOff++ ] = vcl::bitmap::premultiply(pReadScan[ 0 ], nAlpha); +#else + data[ nOff++ ] = premultiply_table[nAlpha][pReadScan[ 2 ]]; + data[ nOff++ ] = premultiply_table[nAlpha][pReadScan[ 1 ]]; + data[ nOff++ ] = premultiply_table[nAlpha][pReadScan[ 0 ]]; +#endif + pReadScan += 3; + nOff++; +#endif + } + break; + case ScanlineFormat::N32BitTcBgra: + bIsAlpha = true; + [[fallthrough]]; + case ScanlineFormat::N32BitTcBgrx: + pReadScan = pBitmapReadAcc->GetScanline( nY ); + + for( nX = 0; nX < nWidth; nX++ ) + { +#ifdef OSL_BIGENDIAN + if( bIsAlpha ) + nAlpha = data[ nOff++ ]; + else + nAlpha = data[ nOff++ ] = 255; +#if ENABLE_WASM_STRIP_PREMULTIPLY + data[ nOff++ ] = vcl::bitmap::premultiply(pReadScan[ 2 ], nAlpha); + data[ nOff++ ] = vcl::bitmap::premultiply(pReadScan[ 1 ], nAlpha); + data[ nOff++ ] = vcl::bitmap::premultiply(pReadScan[ 0 ], nAlpha); +#else + data[ nOff++ ] = premultiply_table[nAlpha][pReadScan[ 2 ]]; + data[ nOff++ ] = premultiply_table[nAlpha][pReadScan[ 1 ]]; + data[ nOff++ ] = premultiply_table[nAlpha][pReadScan[ 0 ]]; +#endif + pReadScan += 4; +#else + if( bIsAlpha ) + nAlpha = data[ nOff + 3 ]; + else + nAlpha = data[ nOff + 3 ] = 255; +#if ENABLE_WASM_STRIP_PREMULTIPLY + data[ nOff++ ] = vcl::bitmap::premultiply(*pReadScan++, nAlpha); + data[ nOff++ ] = vcl::bitmap::premultiply(*pReadScan++, nAlpha); + data[ nOff++ ] = vcl::bitmap::premultiply(*pReadScan++, nAlpha); +#else + data[ nOff++ ] = premultiply_table[nAlpha][*pReadScan++]; + data[ nOff++ ] = premultiply_table[nAlpha][*pReadScan++]; + data[ nOff++ ] = premultiply_table[nAlpha][*pReadScan++]; +#endif + pReadScan++; + nOff++; +#endif + } + break; + case ScanlineFormat::N32BitTcRgba: + bIsAlpha = true; + [[fallthrough]]; + case ScanlineFormat::N32BitTcRgbx: + pReadScan = pBitmapReadAcc->GetScanline( nY ); + + for( nX = 0; nX < nWidth; nX++ ) + { +#ifdef OSL_BIGENDIAN + if( bIsAlpha ) + nAlpha = data[ nOff ++ ]; + else + nAlpha = data[ nOff ++ ] = 255; +#if ENABLE_WASM_STRIP_PREMULTIPLY + data[ nOff++ ] = vcl::bitmap::premultiply(*pReadScan++, nAlpha); + data[ nOff++ ] = vcl::bitmap::premultiply(*pReadScan++, nAlpha); + data[ nOff++ ] = vcl::bitmap::premultiply(*pReadScan++, nAlpha); +#else + data[ nOff++ ] = premultiply_table[nAlpha][*pReadScan++]; + data[ nOff++ ] = premultiply_table[nAlpha][*pReadScan++]; + data[ nOff++ ] = premultiply_table[nAlpha][*pReadScan++]; +#endif + pReadScan++; +#else + if( bIsAlpha ) + nAlpha = data[ nOff + 3 ]; + else + nAlpha = data[ nOff + 3 ] = 255; +#if ENABLE_WASM_STRIP_PREMULTIPLY + data[ nOff++ ] = vcl::bitmap::premultiply(pReadScan[ 2 ], nAlpha); + data[ nOff++ ] = vcl::bitmap::premultiply(pReadScan[ 1 ], nAlpha); + data[ nOff++ ] = vcl::bitmap::premultiply(pReadScan[ 0 ], nAlpha); +#else + data[ nOff++ ] = premultiply_table[nAlpha][pReadScan[ 2 ]]; + data[ nOff++ ] = premultiply_table[nAlpha][pReadScan[ 1 ]]; + data[ nOff++ ] = premultiply_table[nAlpha][pReadScan[ 0 ]]; +#endif + pReadScan += 4; + nOff++; +#endif + } + break; + default: + assert(false && "unknown format"); + } + } + + bHasAlpha = bIsAlpha; +} + uno::Sequence< sal_Int8 > CanvasExtractBitmapData(BitmapEx const & rBitmapEx, const geometry::IntegerRectangle2D& rect) { const Bitmap& aBitmap( rBitmapEx.GetBitmap() ); diff --git a/vcl/source/helper/canvastools.cxx b/vcl/source/helper/canvastools.cxx index 7dbfbc649c1d..6b7f7747e0ad 100644 --- a/vcl/source/helper/canvastools.cxx +++ b/vcl/source/helper/canvastools.cxx @@ -49,13 +49,6 @@ using namespace ::com::sun::star; namespace vcl::unotools { - uno::Reference< rendering::XBitmap > xBitmapFromBitmapEx(const ::BitmapEx& inputBitmap ) - { - SAL_INFO( "vcl.helper", "vcl::unotools::xBitmapFromBitmapEx()" ); - - return new vcl::unotools::VclCanvasBitmap( Bitmap(inputBitmap) ); - } - uno::Reference< rendering::XBitmap > xBitmapFromBitmap(const ::Bitmap& inputBitmap ) { SAL_INFO( "vcl.helper", "vcl::unotools::xBitmapFromBitmapEx()" ); @@ -156,11 +149,6 @@ namespace vcl::unotools } } - ::BitmapEx bitmapExFromXBitmap( const uno::Reference< rendering::XIntegerReadOnlyBitmap >& xInputBitmap ) - { - return BitmapEx(bitmapFromXBitmap(xInputBitmap)); - } - ::Bitmap bitmapFromXBitmap( const uno::Reference< rendering::XIntegerReadOnlyBitmap >& xInputBitmap ) { SAL_INFO( "vcl.helper", "vcl::unotools::bitmapExFromXBitmap()" );