summaryrefslogtreecommitdiff
path: root/cppcanvas/source/mtfrenderer/textaction.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'cppcanvas/source/mtfrenderer/textaction.cxx')
-rw-r--r--cppcanvas/source/mtfrenderer/textaction.cxx103
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 );