23#include <com/sun/star/rendering/PathCapType.hpp>
24#include <com/sun/star/rendering/PathJoinType.hpp>
25#include <com/sun/star/rendering/XCanvas.hpp>
26#include <com/sun/star/rendering/XCanvasFont.hpp>
57 void init( rendering::RenderState& o_rRenderState,
58 const ::basegfx::B2DPoint& rStartPoint,
59 const OutDevState& rState,
75 &rState.fontRotation );
78 aLocalTransformation.translate( rStartPoint.getX(),
80 ::canvas::tools::appendToRenderState( o_rRenderState,
81 aLocalTransformation );
83 o_rRenderState.DeviceColor = rState.textColor;
86 void init( rendering::RenderState& o_rRenderState,
87 const ::basegfx::B2DPoint& rStartPoint,
88 const OutDevState& rState,
90 const ::basegfx::B2DHomMatrix& rTextTransform )
92 init( o_rRenderState, rStartPoint, rState, rCanvas );
101 ::canvas::tools::prependToRenderState( o_rRenderState,
105 void init( rendering::RenderState& o_rRenderState,
106 uno::Reference< rendering::XCanvasFont >& o_rFont,
107 const ::basegfx::B2DPoint& rStartPoint,
108 const OutDevState& rState,
117 const rendering::FontRequest aFontRequest;
119 geometry::Matrix2D aFontMatrix;
120 ::canvas::tools::setIdentityMatrix2D( aFontMatrix );
122 o_rFont = rCanvas->getUNOCanvas()->createFont(
124 uno::Sequence< beans::PropertyValue >(),
128 init( o_rRenderState,
134 void init( rendering::RenderState& o_rRenderState,
135 uno::Reference< rendering::XCanvasFont >& o_rFont,
136 const ::basegfx::B2DPoint& rStartPoint,
137 const OutDevState& rState,
139 const ::basegfx::B2DHomMatrix& rTextTransform )
141 init( o_rRenderState, o_rFont, rStartPoint, rState, rCanvas );
150 ::canvas::tools::prependToRenderState( o_rRenderState,
154 void initLayoutWidth(
double& rLayoutWidth,
const uno::Sequence<double>& rOffsets)
157 "::cppcanvas::internal::initLayoutWidth(): zero-length array" );
158 rLayoutWidth = *(std::max_element(rOffsets.begin(), rOffsets.end()));
161 uno::Sequence< double > setupDXArray(
KernArraySpan rCharWidths,
163 const OutDevState& rState )
166 uno::Sequence< double > aCharWidthSeq( nLen );
167 double* pOutputWidths( aCharWidthSeq.getArray() );
172 const double nScale( rState.mapModeTransform.get(0,0) );
173 for(
int i = 0;
i < nLen; ++
i )
176 *pOutputWidths++ = rCharWidths[
i] * nScale;
179 return aCharWidthSeq;
182 uno::Sequence< double > setupDXArray(
const OUString& rText,
186 const OutDevState& rState )
192 rVDev.
GetTextArray( rText, &aCharWidths, nStartPos, nLen );
194 return setupDXArray( aCharWidths, nLen, rState );
198 const OutDevState& rState,
199 const uno::Sequence< double >& rOffsets )
203 if( rState.textAlignment )
209 const double nOffset( rOffsets[ rOffsets.getLength()-1 ] );
213 aLocalPoint.setX( aLocalPoint.getX() + cos( rState.fontRotation )*nOffset );
214 aLocalPoint.setY( aLocalPoint.getY() + sin( rState.fontRotation )*nOffset );
225 void initArrayAction( rendering::RenderState& o_rRenderState,
226 uno::Reference< rendering::XTextLayout >& o_rTextLayout,
227 const ::basegfx::B2DPoint& rStartPoint,
228 const OUString& rText,
231 const uno::Sequence< double >& rOffsets,
232 const uno::Sequence< sal_Bool >& rKashidas,
234 const OutDevState& rState,
235 const ::basegfx::B2DHomMatrix* pTextTransform )
238 "::cppcanvas::internal::initArrayAction(): zero-length DX array" );
240 const ::basegfx::B2DPoint aLocalStartPoint(
241 adaptStartPoint( rStartPoint, rState, rOffsets ) );
243 uno::Reference< rendering::XCanvasFont > xFont( rState.xFont );
246 init( o_rRenderState, xFont, aLocalStartPoint, rState, rCanvas, *pTextTransform );
248 init( o_rRenderState, xFont, aLocalStartPoint, rState, rCanvas );
250 o_rTextLayout = xFont->createTextLayout(
251 rendering::StringContext( rText, nStartPos, nLen ),
252 rState.textDirection,
256 "::cppcanvas::internal::initArrayAction(): Invalid font" );
258 o_rTextLayout->applyLogicalAdvancements( rOffsets );
259 o_rTextLayout->applyKashidaPositions( rKashidas );
264 const OutDevState& rState,
265 const rendering::StringContext& rStringContext )
268 const ::basegfx::B2DSize aSize( rVDev.
GetTextWidth( rStringContext.Text,
269 static_cast<sal_uInt16
>(rStringContext.StartPosition),
270 static_cast<sal_uInt16
>(rStringContext.Length) ),
273 return (rState.mapModeTransform * aSize).getWidth();
276 uno::Sequence< double >
277 calcSubsetOffsets( rendering::RenderState& io_rRenderState,
280 const uno::Reference< rendering::XTextLayout >& rOrigTextLayout,
282 const ::cppcanvas::internal::Action::Subset& rSubset )
285 "::cppcanvas::internal::calcSubsetOffsets(): invalid subset range range" );
287 uno::Sequence< double > aOrigOffsets( rOrigTextLayout->queryLogicalAdvancements() );
288 const double* pOffsets( aOrigOffsets.getConstArray() );
291 "::cppcanvas::internal::calcSubsetOffsets(): invalid subset range range" );
299 const double nMinPos( rSubset.mnSubsetBegin <= 0 ? 0 :
300 *(std::min_element( pOffsets+rSubset.mnSubsetBegin-1,
301 pOffsets+rSubset.mnSubsetEnd )) );
308 const double nMaxPos(
309 *(std::max_element( pOffsets + (rSubset.mnSubsetBegin <= 0 ?
310 0 : rSubset.mnSubsetBegin-1),
311 pOffsets + rSubset.mnSubsetEnd )) );
320 const double nOffset = rOrigTextLayout->getMainTextDirection()
321 ? nLayoutWidth - nMaxPos : nMinPos;
335 if( rOrigTextLayout->getFont()->getFontRequest().FontDescription.IsVertical == css::util::TriState_YES )
346 ::canvas::tools::appendToRenderState( io_rRenderState,
354 const sal_Int32 nNewElements( rSubset.mnSubsetEnd - rSubset.mnSubsetBegin );
355 uno::Sequence< double > aAdaptedOffsets( nNewElements );
356 double* pAdaptedOffsets( aAdaptedOffsets.getArray() );
361 std::transform( pOffsets + rSubset.mnSubsetBegin,
362 pOffsets + rSubset.mnSubsetEnd,
364 [nMinPos](
double aPos) { return aPos - nMinPos; } );
369 return aAdaptedOffsets;
372 uno::Reference< rendering::XTextLayout >
373 createSubsetLayout(
const rendering::StringContext& rOrigContext,
374 const ::cppcanvas::internal::Action::Subset& rSubset,
375 const uno::Reference< rendering::XTextLayout >& rOrigTextLayout )
380 const sal_Int32 nNewStartPos( rOrigContext.StartPosition + std::min(
381 rSubset.mnSubsetBegin, rOrigContext.Length-1 ) );
382 const sal_Int32 nNewLength( std::max(
384 rSubset.mnSubsetEnd - rSubset.mnSubsetBegin,
385 rOrigContext.Length ),
388 const rendering::StringContext aContext( rOrigContext.Text,
392 uno::Reference< rendering::XTextLayout > xTextLayout(
393 rOrigTextLayout->getFont()->createTextLayout( aContext,
394 rOrigTextLayout->getMainTextDirection(),
396 uno::UNO_SET_THROW );
420 void createSubsetLayout( uno::Reference< rendering::XTextLayout >& io_rTextLayout,
422 rendering::RenderState& io_rRenderState,
425 const ::basegfx::B2DHomMatrix& rTransformation,
426 const Action::Subset& rSubset )
428 ::canvas::tools::prependToRenderState(io_rRenderState, rTransformation);
430 if( rSubset.mnSubsetBegin == rSubset.mnSubsetEnd )
433 io_rTextLayout.clear();
439 "createSubsetLayout(): Invalid input layout" );
441 const rendering::StringContext& rOrigContext( io_rTextLayout->getText() );
443 if( rSubset.mnSubsetBegin == 0 &&
444 rSubset.mnSubsetEnd == rOrigContext.Length )
450 uno::Reference< rendering::XTextLayout > xTextLayout(
451 createSubsetLayout( rOrigContext, rSubset, io_rTextLayout ) );
453 if( xTextLayout.is() )
455 xTextLayout->applyLogicalAdvancements(
456 calcSubsetOffsets( io_rRenderState,
462 uno::Sequence< sal_Bool > aOrigKashidaPositions(io_rTextLayout->queryKashidaPositions());
463 uno::Sequence< sal_Bool > aKashidaPositions(aOrigKashidaPositions.getArray() + rSubset.mnSubsetBegin,
464 rSubset.mnSubsetEnd - rSubset.mnSubsetBegin);
465 xTextLayout->applyKashidaPositions(aKashidaPositions);
468 io_rTextLayout = xTextLayout;
480 virtual ~TextRenderer() {}
483 virtual bool operator()(
const rendering::RenderState& rRenderState, const ::Color& rTextFillColor,
bool bNormalText )
const = 0;
493 bool renderEffectText(
const TextRenderer& rRenderer,
494 const rendering::RenderState& rRenderState,
495 const uno::Reference< rendering::XCanvas >& xCanvas,
496 const ::Color& rShadowColor,
497 const ::basegfx::B2DSize& rShadowOffset,
498 const ::Color& rReliefColor,
499 const ::basegfx::B2DSize& rReliefOffset,
500 const ::Color& rTextFillColor )
502 ::Color aEmptyColor( COL_AUTO );
503 uno::Reference<rendering::XColorSpace> xColorSpace(
504 xCanvas->getDevice()->getDeviceColorSpace() );
507 if( rShadowColor != aEmptyColor )
509 rendering::RenderState aShadowState( rRenderState );
512 aTranslate.
translate(rShadowOffset.getWidth(),
513 rShadowOffset.getHeight());
515 ::canvas::tools::appendToRenderState(aShadowState, aTranslate);
517 aShadowState.DeviceColor =
521 rRenderer( aShadowState, rTextFillColor,
false );
525 if( rReliefColor != aEmptyColor )
527 rendering::RenderState aReliefState( rRenderState );
530 aTranslate.
translate(rReliefOffset.getWidth(),
531 rReliefOffset.getHeight());
533 ::canvas::tools::appendToRenderState(aReliefState, aTranslate);
535 aReliefState.DeviceColor =
539 rRenderer( aReliefState, rTextFillColor,
false );
543 rRenderer( rRenderState, rTextFillColor,
true );
550 const ::basegfx::B2DRange& rLineBounds,
551 const ::basegfx::B2DSize& rReliefOffset,
552 const ::basegfx::B2DSize& rShadowOffset,
553 const rendering::RenderState& rRenderState,
554 const rendering::ViewState& rViewState )
559 aBounds.expand( rLineBounds );
565 aBounds.getMinY() + rReliefOffset.getHeight(),
566 aBounds.getMaxX() + rReliefOffset.getWidth(),
567 aBounds.getMaxY() + rReliefOffset.getHeight() ) );
570 aBounds.getMinY() + rShadowOffset.getHeight(),
571 aBounds.getMaxX() + rShadowOffset.getWidth(),
572 aBounds.getMaxY() + rShadowOffset.getHeight() ) );
580 uno::Reference< rendering::XPolyPolygon2D >& o_rTextLines,
583 const tools::TextLineInfo& rLineInfo )
585 const ::basegfx::B2DPolyPolygon aPoly(
591 o_rTextLines = ::basegfx::unotools::xPolyPolygonFromB2DPolyPolygon(
592 rCanvas->getUNOCanvas()->getDevice(),
597 class TextAction :
public Action
600 TextAction( const ::basegfx::B2DPoint& rStartPoint,
601 const OUString& rString,
605 const OutDevState& rState );
607 TextAction( const ::basegfx::B2DPoint& rStartPoint,
608 const OUString& rString,
612 const OutDevState& rState,
613 const ::basegfx::B2DHomMatrix& rTextTransform );
615 TextAction(
const TextAction&) =
delete;
616 const TextAction& operator=(
const TextAction&) =
delete;
618 virtual bool render( const ::basegfx::B2DHomMatrix& rTransformation )
const override;
619 virtual bool renderSubset( const ::basegfx::B2DHomMatrix& rTransformation,
620 const Subset& rSubset )
const override;
622 virtual ::basegfx::B2DRange getBounds( const ::basegfx::B2DHomMatrix& rTransformation )
const override;
623 virtual ::basegfx::B2DRange getBounds( const ::basegfx::B2DHomMatrix& rTransformation,
624 const Subset& rSubset )
const override;
626 virtual sal_Int32 getActionCount()
const override;
636 uno::Reference< rendering::XCanvasFont >
mxFont;
643 TextAction::TextAction( const ::basegfx::B2DPoint& rStartPoint,
644 const OUString& rString,
648 const OutDevState& rState ) :
659 "::cppcanvas::internal::TextAction(): Invalid font" );
662 TextAction::TextAction( const ::basegfx::B2DPoint& rStartPoint,
663 const OUString& rString,
667 const OutDevState& rState,
668 const ::basegfx::B2DHomMatrix& rTextTransform ) :
676 rState, rCanvas, rTextTransform );
679 "::cppcanvas::internal::TextAction(): Invalid font" );
682 bool TextAction::render( const ::basegfx::B2DHomMatrix& rTransformation )
const
684 SAL_INFO(
"cppcanvas.emf",
"::cppcanvas::internal::TextAction::render()" );
685 SAL_INFO(
"cppcanvas.emf",
"::cppcanvas::internal::TextAction: 0x" << std::hex <<
this );
687 rendering::RenderState aLocalState(
maState );
688 ::canvas::tools::prependToRenderState(aLocalState, rTransformation);
696 bool TextAction::renderSubset( const ::basegfx::B2DHomMatrix& rTransformation,
699 SAL_WARN(
"cppcanvas.emf",
"TextAction::renderSubset(): Subset not supported by this object" );
705 return render( rTransformation );
708 ::basegfx::B2DRange TextAction::getBounds( const ::basegfx::B2DHomMatrix& rTransformation )
const
712 uno::Reference< rendering::XTextLayout > xTextLayout(
718 rendering::RenderState aLocalState(
maState );
719 ::canvas::tools::prependToRenderState(aLocalState, rTransformation);
722 xTextLayout->queryTextBounds() ),
730 SAL_WARN(
"cppcanvas.emf",
"TextAction::getBounds(): Subset not supported by this object" );
736 return getBounds( rTransformation );
739 sal_Int32 TextAction::getActionCount()
const
749 class EffectTextAction :
754 EffectTextAction( const ::basegfx::B2DPoint& rStartPoint,
755 const ::basegfx::B2DSize& rReliefOffset,
756 const ::Color& rReliefColor,
757 const ::basegfx::B2DSize& rShadowOffset,
758 const ::Color& rShadowColor,
759 const ::Color& rTextFillColor,
760 const OUString& rText,
765 const OutDevState& rState );
767 EffectTextAction( const ::basegfx::B2DPoint& rStartPoint,
768 const ::basegfx::B2DSize& rReliefOffset,
769 const ::Color& rReliefColor,
770 const ::basegfx::B2DSize& rShadowOffset,
771 const ::Color& rShadowColor,
772 const ::Color& rTextFillColor,
773 const OUString& rText,
778 const OutDevState& rState,
779 const ::basegfx::B2DHomMatrix& rTextTransform );
781 EffectTextAction(
const EffectTextAction&) =
delete;
782 const EffectTextAction& operator=(
const EffectTextAction&) =
delete;
784 virtual bool render( const ::basegfx::B2DHomMatrix& rTransformation )
const override;
785 virtual bool renderSubset( const ::basegfx::B2DHomMatrix& rTransformation,
786 const Subset& rSubset )
const override;
788 virtual ::basegfx::B2DRange getBounds( const ::basegfx::B2DHomMatrix& rTransformation )
const override;
789 virtual ::basegfx::B2DRange getBounds( const ::basegfx::B2DHomMatrix& rTransformation,
790 const Subset& rSubset )
const override;
792 virtual sal_Int32 getActionCount()
const override;
796 virtual bool operator()(
const rendering::RenderState& rRenderState, const ::Color& rTextFillColor,
bool bNormalText )
const override;
798 geometry::RealRectangle2D queryTextBounds()
const;
799 css::uno::Reference<css::rendering::XPolyPolygon2D> queryTextBounds(
const uno::Reference<rendering::XCanvas>& rCanvas)
const;
808 uno::Reference< rendering::XCanvasFont >
mxFont;
811 rendering::RenderState
maState;
823 EffectTextAction::EffectTextAction( const ::basegfx::B2DPoint& rStartPoint,
824 const ::basegfx::B2DSize& rReliefOffset,
825 const ::Color& rReliefColor,
826 const ::basegfx::B2DSize& rShadowOffset,
827 const ::Color& rShadowColor,
828 const ::Color& rTextFillColor,
829 const OUString& rText,
834 const OutDevState& rState ) :
858 "::cppcanvas::internal::EffectTextAction(): Invalid font or lines" );
861 EffectTextAction::EffectTextAction( const ::basegfx::B2DPoint& rStartPoint,
862 const ::basegfx::B2DSize& rReliefOffset,
863 const ::Color& rReliefColor,
864 const ::basegfx::B2DSize& rShadowOffset,
865 const ::Color& rShadowColor,
866 const ::Color& rTextFillColor,
867 const OUString& rText,
872 const OutDevState& rState,
873 const ::basegfx::B2DHomMatrix& rTextTransform ) :
894 rState, rCanvas, rTextTransform );
897 "::cppcanvas::internal::EffectTextAction(): Invalid font or lines" );
900 bool EffectTextAction::operator()(
const rendering::RenderState& rRenderState, const ::Color& rTextFillColor,
bool )
const
902 const rendering::ViewState& rViewState(
mpCanvas->getViewState() );
903 const uno::Reference< rendering::XCanvas >& rCanvas(
mpCanvas->getUNOCanvas() );
906 if (rTextFillColor != COL_AUTO)
908 rendering::RenderState aLocalState( rRenderState );
910 rTextFillColor, rCanvas->getDevice()->getDeviceColorSpace());
911 auto xTextBounds = queryTextBounds(rCanvas);
913 rCanvas->fillPolyPolygon(xTextBounds, rViewState, aLocalState);
929 bool EffectTextAction::render( const ::basegfx::B2DHomMatrix& rTransformation )
const
931 SAL_INFO(
"cppcanvas.emf",
"::cppcanvas::internal::EffectTextAction::render()" );
932 SAL_INFO(
"cppcanvas.emf",
"::cppcanvas::internal::EffectTextAction: 0x" << std::hex <<
this );
934 rendering::RenderState aLocalState(
maState );
935 ::canvas::tools::prependToRenderState(aLocalState, rTransformation);
937 return renderEffectText( *
this,
947 bool EffectTextAction::renderSubset( const ::basegfx::B2DHomMatrix& rTransformation,
950 SAL_WARN(
"cppcanvas.emf",
"EffectTextAction::renderSubset(): Subset not supported by this object" );
956 return render( rTransformation );
959 geometry::RealRectangle2D EffectTextAction::queryTextBounds()
const
963 uno::Reference< rendering::XTextLayout > xTextLayout(
969 return xTextLayout->queryTextBounds();
972 css::uno::Reference<css::rendering::XPolyPolygon2D> EffectTextAction::queryTextBounds(
const uno::Reference<rendering::XCanvas>& rCanvas)
const
974 auto aTextBounds = queryTextBounds();
975 auto aB2DBounds = ::basegfx::unotools::b2DRectangleFromRealRectangle2D(aTextBounds);
976 auto aTextBoundsPoly = ::basegfx::utils::createPolygonFromRect(aB2DBounds);
977 return ::basegfx::unotools::xPolyPolygonFromB2DPolygon(rCanvas->getDevice(), aTextBoundsPoly);
980 ::basegfx::B2DRange EffectTextAction::getBounds( const ::basegfx::B2DHomMatrix& rTransformation )
const
982 rendering::RenderState aLocalState(
maState );
983 ::canvas::tools::prependToRenderState(aLocalState, rTransformation);
985 return calcEffectTextBounds( ::basegfx::unotools::b2DRectangleFromRealRectangle2D(
996 ::basegfx::B2DRange EffectTextAction::getBounds( const ::basegfx::B2DHomMatrix& rTransformation,
999 SAL_WARN(
"cppcanvas.emf",
"EffectTextAction::getBounds(): Subset not supported by this object" );
1005 return getBounds( rTransformation );
1008 sal_Int32 EffectTextAction::getActionCount()
const
1018 class TextArrayAction :
public Action
1021 TextArrayAction( const ::basegfx::B2DPoint& rStartPoint,
1022 const OUString& rString,
1023 sal_Int32 nStartPos,
1025 const uno::Sequence< double >& rOffsets,
1026 const uno::Sequence< sal_Bool >& rKashidas,
1028 const OutDevState& rState );
1030 TextArrayAction( const ::basegfx::B2DPoint& rStartPoint,
1031 const OUString& rString,
1032 sal_Int32 nStartPos,
1034 const uno::Sequence< double >& rOffsets,
1035 const uno::Sequence< sal_Bool >& rKashidas,
1037 const OutDevState& rState,
1038 const ::basegfx::B2DHomMatrix& rTextTransform );
1040 TextArrayAction(
const TextArrayAction&) =
delete;
1041 const TextArrayAction& operator=(
const TextArrayAction&) =
delete;
1043 virtual bool render( const ::basegfx::B2DHomMatrix& rTransformation )
const override;
1044 virtual bool renderSubset( const ::basegfx::B2DHomMatrix& rTransformation,
1045 const Subset& rSubset )
const override;
1047 virtual ::basegfx::B2DRange getBounds( const ::basegfx::B2DHomMatrix& rTransformation )
const override;
1048 virtual ::basegfx::B2DRange getBounds( const ::basegfx::B2DHomMatrix& rTransformation,
1049 const Subset& rSubset )
const override;
1051 virtual sal_Int32 getActionCount()
const override;
1063 rendering::RenderState
maState;
1067 TextArrayAction::TextArrayAction( const ::basegfx::B2DPoint& rStartPoint,
1068 const OUString& rString,
1069 sal_Int32 nStartPos,
1071 const uno::Sequence< double >& rOffsets,
1072 const uno::Sequence< sal_Bool >& rKashidas,
1074 const OutDevState& rState ) :
1091 TextArrayAction::TextArrayAction( const ::basegfx::B2DPoint& rStartPoint,
1092 const OUString& rString,
1093 sal_Int32 nStartPos,
1095 const uno::Sequence< double >& rOffsets,
1096 const uno::Sequence< sal_Bool >& rKashidas,
1098 const OutDevState& rState,
1099 const ::basegfx::B2DHomMatrix& rTextTransform ) :
1117 bool TextArrayAction::render( const ::basegfx::B2DHomMatrix& rTransformation )
const
1119 SAL_INFO(
"cppcanvas.emf",
"::cppcanvas::internal::TextArrayAction::render()" );
1120 SAL_INFO(
"cppcanvas.emf",
"::cppcanvas::internal::TextArrayAction: 0x" << std::hex <<
this );
1122 rendering::RenderState aLocalState(
maState );
1123 ::canvas::tools::prependToRenderState(aLocalState, rTransformation);
1132 bool TextArrayAction::renderSubset( const ::basegfx::B2DHomMatrix& rTransformation,
1133 const Subset& rSubset )
const
1135 SAL_INFO(
"cppcanvas.emf",
"::cppcanvas::internal::TextArrayAction::renderSubset()" );
1136 SAL_INFO(
"cppcanvas.emf",
"::cppcanvas::internal::TextArrayAction: 0x" << std::hex <<
this );
1138 rendering::RenderState aLocalState(
maState );
1139 uno::Reference< rendering::XTextLayout > xTextLayout(
mxTextLayout );
1141 double nDummy0, nDummy1;
1142 createSubsetLayout( xTextLayout,
1150 if( !xTextLayout.is() )
1153 mpCanvas->getUNOCanvas()->drawTextLayout( xTextLayout,
1160 ::basegfx::B2DRange TextArrayAction::getBounds( const ::basegfx::B2DHomMatrix& rTransformation )
const
1162 rendering::RenderState aLocalState(
maState );
1163 ::canvas::tools::prependToRenderState(aLocalState, rTransformation);
1171 ::basegfx::B2DRange TextArrayAction::getBounds( const ::basegfx::B2DHomMatrix& rTransformation,
1172 const Subset& rSubset )
const
1174 SAL_INFO(
"cppcanvas.emf",
"::cppcanvas::internal::TextArrayAction::getBounds( subset )" );
1175 SAL_INFO(
"cppcanvas.emf",
"::cppcanvas::internal::TextArrayAction: 0x" << std::hex <<
this );
1177 rendering::RenderState aLocalState(
maState );
1178 uno::Reference< rendering::XTextLayout > xTextLayout(
mxTextLayout );
1180 double nDummy0, nDummy1;
1181 createSubsetLayout( xTextLayout,
1189 if( !xTextLayout.is() )
1190 return ::basegfx::B2DRange();
1193 xTextLayout->queryTextBounds() ),
1198 sal_Int32 TextArrayAction::getActionCount()
const
1200 const rendering::StringContext& rOrigContext(
mxTextLayout->getText() );
1202 return rOrigContext.Length;
1206 class EffectTextArrayAction :
1211 EffectTextArrayAction( const ::basegfx::B2DPoint& rStartPoint,
1212 const ::basegfx::B2DSize& rReliefOffset,
1213 const ::Color& rReliefColor,
1214 const ::basegfx::B2DSize& rShadowOffset,
1215 const ::Color& rShadowColor,
1216 const ::Color& rTextFillColor,
1217 const OUString& rText,
1218 sal_Int32 nStartPos,
1220 const uno::Sequence< double >& rOffsets,
1221 const uno::Sequence< sal_Bool >& rKashidas,
1224 const OutDevState& rState );
1225 EffectTextArrayAction( const ::basegfx::B2DPoint& rStartPoint,
1226 const ::basegfx::B2DSize& rReliefOffset,
1227 const ::Color& rReliefColor,
1228 const ::basegfx::B2DSize& rShadowOffset,
1229 const ::Color& rShadowColor,
1230 const ::Color& rTextFillColor,
1231 const OUString& rText,
1232 sal_Int32 nStartPos,
1234 const uno::Sequence< double >& rOffsets,
1235 const uno::Sequence< sal_Bool >& rKashidas,
1238 const OutDevState& rState,
1239 const ::basegfx::B2DHomMatrix& rTextTransform );
1241 EffectTextArrayAction(
const EffectTextArrayAction&) =
delete;
1242 const EffectTextArrayAction& operator=(
const EffectTextArrayAction&) =
delete;
1244 virtual bool render( const ::basegfx::B2DHomMatrix& rTransformation )
const override;
1245 virtual bool renderSubset( const ::basegfx::B2DHomMatrix& rTransformation,
1246 const Subset& rSubset )
const override;
1248 virtual ::basegfx::B2DRange getBounds( const ::basegfx::B2DHomMatrix& rTransformation )
const override;
1249 virtual ::basegfx::B2DRange getBounds( const ::basegfx::B2DHomMatrix& rTransformation,
1250 const Subset& rSubset )
const override;
1252 virtual sal_Int32 getActionCount()
const override;
1256 virtual bool operator()(
const rendering::RenderState& rRenderState, const ::Color& rTextFillColor,
bool bNormalText )
const override;
1258 css::uno::Reference<css::rendering::XPolyPolygon2D> queryTextBounds(
const uno::Reference<rendering::XCanvas>& rCanvas)
const;
1269 rendering::RenderState
maState;
1280 EffectTextArrayAction::EffectTextArrayAction( const ::basegfx::B2DPoint& rStartPoint,
1281 const ::basegfx::B2DSize& rReliefOffset,
1282 const ::Color& rReliefColor,
1283 const ::basegfx::B2DSize& rShadowOffset,
1284 const ::Color& rShadowColor,
1285 const ::Color& rTextFillColor,
1286 const OUString& rText,
1287 sal_Int32 nStartPos,
1289 const uno::Sequence< double >& rOffsets,
1290 const uno::Sequence< sal_Bool >& rKashidas,
1293 const OutDevState& rState ) :
1319 EffectTextArrayAction::EffectTextArrayAction( const ::basegfx::B2DPoint& rStartPoint,
1320 const ::basegfx::B2DSize& rReliefOffset,
1321 const ::Color& rReliefColor,
1322 const ::basegfx::B2DSize& rShadowOffset,
1323 const ::Color& rShadowColor,
1324 const ::Color& rTextFillColor,
1325 const OUString& rText,
1326 sal_Int32 nStartPos,
1328 const uno::Sequence< double >& rOffsets,
1329 const uno::Sequence< sal_Bool >& rKashidas,
1332 const OutDevState& rState,
1333 const ::basegfx::B2DHomMatrix& rTextTransform ) :
1360 css::uno::Reference<css::rendering::XPolyPolygon2D> EffectTextArrayAction::queryTextBounds(
const uno::Reference<rendering::XCanvas>& rCanvas)
const
1362 const geometry::RealRectangle2D aTextBounds(
mxTextLayout->queryTextBounds());
1363 auto aB2DBounds = ::basegfx::unotools::b2DRectangleFromRealRectangle2D(aTextBounds);
1364 auto aTextBoundsPoly = ::basegfx::utils::createPolygonFromRect(aB2DBounds);
1365 return ::basegfx::unotools::xPolyPolygonFromB2DPolygon(rCanvas->getDevice(), aTextBoundsPoly);
1368 bool EffectTextArrayAction::operator()(
const rendering::RenderState& rRenderState, const ::Color& rTextFillColor,
bool bNormalText)
const
1370 const rendering::ViewState& rViewState(
mpCanvas->getViewState() );
1371 const uno::Reference< rendering::XCanvas >& rCanvas(
mpCanvas->getUNOCanvas() );
1374 if (rTextFillColor != COL_AUTO)
1376 rendering::RenderState aLocalState(rRenderState);
1378 rTextFillColor, rCanvas->getDevice()->getDeviceColorSpace());
1379 auto xTextBounds = queryTextBounds(rCanvas);
1381 rCanvas->fillPolyPolygon(xTextBounds, rViewState, aLocalState);
1394 bool EffectTextArrayAction::render( const ::basegfx::B2DHomMatrix& rTransformation )
const
1396 SAL_INFO(
"cppcanvas.emf",
"::cppcanvas::internal::EffectTextArrayAction::render()" );
1397 SAL_INFO(
"cppcanvas.emf",
"::cppcanvas::internal::EffectTextArrayAction: 0x" << std::hex <<
this );
1399 rendering::RenderState aLocalState(
maState );
1400 ::canvas::tools::prependToRenderState(aLocalState, rTransformation);
1402 return renderEffectText( *
this,
1412 class EffectTextArrayRenderHelper :
public TextRenderer
1415 EffectTextArrayRenderHelper(
const uno::Reference< rendering::XCanvas >& rCanvas,
1416 const uno::Reference< rendering::XTextLayout >& rTextLayout,
1417 const TextLinesHelper& rTextLinesHelper,
1418 const rendering::ViewState& rViewState ) :
1427 virtual bool operator()(
const rendering::RenderState& rRenderState, const ::Color& rTextFillColor,
bool bNormalText)
const override
1432 if (rTextFillColor != COL_AUTO)
1434 rendering::RenderState aLocalState(rRenderState);
1436 rTextFillColor,
mrCanvas->getDevice()->getDeviceColorSpace());
1437 auto xTextBounds = queryTextBounds();
1451 css::uno::Reference<css::rendering::XPolyPolygon2D> queryTextBounds()
const
1453 const geometry::RealRectangle2D aTextBounds(
mrTextLayout->queryTextBounds());
1454 auto aB2DBounds = ::basegfx::unotools::b2DRectangleFromRealRectangle2D(aTextBounds);
1455 auto aTextBoundsPoly = ::basegfx::utils::createPolygonFromRect(aB2DBounds);
1456 return ::basegfx::unotools::xPolyPolygonFromB2DPolygon(
mrCanvas->getDevice(), aTextBoundsPoly);
1465 bool EffectTextArrayAction::renderSubset( const ::basegfx::B2DHomMatrix& rTransformation,
1466 const Subset& rSubset )
const
1468 SAL_INFO(
"cppcanvas.emf",
"::cppcanvas::internal::EffectTextArrayAction::renderSubset()" );
1469 SAL_INFO(
"cppcanvas.emf",
"::cppcanvas::internal::EffectTextArrayAction: 0x" << std::hex <<
this );
1471 rendering::RenderState aLocalState(
maState );
1472 uno::Reference< rendering::XTextLayout > xTextLayout(
mxTextLayout );
1473 const geometry::RealRectangle2D aTextBounds(
mxTextLayout->queryTextBounds() );
1475 double nMinPos(0.0);
1476 double nMaxPos(aTextBounds.X2 - aTextBounds.X1);
1478 createSubsetLayout( xTextLayout,
1486 if( !xTextLayout.is() )
1493 uno::Reference< rendering::XCanvas > xCanvas(
mpCanvas->getUNOCanvas() );
1494 const rendering::ViewState& rViewState(
mpCanvas->getViewState() );
1503 return renderEffectText(
1504 EffectTextArrayRenderHelper( xCanvas,
1517 ::basegfx::B2DRange EffectTextArrayAction::getBounds( const ::basegfx::B2DHomMatrix& rTransformation )
const
1519 rendering::RenderState aLocalState(
maState );
1520 ::canvas::tools::prependToRenderState(aLocalState, rTransformation);
1524 return calcEffectTextBounds( ::basegfx::unotools::b2DRectangleFromRealRectangle2D(
1535 ::basegfx::B2DRange EffectTextArrayAction::getBounds( const ::basegfx::B2DHomMatrix& rTransformation,
1536 const Subset& rSubset )
const
1538 SAL_INFO(
"cppcanvas.emf",
"::cppcanvas::internal::EffectTextArrayAction::getBounds( subset )" );
1539 SAL_INFO(
"cppcanvas.emf",
"::cppcanvas::internal::EffectTextArrayAction: 0x" << std::hex <<
this );
1541 rendering::RenderState aLocalState(
maState );
1542 uno::Reference< rendering::XTextLayout > xTextLayout(
mxTextLayout );
1543 const geometry::RealRectangle2D aTextBounds(
mxTextLayout->queryTextBounds() );
1545 double nMinPos(0.0);
1546 double nMaxPos(aTextBounds.X2 - aTextBounds.X1);
1548 createSubsetLayout( xTextLayout,
1556 if( !xTextLayout.is() )
1557 return ::basegfx::B2DRange();
1563 const ::basegfx::B2DPolyPolygon aPoly(
1565 0.0, nMaxPos - nMinPos,
1568 return calcEffectTextBounds( ::basegfx::unotools::b2DRectangleFromRealRectangle2D(
1569 xTextLayout->queryTextBounds() ),
1570 ::basegfx::utils::getRange( aPoly ),
1577 sal_Int32 EffectTextArrayAction::getActionCount()
const
1579 const rendering::StringContext& rOrigContext(
mxTextLayout->getText() );
1581 return rOrigContext.Length;
1585 class OutlineAction :
1590 OutlineAction( const ::basegfx::B2DPoint& rStartPoint,
1591 const ::basegfx::B2DSize& rReliefOffset,
1592 const ::Color& rReliefColor,
1593 const ::basegfx::B2DSize& rShadowOffset,
1594 const ::Color& rShadowColor,
1595 const ::basegfx::B2DRectangle& rOutlineBounds,
1596 uno::Reference< rendering::XPolyPolygon2D > xTextPoly,
1597 const uno::Sequence< double >& rOffsets,
1600 const OutDevState& rState );
1601 OutlineAction( const ::basegfx::B2DPoint& rStartPoint,
1602 const ::basegfx::B2DSize& rReliefOffset,
1603 const ::Color& rReliefColor,
1604 const ::basegfx::B2DSize& rShadowOffset,
1605 const ::Color& rShadowColor,
1606 const ::basegfx::B2DRectangle& rOutlineBounds,
1607 uno::Reference< rendering::XPolyPolygon2D > xTextPoly,
1608 const uno::Sequence< double >& rOffsets,
1611 const OutDevState& rState,
1612 const ::basegfx::B2DHomMatrix& rTextTransform );
1614 OutlineAction(
const OutlineAction&) =
delete;
1615 const OutlineAction& operator=(
const OutlineAction&) =
delete;
1617 virtual bool render( const ::basegfx::B2DHomMatrix& rTransformation )
const override;
1618 virtual bool renderSubset( const ::basegfx::B2DHomMatrix& rTransformation,
1619 const Subset& rSubset )
const override;
1621 virtual ::basegfx::B2DRange getBounds( const ::basegfx::B2DHomMatrix& rTransformation )
const override;
1622 virtual ::basegfx::B2DRange getBounds( const ::basegfx::B2DHomMatrix& rTransformation,
1623 const Subset& rSubset )
const override;
1625 virtual sal_Int32 getActionCount()
const override;
1629 virtual bool operator()(
const rendering::RenderState& rRenderState, const ::Color& rTextFillColor,
bool bNormalText )
const override;
1642 rendering::RenderState
maState;
1648 uno::Reference< rendering::XPolyPolygon2D >
mxTextLines;
1656 double calcOutlineWidth(
const OutDevState& rState,
1659 const ::basegfx::B2DSize aFontSize( 0,
1662 const double nOutlineWidth(
1663 (rState.mapModeTransform * aFontSize).getHeight() );
1665 return nOutlineWidth < 1.0 ? 1.0 : nOutlineWidth;
1668 OutlineAction::OutlineAction( const ::basegfx::B2DPoint& rStartPoint,
1669 const ::basegfx::B2DSize& rReliefOffset,
1670 const ::Color& rReliefColor,
1671 const ::basegfx::B2DSize& rShadowOffset,
1672 const ::Color& rShadowColor,
1673 const ::basegfx::B2DRectangle& rOutlineBounds,
1674 uno::Reference< rendering::XPolyPolygon2D > xTextPoly,
1675 const uno::Sequence< double >& rOffsets,
1678 const OutDevState& rState ) :
1686 rCanvas->getUNOCanvas()->getDevice()->getDeviceColorSpace() )),
1694 double nLayoutWidth = 0.0;
1696 initLayoutWidth(nLayoutWidth, rOffsets);
1710 OutlineAction::OutlineAction( const ::basegfx::B2DPoint& rStartPoint,
1711 const ::basegfx::B2DSize& rReliefOffset,
1712 const ::Color& rReliefColor,
1713 const ::basegfx::B2DSize& rShadowOffset,
1714 const ::Color& rShadowColor,
1715 const ::basegfx::B2DRectangle& rOutlineBounds,
1716 uno::Reference< rendering::XPolyPolygon2D > xTextPoly,
1717 const uno::Sequence< double >& rOffsets,
1720 const OutDevState& rState,
1721 const ::basegfx::B2DHomMatrix& rTextTransform ) :
1729 rCanvas->getUNOCanvas()->getDevice()->getDeviceColorSpace() )),
1737 double nLayoutWidth = 0.0;
1738 initLayoutWidth(nLayoutWidth, rOffsets);
1753 bool OutlineAction::operator()(
const rendering::RenderState& rRenderState, const ::Color& ,
bool )
const
1755 const rendering::ViewState& rViewState(
mpCanvas->getViewState() );
1756 const uno::Reference< rendering::XCanvas >& rCanvas(
mpCanvas->getUNOCanvas() );
1758 rendering::StrokeAttributes aStrokeAttributes;
1761 aStrokeAttributes.MiterLimit = 1.0;
1762 aStrokeAttributes.StartCapType = rendering::PathCapType::BUTT;
1763 aStrokeAttributes.EndCapType = rendering::PathCapType::BUTT;
1764 aStrokeAttributes.JoinType = rendering::PathJoinType::MITER;
1766 rendering::RenderState aLocalState( rRenderState );
1780 aStrokeAttributes );
1790 aStrokeAttributes );
1795 bool OutlineAction::render( const ::basegfx::B2DHomMatrix& rTransformation )
const
1797 SAL_INFO(
"cppcanvas.emf",
"::cppcanvas::internal::EffectTextArrayAction::render()" );
1798 SAL_INFO(
"cppcanvas.emf",
"::cppcanvas::internal::EffectTextArrayAction: 0x" << std::hex <<
this );
1800 rendering::RenderState aLocalState(
maState );
1801 ::canvas::tools::prependToRenderState(aLocalState, rTransformation);
1803 return renderEffectText( *
this,
1814 class OutlineTextArrayRenderHelper :
public TextRenderer
1817 OutlineTextArrayRenderHelper(
const uno::Reference< rendering::XCanvas >& rCanvas,
1818 const uno::Reference< rendering::XPolyPolygon2D >& rTextPolygon,
1819 const uno::Reference< rendering::XPolyPolygon2D >& rLinePolygon,
1820 const rendering::ViewState& rViewState,
1821 double nOutlineWidth ) :
1825 rCanvas->getDevice()->getDeviceColorSpace() )),
1828 mrTextPolygon( rTextPolygon ),
1829 mrLinePolygon( rLinePolygon ),
1835 virtual bool operator()(
const rendering::RenderState& rRenderState )
const
1837 rendering::StrokeAttributes aStrokeAttributes;
1840 aStrokeAttributes.MiterLimit = 1.0;
1841 aStrokeAttributes.StartCapType = rendering::PathCapType::BUTT;
1842 aStrokeAttributes.EndCapType = rendering::PathCapType::BUTT;
1843 aStrokeAttributes.JoinType = rendering::PathJoinType::MITER;
1845 rendering::RenderState aLocalState( rRenderState );
1851 mrCanvas->fillPolyPolygon( mrTextPolygon,
1856 mrCanvas->strokePolyPolygon( mrTextPolygon,
1859 aStrokeAttributes );
1862 mrCanvas->fillPolyPolygon( mrLinePolygon,
1866 mrCanvas->strokePolyPolygon( mrLinePolygon,
1869 aStrokeAttributes );
1877 const uno::Reference< rendering::XCanvas >&
mrCanvas;
1878 const uno::Reference< rendering::XPolyPolygon2D >& mrTextPolygon;
1879 const uno::Reference< rendering::XPolyPolygon2D >& mrLinePolygon;
1884 bool OutlineAction::renderSubset( const ::basegfx::B2DHomMatrix& rTransformation,
1885 const Subset& rSubset )
const
1887 SAL_INFO(
"cppcanvas.emf",
"::cppcanvas::internal::OutlineAction::renderSubset()" );
1888 SAL_INFO(
"cppcanvas.emf",
"::cppcanvas::internal::OutlineAction: 0x" << std::hex <<
this );
1890 if( rSubset.mnSubsetBegin == rSubset.mnSubsetEnd )
1895 return render( rTransformation );
1897 const rendering::StringContext rOrigContext(
mxTextLayout->getText() );
1899 if( rSubset.mnSubsetBegin == 0 &&
1900 rSubset.mnSubsetEnd == rOrigContext.Length )
1903 return render( rTransformation );
1906 rendering::RenderState aLocalState(
maState );
1907 ::canvas::tools::prependToRenderState(aLocalState, rTransformation);
1913 uno::Reference< rendering::XPolyPolygon2D > xTextPolygon();
1917 if( !xTextLayout.is() )
1923 return renderEffectText(
1924 OutlineTextArrayRenderHelper(
1940 ::basegfx::B2DRange OutlineAction::getBounds( const ::basegfx::B2DHomMatrix& rTransformation )
const
1942 rendering::RenderState aLocalState(
maState );
1943 ::canvas::tools::prependToRenderState(aLocalState, rTransformation);
1955 ::basegfx::B2DRange OutlineAction::getBounds( const ::basegfx::B2DHomMatrix& rTransformation,
1958 SAL_WARN(
"cppcanvas.emf",
"OutlineAction::getBounds(): Subset not yet supported by this object" );
1960 return getBounds( rTransformation );
1963 sal_Int32 OutlineAction::getActionCount()
const
1979 std::shared_ptr<Action> createOutline( const ::basegfx::B2DPoint& rStartPoint,
1980 const ::basegfx::B2DSize& rReliefOffset,
1981 const ::Color& rReliefColor,
1982 const ::basegfx::B2DSize& rShadowOffset,
1983 const ::Color& rShadowColor,
1984 const OUString& rText,
1985 sal_Int32 nStartPos,
1991 const OutDevState& rState,
1992 const Renderer::Parameters& rParms )
2005 aUnrotatedFont.SetOrientation(0_deg10);
2006 rVDev.
SetFont( aUnrotatedFont );
2012 const bool bHaveOutlines( rVDev.
GetTextOutlines( aVCLPolyPolyVector, rText,
2013 static_cast<sal_uInt16
>(nStartPos),
2014 static_cast<sal_uInt16
>(nStartPos),
2015 static_cast<sal_uInt16
>(nLen),
2016 0, pDXArray, pKashidaArray ) );
2019 if( !bHaveOutlines )
2020 return std::shared_ptr<Action>();
2026 rState.mapModeTransform );
2027 aMapModeTransform.set(0,2, 0.0);
2028 aMapModeTransform.set(1,2, 0.0);
2030 for(
const auto& rVCLPolyPolygon : aVCLPolyPolyVector )
2033 aPolyPolygon.
transform( aMapModeTransform );
2036 for( sal_uInt32 i=0;
i<aPolyPolygon.
count(); ++
i )
2041 const ::basegfx::B2DPolygon& rPoly( aPolyPolygon.
getB2DPolygon( i ) );
2042 const sal_uInt32
nCount( rPoly.count() );
2048 aResultingPolyPolygon.
append( rPoly );
2053 aPoly.setClosed(
true);
2055 aResultingPolyPolygon.
append( aPoly );
2060 const uno::Sequence< double > aCharWidthSeq(
2062 setupDXArray( pDXArray, nLen, rState ) :
2063 setupDXArray( rText,
2068 const uno::Reference< rendering::XPolyPolygon2D > xTextPoly(
2069 ::basegfx::unotools::xPolyPolygonFromB2DPolyPolygon(
2070 rCanvas->getUNOCanvas()->getDevice(),
2071 aResultingPolyPolygon ) );
2073 if( rParms.maTextTransformation )
2075 return std::make_shared<OutlineAction>(
2081 ::basegfx::utils::getRange(aResultingPolyPolygon),
2087 *rParms.maTextTransformation );
2091 return std::make_shared<OutlineAction>(
2097 ::basegfx::utils::getRange(aResultingPolyPolygon),
2110 const ::Size& rReliefOffset,
2111 const ::Color& rReliefColor,
2112 const ::Size& rShadowOffset,
2113 const ::Color& rShadowColor,
2114 const ::Color& rTextFillColor,
2115 const OUString& rText,
2116 sal_Int32 nStartPos,
2130 const ::basegfx::B2DPoint aStartPoint(
2133 rStartPoint.Y() + aBaselineOffset.Height()) );
2135 const ::basegfx::B2DSize aReliefOffset(
2137 const ::basegfx::B2DSize aShadowOffset(
2142 return createOutline(
2161 const uno::Sequence< double > aCharWidths(
2163 setupDXArray( pDXArray, nLen, rState ) :
2164 setupDXArray( rText,
2170 const uno::Sequence< sal_Bool > aKashidas(pKashidaArray.
data(), pKashidaArray.
size());
2175 const ::Color aEmptyColor(
COL_AUTO );
2177 std::shared_ptr<Action> ret;
2181 if( pDXArray.
empty() && !bSubsettable )
2187 rReliefColor == aEmptyColor &&
2188 rShadowColor == aEmptyColor &&
2189 rTextFillColor == aEmptyColor )
2194 ret = std::make_shared<TextAction>(
2205 ret = std::make_shared<TextAction>(
2218 ret = std::make_shared<EffectTextAction>(
2233 ret = std::make_shared<EffectTextAction>(
2254 rReliefColor == aEmptyColor &&
2255 rShadowColor == aEmptyColor &&
2256 rTextFillColor == aEmptyColor )
2260 ret = std::make_shared<TextArrayAction>(
2271 ret = std::make_shared<TextArrayAction>(
2285 ret = std::make_shared<EffectTextArrayAction>(
2302 ret = std::make_shared<EffectTextArrayAction>(
FILE * init(int, char **)
const vcl::Font & GetFont() const
void SetFont(const vcl::Font &rNewFont)
tools::Long GetTextWidth(const OUString &rStr, sal_Int32 nIndex=0, sal_Int32 nLen=-1, vcl::text::TextLayoutCache const *=nullptr, SalLayoutGlyphs const *const pLayoutCache=nullptr) const
tools::Long GetTextArray(const OUString &rStr, KernArray *pDXAry, sal_Int32 nIndex=0, sal_Int32 nLen=-1, bool bCaret=false, vcl::text::TextLayoutCache const *=nullptr, SalLayoutGlyphs const *const pLayoutCache=nullptr) const
bool GetTextOutlines(PolyPolyVector &, const OUString &rStr, sal_Int32 nBase=0, sal_Int32 nIndex=0, sal_Int32 nLen=-1, sal_uLong nLayoutWidth=0, KernArraySpan aDXArray=KernArraySpan(), o3tl::span< const sal_Bool > pKashidaArray={}) const
void translate(double fX, double fY)
B2DPolygon const & getB2DPolygon(sal_uInt32 nIndex) const
void append(const B2DPolygon &rPolygon, sal_uInt32 nCount=1)
void transform(const basegfx::B2DHomMatrix &rMatrix)
B2DVector getRange() const
constexpr size_type size() const noexcept
constexpr pointer data() const noexcept
tools::Long GetFontHeight() const
constexpr ::Color COL_WHITE(0xFF, 0xFF, 0xFF)
constexpr ::Color COL_AUTO(ColorTransparency, 0xFF, 0xFF, 0xFF, 0xFF)
#define ENSURE_OR_THROW(c, m)
#define SAL_WARN(area, stream)
#define SAL_INFO(area, stream)
B2DHomMatrix createRotateB2DHomMatrix(double fRadiant)
B2DRange getRange(const B2DPolygon &rCandidate)
std::shared_ptr< Action > createTextAction(const ::Point &rStartPoint, const ::Size &rReliefOffset, const ::Color &rReliefColor, const ::Size &rShadowOffset, const ::Color &rShadowColor, const ::Color &rTextFillColor, const OUString &rText, sal_Int32 nStartPos, sal_Int32 nLen, KernArraySpan pDXArray, o3tl::span< const sal_Bool > pKashidaArray, VirtualDevice &rVDev, const CanvasSharedPtr &rCanvas, const OutDevState &rState, const Renderer::Parameters &rParms, bool bSubsettable)
Create text action, optionally shadow/relief effect.
std::shared_ptr< Canvas > CanvasSharedPtr
std::vector< tools::PolyPolygon > PolyPolyVector
Parameters for the Renderer.
::std::optional< ::basegfx::B2DHomMatrix > maTextTransformation
Optionally transforms all text output actions with the given matrix (in addition to the overall canva...
::basegfx::B2DHomMatrix mapModeTransform
bool isTextOutlineModeSet
sal_Int8 textUnderlineStyle
sal_Int8 textStrikeoutStyle
sal_Int8 textOverlineStyle
const uno::Sequence< double > maFillColor
uno::Reference< rendering::XPolyPolygon2D > mxTextPoly
const uno::Reference< rendering::XCanvas > & mrCanvas
const tools::TextLineInfo maTextLineInfo
const uno::Reference< rendering::XTextLayout > & mrTextLayout
const rendering::ViewState & mrViewState
const CanvasSharedPtr mpCanvas
const uno::Sequence< double > maOffsets
rendering::RenderState maState
uno::Reference< rendering::XPolyPolygon2D > mxTextLines
const sal_Int8 maTextDirection
uno::Reference< rendering::XCanvasFont > mxFont
const ::basegfx::B2DSize maReliefOffset
const ::basegfx::B2DSize maShadowOffset
const rendering::StringContext maStringContext
::basegfx::B2DSize maLinesOverallSize
const ::Color maTextFillColor
const ::Color maReliefColor
TextLinesHelper maTextLinesHelper
const ::basegfx::B2DRectangle maOutlineBounds
uno::Reference< rendering::XTextLayout > mxTextLayout
const ::Color maShadowColor
const TextLinesHelper & mrTextLinesHelper