diff options
Diffstat (limited to 'drawinglayer')
13 files changed, 91 insertions, 27 deletions
diff --git a/drawinglayer/source/attribute/fontattribute.cxx b/drawinglayer/source/attribute/fontattribute.cxx index e423b8367f1c..b14397fe9d87 100644 --- a/drawinglayer/source/attribute/fontattribute.cxx +++ b/drawinglayer/source/attribute/fontattribute.cxx @@ -112,15 +112,31 @@ FontAttribute::FontAttribute() { } -FontAttribute::FontAttribute(const FontAttribute&) = default; +FontAttribute::FontAttribute(const FontAttribute& rOther) + : mpFontAttribute(rOther.mpFontAttribute) +{ +} + +FontAttribute::FontAttribute(FontAttribute&& rOther) noexcept + : mpFontAttribute(std::move(rOther.mpFontAttribute)) +{ +} -FontAttribute::FontAttribute(FontAttribute&&) = default; +FontAttribute::~FontAttribute() {} -FontAttribute::~FontAttribute() = default; +FontAttribute& FontAttribute::operator=(const FontAttribute& rOther) +{ + mpFontAttribute = rOther.mpFontAttribute; -FontAttribute& FontAttribute::operator=(const FontAttribute&) = default; + return *this; +} -FontAttribute& FontAttribute::operator=(FontAttribute&&) = default; +FontAttribute& FontAttribute::operator=(FontAttribute&& rOther) noexcept +{ + mpFontAttribute = std::move(rOther.mpFontAttribute); + + return *this; +} bool FontAttribute::operator==(const FontAttribute& rCandidate) const { diff --git a/drawinglayer/source/drawinglayeruno/xprimitive2drenderer.cxx b/drawinglayer/source/drawinglayeruno/xprimitive2drenderer.cxx index f0e677c0cedb..78e2ea02a0eb 100644 --- a/drawinglayer/source/drawinglayeruno/xprimitive2drenderer.cxx +++ b/drawinglayer/source/drawinglayeruno/xprimitive2drenderer.cxx @@ -32,6 +32,7 @@ #include <com/sun/star/geometry/RealRectangle2D.hpp> #include <basegfx/matrix/b2dhommatrixtools.hxx> #include <drawinglayer/primitive2d/transformprimitive2d.hxx> +#include <drawinglayer/processor2d/textlayoutdevice.hxx> #include <drawinglayer/converters.hxx> #include <comphelper/sequenceashashmap.hxx> @@ -118,7 +119,8 @@ namespace drawinglayer::unorenderer } const geometry::ViewInformation2D aViewInformation2D(aViewInformationSequence); - primitive2d::VisitingParameters aVisitingParameters(aViewInformation2D); + auto pTextLayouter = std::make_shared<drawinglayer::processor2d::TextLayouterDevice>(); + primitive2d::VisitingParameters aVisitingParameters(aViewInformation2D, pTextLayouter); const sal_uInt32 nDiscreteWidth(basegfx::fround(o3tl::convert(fWidth, eRangeUnit, o3tl::Length::in) * DPI_X)); const sal_uInt32 nDiscreteHeight(basegfx::fround(o3tl::convert(fHeight, eRangeUnit, o3tl::Length::in) * DPI_Y)); diff --git a/drawinglayer/source/primitive2d/baseprimitive2d.cxx b/drawinglayer/source/primitive2d/baseprimitive2d.cxx index 085ccc1b8c58..7ec09582886f 100644 --- a/drawinglayer/source/primitive2d/baseprimitive2d.cxx +++ b/drawinglayer/source/primitive2d/baseprimitive2d.cxx @@ -23,7 +23,10 @@ #include <drawinglayer/primitive2d/Tools.hxx> #include <drawinglayer/geometry/viewinformation2d.hxx> #include <basegfx/utils/canvastools.hxx> +#include <basegfx/text/UnoTextLayouter.hxx> #include <comphelper/sequence.hxx> +#include <drawinglayer/geometry/viewinformation2d.hxx> +#include <com/sun/star/graphic/XTextLayouter.hpp> using namespace css; @@ -85,12 +88,39 @@ void BasePrimitive2D::get2DDecomposition(Primitive2DDecompositionVisitor& /*rVis { } +namespace +{ +std::shared_ptr<gfx::ITextLayouter> +getTextLayouter(const uno::Sequence<beans::PropertyValue>& rProperties) +{ + std::shared_ptr<gfx::ITextLayouter> pTextLayouter; + + if (!rProperties.hasElements()) + return pTextLayouter; + + for (const beans::PropertyValue& rProperty : rProperties) + { + if (rProperty.Name == "TextLayouter") + { + uno::Reference<graphic::XTextLayouter> xTextLayouter; + rProperty.Value >>= xTextLayouter; + if (xTextLayouter.is()) + pTextLayouter = gfx::getTextLayouterFromUno(xTextLayouter); + return pTextLayouter; + } + } + return pTextLayouter; +} + +} // end anonymous namespace + css::uno::Sequence<::css::uno::Reference<::css::graphic::XPrimitive2D>> SAL_CALL BasePrimitive2D::getDecomposition(const uno::Sequence<beans::PropertyValue>& rViewParameters) { Primitive2DContainer aContainer; geometry::ViewInformation2D aViewInformation2D(rViewParameters); - VisitingParameters aParameters(aViewInformation2D); + std::shared_ptr<gfx::ITextLayouter> pTextLayouter = getTextLayouter(rViewParameters); + VisitingParameters aParameters(aViewInformation2D, pTextLayouter); get2DDecomposition(aContainer, aParameters); return comphelper::containerToSequence(aContainer); } @@ -99,7 +129,8 @@ css::geometry::RealRectangle2D SAL_CALL BasePrimitive2D::getRange(const uno::Sequence<beans::PropertyValue>& rViewParameters) { geometry::ViewInformation2D aViewInformation2D(rViewParameters); - VisitingParameters aParameters(aViewInformation2D); + std::shared_ptr<gfx::ITextLayouter> pTextLayouter = getTextLayouter(rViewParameters); + VisitingParameters aParameters(aViewInformation2D, pTextLayouter); return basegfx::unotools::rectangle2DFromB2DRectangle(getB2DRange(aParameters)); } diff --git a/drawinglayer/source/primitive2d/patternfillprimitive2d.cxx b/drawinglayer/source/primitive2d/patternfillprimitive2d.cxx index 0cfa014bb13e..09ae46a2230f 100644 --- a/drawinglayer/source/primitive2d/patternfillprimitive2d.cxx +++ b/drawinglayer/source/primitive2d/patternfillprimitive2d.cxx @@ -107,7 +107,7 @@ namespace drawinglayer::primitive2d const primitive2d::Primitive2DContainer xEmbedSeq { xEmbedRef }; const geometry::ViewInformation2D aViewInformation2D; - primitive2d::VisitingParameters aVisitingParameters(aViewInformation2D); + primitive2d::VisitingParameters aVisitingParameters(aViewInformation2D, rParameters.getTextLayouter()); const BitmapEx aBitmapEx( convertToBitmapEx( diff --git a/drawinglayer/source/primitive2d/textprimitive2d.cxx b/drawinglayer/source/primitive2d/textprimitive2d.cxx index fdf81482aa32..e3b25a1f1beb 100644 --- a/drawinglayer/source/primitive2d/textprimitive2d.cxx +++ b/drawinglayer/source/primitive2d/textprimitive2d.cxx @@ -111,9 +111,10 @@ void TextSimplePortionPrimitive2D::getTextOutlinesAndTransformation( const basegfx::B2DVector aFontScale(getCorrectedScaleAndFontScale(aScale)); // prepare textlayoutdevice - drawinglayer::processor2d::TextLayouterDevice aTextLayouter; - aTextLayouter.setFontAttribute(getFontAttribute(), aFontScale.getX(), aFontScale.getY(), - getLocale()); + std::unique_ptr<gfx::ITextLayouter> pTextLayouter + = std::make_unique<drawinglayer::processor2d::TextLayouterDevice>(); + pTextLayouter->setFontAttribute(getFontAttribute(), aFontScale.getX(), aFontScale.getY(), + getLocale()); // When getting outlines from stretched text (aScale.getX() != 1.0) it // is necessary to inverse-scale the DXArray (if used) to not get the @@ -129,14 +130,14 @@ void TextSimplePortionPrimitive2D::getTextOutlinesAndTransformation( } // get the text outlines - aTextLayouter.getTextOutlines(rTarget, getText(), getTextPosition(), getTextLength(), - aScaledDXArray); + pTextLayouter->getTextOutlines(rTarget, getText(), getTextPosition(), getTextLength(), + aScaledDXArray); } else { // get the text outlines - aTextLayouter.getTextOutlines(rTarget, getText(), getTextPosition(), getTextLength(), - getDXArray()); + pTextLayouter->getTextOutlines(rTarget, getText(), getTextPosition(), getTextLength(), + getDXArray()); } // create primitives for the outlines diff --git a/drawinglayer/source/processor2d/contourextractor2d.cxx b/drawinglayer/source/processor2d/contourextractor2d.cxx index 5b9adf4c0ab1..919c09cfe430 100644 --- a/drawinglayer/source/processor2d/contourextractor2d.cxx +++ b/drawinglayer/source/processor2d/contourextractor2d.cxx @@ -131,7 +131,7 @@ namespace drawinglayer::processor2d getViewInformation2D().getVisualizedPage(), getViewInformation2D().getViewTime(), getViewInformation2D().getExtendedInformationSequence()); - primitive2d::VisitingParameters aVisitingParameters(aViewInformation2D); + primitive2d::VisitingParameters aVisitingParameters(aViewInformation2D, maVisitingParameters.getTextLayouter()); updateVisitingParameters(aVisitingParameters); // process content diff --git a/drawinglayer/source/processor2d/hittestprocessor2d.cxx b/drawinglayer/source/processor2d/hittestprocessor2d.cxx index a41037426b09..ffc6c466064f 100644 --- a/drawinglayer/source/processor2d/hittestprocessor2d.cxx +++ b/drawinglayer/source/processor2d/hittestprocessor2d.cxx @@ -240,7 +240,7 @@ namespace drawinglayer::processor2d getViewInformation2D().getVisualizedPage(), getViewInformation2D().getViewTime(), getViewInformation2D().getExtendedInformationSequence()); - primitive2d::VisitingParameters aVisitingParameters(aViewInformation2D); + primitive2d::VisitingParameters aVisitingParameters(aViewInformation2D, maVisitingParameters.getTextLayouter()); updateVisitingParameters(aVisitingParameters); // process child content recursively diff --git a/drawinglayer/source/processor2d/linegeometryextractor2d.cxx b/drawinglayer/source/processor2d/linegeometryextractor2d.cxx index cd4593b2a3a9..8a173b21fd01 100644 --- a/drawinglayer/source/processor2d/linegeometryextractor2d.cxx +++ b/drawinglayer/source/processor2d/linegeometryextractor2d.cxx @@ -94,7 +94,7 @@ namespace drawinglayer::processor2d getViewInformation2D().getViewTime(), getViewInformation2D().getExtendedInformationSequence()); - primitive2d::VisitingParameters aVisitingParameters(aViewInformation2D); + primitive2d::VisitingParameters aVisitingParameters(aViewInformation2D, maVisitingParameters.getTextLayouter()); updateVisitingParameters(aVisitingParameters); // process content diff --git a/drawinglayer/source/processor2d/textaspolygonextractor2d.cxx b/drawinglayer/source/processor2d/textaspolygonextractor2d.cxx index 5eb6c9f9c8ff..bc60998f2d03 100644 --- a/drawinglayer/source/processor2d/textaspolygonextractor2d.cxx +++ b/drawinglayer/source/processor2d/textaspolygonextractor2d.cxx @@ -185,7 +185,7 @@ namespace drawinglayer::processor2d getViewInformation2D().getViewTime(), getViewInformation2D().getExtendedInformationSequence()); - primitive2d::VisitingParameters aParameters(aViewInformation2D); + primitive2d::VisitingParameters aParameters(aViewInformation2D, maVisitingParameters.getTextLayouter()); updateVisitingParameters(aParameters); // process content diff --git a/drawinglayer/source/processor2d/textlayoutdevice.cxx b/drawinglayer/source/processor2d/textlayoutdevice.cxx index 759a5757c8a2..1af699d766ee 100644 --- a/drawinglayer/source/processor2d/textlayoutdevice.cxx +++ b/drawinglayer/source/processor2d/textlayoutdevice.cxx @@ -164,6 +164,14 @@ TextLayouterDevice::~TextLayouterDevice() COVERITY_NOEXCEPT_FALSE { releaseGloba void TextLayouterDevice::setFont(const vcl::Font& rFont) { mrDevice.SetFont(rFont); } +void TextLayouterDevice::setFontAttribute(const gfx::IFontAttribute& rFontAttribute, + double fFontScaleX, double fFontScaleY, + const css::lang::Locale& rLocale) +{ + auto rFontA = dynamic_cast<attribute::FontAttribute const&>(rFontAttribute); + setFontAttribute(rFontA, fFontScaleX, fFontScaleY, rLocale); +} + void TextLayouterDevice::setFontAttribute(const attribute::FontAttribute& rFontAttribute, double fFontScaleX, double fFontScaleY, const css::lang::Locale& rLocale) @@ -342,8 +350,8 @@ std::vector<double> TextLayouterDevice::getCaretPositions(const OUString& rText, // helper methods for vcl font handling -vcl::Font getVclFontFromFontAttribute(const attribute::FontAttribute& rFontAttribute, - double fFontScaleX, double fFontScaleY, double fFontRotation, +vcl::Font getVclFontFromFontAttribute(const gfx::IFontAttribute& rFontAttribute, double fFontScaleX, + double fFontScaleY, double fFontRotation, const css::lang::Locale& rLocale) { // detect FontScaling diff --git a/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx b/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx index 042bb4e5f54c..25a72a44fbba 100644 --- a/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx +++ b/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx @@ -2311,7 +2311,8 @@ void VclMetafileProcessor2D::processTransparencePrimitive2D( getViewInformation2D().getVisualizedPage(), getViewInformation2D().getViewTime(), getViewInformation2D().getExtendedInformationSequence()); - primitive2d::VisitingParameters aVisitingParameters(aViewInfo); + primitive2d::VisitingParameters aVisitingParameters( + aViewInfo, maVisitingParameters.getTextLayouter()); VclPixelProcessor2D aBufferProcessor(aVisitingParameters, *aBufferDevice); @@ -2451,7 +2452,8 @@ void VclMetafileProcessor2D::processPrimitive2DOnPixelProcessor( auto pBufferDevice(CreateBufferDevice(aViewRange, aViewInfo, aRectLogic, aSizePixel)); if (pBufferDevice) { - primitive2d::VisitingParameters aVisitingParameters(aViewInfo); + primitive2d::VisitingParameters aVisitingParameters(aViewInfo, + maVisitingParameters.getTextLayouter()); VclPixelProcessor2D aBufferProcessor(aVisitingParameters, *pBufferDevice, maBColorModifierStack); diff --git a/drawinglayer/source/processor2d/vclprocessor2d.cxx b/drawinglayer/source/processor2d/vclprocessor2d.cxx index 5489e56d0c19..a2a33986a3c9 100644 --- a/drawinglayer/source/processor2d/vclprocessor2d.cxx +++ b/drawinglayer/source/processor2d/vclprocessor2d.cxx @@ -907,7 +907,8 @@ void VclProcessor2D::RenderTransformPrimitive2D( getViewInformation2D().getViewTransformation(), getViewInformation2D().getViewport(), getViewInformation2D().getVisualizedPage(), getViewInformation2D().getViewTime(), getViewInformation2D().getExtendedInformationSequence()); - primitive2d::VisitingParameters aVisitingParameters(aViewInformation2D); + primitive2d::VisitingParameters aVisitingParameters(aViewInformation2D, + maVisitingParameters.getTextLayouter()); updateVisitingParameters(aVisitingParameters); // process content @@ -931,7 +932,8 @@ void VclProcessor2D::RenderPagePreviewPrimitive2D( getViewInformation2D().getViewTransformation(), getViewInformation2D().getViewport(), rPagePreviewCandidate.getXDrawPage(), getViewInformation2D().getViewTime(), getViewInformation2D().getExtendedInformationSequence()); - primitive2d::VisitingParameters aVisitingParameters(aViewInformation2D); + primitive2d::VisitingParameters aVisitingParameters(aViewInformation2D, + maVisitingParameters.getTextLayouter()); updateVisitingParameters(aVisitingParameters); // process decomposed content diff --git a/drawinglayer/source/tools/primitive2dxmldump.cxx b/drawinglayer/source/tools/primitive2dxmldump.cxx index e347e102c616..8c18973e1b8a 100644 --- a/drawinglayer/source/tools/primitive2dxmldump.cxx +++ b/drawinglayer/source/tools/primitive2dxmldump.cxx @@ -36,6 +36,7 @@ #include <drawinglayer/geometry/viewinformation2d.hxx> #include <drawinglayer/attribute/lineattribute.hxx> #include <drawinglayer/attribute/fontattribute.hxx> +#include <drawinglayer/processor2d/textlayoutdevice.hxx> #include <basegfx/polygon/b2dpolypolygontools.hxx> #include <basegfx/polygon/b2dpolygontools.hxx> @@ -209,7 +210,8 @@ void Primitive2dXmlDump::decomposeAndWrite( ::tools::XmlWriter& rWriter) { drawinglayer::geometry::ViewInformation2D aInfo; - drawinglayer::primitive2d::VisitingParameters aVisitingParameters(aInfo); + auto pTextLayouter = std::make_shared<drawinglayer::processor2d::TextLayouterDevice>(); + drawinglayer::primitive2d::VisitingParameters aVisitingParameters(aInfo, pTextLayouter); for (size_t i = 0; i < rPrimitive2DSequence.size(); i++) { |