22#include <com/sun/star/rendering/XCanvas.hpp>
29#include <rtl/math.hxx>
43 const ::cppcanvas::internal::OutDevState& outdevState )
46 ::canvas::tools::setRenderStateTransform( renderState,
47 outdevState.transform );
48 renderState.Clip = outdevState.xClipPoly;
58 switch( outdevState.textReferencePoint )
62 aMetric.GetInternalLeading() + aMetric.GetAscent() );
65 return ::Size( 0, 0 );
69 -aMetric.GetDescent() );
72 throw css::uno::RuntimeException(
73 "tools::getBaselineOffset(): Unexpected TextAlign value" );
83 const ::Size aSizeLogic( 0x00010000L,
86 const ::Size aSizePixel( rVDev.
LogicToPixel( aSizeLogic ) );
89 aSizePixel.Width() /
static_cast<double>(aSizeLogic.Width()),
90 aSizePixel.Height() /
static_cast<double>(aSizeLogic.Height()) );
102 const ::Point aEmptyPoint;
103 const ::Point& rTranslatedPoint(
106 o_rMatrix.
translate(rTranslatedPoint.X(),
107 rTranslatedPoint.Y());
113 const struct ::cppcanvas::internal::OutDevState& rOutdevState,
115 const ::basegfx::B2DPoint& rOffset,
116 const ::basegfx::B2DVector* pScaling,
117 const double* pRotation )
119 const bool bOffsetting( !rOffset.equalZero() );
120 const bool bScaling( pScaling &&
121 !rtl::math::approxEqual(pScaling->getX(), 1.0) &&
122 !rtl::math::approxEqual(pScaling->getY(), 1.0) );
123 const bool bRotation( pRotation &&
126 if( !bOffsetting && !bScaling && !bRotation )
140 aTransform.
scale( 1.0/pScaling->getX(), 1.0/pScaling->getY() );
143 aTransform.
rotate( - *pRotation );
147 o_rRenderState.Clip = ::basegfx::unotools::xPolyPolygonFromB2DPolyPolygon(
148 rCanvas->getUNOCanvas()->getDevice(),
157 const ::tools::Rectangle aLocalClipRect( rOutdevState.
clipRect );
164 ::basegfx::utils::createPolygonFromRect(
172 aTransform.
scale( 1.0/pScaling->getX(), 1.0/pScaling->getY() );
174 aTransform.
rotate( - *pRotation );
178 o_rRenderState.Clip = ::basegfx::unotools::xPolyPolygonFromB2DPolyPolygon(
179 rCanvas->getUNOCanvas()->getDevice(),
186 o_rRenderState.Clip = ::basegfx::unotools::xPolyPolygonFromB2DPolyPolygon(
187 rCanvas->getUNOCanvas()->getDevice(),
189 ::basegfx::utils::createPolygonFromRect(
191 (aLocalClipRect.Left() - rOffset.getX())/pScaling->getX(),
192 (aLocalClipRect.Top() - rOffset.getY())/pScaling->getY(),
193 (aLocalClipRect.Right() - rOffset.getX())/pScaling->getX(),
194 (aLocalClipRect.Bottom() - rOffset.getY())/pScaling->getY() ) ) ) );
200 o_rRenderState.Clip = ::basegfx::unotools::xPolyPolygonFromB2DPolyPolygon(
201 rCanvas->getUNOCanvas()->getDevice(),
203 ::basegfx::utils::createPolygonFromRect(
205 aLocalClipRect.Top() - rOffset.getY(),
206 aLocalClipRect.Right() - rOffset.getX(),
207 aLocalClipRect.Bottom() - rOffset.getY() ) ) ) );
219 const ::cppcanvas::internal::OutDevState& rState )
221 const bool bOldMode( rVDev.IsMapModeEnabled() );
225 rVDev.GetFontMetric();
228 const_cast< ::
VirtualDevice&
>(rVDev).EnableMapMode(
false );
233 (aMetric.GetDescent() + 2) / 4.0,
234 ((aMetric.GetInternalLeading() + 1.5) / 3.0),
235 (aMetric.GetInternalLeading() / 2.0) - aMetric.GetAscent(),
236 aMetric.GetDescent() / 2.0,
237 (aMetric.GetInternalLeading() - aMetric.GetAscent()) / 3.0,
238 rState.textOverlineStyle,
239 rState.textUnderlineStyle,
240 rState.textStrikeoutStyle );
242 const_cast< ::
VirtualDevice&
>(rVDev).EnableMapMode( bOldMode );
250 const ::basegfx::B2DPoint& rStartPos,
251 const double nStartOffset,
253 const double nHeight,
256 const double x(rStartPos.getX());
257 const double y(rStartPos.getY() + nStartOffset + nHeight);
258 double nWaveWidth = nHeight * 10.6 * 0.25;
260 double nOffset = 0.0;
262 if (nLineStyle == LINESTYLE_DOUBLEWAVE)
263 nOffset = -nHeight * 0.5;
271 o_rPoly.
append(::basegfx::utils::createWaveline(aLine, nWaveWidth, nWaveWidth * 0.5));
273 if (nLineStyle == LINESTYLE_DOUBLEWAVE)
275 nOffset = nHeight * 1.2;
280 o_rPoly.
append(::basegfx::utils::createWaveline(aLine2, nWaveWidth, nWaveWidth * 0.5));
285 const ::basegfx::B2DPoint& rStartPos,
291 const double x( rStartPos.getX() );
292 const double y( rStartPos.getY() );
295 ::basegfx::utils::createPolygonFromRect(
306 ::basegfx::utils::createPolygonFromRect(
313 const double nLineWidth,
318 static const int aDottedArray[] = { 1, 1, 0};
319 static const int aDotDashArray[] = { 1, 1, 4, 1, 0};
320 static const int aDashDotDotArray[] = { 1, 1, 1, 1, 4, 1, 0};
321 static const int aDashedArray[] = { 5, 2, 0};
322 static const int aLongDashArray[] = { 7, 2, 0};
323 const int *pArray =
nullptr;
324 bool bIsBold =
false;
332 pArray = aDottedArray;
339 pArray = aDashedArray;
346 pArray = aLongDashArray;
353 pArray = aDotDashArray;
359 pArray = aDashDotDotArray;
381 if (pArray[nIndex] == 0)
384 const double nX2 = std::min(nEnd, nX1 + pArray[nIndex] * nLineHeight);
387 appendRect(o_rPoly, nX1, nY, nX2, nY + nLineHeight);
401 const ::basegfx::B2DPoint& rStartPos,
402 const double& rLineWidth,
403 const TextLineInfo& rTextLineInfo)
405 switch( rTextLineInfo.mnOverlineStyle )
418 rTextLineInfo.mnOverlineOffset,
420 rTextLineInfo.mnOverlineHeight,
421 rTextLineInfo.mnOverlineStyle);
429 rTextLineInfo.mnOverlineOffset,
431 rTextLineInfo.mnOverlineOffset + rTextLineInfo.mnOverlineHeight );
438 rTextLineInfo.mnOverlineOffset - rTextLineInfo.mnOverlineHeight,
440 rTextLineInfo.mnOverlineOffset + rTextLineInfo.mnOverlineHeight );
448 rTextLineInfo.mnOverlineOffset - rTextLineInfo.mnOverlineHeight * 2.0 ,
450 rTextLineInfo.mnOverlineOffset - rTextLineInfo.mnOverlineHeight );
456 rTextLineInfo.mnOverlineOffset + rTextLineInfo.mnOverlineHeight,
458 rTextLineInfo.mnOverlineOffset + rTextLineInfo.mnOverlineHeight * 2.0 );
465 rStartPos.getY() + rTextLineInfo.mnOverlineOffset,
467 rTextLineInfo.mnOverlineHeight,
468 rTextLineInfo.mnOverlineStyle,
472 "::cppcanvas::internal::createTextLinesPolyPolygon(): Unexpected overline case" );
478 const ::basegfx::B2DPoint& rStartPos,
479 const double& rLineWidth,
480 const TextLineInfo& rTextLineInfo )
483 switch( rTextLineInfo.mnUnderlineStyle )
496 rTextLineInfo.mnUnderlineOffset,
498 rTextLineInfo.mnLineHeight,
499 rTextLineInfo.mnUnderlineStyle);
506 rTextLineInfo.mnUnderlineOffset,
508 rTextLineInfo.mnUnderlineOffset + rTextLineInfo.mnLineHeight );
516 rTextLineInfo.mnUnderlineOffset,
518 rTextLineInfo.mnUnderlineOffset + 2*rTextLineInfo.mnLineHeight );
526 rTextLineInfo.mnUnderlineOffset - rTextLineInfo.mnLineHeight,
528 rTextLineInfo.mnUnderlineOffset );
534 rTextLineInfo.mnUnderlineOffset + 2*rTextLineInfo.mnLineHeight,
536 rTextLineInfo.mnUnderlineOffset + 3*rTextLineInfo.mnLineHeight );
543 rStartPos.getY() + rTextLineInfo.mnUnderlineOffset,
545 rTextLineInfo.mnLineHeight,
546 rTextLineInfo.mnUnderlineStyle,
550 "::cppcanvas::internal::createTextLinesPolyPolygon(): Unexpected underline case" );
556 const ::basegfx::B2DPoint& rStartPos,
557 const double& rLineWidth,
558 const TextLineInfo& rTextLineInfo)
560 switch( rTextLineInfo.mnStrikeoutStyle )
575 rTextLineInfo.mnStrikeoutOffset,
577 rTextLineInfo.mnStrikeoutOffset + rTextLineInfo.mnLineHeight );
585 rTextLineInfo.mnStrikeoutOffset,
587 rTextLineInfo.mnStrikeoutOffset + 2*rTextLineInfo.mnLineHeight );
595 rTextLineInfo.mnStrikeoutOffset - rTextLineInfo.mnLineHeight,
597 rTextLineInfo.mnStrikeoutOffset );
603 rTextLineInfo.mnStrikeoutOffset + 2*rTextLineInfo.mnLineHeight,
605 rTextLineInfo.mnStrikeoutOffset + 3*rTextLineInfo.mnLineHeight );
610 "::cppcanvas::internal::createTextLinesPolyPolygon(): Unexpected strikeout case" );
616 const double& rLineWidth,
622 createOverlinePolyPolygon(aTextLinesPolyPoly, rStartPos, rLineWidth, rTextLineInfo);
623 createUnderlinePolyPolygon(aTextLinesPolyPoly, rStartPos, rLineWidth, rTextLineInfo);
624 createStrikeoutPolyPolygon(aTextLinesPolyPoly, rStartPos, rLineWidth, rTextLineInfo);
625 return aTextLinesPolyPoly;
629 const rendering::ViewState& viewState,
630 const rendering::RenderState& renderState )
633 ::canvas::tools::mergeViewAndRenderTransform( aTransform,
638 return ::canvas::tools::calcTransformedRectBounds( aTransformedBounds,
646 const double& rLineWidth,
657 const double& rLineWidth,
665 createOverlinePolyPolygon(rOverlinePolyPoly, aStartPos, rLineWidth, rTextLineInfo);
666 createUnderlinePolyPolygon(rUnderlinePolyPoly, aStartPos, rLineWidth, rTextLineInfo);
667 createStrikeoutPolyPolygon(rStrikeoutPolyPoly, aStartPos, rLineWidth, rTextLineInfo);
SAL_WARN_UNUSED_RESULT Point LogicToPixel(const Point &rLogicPt) const
FontMetric GetFontMetric() const
void rotate(double fRadiant)
void translate(double fX, double fY)
void scale(double fX, double fY)
void append(const B2DPolygon &rPolygon, sal_uInt32 nCount=1)
void transform(const basegfx::B2DHomMatrix &rMatrix)
void transform(const basegfx::B2DHomMatrix &rMatrix)
void append(const basegfx::B2DPoint &rPoint, sal_uInt32 nCount)
#define ENSURE_OR_THROW(c, m)
B2DHomMatrix createScaleB2DHomMatrix(double fScaleX, double fScaleY)
std::shared_ptr< Canvas > CanvasSharedPtr
::tools::Rectangle clipRect
::basegfx::B2DPolyPolygon clip