48#include <com/sun/star/i18n/BreakIterator.hpp>
49#include <com/sun/star/i18n/ScriptType.hpp>
53#include <rtl/math.hxx>
64 std::vector< tools::PolyPolygon > vOutlines;
70 std::vector< FWCharacterData > vCharacters;
76 std::vector< FWParagraphData > vParagraphs;
81 std::vector< FWTextArea > vTextAreas;
82 double fHorizontalTextScaling;
83 double fVerticalTextScaling;
84 sal_uInt32 nMaxParagraphsPerTextArea;
85 sal_Int32 nSingleLineHeight;
94 const sal_uInt16 nOutlinesCount2d,
98 bool bSingleLineMode =
false;
99 sal_uInt16 nTextAreaCount = nOutlinesCount2d;
100 if ( nOutlinesCount2d & 1 )
101 bSingleLineMode =
true;
103 nTextAreaCount >>= 1;
108 *pAny >>= rFWData.bScaleX;
110 rFWData.bScaleX =
false;
112 if ( nTextAreaCount )
114 rFWData.bSingleLineMode = bSingleLineMode;
125 std::vector<int> aLineParaID;
126 std::vector<int> aLineStart;
127 std::vector<int> aLineLength;
128 std::vector<OUString> aParaText;
129 for (sal_Int32 nPara = 0; nPara < nParagraphsCount; ++nPara)
131 aParaText.push_back(rTextObj.
GetText(nPara));
133 sal_Int32 nPrevPos = 0;
143 aLineParaID.push_back(nPara);
144 aLineStart.push_back(nPrevPos);
151 sal_Int32 nLinesLeft = aLineParaID.size();
153 rFWData.nMaxParagraphsPerTextArea = ((nLinesLeft - 1) / nTextAreaCount) + 1;
155 while (nLinesLeft && nTextAreaCount)
157 FWTextArea aTextArea;
158 sal_Int32 nLinesInPara = ((nLinesLeft - 1) / nTextAreaCount) + 1;
159 for (sal_Int32
i = 0;
i < nLinesInPara; ++
i, ++nLine)
161 FWParagraphData aParagraphData;
162 aParagraphData.aString = aParaText[aLineParaID[nLine]].subView(
163 aLineStart[nLine], aLineLength[nLine]);
168 aTextArea.vParagraphs.push_back(aParagraphData);
170 rFWData.vTextAreas.push_back(aTextArea);
171 nLinesLeft -= nLinesInPara;
201 double fScalingFactor = 1.0;
202 rFWData.fVerticalTextScaling = 1.0;
205 bool bSingleLineMode =
false;
206 sal_uInt16 nOutlinesCount2d = rOutline2d.
Count();
211 sal_Int32 nFontSize = rFontHeight.
GetHeight();
231 pVirDev->SetMapMode(
MapMode(MapUnit::Map100thMM));
232 pVirDev->SetFont( aFont );
234 if ( nOutlinesCount2d & 1 )
235 bSingleLineMode =
true;
244 bool bScalingFactorDefined =
false;
245 for(
const auto& rTextArea : rFWData.vTextAreas )
249 if ( !bSingleLineMode )
255 for(
const auto& rParagraph : rTextArea.vParagraphs )
257 double fTextWidth = pVirDev->GetTextWidth( rParagraph.aString );
258 if ( fTextWidth > 0.0 )
260 double fScale = fWidth / fTextWidth;
261 if ( !bScalingFactorDefined )
263 fScalingFactor = fScale;
264 bScalingFactorDefined =
true;
266 else if (fScale < fScalingFactor)
268 fScalingFactor = fScale;
274 if (fScalingFactor < 1.0)
278 pVirDev->SetFont( aFont );
281 while (rFWData.bScaleX && fScalingFactor < 1.0 && nFontSize > 1 );
284 rFWData.fVerticalTextScaling =
static_cast<double>(nFontSize) / rFontHeight.
GetHeight();
286 rFWData.fHorizontalTextScaling = fScalingFactor;
290 const FWData& rFWData,
292 FWTextArea& rTextArea,
293 bool bSameLetterHeights)
296 sal_Int32 nVerticalOffset = rFWData.nMaxParagraphsPerTextArea > rTextArea.vParagraphs.size()
297 ? rFWData.nSingleLineHeight / 2 : 0;
299 for(
auto& rParagraph : rTextArea.vParagraphs )
301 const OUString& rText = rParagraph.aString;
302 if ( !rText.isEmpty() )
305 sal_uInt16 nScriptType = i18n::ScriptType::LATIN;
309 nScriptType = xBI->getScriptType( rText, 0 );
310 if( i18n::ScriptType::WEAK == nScriptType )
312 sal_Int32 nChg = xBI->endOfScript( rText, 0, nScriptType );
313 if (nChg < rText.getLength() && nChg >= 0)
314 nScriptType = xBI->getScriptType( rText, nChg );
316 nScriptType = i18n::ScriptType::LATIN;
320 if ( nScriptType == i18n::ScriptType::COMPLEX )
322 else if ( nScriptType == i18n::ScriptType::ASIAN )
344 pVirDev->SetMapMode(
MapMode(MapUnit::Map100thMM));
345 pVirDev->SetFont( aFont );
346 pVirDev->EnableRTL();
347 if ( rParagraph.nFrameDirection == SvxFrameDirection::Horizontal_RL_TB )
351 sal_uInt16 nCharScaleWidth = rCharScaleWidthItem.GetValue();
352 sal_Int32 nWidth = 0;
359 sal_Int32 nHeight = 0;
361 for (
i = 0;
i < rText.getLength();
i++ )
363 FWCharacterData aCharacterData;
364 OUString aCharText( rText[
i ] );
365 if ( pVirDev->GetTextOutlines( aCharacterData.vOutlines, aCharText, 0, 0, -1, nWidth, {} ) )
367 sal_Int32 nTextWidth = pVirDev->GetTextWidth( aCharText);
368 if ( aCharacterData.vOutlines.empty() )
370 nHeight += rFWData.nSingleLineHeight;
374 for (
auto& rOutline : aCharacterData.vOutlines )
377 rOutline.Rotate(
Point( nTextWidth / 2, rFWData.nSingleLineHeight / 2 ), 900_deg10 );
378 aCharacterData.aBoundRect.Union( rOutline.GetBoundRect() );
380 for (
auto& rOutline : aCharacterData.vOutlines )
382 sal_Int32 nM = - aCharacterData.aBoundRect.Left() + nHeight;
383 rOutline.Move( nM, 0 );
384 aCharacterData.aBoundRect.Move( nM, 0 );
386 nHeight += aCharacterData.aBoundRect.GetWidth() + ( rFWData.nSingleLineHeight / 5 );
387 aSingleCharacterUnion.
Union( aCharacterData.aBoundRect );
390 rParagraph.vCharacters.push_back( aCharacterData );
392 for (
auto& rCharacter : rParagraph.vCharacters )
394 for (
auto& rOutline : rCharacter.vOutlines )
396 rOutline.
Move( ( aSingleCharacterUnion.
GetWidth() - rCharacter.aBoundRect.GetWidth() ) / 2, 0 );
403 if ( ( nCharScaleWidth != 100 ) && nCharScaleWidth )
405 pVirDev->GetTextArray( rText, &aDXArry);
406 FontMetric aFontMetric( pVirDev->GetFontMetric() );
408 pVirDev->SetFont( aFont );
410 FWCharacterData aCharacterData;
411 if ( pVirDev->GetTextOutlines( aCharacterData.vOutlines, rText, 0, 0, -1, nWidth, aDXArry ) )
413 rParagraph.vCharacters.push_back( aCharacterData );
421 pVirDev->GetTextArray( rText, &aDXArry);
422 aCharacterData.vOutlines.
clear();
426 for(
size_t a(0);
a < aDXArry.
size();
a++)
431 0 ==
a ? 0 : aDXArry[
a - 1],
453 rParagraph.vCharacters.push_back( aCharacterData );
458 for (
auto& rCharacter : rParagraph.vCharacters )
462 if ( nVerticalOffset )
463 rPolyPoly.
Move( 0, nVerticalOffset );
467 rParagraph.aBoundRect.Union( aBoundRect );
472 if ( rParagraph.aBoundRect.IsEmpty() )
474 if ( rTextArea.aBoundRect.IsEmpty() )
477 rTextArea.aBoundRect.AdjustBottom(rFWData.nSingleLineHeight );
482 rTextArea.aBoundRect.
Union( rParagraphBoundRect );
484 if ( bSameLetterHeights )
486 for (
auto& rCharacter : rParagraph.vCharacters )
488 for(
auto& rOutline : rCharacter.vOutlines )
492 rOutline.Scale( 1.0,
static_cast<double>(rParagraphBoundRect.
GetHeight()) / aPolyPolyBoundRect.
GetHeight() );
493 aPolyPolyBoundRect = rOutline.GetBoundRect();
494 sal_Int32 nMove = aPolyPolyBoundRect.
Top() - rParagraphBoundRect.
Top();
496 rOutline.Move( 0, -nMove );
502 nVerticalOffset -= rFWData.nSingleLineHeight;
504 nVerticalOffset += rFWData.nSingleLineHeight;
515 bool bSameLetterHeights =
false;
519 *pAny >>= bSameLetterHeights;
523 rFWData.nSingleLineHeight = rFWData.fVerticalTextScaling * rFontHeight.
GetHeight();
525 rFWData.nSingleLineHeight =
static_cast<sal_Int32
>( (
static_cast<double>( rSdrObjCustomShape.
GetLogicRect().
GetHeight() )
526 / rFWData.nMaxParagraphsPerTextArea ) * rFWData.fHorizontalTextScaling );
531 for (
auto& rTextArea : rFWData.vTextAreas )
539 if (eFTS == drawing::TextFitToSizeType_ALLLINES ||
542 eFTS == drawing::TextFitToSizeType_PROPORTIONAL)
544 for (
auto& rParagraph : rTextArea.vParagraphs )
546 sal_Int32 nParaWidth = rParagraph.aBoundRect.GetWidth();
549 double fScale =
static_cast<double>(rTextArea.aBoundRect.GetWidth()) / nParaWidth;
551 for (
auto& rCharacter : rParagraph.vCharacters )
553 for(
auto& rOutline : rCharacter.vOutlines )
555 rOutline.Scale( fScale, 1.0 );
561 else if (rFWData.bScaleX)
566 for (
auto& rParagraph : rTextArea.vParagraphs )
568 sal_Int32 nHorzDiff = 0;
569 sal_Int32 nVertDiff =
static_cast<double>( rFWData.nSingleLineHeight ) * fFactor * ( rTextArea.vParagraphs.size() - 1 );
572 nHorzDiff = ( rFWData.fHorizontalTextScaling * rTextArea.aBoundRect.GetWidth() - rParagraph.aBoundRect.GetWidth() ) / 2;
574 nHorzDiff = ( rFWData.fHorizontalTextScaling * rTextArea.aBoundRect.GetWidth() - rParagraph.aBoundRect.GetWidth() );
576 if (nHorzDiff || nVertDiff)
578 for (
auto& rCharacter : rParagraph.vCharacters )
580 for(
auto& rOutline : rCharacter.vOutlines )
582 rOutline.Move( nHorzDiff, nVertDiff );
590 switch( eHorzAdjust )
595 for (
auto& rParagraph : rTextArea.vParagraphs )
597 sal_Int32 nHorzDiff = 0;
599 nHorzDiff = ( rTextArea.aBoundRect.GetWidth() - rParagraph.aBoundRect.GetWidth() ) / 2;
601 nHorzDiff = ( rTextArea.aBoundRect.GetWidth() - rParagraph.aBoundRect.GetWidth() );
604 for (
auto& rCharacter : rParagraph.vCharacters )
606 for(
auto& rOutline : rCharacter.vOutlines )
608 rOutline.Move( nHorzDiff, 0 );
630 while( aObjListIter.
IsMore() )
633 if (
auto pPathObj =
dynamic_cast<const SdrPathObj*
>( pPartObj))
640 aOutlines2d.
append(aCandidate);
656 rDistances.push_back( fDistance );
658 std::partial_sum( rDistances.begin(), rDistances.end(), rDistances.begin() );
659 double fLength = rDistances[ rDistances.size() - 1 ];
662 for (
auto& rDistance : rDistances )
663 rDistance /= fLength;
670 sal_uInt16 nSize = rPoly.
GetSize();
679 double fLastDistance = 0.0;
680 for (sal_uInt16
i = 0;
i < nSize; ++
i)
682 Point& rPoint = rPoly[
i ];
683 double fDistance =
static_cast<double>( rPoint.
X() - rTextAreaBoundRect.
Left() ) /
static_cast<double>(nTextWidth);
686 if ( fDistance > fLastDistance )
688 std::vector< double >::const_iterator aIter = std::upper_bound( rDistances.begin(), rDistances.end(), fLastDistance );
689 if ( aIter != rDistances.end() && ( *aIter > fLastDistance ) && ( *aIter < fDistance ) )
691 Point& rPt0 = rPoly[
i - 1 ];
692 sal_Int32 fX = rPoint.
X() - rPt0.
X();
693 sal_Int32 fY = rPoint.
Y() - rPt0.
Y();
694 double fd = ( 1.0 / ( fDistance - fLastDistance ) ) * ( *aIter - fLastDistance );
695 rPoly.
Insert(
i,
Point(
static_cast<sal_Int32
>( rPt0.
X() + fX * fd ),
static_cast<sal_Int32
>( rPt0.
Y() + fY * fd ) ) );
699 else if ( fDistance < fLastDistance )
701 std::vector< double >::const_iterator aIter = std::lower_bound( rDistances.begin(), rDistances.end(), fLastDistance );
702 if ( aIter != rDistances.begin() )
705 if ( ( *aIter > fDistance ) && ( *aIter < fLastDistance ) )
707 Point& rPt0 = rPoly[
i - 1 ];
708 sal_Int32 fX = rPoint.
X() - rPt0.
X();
709 sal_Int32 fY = rPoint.
Y() - rPt0.
Y();
710 double fd = ( 1.0 / ( fDistance - fLastDistance ) ) * ( *aIter - fLastDistance );
711 rPoly.
Insert(
i,
Point(
static_cast<sal_Int32
>( rPt0.
X() + fX * fd ),
static_cast<sal_Int32
>( rPt0.
Y() + fY * fd ) ) );
717 fLastDistance = fDistance;
721static void GetPoint(
const tools::Polygon& rPoly,
const std::vector< double >& rDistances,
const double& fX,
double& fx1,
double& fy1 )
727 std::vector< double >::const_iterator aIter = std::lower_bound( rDistances.begin(), rDistances.end(), fX );
728 sal_uInt16 nIdx = sal::static_int_cast<sal_uInt16>( std::distance( rDistances.begin(), aIter ) );
729 if ( aIter == rDistances.end() )
731 const Point& rPt = rPoly[ nIdx ];
734 if ( !nIdx || ( aIter == rDistances.end() ) || rtl::math::approxEqual( *aIter, fX ) )
737 nIdx = sal::static_int_cast<sal_uInt16>( std::distance( rDistances.begin(), aIter ) );
738 double fDist0 = *( aIter - 1 );
739 double fd = ( 1.0 / ( *aIter - fDist0 ) ) * ( fX - fDist0 );
740 const Point& rPt2 = rPoly[ nIdx - 1 ];
741 double fWidth = rPt.
X() - rPt2.
X();
742 double fHeight= rPt.
Y() - rPt2.
Y();
745 fx1 = rPt2.
X() + fWidth;
746 fy1 = rPt2.
Y() + fHeight;
751 sal_uInt16 nOutline2dIdx = 0;
752 for(
auto& rTextArea : rFWData.vTextAreas )
755 sal_Int32 nLeft = rTextAreaBoundRect.
Left();
756 sal_Int32 nTop = rTextAreaBoundRect.
Top();
757 sal_Int32 nWidth = rTextAreaBoundRect.
GetWidth();
758 sal_Int32 nHeight= rTextAreaBoundRect.
GetHeight();
762 nWidth *= rFWData.fHorizontalTextScaling;
765 if ( rFWData.bSingleLineMode && nHeight && nWidth )
767 if ( nOutline2dIdx >= aOutlines2d.
Count() )
769 const tools::Polygon& rOutlinePoly( aOutlines2d[ nOutline2dIdx++ ] );
770 const sal_uInt16 nPointCount = rOutlinePoly.
GetSize();
771 if ( nPointCount > 1 )
773 std::vector< double > vDistances;
774 vDistances.reserve( nPointCount );
776 if ( !vDistances.empty() )
778 for(
auto& rParagraph : rTextArea.vParagraphs )
780 for (
auto& rCharacter : rParagraph.vCharacters )
785 double fx1 = aBoundRect.
Left() - nLeft;
786 double fx2 = aBoundRect.
Right() - nLeft;
788 double fM1 = fx1 /
static_cast<double>(nWidth);
789 double fM2 = fx2 /
static_cast<double>(nWidth);
791 GetPoint( rOutlinePoly, vDistances, fM1, fx1, fy1 );
792 GetPoint( rOutlinePoly, vDistances, fM2, fx2, fy2 );
794 double fvx = fy2 - fy1;
795 double fvy = - ( fx2 - fx1 );
796 fx1 = fx1 + ( ( fx2 - fx1 ) * 0.5 );
797 fy1 = fy1 + ( ( fy2 - fy1 ) * 0.5 );
799 double fAngle = atan2( -fvx, -fvy );
800 double fL = hypot( fvx, fvy );
803 SAL_WARN(
"svx",
"FitTextOutlinesToShapeOutlines div-by-zero, abandon fit");
808 fL = rTextArea.aBoundRect.GetHeight() / 2.0 + rTextArea.aBoundRect.Top() - rParagraph.aBoundRect.Center().Y();
811 rPolyPoly.
Rotate(
Point( aBoundRect.
Center().
X(), rParagraph.aBoundRect.Center().Y() ), sin( fAngle ), cos( fAngle ) );
812 rPolyPoly.
Move(
static_cast<sal_Int32
>( ( fx1 + fvx )- aBoundRect.
Center().
X() ),
static_cast<sal_Int32
>( ( fy1 + fvy ) - rParagraph.aBoundRect.Center().Y() ) );
821 if ( ( nOutline2dIdx + 1 ) >= aOutlines2d.
Count() )
823 const tools::Polygon& rOutlinePoly( aOutlines2d[ nOutline2dIdx++ ] );
824 const tools::Polygon& rOutlinePoly2( aOutlines2d[ nOutline2dIdx++ ] );
825 const sal_uInt16 nPointCount = rOutlinePoly.
GetSize();
826 const sal_uInt16 nPointCount2 = rOutlinePoly2.
GetSize();
827 if ( ( nPointCount > 1 ) && ( nPointCount2 > 1 ) )
829 std::vector< double > vDistances;
830 vDistances.reserve( nPointCount );
831 std::vector< double > vDistances2;
832 vDistances2.reserve( nPointCount2 );
835 for(
auto& rParagraph : rTextArea.vParagraphs )
837 for (
auto& rCharacter : rParagraph.vCharacters )
841 sal_uInt16
i, nPolyCount = rPolyPoly.
Count();
842 for (
i = 0;
i < nPolyCount;
i++ )
858 sal_uInt16 _nPointCount = aLocalPoly.
GetSize();
861 if (!nWidth || !nHeight)
863 for (sal_uInt16 j = 0; j < _nPointCount; ++j)
865 Point& rPoint = aLocalPoly[ j ];
868 double fX =
static_cast<double>(rPoint.
X()) /
static_cast<double>(nWidth);
869 double fY =
static_cast<double>(rPoint.
Y()) /
static_cast<double>(nHeight);
871 double fx1, fy1, fx2, fy2;
872 GetPoint( rOutlinePoly, vDistances, fX, fx1, fy1 );
873 GetPoint( rOutlinePoly2, vDistances2, fX, fx2, fy2 );
874 double fWidth = fx2 - fx1;
875 double fHeight= fy2 - fy1;
876 rPoint.
setX(
static_cast<sal_Int32
>( fx1 + fWidth * fY ) );
877 rPoint.
setY(
static_cast<sal_Int32
>( fy1 + fHeight* fY ) );
882 rPolyPoly[
i ] = aLocalPoly;
893 const FWData& rFWData,
898 if ( !rFWData.vTextAreas.empty() )
900 for (
const auto& rTextArea : rFWData.vTextAreas )
902 for (
const auto& rParagraph : rTextArea.vParagraphs )
904 for (
const auto& rCharacter : rParagraph.vCharacters )
906 for(
const auto& rOutline : rCharacter.vOutlines )
908 aPolyPoly.
append( rOutline.getB2DPolyPolygon() );
917 std::move(aPolyPoly));
922 pRet->SetMergedItemSet( aSet );
951 sal_uInt16 nOutlinesCount2d = aOutlines2d.
Count();
952 if ( nOutlinesCount2d )
static void CalcDistances(const tools::Polygon &rPoly, std::vector< double > &rDistances)
static void GetPoint(const tools::Polygon &rPoly, const std::vector< double > &rDistances, const double &fX, double &fx1, double &fy1)
static bool GetFontWorkOutline(FWData &rFWData, const SdrObjCustomShape &rSdrObjCustomShape)
static void FitTextOutlinesToShapeOutlines(const tools::PolyPolygon &aOutlines2d, FWData &rFWData)
static rtl::Reference< SdrObject > CreateSdrObjectFromParagraphOutlines(const FWData &rFWData, const SdrObjCustomShape &rSdrObjCustomShape)
static void InsertMissingOutlinePoints(const std::vector< double > &rDistances, const tools::Rectangle &rTextAreaBoundRect, tools::Polygon &rPoly)
static void CalculateHorizontalScalingFactor(const SdrObjCustomShape &rSdrObjCustomShape, FWData &rFWData, const tools::PolyPolygon &rOutline2d)
static bool InitializeFontWorkData(const SdrObjCustomShape &rSdrObjCustomShape, const sal_uInt16 nOutlinesCount2d, FWData &rFWData)
static void GetTextAreaOutline(const FWData &rFWData, const SdrObjCustomShape &rSdrObjCustomShape, FWTextArea &rTextArea, bool bSameLetterHeights)
static double GetLength(const tools::Polygon &rPolygon)
static basegfx::B2DPolyPolygon GetOutlinesFromShape2d(const SdrObject *pShape2d)
virtual sal_Int32 GetParagraphCount() const=0
virtual OUString GetText(sal_Int32 nPara) const=0
virtual const SfxItemSet & GetParaAttribs(sal_Int32 nPara) const=0
static css::uno::Reference< css::i18n::XBreakIterator > mxBreakIterator
static css::uno::Reference< css::i18n::XBreakIterator > const & GetBreakIterator()
static rtl::Reference< SdrObject > CreateFontWork(const SdrObject *pShape2d, const SdrObjCustomShape &rSdrObjCustomShape)
const EditTextObject & GetTextObject() const
constexpr tools::Long Y() const
void setX(tools::Long nX)
void setY(tools::Long nY)
tools::Long AdjustY(tools::Long nVertMove)
tools::Long AdjustX(tools::Long nHorzMove)
constexpr tools::Long X() const
css::uno::Any * GetPropertyValueByName(const OUString &rPropName)
bool GetCompatibilityFlag(SdrCompatibilityFlag eFlag) const
const SfxPoolItem & GetMergedItem(const sal_uInt16 nWhich) const
SdrModel & getSdrModelFromSdrObject() const
const SfxItemSet & GetMergedItemSet() const
virtual OutlinerParaObject * GetOutlinerParaObject() const override
virtual const tools::Rectangle & GetLogicRect() const override
virtual bool IsVerticalWriting() const
sal_uInt16 ClearItem(sal_uInt16 nWhich=0)
const SfxPoolItem * Put(const SfxPoolItem &rItem, sal_uInt16 nWhich)
const SfxPoolItem & Get(sal_uInt16 nWhich, bool bSrchInParent=true) const
sal_uInt32 GetHeight() const
FontFamily GetFamily() const
const OUString & GetStyleName() const
const OUString & GetFamilyName() const
FontItalic GetPosture() const
FontWeight GetWeight() const
void append(const B2DPolygon &rPolygon, sal_uInt32 nCount=1)
bool areControlPointsUsed() const
bool areControlPointsUsed() const
tools::Long GetFontHeight() const
void SetOrientation(Degree10 nLineOrientation)
void SetStyleName(const OUString &rStyleName)
void SetAverageFontWidth(tools::Long nWidth)
void SetItalic(FontItalic)
void SetWeight(FontWeight)
void SetFontHeight(tools::Long nHeight)
void SetFamily(FontFamily)
void SetAlignment(TextAlign)
void SetFamilyName(const OUString &rFamilyName)
tools::Long GetAverageFontWidth() const
@ LegacySingleLineFontwork
for tdf#148000
constexpr TypedWhichId< SvxFontItem > EE_CHAR_FONTINFO_CJK(EE_CHAR_START+17)
constexpr TypedWhichId< SvxFontHeightItem > EE_CHAR_FONTHEIGHT(EE_CHAR_START+2)
constexpr TypedWhichId< SvxWeightItem > EE_CHAR_WEIGHT(EE_CHAR_START+4)
constexpr TypedWhichId< SvxPostureItem > EE_CHAR_ITALIC(EE_CHAR_START+7)
constexpr TypedWhichId< SvxFrameDirectionItem > EE_PARA_WRITINGDIR(EE_PARA_START+0)
constexpr TypedWhichId< SvxFontItem > EE_CHAR_FONTINFO_CTL(EE_CHAR_START+18)
constexpr TypedWhichId< SvxCharScaleWidthItem > EE_CHAR_FONTWIDTH(EE_CHAR_START+3)
constexpr TypedWhichId< SvxFontItem > EE_CHAR_FONTINFO(EE_CHAR_START+1)
#define SAL_WARN(area, stream)
double getLength(const B2DPolygon &rCandidate)
B2DPolygon createPolygonFromRect(const B2DRectangle &rRect, double fRadiusX, double fRadiusY)
B2DPolygon adaptiveSubdivideByAngle(const B2DPolygon &rCandidate, double fAngleBound)
SdrOnOffItem makeSdrShadowItem(bool bShadow)
@ SDRTEXTVERTADJUST_BOTTOM
@ SDRTEXTHORZADJUST_BLOCK
@ SDRTEXTHORZADJUST_CENTER
@ SDRTEXTHORZADJUST_RIGHT
constexpr TypedWhichId< SdrTextFitToSizeTypeItem > SDRATTR_TEXT_FITTOSIZE(SDRATTR_MISC_FIRST+3)
constexpr TypedWhichId< SdrTextHorzAdjustItem > SDRATTR_TEXT_HORZADJUST(SDRATTR_MISC_FIRST+13)
constexpr TypedWhichId< SdrTextVertAdjustItem > SDRATTR_TEXT_VERTADJUST(SDRATTR_MISC_FIRST+8)
constexpr TypedWhichId< SdrCustomShapeGeometryItem > SDRATTR_CUSTOMSHAPE_GEOMETRY(SDRATTR_CUSTOMSHAPE_FIRST+2)
constexpr TypedWhichId< SvxWritingModeItem > SDRATTR_TEXTDIRECTION(SDRATTR_NOTPERSIST_FIRST+34)