summaryrefslogtreecommitdiff
path: root/cppcanvas/source/mtfrenderer
diff options
context:
space:
mode:
authorMark Hung <marklh9@gmail.com>2018-10-21 00:04:33 +0800
committerMark Hung <marklh9@gmail.com>2018-10-23 00:55:50 +0200
commitae9f37ba753519ae4a2ae6384d052d417359602f (patch)
tree9fc8a90e05e590f3ad0a237f1247d6c332eac3ae /cppcanvas/source/mtfrenderer
parentc766a05ae0354f1bc9763b725f91069975b37bd3 (diff)
tdf#100236 Implement linestyles with dash and dots.
Allow append dashes to have dash and dot line styles. Segment length parameters were taken from cppcanvas, also restructure the code to use the same appendDashes function. Change-Id: I17c0796dbe722c4c6d5e91d0e318570a52a2514c Reviewed-on: https://gerrit.libreoffice.org/62084 Tested-by: Jenkins Reviewed-by: Mark Hung <marklh9@gmail.com>
Diffstat (limited to 'cppcanvas/source/mtfrenderer')
-rw-r--r--cppcanvas/source/mtfrenderer/mtftools.cxx197
1 files changed, 93 insertions, 104 deletions
diff --git a/cppcanvas/source/mtfrenderer/mtftools.cxx b/cppcanvas/source/mtfrenderer/mtftools.cxx
index 75c7d6069146..0680e05f3ca8 100644
--- a/cppcanvas/source/mtfrenderer/mtftools.cxx
+++ b/cppcanvas/source/mtfrenderer/mtftools.cxx
@@ -319,28 +319,92 @@ namespace cppcanvas
::basegfx::B2DRectangle( nX1, nY1, nX2, nY2 ) ) );
}
- void appendDashes( ::basegfx::B2DPolyPolygon& o_rPoly,
+ bool appendDashes( ::basegfx::B2DPolyPolygon& o_rPoly,
const double nX,
- const double nY,
+ double nY,
const double nLineWidth,
- const double nLineHeight,
- const double nDashWidth,
- const double nDashSkip )
+ double nLineHeight,
+ sal_Int8 nLineStyle,
+ bool bIsOverline)
{
- const sal_Int32 nNumLoops(
- static_cast< sal_Int32 >(
- std::max( 1.0,
- nLineWidth / nDashSkip ) + .5) );
+ static const int aDottedArray[] = { 1, 1, 0}; // DOTTED LINE
+ static const int aDotDashArray[] = { 1, 1, 4, 1, 0}; // DASHDOT
+ static const int aDashDotDotArray[] = { 1, 1, 1, 1, 4, 1, 0}; // DASHDOTDOT
+ static const int aDashedArray[] = { 5, 2, 0}; // DASHED LINE
+ static const int aLongDashArray[] = { 7, 2, 0}; // LONGDASH
+ const int *pArray = nullptr;
+ bool bIsBold = false;
+
+ switch(nLineStyle)
+ {
+ case LINESTYLE_BOLDDOTTED:
+ bIsBold = true;
+ BOOST_FALLTHROUGH;
+ case LINESTYLE_DOTTED:
+ pArray = aDottedArray;
+ break;
+
+ case LINESTYLE_BOLDDASH:
+ bIsBold = true;
+ BOOST_FALLTHROUGH;
+ case LINESTYLE_DASH:
+ pArray = aDashedArray;
+ break;
+
+ case LINESTYLE_BOLDLONGDASH:
+ bIsBold = true;
+ BOOST_FALLTHROUGH;
+ case LINESTYLE_LONGDASH:
+ pArray = aLongDashArray;
+ break;
+
+ case LINESTYLE_BOLDDASHDOT:
+ bIsBold = true;
+ BOOST_FALLTHROUGH;
+ case LINESTYLE_DASHDOT:
+ pArray = aDotDashArray;
+ break;
+ case LINESTYLE_BOLDDASHDOTDOT:
+ bIsBold = true;
+ BOOST_FALLTHROUGH;
+ case LINESTYLE_DASHDOTDOT:
+ pArray = aDashDotDotArray;
+ break;
+ }
- double x = nX;
- for( sal_Int32 i=0; i<nNumLoops; ++i )
+ if (!pArray)
+ return false;
+
+ if (bIsBold)
{
- appendRect( o_rPoly,
- x, nY,
- x + nDashWidth, nY + nLineHeight );
+ if (bIsOverline)
+ nY -= nLineHeight;
+
+ nLineHeight *= 2;
+ }
+
+ const double nEnd = nX + nLineWidth;
+ sal_Int32 nIndex = 0;
+ bool bAppend = true;
+ double nX1 = nX;
+
+ while(nX1 < nEnd)
+ {
+ if (pArray[nIndex] == 0)
+ nIndex = 0;
+
+ const double nX2 = std::min(nEnd, nX1 + pArray[nIndex] * nLineHeight);
+
+ if (bAppend)
+ appendRect(o_rPoly, nX1, nY, nX2, nY + nLineHeight);
+
+ nX1 = nX2;
- x += nDashSkip;
+ ++nIndex;
+
+ bAppend = !bAppend;
}
+ return true;
}
}
@@ -385,17 +449,6 @@ namespace cppcanvas
rLineWidth,
rTextLineInfo.mnOverlineOffset + rTextLineInfo.mnOverlineHeight );
break;
-
- case LINESTYLE_BOLDDOTTED: // TODO(F3): NYI
- // FALLTHROUGH intended
- case LINESTYLE_BOLDDASH: // TODO(F3): NYI
- // FALLTHROUGH intended
- case LINESTYLE_BOLDLONGDASH: // TODO(F3): NYI
- // FALLTHROUGH intended
- case LINESTYLE_BOLDDASHDOT: // TODO(F3): NYI
- // FALLTHROUGH intended
- case LINESTYLE_BOLDDASHDOTDOT:// TODO(F3): NYI
- // FALLTHROUGH intended
case LINESTYLE_BOLD:
appendRect(
aTextLinesPolyPoly,
@@ -424,46 +477,19 @@ namespace cppcanvas
rTextLineInfo.mnOverlineOffset + rTextLineInfo.mnOverlineHeight * 2.0 );
break;
- case LINESTYLE_DASHDOTDOT: // TODO(F3): NYI
- // FALLTHROUGH intended
- case LINESTYLE_DOTTED:
- appendDashes(
- aTextLinesPolyPoly,
- rStartPos.getX(),
- rStartPos.getY() + rTextLineInfo.mnOverlineOffset,
- rLineWidth,
- rTextLineInfo.mnOverlineHeight,
- rTextLineInfo.mnOverlineHeight,
- 2*rTextLineInfo.mnOverlineHeight );
- break;
-
- case LINESTYLE_DASHDOT: // TODO(F3): NYI
- // FALLTHROUGH intended
- case LINESTYLE_DASH:
- appendDashes(
- aTextLinesPolyPoly,
- rStartPos.getX(),
- rStartPos.getY() + rTextLineInfo.mnOverlineOffset,
- rLineWidth,
- rTextLineInfo.mnOverlineHeight,
- 3*rTextLineInfo.mnOverlineHeight,
- 6*rTextLineInfo.mnOverlineHeight );
- break;
-
- case LINESTYLE_LONGDASH:
- appendDashes(
+ default:
+ if (!appendDashes(
aTextLinesPolyPoly,
rStartPos.getX(),
rStartPos.getY() + rTextLineInfo.mnOverlineOffset,
rLineWidth,
rTextLineInfo.mnOverlineHeight,
- 6*rTextLineInfo.mnOverlineHeight,
- 12*rTextLineInfo.mnOverlineHeight );
- break;
-
- default:
- ENSURE_OR_THROW( false,
+ rTextLineInfo.mnOverlineStyle,
+ true))
+ {
+ ENSURE_OR_THROW( false,
"::cppcanvas::internal::createTextLinesPolyPolygon(): Unexpected overline case" );
+ }
}
switch( rTextLineInfo.mnUnderlineStyle )
@@ -498,16 +524,6 @@ namespace cppcanvas
rTextLineInfo.mnUnderlineOffset + rTextLineInfo.mnLineHeight );
break;
- case LINESTYLE_BOLDDOTTED: // TODO(F3): NYI
- // FALLTHROUGH intended
- case LINESTYLE_BOLDDASH: // TODO(F3): NYI
- // FALLTHROUGH intended
- case LINESTYLE_BOLDLONGDASH: // TODO(F3): NYI
- // FALLTHROUGH intended
- case LINESTYLE_BOLDDASHDOT: // TODO(F3): NYI
- // FALLTHROUGH intended
- case LINESTYLE_BOLDDASHDOTDOT:// TODO(F3): NYI
- // FALLTHROUGH intended
case LINESTYLE_BOLD:
appendRect(
aTextLinesPolyPoly,
@@ -536,46 +552,19 @@ namespace cppcanvas
rTextLineInfo.mnUnderlineOffset + 3*rTextLineInfo.mnLineHeight );
break;
- case LINESTYLE_DASHDOTDOT: // TODO(F3): NYI
- // FALLTHROUGH intended
- case LINESTYLE_DOTTED:
- appendDashes(
- aTextLinesPolyPoly,
- rStartPos.getX(),
- rStartPos.getY() + rTextLineInfo.mnUnderlineOffset,
- rLineWidth,
- rTextLineInfo.mnLineHeight,
- rTextLineInfo.mnLineHeight,
- 2*rTextLineInfo.mnLineHeight );
- break;
-
- case LINESTYLE_DASHDOT: // TODO(F3): NYI
- // FALLTHROUGH intended
- case LINESTYLE_DASH:
- appendDashes(
- aTextLinesPolyPoly,
- rStartPos.getX(),
- rStartPos.getY() + rTextLineInfo.mnUnderlineOffset,
- rLineWidth,
- rTextLineInfo.mnLineHeight,
- 3*rTextLineInfo.mnLineHeight,
- 6*rTextLineInfo.mnLineHeight );
- break;
-
- case LINESTYLE_LONGDASH:
- appendDashes(
+ default:
+ if (!appendDashes(
aTextLinesPolyPoly,
rStartPos.getX(),
rStartPos.getY() + rTextLineInfo.mnUnderlineOffset,
rLineWidth,
rTextLineInfo.mnLineHeight,
- 6*rTextLineInfo.mnLineHeight,
- 12*rTextLineInfo.mnLineHeight );
- break;
-
- default:
- ENSURE_OR_THROW( false,
+ rTextLineInfo.mnUnderlineStyle,
+ false))
+ {
+ ENSURE_OR_THROW( false,
"::cppcanvas::internal::createTextLinesPolyPolygon(): Unexpected underline case" );
+ }
}
switch( rTextLineInfo.mnStrikeoutStyle )