summaryrefslogtreecommitdiff
path: root/canvas/source/cairo/cairo_textlayout.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'canvas/source/cairo/cairo_textlayout.cxx')
-rw-r--r--canvas/source/cairo/cairo_textlayout.cxx94
1 files changed, 52 insertions, 42 deletions
diff --git a/canvas/source/cairo/cairo_textlayout.cxx b/canvas/source/cairo/cairo_textlayout.cxx
index 4a0236f6bf4b..e033040d01b2 100644
--- a/canvas/source/cairo/cairo_textlayout.cxx
+++ b/canvas/source/cairo/cairo_textlayout.cxx
@@ -27,11 +27,12 @@
#include <basegfx/matrix/b2dhommatrix.hxx>
#include <basegfx/numeric/ftools.hxx>
#include <cppuhelper/supportsservice.hxx>
-#include <tools/diagnose_ex.h>
+#include <comphelper/diagnose_ex.hxx>
+#include <utility>
+#include <vcl/kernarray.hxx>
#include <vcl/metric.hxx>
#include <vcl/virdev.hxx>
-
#include "cairo_textlayout.hxx"
using namespace ::cairo;
@@ -69,15 +70,14 @@ namespace cairocanvas
}
}
- TextLayout::TextLayout( const rendering::StringContext& aText,
- sal_Int8 nDirection,
- sal_Int64 /*nRandomSeed*/,
- const CanvasFont::Reference& rFont,
- const SurfaceProviderRef& rRefDevice ) :
- TextLayout_Base( m_aMutex ),
- maText( aText ),
- mpFont( rFont ),
- mpRefDevice( rRefDevice ),
+ TextLayout::TextLayout( rendering::StringContext aText,
+ sal_Int8 nDirection,
+ sal_Int64 /*nRandomSeed*/,
+ CanvasFont::Reference rFont,
+ SurfaceProviderRef rRefDevice ) :
+ maText(std::move( aText )),
+ mpFont(std::move( rFont )),
+ mpRefDevice(std::move( rRefDevice )),
mnTextDirection( nDirection )
{
}
@@ -86,10 +86,8 @@ namespace cairocanvas
{
}
- void SAL_CALL TextLayout::disposing()
+ void TextLayout::disposing(std::unique_lock<std::mutex>& /*rGuard*/)
{
- ::osl::MutexGuard aGuard( m_aMutex );
-
mpFont.clear();
mpRefDevice.clear();
}
@@ -115,27 +113,47 @@ namespace cairocanvas
uno::Sequence< double > SAL_CALL TextLayout::queryLogicalAdvancements( )
{
- ::osl::MutexGuard aGuard( m_aMutex );
+ std::unique_lock aGuard( m_aMutex );
return maLogicalAdvancements;
}
void SAL_CALL TextLayout::applyLogicalAdvancements( const uno::Sequence< double >& aAdvancements )
{
- ::osl::MutexGuard aGuard( m_aMutex );
+ std::unique_lock aGuard( m_aMutex );
if( aAdvancements.getLength() != maText.Length )
{
SAL_WARN("canvas.cairo", "TextLayout::applyLogicalAdvancements(): mismatching number of advancements" );
- throw lang::IllegalArgumentException("mismatching number of advancements", static_cast<cppu::OWeakObject*>(this), 1);
+ throw lang::IllegalArgumentException("mismatching number of advancements", getXWeak(), 1);
}
maLogicalAdvancements = aAdvancements;
}
+ uno::Sequence< sal_Bool > SAL_CALL TextLayout::queryKashidaPositions( )
+ {
+ std::unique_lock aGuard( m_aMutex );
+
+ return maKashidaPositions;
+ }
+
+ void SAL_CALL TextLayout::applyKashidaPositions( const uno::Sequence< sal_Bool >& aPositions )
+ {
+ std::unique_lock aGuard( m_aMutex );
+
+ if( aPositions.hasElements() && aPositions.getLength() != maText.Length )
+ {
+ SAL_WARN("canvas.cairo", "TextLayout::applyKashidaPositions(): mismatching number of positions" );
+ throw lang::IllegalArgumentException("mismatching number of positions", getXWeak(), 1);
+ }
+
+ maKashidaPositions = aPositions;
+ }
+
geometry::RealRectangle2D SAL_CALL TextLayout::queryTextBounds( )
{
- ::osl::MutexGuard aGuard( m_aMutex );
+ std::unique_lock aGuard( m_aMutex );
OutputDevice* pOutDev = mpRefDevice->getOutputDevice();
if( !pOutDev )
@@ -226,22 +244,18 @@ namespace cairocanvas
sal_Int8 SAL_CALL TextLayout::getMainTextDirection( )
{
- ::osl::MutexGuard aGuard( m_aMutex );
-
return mnTextDirection;
}
uno::Reference< rendering::XCanvasFont > SAL_CALL TextLayout::getFont( )
{
- ::osl::MutexGuard aGuard( m_aMutex );
+ std::unique_lock aGuard( m_aMutex );
return mpFont;
}
rendering::StringContext SAL_CALL TextLayout::getText( )
{
- ::osl::MutexGuard aGuard( m_aMutex );
-
return maText;
}
@@ -259,17 +273,15 @@ namespace cairocanvas
const rendering::ViewState& viewState,
const rendering::RenderState& renderState ) const
{
- ::osl::MutexGuard aGuard( m_aMutex );
+ std::unique_lock aGuard( m_aMutex );
setupLayoutMode( rOutDev, mnTextDirection );
- std::vector<sal_Int32> aOffsets(maLogicalAdvancements.getLength());
-
- if( maLogicalAdvancements.hasElements() )
- setupTextOffsets( aOffsets.data(), maLogicalAdvancements, viewState, renderState );
-
if (maLogicalAdvancements.hasElements())
{
- rOutDev.DrawTextArray( rOutpos, maText.Text, aOffsets,
+ KernArray aOffsets(setupTextOffsets(maLogicalAdvancements, viewState, renderState));
+ std::span<const sal_Bool> aKashidaArray(maKashidaPositions.getConstArray(), maKashidaPositions.getLength());
+
+ rOutDev.DrawTextArray( rOutpos, maText.Text, aOffsets, aKashidaArray,
::canvas::tools::numeric_cast<sal_uInt16>(maText.StartPosition),
::canvas::tools::numeric_cast<sal_uInt16>(maText.Length) );
}
@@ -286,8 +298,8 @@ namespace cairocanvas
class OffsetTransformer
{
public:
- explicit OffsetTransformer( const ::basegfx::B2DHomMatrix& rMat ) :
- maMatrix( rMat )
+ explicit OffsetTransformer( ::basegfx::B2DHomMatrix aMat ) :
+ maMatrix(std::move( aMat ))
{
}
@@ -313,14 +325,11 @@ namespace cairocanvas
};
}
- void TextLayout::setupTextOffsets( sal_Int32* outputOffsets,
+ KernArray TextLayout::setupTextOffsets(
const uno::Sequence< double >& inputOffsets,
const rendering::ViewState& viewState,
const rendering::RenderState& renderState ) const
{
- ENSURE_OR_THROW( outputOffsets!=nullptr,
- "TextLayout::setupTextOffsets offsets NULL" );
-
::basegfx::B2DHomMatrix aMatrix;
::canvas::tools::mergeViewAndRenderTransform(aMatrix,
@@ -328,15 +337,16 @@ namespace cairocanvas
renderState);
// fill integer offsets
- std::transform( inputOffsets.begin(),
- inputOffsets.end(),
- outputOffsets,
- OffsetTransformer( aMatrix ) );
+ KernArray outputOffsets;
+ OffsetTransformer aTransform(aMatrix);
+ std::for_each(inputOffsets.begin(), inputOffsets.end(),
+ [&outputOffsets, &aTransform](double n) {outputOffsets.push_back(aTransform(n)); } );
+ return outputOffsets;
}
OUString SAL_CALL TextLayout::getImplementationName()
{
- return "CairoCanvas::TextLayout";
+ return u"CairoCanvas::TextLayout"_ustr;
}
sal_Bool SAL_CALL TextLayout::supportsService( const OUString& ServiceName )
@@ -346,7 +356,7 @@ namespace cairocanvas
uno::Sequence< OUString > SAL_CALL TextLayout::getSupportedServiceNames()
{
- return { "com.sun.star.rendering.TextLayout" };
+ return { u"com.sun.star.rendering.TextLayout"_ustr };
}
}