diff options
Diffstat (limited to 'cppcanvas')
28 files changed, 408 insertions, 215 deletions
diff --git a/cppcanvas/CppunitTest_cppcanvas_emfplus.mk b/cppcanvas/CppunitTest_cppcanvas_emfplus.mk index ee47d8af0a18..7e692bdd53e0 100644 --- a/cppcanvas/CppunitTest_cppcanvas_emfplus.mk +++ b/cppcanvas/CppunitTest_cppcanvas_emfplus.mk @@ -25,6 +25,7 @@ $(eval $(call gb_CppunitTest_use_libraries,cppcanvas_emfplus, \ test \ tl \ unotest \ + utl \ vcl \ )) diff --git a/cppcanvas/CppunitTest_cppcanvas_test.mk b/cppcanvas/CppunitTest_cppcanvas_test.mk index e6e7a39d3bae..9e9a1c9eaf60 100644 --- a/cppcanvas/CppunitTest_cppcanvas_test.mk +++ b/cppcanvas/CppunitTest_cppcanvas_test.mk @@ -39,7 +39,8 @@ $(eval $(call gb_CppunitTest_use_ure,cppcanvas_test)) $(eval $(call gb_CppunitTest_use_vcl,cppcanvas_test)) $(eval $(call gb_CppunitTest_use_components,cppcanvas_test,\ - canvas/source/cairo/cairocanvas \ + $(if $(ENABLE_CAIRO_CANVAS),canvas/source/cairo/cairocanvas) \ + canvas/source/vcl/vclcanvas \ canvas/source/factory/canvasfactory \ configmgr/source/configmgr \ i18npool/util/i18npool \ diff --git a/cppcanvas/Module_cppcanvas.mk b/cppcanvas/Module_cppcanvas.mk index b341bc00d60b..2522c0a02007 100644 --- a/cppcanvas/Module_cppcanvas.mk +++ b/cppcanvas/Module_cppcanvas.mk @@ -25,11 +25,11 @@ $(eval $(call gb_Module_add_targets,cppcanvas,\ )) # FIXME: should generalize these ... -ifeq ($(ENABLE_CAIRO_CANVAS),TRUE) $(eval $(call gb_Module_add_check_targets,cppcanvas,\ CppunitTest_cppcanvas_test \ )) +ifeq ($(ENABLE_CAIRO_CANVAS),TRUE) ifneq ($(DISPLAY),) $(eval $(call gb_Module_add_slowcheck_targets,cppcanvas,\ CppunitTest_cppcanvas_emfplus \ diff --git a/cppcanvas/inc/pch/precompiled_cppcanvas.hxx b/cppcanvas/inc/pch/precompiled_cppcanvas.hxx index 44c0bb3db4c4..408286c2ac96 100644 --- a/cppcanvas/inc/pch/precompiled_cppcanvas.hxx +++ b/cppcanvas/inc/pch/precompiled_cppcanvas.hxx @@ -77,7 +77,6 @@ #include <vcl/dllapi.h> #include <vcl/mapmod.hxx> #include <vcl/region.hxx> -#include <vcl/scopedbitmapaccess.hxx> #include <vcl/vclenum.hxx> #endif // PCH_LEVEL >= 2 #if PCH_LEVEL >= 3 diff --git a/cppcanvas/qa/extras/emfplus/emfplus.cxx b/cppcanvas/qa/extras/emfplus/emfplus.cxx index 6866310b5508..1ba179404f28 100644 --- a/cppcanvas/qa/extras/emfplus/emfplus.cxx +++ b/cppcanvas/qa/extras/emfplus/emfplus.cxx @@ -7,15 +7,12 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include <com/sun/star/frame/Desktop.hpp> +#include <test/unoapi_test.hxx> -#include <comphelper/processfactory.hxx> -#include <sfx2/app.hxx> #include <sfx2/objsh.hxx> #include <sfx2/sfxbasemodel.hxx> -#include <test/unoapi_test.hxx> #include <vcl/BitmapReadAccess.hxx> -#include <vcl/pngwrite.hxx> +#include <vcl/filter/PngImageWriter.hxx> #include <vcl/gdimtf.hxx> #include <tools/stream.hxx> @@ -29,29 +26,9 @@ public: { } - virtual void setUp() override - { - UnoApiTest::setUp(); - mxDesktop.set( - frame::Desktop::create(comphelper::getComponentContext(getMultiServiceFactory()))); - SfxApplication::GetOrCreate(); - }; - - virtual void tearDown() override - { - if (mxComponent.is()) - { - closeDocument(mxComponent); - mxComponent->dispose(); - } - UnoApiTest::tearDown(); - }; - Bitmap load(const char* pName) { - OUString aFileURL; - createFileURL(OUString::createFromAscii(pName), aFileURL); - mxComponent = loadFromDesktop(aFileURL, "com.sun.star.drawing.DrawingDocument"); + loadFromFile(OUString::createFromAscii(pName)); SfxBaseModel* pModel = dynamic_cast<SfxBaseModel*>(mxComponent.get()); CPPUNIT_ASSERT(pModel); SfxObjectShell* pShell = pModel->GetObjectShell(); @@ -63,20 +40,18 @@ public: if (pEnv) { SvFileStream aStream(OUString::fromUtf8(pEnv), StreamMode::WRITE); - vcl::PNGWriter aWriter(aResultBitmap); - CPPUNIT_ASSERT(aWriter.Write(aStream)); + vcl::PngImageWriter aWriter(aStream); + CPPUNIT_ASSERT(aWriter.write(aResultBitmap)); } return aResultBitmap.GetBitmap(); } - - uno::Reference<lang::XComponent> mxComponent; }; CPPUNIT_TEST_FIXTURE(Test, testFdo77229) { Bitmap aBitmap = load("fdo77229.emf"); - Bitmap::ScopedReadAccess pAccess(aBitmap); + BitmapScopedReadAccess pAccess(aBitmap); // The green star was missing. Color aColor(pAccess->GetPixel(284, 280)); CPPUNIT_ASSERT_EQUAL(sal_uInt8(0), aColor.GetRed()); diff --git a/cppcanvas/qa/unit/test.cxx b/cppcanvas/qa/unit/test.cxx index 303eecd86a16..ad278f10834b 100644 --- a/cppcanvas/qa/unit/test.cxx +++ b/cppcanvas/qa/unit/test.cxx @@ -7,65 +7,99 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include <sal/config.h> +#include <config_cairo_canvas.h> -#include <test/bootstrapfixture.hxx> +#include <sal/config.h> #include <vcl/wrkwin.hxx> #include <vcl/canvastools.hxx> +#include <vcl/virdev.hxx> +#include <vcl/gdimtf.hxx> +#include <vcl/metaact.hxx> #include <com/sun/star/rendering/XBitmap.hpp> #include <com/sun/star/rendering/XCanvas.hpp> #include <com/sun/star/rendering/XBitmapCanvas.hpp> +#include <cppcanvas/vclfactory.hxx> + using namespace ::com::sun::star; -class CanvasTest : public test::BootstrapFixture +static std::ostream& operator<<(std::ostream& rStream, const KernArray& rArray) { -public: - CanvasTest() : BootstrapFixture(true, false) {} + if (rArray.empty()) + { + rStream << "{ }"; + return rStream; + } - void testComposite(); + rStream << "{ "; + for (size_t i = 0; i < rArray.size() - 1; i++) + rStream << rArray[i] << ", "; + rStream << rArray.back(); + rStream << " }"; + return rStream; +} + +static std::ostream& operator<<(std::ostream& rStream, const std::vector<sal_Bool>& rVec) +{ + if (rVec.empty()) + { + rStream << "{ }"; + return rStream; + } + + rStream << "{ "; + for (size_t i = 0; i < rVec.size() - 1; i++) + rStream << std::boolalpha << bool(rVec[i]) << ", "; + rStream << std::boolalpha << bool(rVec.back()); + rStream << " }"; + return rStream; +} - CPPUNIT_TEST_SUITE(CanvasTest); - CPPUNIT_TEST(testComposite); - CPPUNIT_TEST_SUITE_END(); +#include <test/bootstrapfixture.hxx> + +class CanvasTest : public test::BootstrapFixture +{ +public: + CanvasTest() + : BootstrapFixture(true, false) + { + } }; -void CanvasTest::testComposite() +CPPUNIT_TEST_FIXTURE(CanvasTest, testComposite) { -#ifdef LINUX - ScopedVclPtrInstance<WorkWindow> pWin( nullptr, WB_STDWORK ); + ScopedVclPtrInstance<WorkWindow> pWin(nullptr, WB_STDWORK); - uno::Reference<rendering::XCanvas> xCanvas = pWin->GetOutDev()->GetCanvas (); - if( !xCanvas.is() ) - return; // can't get a canvas working at all - truly headless ? + uno::Reference<rendering::XCanvas> xCanvas = pWin->GetOutDev()->GetCanvas(); + CPPUNIT_ASSERT(xCanvas.is()); // a huge canvas ... - Size aSize (1, 1); - uno::Reference<rendering::XBitmap> xBitmap = xCanvas->getDevice ()->createCompatibleAlphaBitmap( - vcl::unotools::integerSize2DFromSize( aSize ) ); - CPPUNIT_ASSERT( xBitmap.is() ); + Size aSize(1, 1); + uno::Reference<rendering::XBitmap> xBitmap = xCanvas->getDevice()->createCompatibleAlphaBitmap( + vcl::unotools::integerSize2DFromSize(aSize)); + CPPUNIT_ASSERT(xBitmap.is()); - uno::Reference< rendering::XBitmapCanvas > xBitmapCanvas( xBitmap, uno::UNO_QUERY ); - CPPUNIT_ASSERT( xBitmapCanvas.is() ); + uno::Reference<rendering::XBitmapCanvas> xBitmapCanvas(xBitmap, uno::UNO_QUERY); + CPPUNIT_ASSERT(xBitmapCanvas.is()); BitmapEx aBitmapEx; { // clear the canvas and basic sanity check ... xBitmapCanvas->clear(); - CPPUNIT_ASSERT( aBitmapEx.Create( xBitmapCanvas, aSize ) ); - CPPUNIT_ASSERT( aBitmapEx.IsAlpha() ); - CPPUNIT_ASSERT( !aBitmapEx.GetAlpha().IsEmpty() ); + CPPUNIT_ASSERT(aBitmapEx.Create(xBitmapCanvas, aSize)); + CPPUNIT_ASSERT(aBitmapEx.IsAlpha()); + CPPUNIT_ASSERT(!aBitmapEx.GetAlphaMask().IsEmpty()); } { // render something rendering::RenderState aDefaultState; - uno::Sequence< double > aRedTransparent{ 1.0, // R - 0.0, // G - 0.0, // B - 0.5 }; // A + uno::Sequence<double> aRedTransparent{ 1.0, // R + 0.0, // G + 0.0, // B + 0.5 }; // A aDefaultState.DeviceColor = aRedTransparent; #if 0 // words fail me to describe the sheer beauty of allocating a UNO @@ -74,11 +108,100 @@ void CanvasTest::testComposite() XCachedPrimitive fillPolyPolygon( [in] XPolyPolygon2D xPolyPolygon, [in] ViewState aViewState, [in] RenderState aRenderState ) #endif } - -#endif } -CPPUNIT_TEST_SUITE_REGISTRATION(CanvasTest); +CPPUNIT_TEST_FIXTURE(CanvasTest, testTdf155810) +{ + GDIMetaFile aInputMetaFile, aOutputMetaFile; + KernArray aDXArray; + std::vector<sal_Bool> aKashidaArray; + + // First create a meta file with a text array action that has Kashida adjustments. + { + ScopedVclPtrInstance<VirtualDevice> pDev; + + vcl::Font aFont(u"Noto Naskh Arabic"_ustr, u"Regular"_ustr, Size(0, 72)); + pDev->SetFont(aFont); + + aInputMetaFile.Record(pDev.get()); + + OUString aText(u"خالد"_ustr); + pDev->GetTextArray(aText, &aDXArray); + + auto nKashida = 200; + aDXArray.set(0, aDXArray[0] + nKashida); + aDXArray.set(2, aDXArray[2] + nKashida); + aKashidaArray = { true, false, true, false }; + + pDev->DrawTextArray(Point(0, 0), aText, aDXArray, aKashidaArray, 0, -1); + + aInputMetaFile.Stop(); + } + + // Then draw it using canvas + { + ScopedVclPtrInstance<VirtualDevice> pDev; + + aOutputMetaFile.Record(pDev.get()); + + auto xCanvas = pDev->GetCanvas(); + CPPUNIT_ASSERT(xCanvas.is()); + auto pCanvas = cppcanvas::VCLFactory::createCanvas(xCanvas); + + auto pRenderer = cppcanvas::VCLFactory::createRenderer(pCanvas, aInputMetaFile, {}); + pRenderer->draw(); + + aOutputMetaFile.Stop(); + } + + // Then check that the text array drawn by the canvas renderer didn’t loose + // the Kashida insertion positions. + { + auto pInputAction = aInputMetaFile.GetAction(aInputMetaFile.GetActionSize() - 1); + auto pOutputAction = aOutputMetaFile.GetAction(aOutputMetaFile.GetActionSize() - 2); + + CPPUNIT_ASSERT_EQUAL(MetaActionType::TEXTARRAY, pInputAction->GetType()); + CPPUNIT_ASSERT_EQUAL(pInputAction->GetType(), pOutputAction->GetType()); + + MetaTextArrayAction* pInputTextAction = static_cast<MetaTextArrayAction*>(pInputAction); + MetaTextArrayAction* pOutputTextAction = static_cast<MetaTextArrayAction*>(pOutputAction); + + CPPUNIT_ASSERT_EQUAL(pInputTextAction->GetDXArray(), aDXArray); + CPPUNIT_ASSERT_EQUAL(pInputTextAction->GetDXArray(), pOutputTextAction->GetDXArray()); + + CPPUNIT_ASSERT_EQUAL(pInputTextAction->GetKashidaArray(), aKashidaArray); + CPPUNIT_ASSERT_EQUAL(pInputTextAction->GetKashidaArray(), + pOutputTextAction->GetKashidaArray()); + } + + // Now, test drawSubset + { + ScopedVclPtrInstance<VirtualDevice> pDev; + + aOutputMetaFile.Clear(); + aOutputMetaFile.Record(pDev.get()); + + auto xCanvas = pDev->GetCanvas(); + CPPUNIT_ASSERT(xCanvas.is()); + auto pCanvas = cppcanvas::VCLFactory::createCanvas(xCanvas); + + auto pRenderer = cppcanvas::VCLFactory::createRenderer(pCanvas, aInputMetaFile, {}); + pRenderer->drawSubset(1, 3); + + aOutputMetaFile.Stop(); + } + + { + auto pOutputAction = aOutputMetaFile.GetAction(aOutputMetaFile.GetActionSize() - 2); + + CPPUNIT_ASSERT_EQUAL(MetaActionType::TEXTARRAY, pOutputAction->GetType()); + + MetaTextArrayAction* pOutputTextAction = static_cast<MetaTextArrayAction*>(pOutputAction); + std::vector<sal_Bool> aSubsetKashidaArray({ false, true }); + + CPPUNIT_ASSERT_EQUAL(aSubsetKashidaArray, pOutputTextAction->GetKashidaArray()); + } +} CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/cppcanvas/source/inc/canvasgraphichelper.hxx b/cppcanvas/source/inc/canvasgraphichelper.hxx index 0716199ddbeb..03f6b91b6f46 100644 --- a/cppcanvas/source/inc/canvasgraphichelper.hxx +++ b/cppcanvas/source/inc/canvasgraphichelper.hxx @@ -41,7 +41,7 @@ namespace cppcanvas::internal class CanvasGraphicHelper : public virtual CanvasGraphic { public: - CanvasGraphicHelper( const CanvasSharedPtr& rParentCanvas ); + CanvasGraphicHelper( CanvasSharedPtr xParentCanvas ); // CanvasGraphic implementation virtual void setTransformation( const ::basegfx::B2DHomMatrix& rMatrix ) override; diff --git a/cppcanvas/source/inc/implrenderer.hxx b/cppcanvas/source/inc/implrenderer.hxx index 4e39cea723dc..1f367280598f 100644 --- a/cppcanvas/source/inc/implrenderer.hxx +++ b/cppcanvas/source/inc/implrenderer.hxx @@ -22,8 +22,8 @@ #include <sal/config.h> #include <sal/types.h> -#include <o3tl/span.hxx> #include <tools/stream.hxx> +#include <utility> #include <vcl/metaactiontypes.hxx> #include <cppcanvas/renderer.hxx> #include <cppcanvas/canvas.hxx> @@ -35,6 +35,7 @@ #include <osl/diagnose.h> #include <memory> +#include <span> #include <vector> class GDIMetaFile; @@ -137,9 +138,9 @@ namespace cppcanvas::internal // public, since some functors need it, too. struct MtfAction { - MtfAction( const std::shared_ptr<Action>& rAction, + MtfAction( std::shared_ptr<Action> xAction, sal_Int32 nOrigIndex ) : - mpAction( rAction ), + mpAction(std::move( xAction )), mnOrigIndex( nOrigIndex ) { } @@ -193,7 +194,8 @@ namespace cppcanvas::internal const OUString& rString, int nIndex, int nLength, - o3tl::span<const sal_Int32> pCharWidths, + KernArraySpan pCharWidths, + std::span<const sal_Bool> pKashidaArray, const ActionFactoryParameters& rParms, bool bSubsettable ); diff --git a/cppcanvas/source/mtfrenderer/cachedprimitivebase.cxx b/cppcanvas/source/mtfrenderer/cachedprimitivebase.cxx index 8001ae8733f5..e5664cabfc1d 100644 --- a/cppcanvas/source/mtfrenderer/cachedprimitivebase.cxx +++ b/cppcanvas/source/mtfrenderer/cachedprimitivebase.cxx @@ -26,14 +26,15 @@ #include "cachedprimitivebase.hxx" #include <sal/log.hxx> +#include <utility> using namespace ::com::sun::star; namespace cppcanvas::internal { - CachedPrimitiveBase::CachedPrimitiveBase( const CanvasSharedPtr& rCanvas, + CachedPrimitiveBase::CachedPrimitiveBase( CanvasSharedPtr xCanvas, bool bOnlyRedrawWithSameTransform ) : - mpCanvas( rCanvas ), + mpCanvas(std::move( xCanvas )), mbOnlyRedrawWithSameTransform( bOnlyRedrawWithSameTransform ) { // TODO(F2): also store last view transform, and refuse to diff --git a/cppcanvas/source/mtfrenderer/cachedprimitivebase.hxx b/cppcanvas/source/mtfrenderer/cachedprimitivebase.hxx index 2f32d887b515..48a31db5d294 100644 --- a/cppcanvas/source/mtfrenderer/cachedprimitivebase.hxx +++ b/cppcanvas/source/mtfrenderer/cachedprimitivebase.hxx @@ -57,7 +57,7 @@ namespace cppcanvas::internal same. Otherwise, repaints are always performed via the cached primitive. */ - CachedPrimitiveBase( const CanvasSharedPtr& rCanvas, + CachedPrimitiveBase( CanvasSharedPtr xCanvas, bool bOnlyRedrawWithSameTransform ); CachedPrimitiveBase(const CachedPrimitiveBase&) = delete; diff --git a/cppcanvas/source/mtfrenderer/implrenderer.cxx b/cppcanvas/source/mtfrenderer/implrenderer.cxx index f7fe8db551f0..d3cfe793f45f 100644 --- a/cppcanvas/source/mtfrenderer/implrenderer.cxx +++ b/cppcanvas/source/mtfrenderer/implrenderer.cxx @@ -17,8 +17,9 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#include <tools/diagnose_ex.h> +#include <comphelper/diagnose_ex.hxx> #include <tools/debug.hxx> +#include <utility> #include <vcl/svapp.hxx> #include <comphelper/propertysequence.hxx> #include <comphelper/propertyvalue.hxx> @@ -66,7 +67,6 @@ #include "polypolyaction.hxx" #include "textaction.hxx" #include "transparencygroupaction.hxx" -#include <utility> #include <vector> #include <algorithm> #include <memory> @@ -208,9 +208,9 @@ namespace aWhite, rMaskColor }; - Bitmap aMask( rBitmap.CreateMask( aWhite )); + AlphaMask aMask( rBitmap.CreateAlphaMask( aWhite )); Bitmap aSolid( rBitmap.GetSizePixel(), - vcl::PixelFormat::N1_BPP, + vcl::PixelFormat::N8_BPP, &aBiLevelPalette ); aSolid.Erase( rMaskColor ); @@ -549,7 +549,7 @@ namespace cppcanvas::internal uno::Sequence< uno::Sequence < double > > aColors; uno::Sequence< double > aStops; - if( rGradient.GetStyle() == GradientStyle::Axial ) + if( rGradient.GetStyle() == css::awt::GradientStyle_AXIAL ) { aStops = { 0.0, 0.5, 1.0 }; aColors = { aEndColor, aStartColor, aEndColor }; @@ -575,7 +575,7 @@ namespace cppcanvas::internal OUString aGradientService; switch( rGradient.GetStyle() ) { - case GradientStyle::Linear: + case css::awt::GradientStyle_LINEAR: aGradInfo = basegfx::utils::createLinearODFGradientInfo( aBounds, nSteps, @@ -587,7 +587,7 @@ namespace cppcanvas::internal aGradientService = "LinearGradient"; break; - case GradientStyle::Axial: + case css::awt::GradientStyle_AXIAL: { // Adapt the border so that it is suitable // for the axial gradient. An axial @@ -621,7 +621,7 @@ namespace cppcanvas::internal break; } - case GradientStyle::Radial: + case css::awt::GradientStyle_RADIAL: aGradInfo = basegfx::utils::createRadialODFGradientInfo( aBounds, aOffset, @@ -630,7 +630,7 @@ namespace cppcanvas::internal aGradientService = "EllipticalGradient"; break; - case GradientStyle::Elliptical: + case css::awt::GradientStyle_ELLIPTICAL: aGradInfo = basegfx::utils::createEllipticalODFGradientInfo( aBounds, aOffset, @@ -640,7 +640,7 @@ namespace cppcanvas::internal aGradientService = "EllipticalGradient"; break; - case GradientStyle::Square: + case css::awt::GradientStyle_SQUARE: aGradInfo = basegfx::utils::createSquareODFGradientInfo( aBounds, aOffset, @@ -650,7 +650,7 @@ namespace cppcanvas::internal aGradientService = "RectangularGradient"; break; - case GradientStyle::Rect: + case css::awt::GradientStyle_RECT: aGradInfo = basegfx::utils::createRectangularODFGradientInfo( aBounds, aOffset, @@ -825,7 +825,7 @@ namespace cppcanvas::internal else aFontMatrix.m11 *= nScaleY / nScaleX; } - aFontRequest.CellSize = (rState.mapModeTransform * vcl::unotools::b2DSizeFromSize(rFontSizeLog)).getY(); + aFontRequest.CellSize = (rState.mapModeTransform * vcl::unotools::b2DSizeFromSize(rFontSizeLog)).getHeight(); if (rFont.GetEmphasisMark() != FontEmphasisMark::NONE) { @@ -846,7 +846,8 @@ namespace cppcanvas::internal const OUString& rString, int nIndex, int nLength, - o3tl::span<const sal_Int32> pCharWidths, + KernArraySpan pCharWidths, + std::span<const sal_Bool> pKashidaArray, const ActionFactoryParameters& rParms, bool bSubsettableActions ) { @@ -943,6 +944,7 @@ namespace cppcanvas::internal nIndex, nLength, pCharWidths, + pKashidaArray, rParms.mrVDev, rParms.mrCanvas, rState, @@ -963,7 +965,7 @@ namespace cppcanvas::internal pChars[3]=pChars[2]=pChars[1]=pChars[0]; ::tools::Long nStrikeoutWidth = (rParms.mrVDev.GetTextWidth( - OUString(pChars, SAL_N_ELEMENTS(pChars))) + 2) / 4; + OUString(pChars, std::size(pChars))) + 2) / 4; if( nStrikeoutWidth <= 0 ) nStrikeoutWidth = 1; @@ -984,16 +986,16 @@ namespace cppcanvas::internal { ::tools::Long nInterval = ( nWidth - nStrikeoutWidth * nLen ) / nLen; nStrikeoutWidth += nInterval; - std::vector<sal_Int32> aStrikeoutCharWidths(nLen); + KernArray aStrikeoutCharWidths; for ( int i = 0;i<nLen; i++) { - aStrikeoutCharWidths[i] = nStrikeoutWidth; + aStrikeoutCharWidths.push_back(nStrikeoutWidth); } for ( int i = 1;i< nLen; i++ ) { - aStrikeoutCharWidths[ i ] += aStrikeoutCharWidths[ i-1 ]; + aStrikeoutCharWidths.adjust(i, aStrikeoutCharWidths[i - 1]); } pStrikeoutTextAction = @@ -1008,6 +1010,7 @@ namespace cppcanvas::internal 0/*nStartPos*/, nLen, aStrikeoutCharWidths, + pKashidaArray, rParms.mrVDev, rParms.mrCanvas, rState, @@ -1492,7 +1495,7 @@ namespace cppcanvas::internal // TODO(Q2): define and use appropriate enumeration types rState.textReliefStyle = rFont.GetRelief(); rState.textOverlineStyle = static_cast<sal_Int8>(rFont.GetOverline()); - rState.textUnderlineStyle = rParms.maFontUnderline ? + rState.textUnderlineStyle = rParms.maFontUnderline.has_value() ? (*rParms.maFontUnderline ? sal_Int8(LINESTYLE_SINGLE) : sal_Int8(LINESTYLE_NONE)) : static_cast<sal_Int8>(rFont.GetUnderline()); rState.textStrikeoutStyle = static_cast<sal_Int8>(rFont.GetStrikeout()); @@ -1542,7 +1545,7 @@ namespace cppcanvas::internal case MetaActionType::GRADIENT: { MetaGradientAction* pGradAct = static_cast<MetaGradientAction*>(pCurrAct); - createGradientAction( ::tools::Polygon( pGradAct->GetRect() ), + createGradientAction( ::tools::PolyPolygon( pGradAct->GetRect() ), pGradAct->GetGradient(), rFactoryParms, true, @@ -2137,10 +2140,8 @@ namespace cppcanvas::internal std::shared_ptr<Action> pBmpAction( internal::BitmapActionFactory::createBitmapAction( BitmapEx(pAct->GetBitmap()), - rStates.getState().mapModeTransform * - vcl::unotools::b2DPointFromPoint( pAct->GetPoint() ), - rStates.getState().mapModeTransform * - vcl::unotools::b2DSizeFromSize( pAct->GetSize() ), + rStates.getState().mapModeTransform * vcl::unotools::b2DPointFromPoint( pAct->GetPoint() ), + rStates.getState().mapModeTransform * vcl::unotools::b2DVectorFromSize( pAct->GetSize() ), rCanvas, rStates.getState() ) ); @@ -2172,7 +2173,7 @@ namespace cppcanvas::internal rStates.getState().mapModeTransform * vcl::unotools::b2DPointFromPoint( pAct->GetDestPoint() ), rStates.getState().mapModeTransform * - vcl::unotools::b2DSizeFromSize( pAct->GetDestSize() ), + vcl::unotools::b2DVectorFromSize( pAct->GetDestSize() ), rCanvas, rStates.getState() ) ); @@ -2220,7 +2221,7 @@ namespace cppcanvas::internal rStates.getState().mapModeTransform * vcl::unotools::b2DPointFromPoint( pAct->GetPoint() ), rStates.getState().mapModeTransform * - vcl::unotools::b2DSizeFromSize( pAct->GetSize() ), + vcl::unotools::b2DVectorFromSize( pAct->GetSize() ), rCanvas, rStates.getState() ) ); @@ -2252,7 +2253,7 @@ namespace cppcanvas::internal rStates.getState().mapModeTransform * vcl::unotools::b2DPointFromPoint( pAct->GetDestPoint() ), rStates.getState().mapModeTransform * - vcl::unotools::b2DSizeFromSize( pAct->GetDestSize() ), + vcl::unotools::b2DVectorFromSize( pAct->GetDestSize() ), rCanvas, rStates.getState() ) ); @@ -2312,7 +2313,7 @@ namespace cppcanvas::internal rStates.getState().mapModeTransform * vcl::unotools::b2DPointFromPoint( pAct->GetPoint() ), rStates.getState().mapModeTransform * - vcl::unotools::b2DSizeFromSize( pAct->GetSize() ), + vcl::unotools::b2DVectorFromSize( pAct->GetSize() ), rCanvas, rStates.getState() ) ); @@ -2349,7 +2350,7 @@ namespace cppcanvas::internal rStates.getState().mapModeTransform * vcl::unotools::b2DPointFromPoint( pAct->GetDestPoint() ), rStates.getState().mapModeTransform * - vcl::unotools::b2DSizeFromSize( pAct->GetDestSize() ), + vcl::unotools::b2DVectorFromSize( pAct->GetDestSize() ), rCanvas, rStates.getState() ) ); @@ -2406,12 +2407,11 @@ namespace cppcanvas::internal { MetaFloatTransparentAction* pAct = static_cast<MetaFloatTransparentAction*>(pCurrAct); - internal::MtfAutoPtr pMtf( + std::unique_ptr< GDIMetaFile > pMtf( new ::GDIMetaFile( pAct->GetGDIMetaFile() ) ); // TODO(P2): Use native canvas gradients here (saves a lot of UNO calls) - internal::GradientAutoPtr pGradient( - new Gradient( pAct->GetGradient() ) ); + std::optional< Gradient > pGradient( pAct->GetGradient() ); DBG_TESTSOLARMUTEX(); @@ -2422,7 +2422,7 @@ namespace cppcanvas::internal rStates.getState().mapModeTransform * vcl::unotools::b2DPointFromPoint( pAct->GetPoint() ), rStates.getState().mapModeTransform * - vcl::unotools::b2DSizeFromSize( pAct->GetSize() ), + vcl::unotools::b2DVectorFromSize( pAct->GetSize() ), rCanvas, rStates.getState() ) ); @@ -2453,6 +2453,7 @@ namespace cppcanvas::internal pAct->GetIndex(), nLen, {}, + {}, rFactoryParms, bSubsettableActions ); } @@ -2474,6 +2475,7 @@ namespace cppcanvas::internal pAct->GetIndex(), nLen, pAct->GetDXArray(), + pAct->GetKashidaArray(), rFactoryParms, bSubsettableActions ); } @@ -2496,8 +2498,8 @@ namespace cppcanvas::internal rState.mapModeTransform * ::basegfx::B2DPoint( vcl::unotools::b2DPointFromPoint(pAct->GetStartPoint()) + - vcl::unotools::b2DSizeFromSize(aBaselineOffset)), - aSize.getX(), + vcl::unotools::b2DVectorFromSize(aBaselineOffset)), + aSize.getWidth(), tools::createTextLineInfo( rVDev, rState )), rCanvas, @@ -2556,7 +2558,7 @@ namespace cppcanvas::internal // generating a DX array, and uniformly // distributing the excess/insufficient width // to every logical character. - std::vector<sal_Int32> aDXArray; + KernArray aDXArray; rVDev.GetTextArray( pAct->GetText(), &aDXArray, pAct->GetIndex(), pAct->GetLen() ); @@ -2564,7 +2566,6 @@ namespace cppcanvas::internal const sal_Int32 nWidthDifference( pAct->GetWidth() - aDXArray[ nLen-1 ] ); // Last entry of pDXArray contains total width of the text - sal_Int32* p = aDXArray.data(); for (sal_Int32 i = 1; i <= nLen; ++i) { // calc ratio for every array entry, to @@ -2573,7 +2574,7 @@ namespace cppcanvas::internal // entry represents the 'end' position of // the corresponding character, thus, we // let i run from 1 to nLen. - *p++ += i * nWidthDifference / nLen; + aDXArray.adjust(i - 1, i * nWidthDifference / nLen); } createTextAction( @@ -2582,6 +2583,7 @@ namespace cppcanvas::internal pAct->GetIndex(), nLen, aDXArray, + {}, rFactoryParms, bSubsettableActions ); } @@ -2607,8 +2609,8 @@ namespace cppcanvas::internal class ActionRenderer { public: - explicit ActionRenderer( const ::basegfx::B2DHomMatrix& rTransformation ) : - maTransformation( rTransformation ), + explicit ActionRenderer( ::basegfx::B2DHomMatrix aTransformation ) : + maTransformation(std::move( aTransformation )), mbRet( true ) { } @@ -2642,8 +2644,8 @@ namespace cppcanvas::internal class AreaQuery { public: - explicit AreaQuery( const ::basegfx::B2DHomMatrix& rTransformation ) : - maTransformation( rTransformation ) + explicit AreaQuery( ::basegfx::B2DHomMatrix aTransformation ) : + maTransformation(std::move( aTransformation )) { } @@ -2930,7 +2932,7 @@ namespace cppcanvas::internal if( rParams.maFontName || rParams.maFontWeight || rParams.maFontLetterForm || - rParams.maFontUnderline ) + rParams.maFontUnderline.has_value() ) { ::cppcanvas::internal::OutDevState& rState = aStateStack.getState(); diff --git a/cppcanvas/source/mtfrenderer/lineaction.cxx b/cppcanvas/source/mtfrenderer/lineaction.cxx index 9c8734fdf450..4bc55d929958 100644 --- a/cppcanvas/source/mtfrenderer/lineaction.cxx +++ b/cppcanvas/source/mtfrenderer/lineaction.cxx @@ -30,6 +30,7 @@ #include <sal/log.hxx> #include <cppcanvas/canvas.hxx> +#include <utility> #include "mtftools.hxx" @@ -45,7 +46,7 @@ namespace cppcanvas::internal public: LineAction( const ::basegfx::B2DPoint&, const ::basegfx::B2DPoint&, - const CanvasSharedPtr&, + CanvasSharedPtr, const OutDevState& ); LineAction(const LineAction&) = delete; @@ -70,11 +71,11 @@ namespace cppcanvas::internal LineAction::LineAction( const ::basegfx::B2DPoint& rStartPoint, const ::basegfx::B2DPoint& rEndPoint, - const CanvasSharedPtr& rCanvas, + CanvasSharedPtr xCanvas, const OutDevState& rState ) : maStartPoint( rStartPoint ), maEndPoint( rEndPoint ), - mpCanvas( rCanvas ) + mpCanvas(std::move( xCanvas )) { tools::initRenderState(maState,rState); maState.DeviceColor = rState.lineColor; diff --git a/cppcanvas/source/mtfrenderer/mtftools.cxx b/cppcanvas/source/mtfrenderer/mtftools.cxx index 0181fa78ec9c..94a83da70c19 100644 --- a/cppcanvas/source/mtfrenderer/mtftools.cxx +++ b/cppcanvas/source/mtfrenderer/mtftools.cxx @@ -18,7 +18,7 @@ */ -#include <tools/diagnose_ex.h> +#include <comphelper/diagnose_ex.hxx> #include <com/sun/star/rendering/XCanvas.hpp> #include <basegfx/utils/canvastools.hxx> #include <basegfx/polygon/b2dpolygontools.hxx> diff --git a/cppcanvas/source/mtfrenderer/pointaction.cxx b/cppcanvas/source/mtfrenderer/pointaction.cxx index 72550db5480b..449f4b9b4249 100644 --- a/cppcanvas/source/mtfrenderer/pointaction.cxx +++ b/cppcanvas/source/mtfrenderer/pointaction.cxx @@ -22,6 +22,7 @@ #include <sal/types.h> #include <sal/log.hxx> +#include <utility> #include <vcl/canvastools.hxx> #include <basegfx/range/b2drange.hxx> @@ -45,7 +46,7 @@ namespace cppcanvas::internal { public: PointAction( const ::basegfx::B2DPoint&, - const CanvasSharedPtr&, + CanvasSharedPtr, const OutDevState& ); PointAction( const ::basegfx::B2DPoint&, const CanvasSharedPtr&, @@ -72,10 +73,10 @@ namespace cppcanvas::internal }; PointAction::PointAction( const ::basegfx::B2DPoint& rPoint, - const CanvasSharedPtr& rCanvas, + CanvasSharedPtr xCanvas, const OutDevState& rState ) : maPoint( rPoint ), - mpCanvas( rCanvas ) + mpCanvas(std::move( xCanvas )) { tools::initRenderState(maState,rState); maState.DeviceColor = rState.lineColor; diff --git a/cppcanvas/source/mtfrenderer/polypolyaction.cxx b/cppcanvas/source/mtfrenderer/polypolyaction.cxx index e191e512ec61..955727a31309 100644 --- a/cppcanvas/source/mtfrenderer/polypolyaction.cxx +++ b/cppcanvas/source/mtfrenderer/polypolyaction.cxx @@ -28,11 +28,13 @@ #include <basegfx/polygon/b2dpolypolygontools.hxx> #include <basegfx/matrix/b2dhommatrix.hxx> #include <canvas/canvastools.hxx> +#include <osl/diagnose.h> #include <sal/log.hxx> #include "cachedprimitivebase.hxx" #include "polypolyaction.hxx" #include <outdevstate.hxx> +#include <utility> #include "mtftools.hxx" @@ -337,7 +339,7 @@ namespace cppcanvas::internal StrokedPolyPolyAction( const ::basegfx::B2DPolyPolygon& rPoly, const CanvasSharedPtr& rCanvas, const OutDevState& rState, - const rendering::StrokeAttributes& rStrokeAttributes ); + rendering::StrokeAttributes aStrokeAttributes ); virtual bool renderSubset( const ::basegfx::B2DHomMatrix& rTransformation, const Subset& rSubset ) const override; @@ -363,12 +365,12 @@ namespace cppcanvas::internal StrokedPolyPolyAction::StrokedPolyPolyAction( const ::basegfx::B2DPolyPolygon& rPolyPoly, const CanvasSharedPtr& rCanvas, const OutDevState& rState, - const rendering::StrokeAttributes& rStrokeAttributes ) : + rendering::StrokeAttributes aStrokeAttributes ) : CachedPrimitiveBase( rCanvas, false ), mxPolyPoly( ::basegfx::unotools::xPolyPolygonFromB2DPolyPolygon( rCanvas->getUNOCanvas()->getDevice(), rPolyPoly) ), maBounds( ::basegfx::utils::getRange(rPolyPoly) ), mpCanvas( rCanvas ), - maStrokeAttributes( rStrokeAttributes ) + maStrokeAttributes(std::move( aStrokeAttributes )) { tools::initRenderState(maState,rState); maState.DeviceColor = rState.lineColor; diff --git a/cppcanvas/source/mtfrenderer/textaction.cxx b/cppcanvas/source/mtfrenderer/textaction.cxx index 091dde1c456c..2f2148c44dbd 100644 --- a/cppcanvas/source/mtfrenderer/textaction.cxx +++ b/cppcanvas/source/mtfrenderer/textaction.cxx @@ -18,7 +18,7 @@ */ -#include <tools/diagnose_ex.h> +#include <comphelper/diagnose_ex.hxx> #include <com/sun/star/rendering/PathCapType.hpp> #include <com/sun/star/rendering/PathJoinType.hpp> @@ -33,6 +33,7 @@ #include <basegfx/matrix/b2dhommatrixtools.hxx> #include <tools/gen.hxx> +#include <utility> #include <vcl/canvastools.hxx> #include <vcl/virdev.hxx> @@ -157,7 +158,7 @@ namespace cppcanvas::internal rLayoutWidth = *(std::max_element(rOffsets.begin(), rOffsets.end())); } - uno::Sequence< double > setupDXArray( o3tl::span<const sal_Int32> rCharWidths, + uno::Sequence< double > setupDXArray( KernArraySpan rCharWidths, sal_Int32 nLen, const OutDevState& rState ) { @@ -169,11 +170,10 @@ namespace cppcanvas::internal // array, by circumventing integer-based // OutDev-mapping const double nScale( rState.mapModeTransform.get(0,0) ); - sal_Int32 const * pCharWidths = rCharWidths.data(); for( int i = 0; i < nLen; ++i ) { // TODO(F2): use correct scale direction - *pOutputWidths++ = *pCharWidths++ * nScale; + *pOutputWidths++ = rCharWidths[i] * nScale; } return aCharWidthSeq; @@ -187,7 +187,7 @@ namespace cppcanvas::internal { // no external DX array given, create one from given // string - std::vector<sal_Int32> aCharWidths; + KernArray aCharWidths; rVDev.GetTextArray( rText, &aCharWidths, nStartPos, nLen ); @@ -229,6 +229,7 @@ namespace cppcanvas::internal sal_Int32 nStartPos, sal_Int32 nLen, const uno::Sequence< double >& rOffsets, + const uno::Sequence< sal_Bool >& rKashidas, const CanvasSharedPtr& rCanvas, const OutDevState& rState, const ::basegfx::B2DHomMatrix* pTextTransform ) @@ -255,6 +256,7 @@ namespace cppcanvas::internal "::cppcanvas::internal::initArrayAction(): Invalid font" ); o_rTextLayout->applyLogicalAdvancements( rOffsets ); + o_rTextLayout->applyKashidaPositions( rKashidas ); } @@ -268,7 +270,7 @@ namespace cppcanvas::internal static_cast<sal_uInt16>(rStringContext.Length) ), 0 ); - return (rState.mapModeTransform * aSize).getX(); + return (rState.mapModeTransform * aSize).getWidth(); } uno::Sequence< double > @@ -457,6 +459,10 @@ namespace cppcanvas::internal io_rTextLayout, nLayoutWidth, rSubset ) ); + uno::Sequence< sal_Bool > aOrigKashidaPositions(io_rTextLayout->queryKashidaPositions()); + uno::Sequence< sal_Bool > aKashidaPositions(aOrigKashidaPositions.getArray() + rSubset.mnSubsetBegin, + rSubset.mnSubsetEnd - rSubset.mnSubsetBegin); + xTextLayout->applyKashidaPositions(aKashidaPositions); } io_rTextLayout = xTextLayout; @@ -503,8 +509,8 @@ namespace cppcanvas::internal rendering::RenderState aShadowState( rRenderState ); ::basegfx::B2DHomMatrix aTranslate; - aTranslate.translate( rShadowOffset.getX(), - rShadowOffset.getY() ); + aTranslate.translate(rShadowOffset.getWidth(), + rShadowOffset.getHeight()); ::canvas::tools::appendToRenderState(aShadowState, aTranslate); @@ -521,8 +527,8 @@ namespace cppcanvas::internal rendering::RenderState aReliefState( rRenderState ); ::basegfx::B2DHomMatrix aTranslate; - aTranslate.translate( rReliefOffset.getX(), - rReliefOffset.getY() ); + aTranslate.translate(rReliefOffset.getWidth(), + rReliefOffset.getHeight()); ::canvas::tools::appendToRenderState(aReliefState, aTranslate); @@ -555,15 +561,15 @@ namespace cppcanvas::internal // TODO(Q3): Provide this functionality at the B2DRange ::basegfx::B2DRange aTotalBounds( aBounds ); aTotalBounds.expand( - ::basegfx::B2DRange( aBounds.getMinX() + rReliefOffset.getX(), - aBounds.getMinY() + rReliefOffset.getY(), - aBounds.getMaxX() + rReliefOffset.getX(), - aBounds.getMaxY() + rReliefOffset.getY() ) ); + ::basegfx::B2DRange( aBounds.getMinX() + rReliefOffset.getWidth(), + aBounds.getMinY() + rReliefOffset.getHeight(), + aBounds.getMaxX() + rReliefOffset.getWidth(), + aBounds.getMaxY() + rReliefOffset.getHeight() ) ); aTotalBounds.expand( - ::basegfx::B2DRange( aBounds.getMinX() + rShadowOffset.getX(), - aBounds.getMinY() + rShadowOffset.getY(), - aBounds.getMaxX() + rShadowOffset.getX(), - aBounds.getMaxY() + rShadowOffset.getY() ) ); + ::basegfx::B2DRange( aBounds.getMinX() + rShadowOffset.getWidth(), + aBounds.getMinY() + rShadowOffset.getHeight(), + aBounds.getMaxX() + rShadowOffset.getWidth(), + aBounds.getMaxY() + rShadowOffset.getHeight() ) ); return tools::calcDevicePixelBounds( aTotalBounds, rViewState, @@ -579,8 +585,8 @@ namespace cppcanvas::internal const ::basegfx::B2DPolyPolygon aPoly( tools::createTextLinesPolyPolygon( 0.0, nLineWidth, rLineInfo ) ); - - o_rOverallSize = ::basegfx::utils::getRange( aPoly ).getRange(); + auto aRange = basegfx::utils::getRange( aPoly ).getRange(); + o_rOverallSize = basegfx::B2DSize(aRange.getX(), aRange.getY()); o_rTextLines = ::basegfx::unotools::xPolyPolygonFromB2DPolyPolygon( rCanvas->getUNOCanvas()->getDevice(), @@ -979,8 +985,8 @@ namespace cppcanvas::internal return calcEffectTextBounds( ::basegfx::unotools::b2DRectangleFromRealRectangle2D( queryTextBounds() ), ::basegfx::B2DRange( 0,0, - maLinesOverallSize.getX(), - maLinesOverallSize.getY() ), + maLinesOverallSize.getWidth(), + maLinesOverallSize.getHeight() ), maReliefOffset, maShadowOffset, aLocalState, @@ -1017,6 +1023,7 @@ namespace cppcanvas::internal sal_Int32 nStartPos, sal_Int32 nLen, const uno::Sequence< double >& rOffsets, + const uno::Sequence< sal_Bool >& rKashidas, const CanvasSharedPtr& rCanvas, const OutDevState& rState ); @@ -1025,6 +1032,7 @@ namespace cppcanvas::internal sal_Int32 nStartPos, sal_Int32 nLen, const uno::Sequence< double >& rOffsets, + const uno::Sequence< sal_Bool >& rKashidas, const CanvasSharedPtr& rCanvas, const OutDevState& rState, const ::basegfx::B2DHomMatrix& rTextTransform ); @@ -1061,6 +1069,7 @@ namespace cppcanvas::internal sal_Int32 nStartPos, sal_Int32 nLen, const uno::Sequence< double >& rOffsets, + const uno::Sequence< sal_Bool >& rKashidas, const CanvasSharedPtr& rCanvas, const OutDevState& rState ) : mpCanvas( rCanvas ) @@ -1074,6 +1083,7 @@ namespace cppcanvas::internal nStartPos, nLen, rOffsets, + rKashidas, rCanvas, rState, nullptr ); } @@ -1083,6 +1093,7 @@ namespace cppcanvas::internal sal_Int32 nStartPos, sal_Int32 nLen, const uno::Sequence< double >& rOffsets, + const uno::Sequence< sal_Bool >& rKashidas, const CanvasSharedPtr& rCanvas, const OutDevState& rState, const ::basegfx::B2DHomMatrix& rTextTransform ) : @@ -1097,6 +1108,7 @@ namespace cppcanvas::internal nStartPos, nLen, rOffsets, + rKashidas, rCanvas, rState, &rTextTransform ); @@ -1206,6 +1218,7 @@ namespace cppcanvas::internal sal_Int32 nStartPos, sal_Int32 nLen, const uno::Sequence< double >& rOffsets, + const uno::Sequence< sal_Bool >& rKashidas, VirtualDevice const & rVDev, const CanvasSharedPtr& rCanvas, const OutDevState& rState ); @@ -1219,6 +1232,7 @@ namespace cppcanvas::internal sal_Int32 nStartPos, sal_Int32 nLen, const uno::Sequence< double >& rOffsets, + const uno::Sequence< sal_Bool >& rKashidas, VirtualDevice const & rVDev, const CanvasSharedPtr& rCanvas, const OutDevState& rState, @@ -1273,6 +1287,7 @@ namespace cppcanvas::internal sal_Int32 nStartPos, sal_Int32 nLen, const uno::Sequence< double >& rOffsets, + const uno::Sequence< sal_Bool >& rKashidas, VirtualDevice const & rVDev, const CanvasSharedPtr& rCanvas, const OutDevState& rState ) : @@ -1296,6 +1311,7 @@ namespace cppcanvas::internal nStartPos, nLen, rOffsets, + rKashidas, rCanvas, rState, nullptr ); } @@ -1310,6 +1326,7 @@ namespace cppcanvas::internal sal_Int32 nStartPos, sal_Int32 nLen, const uno::Sequence< double >& rOffsets, + const uno::Sequence< sal_Bool >& rKashidas, VirtualDevice const & rVDev, const CanvasSharedPtr& rCanvas, const OutDevState& rState, @@ -1334,6 +1351,7 @@ namespace cppcanvas::internal nStartPos, nLen, rOffsets, + rKashidas, rCanvas, rState, &rTextTransform ); @@ -1505,9 +1523,9 @@ namespace cppcanvas::internal return calcEffectTextBounds( ::basegfx::unotools::b2DRectangleFromRealRectangle2D( mxTextLayout->queryTextBounds() ), - ::basegfx::B2DRange( 0,0, - aSize.getX(), - aSize.getY() ), + basegfx::B2DRange(0, 0, + aSize.getWidth(), + aSize.getHeight()), maReliefOffset, maShadowOffset, aLocalState, @@ -1575,7 +1593,7 @@ namespace cppcanvas::internal const ::basegfx::B2DSize& rShadowOffset, const ::Color& rShadowColor, const ::basegfx::B2DRectangle& rOutlineBounds, - const uno::Reference< rendering::XPolyPolygon2D >& rTextPoly, + uno::Reference< rendering::XPolyPolygon2D > xTextPoly, const uno::Sequence< double >& rOffsets, VirtualDevice const & rVDev, const CanvasSharedPtr& rCanvas, @@ -1586,7 +1604,7 @@ namespace cppcanvas::internal const ::basegfx::B2DSize& rShadowOffset, const ::Color& rShadowColor, const ::basegfx::B2DRectangle& rOutlineBounds, - const uno::Reference< rendering::XPolyPolygon2D >& rTextPoly, + uno::Reference< rendering::XPolyPolygon2D > xTextPoly, const uno::Sequence< double >& rOffsets, VirtualDevice const & rVDev, const CanvasSharedPtr& rCanvas, @@ -1642,7 +1660,7 @@ namespace cppcanvas::internal rVDev.GetFont().GetFontHeight() / 64.0 ); const double nOutlineWidth( - (rState.mapModeTransform * aFontSize).getY() ); + (rState.mapModeTransform * aFontSize).getHeight() ); return nOutlineWidth < 1.0 ? 1.0 : nOutlineWidth; } @@ -1653,12 +1671,12 @@ namespace cppcanvas::internal const ::basegfx::B2DSize& rShadowOffset, const ::Color& rShadowColor, const ::basegfx::B2DRectangle& rOutlineBounds, - const uno::Reference< rendering::XPolyPolygon2D >& rTextPoly, + uno::Reference< rendering::XPolyPolygon2D > xTextPoly, const uno::Sequence< double >& rOffsets, VirtualDevice const & rVDev, const CanvasSharedPtr& rCanvas, const OutDevState& rState ) : - mxTextPoly( rTextPoly ), + mxTextPoly(std::move( xTextPoly )), maOffsets( rOffsets ), mpCanvas( rCanvas ), mnOutlineWidth( calcOutlineWidth(rState,rVDev) ), @@ -1695,13 +1713,13 @@ namespace cppcanvas::internal const ::basegfx::B2DSize& rShadowOffset, const ::Color& rShadowColor, const ::basegfx::B2DRectangle& rOutlineBounds, - const uno::Reference< rendering::XPolyPolygon2D >& rTextPoly, + uno::Reference< rendering::XPolyPolygon2D > xTextPoly, const uno::Sequence< double >& rOffsets, VirtualDevice const & rVDev, const CanvasSharedPtr& rCanvas, const OutDevState& rState, const ::basegfx::B2DHomMatrix& rTextTransform ) : - mxTextPoly( rTextPoly ), + mxTextPoly(std::move( xTextPoly )), maOffsets( rOffsets ), mpCanvas( rCanvas ), mnOutlineWidth( calcOutlineWidth(rState,rVDev) ), @@ -1925,9 +1943,9 @@ namespace cppcanvas::internal ::canvas::tools::prependToRenderState(aLocalState, rTransformation); return calcEffectTextBounds( maOutlineBounds, - ::basegfx::B2DRange( 0,0, - maLinesOverallSize.getX(), - maLinesOverallSize.getY() ), + ::basegfx::B2DRange(0, 0, + maLinesOverallSize.getWidth(), + maLinesOverallSize.getHeight()), maReliefOffset, maShadowOffset, aLocalState, @@ -1966,7 +1984,8 @@ namespace cppcanvas::internal const OUString& rText, sal_Int32 nStartPos, sal_Int32 nLen, - o3tl::span<const sal_Int32> pDXArray, + KernArraySpan pDXArray, + std::span<const sal_Bool> pKashidaArray, VirtualDevice& rVDev, const CanvasSharedPtr& rCanvas, const OutDevState& rState, @@ -1994,7 +2013,7 @@ namespace cppcanvas::internal static_cast<sal_uInt16>(nStartPos), static_cast<sal_uInt16>(nStartPos), static_cast<sal_uInt16>(nLen), - 0, pDXArray ) ); + 0, pDXArray, pKashidaArray ) ); rVDev.SetFont(aOrigFont); if( !bHaveOutlines ) @@ -2096,7 +2115,8 @@ namespace cppcanvas::internal const OUString& rText, sal_Int32 nStartPos, sal_Int32 nLen, - o3tl::span<const sal_Int32> pDXArray, + KernArraySpan pDXArray, + std::span<const sal_Bool> pKashidaArray, VirtualDevice& rVDev, const CanvasSharedPtr& rCanvas, const OutDevState& rState, @@ -2129,6 +2149,7 @@ namespace cppcanvas::internal nStartPos, nLen, pDXArray, + pKashidaArray, rVDev, rCanvas, rState, @@ -2146,6 +2167,8 @@ namespace cppcanvas::internal rVDev, rState )); + const uno::Sequence< sal_Bool > aKashidas(pKashidaArray.data(), pKashidaArray.size()); + // determine type of text action to create // ======================================= @@ -2240,6 +2263,7 @@ namespace cppcanvas::internal nStartPos, nLen, aCharWidths, + aKashidas, rCanvas, rState, *rParms.maTextTransformation ); @@ -2250,6 +2274,7 @@ namespace cppcanvas::internal nStartPos, nLen, aCharWidths, + aKashidas, rCanvas, rState ); } @@ -2268,6 +2293,7 @@ namespace cppcanvas::internal nStartPos, nLen, aCharWidths, + aKashidas, rVDev, rCanvas, rState, @@ -2284,6 +2310,7 @@ namespace cppcanvas::internal nStartPos, nLen, aCharWidths, + aKashidas, rVDev, rCanvas, rState ); diff --git a/cppcanvas/source/mtfrenderer/textaction.hxx b/cppcanvas/source/mtfrenderer/textaction.hxx index f59ed4115c76..9f7349caccc9 100644 --- a/cppcanvas/source/mtfrenderer/textaction.hxx +++ b/cppcanvas/source/mtfrenderer/textaction.hxx @@ -19,10 +19,13 @@ #pragma once +#include <sal/config.h> + +#include <span> + #include <action.hxx> #include <cppcanvas/canvas.hxx> #include <cppcanvas/renderer.hxx> -#include <o3tl/span.hxx> class VirtualDevice; class Point; @@ -68,7 +71,8 @@ namespace cppcanvas::internal const OUString& rText, sal_Int32 nStartPos, sal_Int32 nLen, - o3tl::span<const sal_Int32> pDXArray, + KernArraySpan pDXArray, + std::span<const sal_Bool> pKashidaArray, VirtualDevice& rVDev, const CanvasSharedPtr& rCanvas, const OutDevState& rState, diff --git a/cppcanvas/source/mtfrenderer/textlineshelper.cxx b/cppcanvas/source/mtfrenderer/textlineshelper.cxx index 6bdc172e30ac..125c3385afec 100644 --- a/cppcanvas/source/mtfrenderer/textlineshelper.cxx +++ b/cppcanvas/source/mtfrenderer/textlineshelper.cxx @@ -13,6 +13,7 @@ #include <basegfx/polygon/b2dpolypolygontools.hxx> #include <basegfx/utils/canvastools.hxx> #include <outdevstate.hxx> +#include <utility> #include "textlineshelper.hxx" #include "mtftools.hxx" @@ -30,8 +31,8 @@ void initLineStyleWaveline(sal_uInt32 nLineStyle, bool& bIsWaveline, bool& bIsBo namespace cppcanvas::internal { -TextLinesHelper::TextLinesHelper(const CanvasSharedPtr& rCanvas, const OutDevState& rState) - : mpCanvas(rCanvas) +TextLinesHelper::TextLinesHelper(CanvasSharedPtr xCanvas, const OutDevState& rState) + : mpCanvas(std::move(xCanvas)) , mbIsOverlineColorSet(rState.isTextOverlineColorSet) , maOverlineColor(rState.textOverlineColor) , mbIsUnderlineColorSet(rState.isTextLineColorSet) @@ -74,7 +75,7 @@ void TextLinesHelper::init(double nLineWidth, const tools::TextLineInfo& rLineIn mxStrikeout = ::basegfx::unotools::xPolyPolygonFromB2DPolyPolygon(xDevice, aStrikeout); } - maOverallSize = aRange.getRange(); + maOverallSize = basegfx::B2DSize(aRange.getRange().getX(), aRange.getRange().getY()); initLineStyleWaveline(rLineInfo.mnOverlineStyle, mbOverlineWaveline, mbOverlineWavelineBold); diff --git a/cppcanvas/source/mtfrenderer/textlineshelper.hxx b/cppcanvas/source/mtfrenderer/textlineshelper.hxx index 38105961ee05..f0a53ff7a07d 100644 --- a/cppcanvas/source/mtfrenderer/textlineshelper.hxx +++ b/cppcanvas/source/mtfrenderer/textlineshelper.hxx @@ -53,7 +53,7 @@ class TextLinesHelper bool mbUnderlineWavelineBold; public: - TextLinesHelper(const CanvasSharedPtr& rCanvas, const OutDevState& rState); + TextLinesHelper(CanvasSharedPtr xCanvas, const OutDevState& rState); ::basegfx::B2DSize const& getOverallSize() const { return maOverallSize; } diff --git a/cppcanvas/source/mtfrenderer/transparencygroupaction.cxx b/cppcanvas/source/mtfrenderer/transparencygroupaction.cxx index e0562361e3ce..c3c1cfdf50f6 100644 --- a/cppcanvas/source/mtfrenderer/transparencygroupaction.cxx +++ b/cppcanvas/source/mtfrenderer/transparencygroupaction.cxx @@ -83,8 +83,8 @@ namespace cppcanvas::internal Size of the transparency group object, in current state coordinate system. */ - TransparencyGroupAction( MtfAutoPtr&& rGroupMtf, - GradientAutoPtr&& rAlphaGradient, + TransparencyGroupAction( std::unique_ptr< GDIMetaFile >&& rGroupMtf, + std::optional< Gradient >&& rAlphaGradient, const ::basegfx::B2DPoint& rDstPoint, const ::basegfx::B2DVector& rDstSize, const CanvasSharedPtr& rCanvas, @@ -104,8 +104,8 @@ namespace cppcanvas::internal virtual sal_Int32 getActionCount() const override; private: - MtfAutoPtr mpGroupMtf; - GradientAutoPtr mpAlphaGradient; + std::unique_ptr< GDIMetaFile > mpGroupMtf; + std::optional< Gradient > mpAlphaGradient; const ::basegfx::B2DSize maDstSize; @@ -135,15 +135,15 @@ namespace cppcanvas::internal aLocalTransformation ); } - TransparencyGroupAction::TransparencyGroupAction( MtfAutoPtr&& rGroupMtf, - GradientAutoPtr&& rAlphaGradient, + TransparencyGroupAction::TransparencyGroupAction( std::unique_ptr< GDIMetaFile >&& rGroupMtf, + std::optional< Gradient >&& rAlphaGradient, const ::basegfx::B2DPoint& rDstPoint, const ::basegfx::B2DVector& rDstSize, const CanvasSharedPtr& rCanvas, const OutDevState& rState ) : mpGroupMtf( std::move(rGroupMtf) ), mpAlphaGradient( std::move(rAlphaGradient) ), - maDstSize( rDstSize ), + maDstSize(rDstSize.getX(), rDstSize.getY()), mpCanvas( rCanvas ) { tools::initRenderState(maState,rState); @@ -205,6 +205,8 @@ namespace cppcanvas::internal return false; } + ::Point aMtfOffsetPoint; + // if there's no buffer bitmap, or as soon as the // total transformation changes, we've got to // re-render the bitmap @@ -215,21 +217,65 @@ namespace cppcanvas::internal { DBG_TESTSOLARMUTEX(); + // tdf#150610 fix broken rendering of text meta actions + // Even when drawing to a VirtualDevice where antialiasing + // is disabled, text will still be drawn with some + // antialiased pixels on HiDPI displays. So, expand the + // size of the VirtualDevice slightly to capture any of + // the pixels drawn past the edges of the destination + // bounds. + bool bHasTextActions = false; + MetaAction* pCurrAct; + int nCurrActionIndex; + for( nCurrActionIndex=0, pCurrAct=mpGroupMtf->FirstAction(); + pCurrAct && !bHasTextActions; + ++nCurrActionIndex, pCurrAct = mpGroupMtf->NextAction() ) + { + switch( pCurrAct->GetType() ) + { + case MetaActionType::TEXT: + case MetaActionType::TEXTARRAY: + case MetaActionType::STRETCHTEXT: + case MetaActionType::TEXTRECT: + if( ( rSubset.mnSubsetBegin == 0 && rSubset.mnSubsetEnd == -1 ) || ( rSubset.mnSubsetBegin <= nCurrActionIndex && rSubset.mnSubsetEnd > nCurrActionIndex ) ) + bHasTextActions = true; + break; + default: + break; + } + } + // output size of metafile - ::Size aOutputSizePixel( ::basegfx::fround( aScale.getX() * maDstSize.getX() ), - ::basegfx::fround( aScale.getY() * maDstSize.getY() ) ); + ::Size aOutputSizePixel( ::basegfx::fround<::tools::Long>( aScale.getX() * maDstSize.getWidth() ), + ::basegfx::fround<::tools::Long>( aScale.getY() * maDstSize.getHeight() ) ); - // pixel size of cache bitmap: round up to nearest int - ::Size aBitmapSizePixel( static_cast<sal_Int32>( aScale.getX() * maDstSize.getX() )+1, - static_cast<sal_Int32>( aScale.getY() * maDstSize.getY() )+1 ); + sal_Int32 nBitmapExtra; + if ( bHasTextActions ) + { + nBitmapExtra = 10; + aMtfOffsetPoint = ::Point( nBitmapExtra / 2, nBitmapExtra / 2 ); + } + else + { + // Related tdf#150610 assume antialiasing is enabled + // Although antialiasing is normally disabled in the + // VirtualDevice, lines in tdf#150610 will draw past + // the edge of the VirtualDevice when running a + // slideshow so always add an extra pixel on the + // right and bottom edges. + nBitmapExtra = 1; + } - ::Point aEmptyPoint; + // pixel size of cache bitmap: round up to nearest int + ::Point aBitmapPoint; + ::Size aBitmapSizePixel( static_cast<sal_Int32>( aScale.getX() * maDstSize.getWidth() ) + nBitmapExtra, + static_cast<sal_Int32>( aScale.getY() * maDstSize.getHeight() ) + nBitmapExtra ); // render our content into an appropriately sized // VirtualDevice with alpha channel ScopedVclPtrInstance<VirtualDevice> aVDev( - *::Application::GetDefaultDevice(), DeviceFormat::DEFAULT, DeviceFormat::DEFAULT ); - aVDev->SetOutputSizePixel( aBitmapSizePixel ); + *::Application::GetDefaultDevice(), DeviceFormat::WITH_ALPHA ); + aVDev->SetOutputSizePixel( aBitmapSizePixel, true, true ); aVDev->SetMapMode(); if( rSubset.mnSubsetBegin != 0 || @@ -238,8 +284,6 @@ namespace cppcanvas::internal // true subset - extract referenced // metaactions from mpGroupMtf GDIMetaFile aMtf; - MetaAction* pCurrAct; - int nCurrActionIndex; // extract subset actions for( nCurrActionIndex=0, @@ -320,7 +364,9 @@ namespace cppcanvas::internal } aVDev->DrawTransparent( aMtf, - aEmptyPoint, + aBitmapPoint, + aBitmapSizePixel, + aMtfOffsetPoint, aOutputSizePixel, *mpAlphaGradient ); } @@ -328,7 +374,9 @@ namespace cppcanvas::internal { // no subsetting - render whole mtf aVDev->DrawTransparent( *mpGroupMtf, - aEmptyPoint, + aBitmapPoint, + aBitmapSizePixel, + aMtfOffsetPoint, aOutputSizePixel, *mpAlphaGradient ); } @@ -338,7 +386,7 @@ namespace cppcanvas::internal BitmapSharedPtr aBmp( VCLFactory::createBitmap( mpCanvas, aVDev->GetBitmapEx( - aEmptyPoint, + aBitmapPoint, aBitmapSizePixel ) ) ); mxBufferBitmap = aBmp->getUNOBitmap(); maLastTransformation = aTotalTransform; @@ -362,6 +410,7 @@ namespace cppcanvas::internal // the contained scaling, we've got to right-multiply with // the inverse. ::basegfx::B2DHomMatrix aScaleCorrection; + aScaleCorrection.translate( -aMtfOffsetPoint.X(), -aMtfOffsetPoint.Y() ); aScaleCorrection.scale( 1/aScale.getX(), 1/aScale.getY() ); aTransform = aTransform * aScaleCorrection; @@ -423,8 +472,8 @@ namespace cppcanvas::internal return tools::calcDevicePixelBounds( ::basegfx::B2DRange( 0,0, - maDstSize.getX(), - maDstSize.getY() ), + maDstSize.getWidth(), + maDstSize.getHeight() ), mpCanvas->getViewState(), aLocalState ); } @@ -453,8 +502,8 @@ namespace cppcanvas::internal } - std::shared_ptr<Action> TransparencyGroupActionFactory::createTransparencyGroupAction( MtfAutoPtr&& rGroupMtf, - GradientAutoPtr&& rAlphaGradient, + std::shared_ptr<Action> TransparencyGroupActionFactory::createTransparencyGroupAction( std::unique_ptr< GDIMetaFile >&& rGroupMtf, + std::optional< Gradient >&& rAlphaGradient, const ::basegfx::B2DPoint& rDstPoint, const ::basegfx::B2DVector& rDstSize, const CanvasSharedPtr& rCanvas, diff --git a/cppcanvas/source/mtfrenderer/transparencygroupaction.hxx b/cppcanvas/source/mtfrenderer/transparencygroupaction.hxx index f863d18ed4c7..ddf01ca00934 100644 --- a/cppcanvas/source/mtfrenderer/transparencygroupaction.hxx +++ b/cppcanvas/source/mtfrenderer/transparencygroupaction.hxx @@ -20,6 +20,7 @@ #pragma once #include <cppcanvas/canvas.hxx> +#include <vcl/gradient.hxx> #include <action.hxx> #include <memory> @@ -30,7 +31,6 @@ namespace basegfx { } class GDIMetaFile; -class Gradient; /* Definition of internal::TransparencyGroupActionFactory */ @@ -39,9 +39,6 @@ namespace cppcanvas::internal { struct OutDevState; - typedef std::unique_ptr< GDIMetaFile > MtfAutoPtr; - typedef std::unique_ptr< Gradient > GradientAutoPtr; - /** Transparency group action. This action groups a bunch of other actions, to be @@ -75,8 +72,8 @@ namespace cppcanvas::internal Size of the transparency group object, in current state coordinate system. */ - std::shared_ptr<Action> createTransparencyGroupAction( MtfAutoPtr&& rGroupMtf, - GradientAutoPtr&& rAlphaGradient, + std::shared_ptr<Action> createTransparencyGroupAction( std::unique_ptr< GDIMetaFile >&& rGroupMtf, + std::optional< Gradient >&& rAlphaGradient, const ::basegfx::B2DPoint& rDstPoint, const ::basegfx::B2DVector& rDstSize, const CanvasSharedPtr& rCanvas, diff --git a/cppcanvas/source/tools/canvasgraphichelper.cxx b/cppcanvas/source/tools/canvasgraphichelper.cxx index 632294834cce..491c743f5216 100644 --- a/cppcanvas/source/tools/canvasgraphichelper.cxx +++ b/cppcanvas/source/tools/canvasgraphichelper.cxx @@ -25,6 +25,8 @@ #include <canvas/canvastools.hxx> #include <basegfx/utils/canvastools.hxx> #include <basegfx/matrix/b2dhommatrix.hxx> +#include <osl/diagnose.h> +#include <utility> using namespace ::com::sun::star; @@ -33,8 +35,8 @@ using namespace ::com::sun::star; namespace cppcanvas::internal { - CanvasGraphicHelper::CanvasGraphicHelper( const CanvasSharedPtr& rParentCanvas ) : - mpCanvas( rParentCanvas ) + CanvasGraphicHelper::CanvasGraphicHelper( CanvasSharedPtr xParentCanvas ) : + mpCanvas(std::move( xParentCanvas )) { OSL_ENSURE( mpCanvas && mpCanvas->getUNOCanvas().is(), "CanvasGraphicHelper::CanvasGraphicHelper: no valid canvas" ); diff --git a/cppcanvas/source/wrapper/implcanvas.cxx b/cppcanvas/source/wrapper/implcanvas.cxx index 2760311d5ef7..81b5a3759fd6 100644 --- a/cppcanvas/source/wrapper/implcanvas.cxx +++ b/cppcanvas/source/wrapper/implcanvas.cxx @@ -21,10 +21,12 @@ #include <basegfx/matrix/b2dhommatrix.hxx> #include <basegfx/polygon/b2dpolypolygon.hxx> #include <basegfx/utils/canvastools.hxx> +#include <osl/diagnose.h> #include <com/sun/star/rendering/XCanvas.hpp> #include <canvas/canvastools.hxx> +#include <utility> #include "implcanvas.hxx" @@ -34,8 +36,8 @@ using namespace ::com::sun::star; namespace cppcanvas::internal { - ImplCanvas::ImplCanvas( const uno::Reference< rendering::XCanvas >& xCanvas ) : - mxCanvas( xCanvas ) + ImplCanvas::ImplCanvas( uno::Reference< rendering::XCanvas > xCanvas ) : + mxCanvas(std::move( xCanvas )) { OSL_ENSURE( mxCanvas.is(), "Canvas::Canvas() invalid XCanvas" ); diff --git a/cppcanvas/source/wrapper/implcanvas.hxx b/cppcanvas/source/wrapper/implcanvas.hxx index d49116c92860..cc49c819eeef 100644 --- a/cppcanvas/source/wrapper/implcanvas.hxx +++ b/cppcanvas/source/wrapper/implcanvas.hxx @@ -47,7 +47,7 @@ namespace cppcanvas::internal class ImplCanvas : public virtual Canvas { public: - explicit ImplCanvas( const css::uno::Reference< css::rendering::XCanvas >& rCanvas ); + explicit ImplCanvas( css::uno::Reference< css::rendering::XCanvas > xCanvas ); virtual ~ImplCanvas() override; ImplCanvas(ImplCanvas const &) = default; diff --git a/cppcanvas/source/wrapper/implpolypolygon.cxx b/cppcanvas/source/wrapper/implpolypolygon.cxx index 182bf6b47f42..536bfa60a53b 100644 --- a/cppcanvas/source/wrapper/implpolypolygon.cxx +++ b/cppcanvas/source/wrapper/implpolypolygon.cxx @@ -27,6 +27,7 @@ #include "implpolypolygon.hxx" #include <tools.hxx> +#include <utility> using namespace ::com::sun::star; @@ -35,9 +36,9 @@ using namespace ::com::sun::star; namespace cppcanvas::internal { ImplPolyPolygon::ImplPolyPolygon( const CanvasSharedPtr& rParentCanvas, - const uno::Reference< rendering::XPolyPolygon2D >& rPolyPoly ) : + uno::Reference< rendering::XPolyPolygon2D > xPolyPoly ) : CanvasGraphicHelper( rParentCanvas ), - mxPolyPoly( rPolyPoly ), + mxPolyPoly(std::move( xPolyPoly )), maStrokeAttributes(1.0, 10.0, uno::Sequence< double >(), diff --git a/cppcanvas/source/wrapper/implpolypolygon.hxx b/cppcanvas/source/wrapper/implpolypolygon.hxx index 341531fba74f..a756b4400795 100644 --- a/cppcanvas/source/wrapper/implpolypolygon.hxx +++ b/cppcanvas/source/wrapper/implpolypolygon.hxx @@ -39,8 +39,8 @@ namespace cppcanvas::internal { public: ImplPolyPolygon( const CanvasSharedPtr& rParentCanvas, - const css::uno::Reference< - css::rendering::XPolyPolygon2D >& rPolyPoly ); + css::uno::Reference< + css::rendering::XPolyPolygon2D > xPolyPoly ); virtual ~ImplPolyPolygon() override; diff --git a/cppcanvas/source/wrapper/implsprite.cxx b/cppcanvas/source/wrapper/implsprite.cxx index c0450880d75d..d0b2d617944e 100644 --- a/cppcanvas/source/wrapper/implsprite.cxx +++ b/cppcanvas/source/wrapper/implsprite.cxx @@ -21,6 +21,8 @@ #include <basegfx/utils/canvastools.hxx> #include <basegfx/polygon/b2dpolypolygon.hxx> #include <canvas/canvastools.hxx> +#include <osl/diagnose.h> +#include <utility> #include "implsprite.hxx" @@ -31,10 +33,10 @@ namespace cppcanvas::internal { ImplSprite::ImplSprite( const uno::Reference< rendering::XSpriteCanvas >& rParentCanvas, - const uno::Reference< rendering::XSprite >& rSprite, - const ImplSpriteCanvas::TransformationArbiterSharedPtr& rTransformArbiter ) : - mxSprite( rSprite ), - mpTransformArbiter( rTransformArbiter ) + uno::Reference< rendering::XSprite > rSprite, + ImplSpriteCanvas::TransformationArbiterSharedPtr xTransformArbiter ) : + mxSprite(std::move( rSprite )), + mpTransformArbiter(std::move( xTransformArbiter )) { // Avoiding ternary operator in initializer list (Solaris // compiler bug, when function call and temporary is diff --git a/cppcanvas/source/wrapper/implsprite.hxx b/cppcanvas/source/wrapper/implsprite.hxx index 220dfb9489fc..d40fb0574a96 100644 --- a/cppcanvas/source/wrapper/implsprite.hxx +++ b/cppcanvas/source/wrapper/implsprite.hxx @@ -32,9 +32,9 @@ namespace cppcanvas::internal public: ImplSprite( const css::uno::Reference< css::rendering::XSpriteCanvas >& rParentCanvas, - const css::uno::Reference< - css::rendering::XSprite >& rSprite, - const ImplSpriteCanvas::TransformationArbiterSharedPtr& rTransformArbiter ); + css::uno::Reference< + css::rendering::XSprite > xSprite, + ImplSpriteCanvas::TransformationArbiterSharedPtr xTransformArbiter ); virtual ~ImplSprite() override; virtual void setAlpha( const double& rAlpha ) override; |