diff options
Diffstat (limited to 'cppcanvas/source/mtfrenderer/textaction.cxx')
-rw-r--r-- | cppcanvas/source/mtfrenderer/textaction.cxx | 103 |
1 files changed, 65 insertions, 38 deletions
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 ); |