summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Holesovsky <kendy@collabora.com>2013-11-22 12:01:15 +0100
committerAndras Timar <andras.timar@collabora.com>2013-11-26 11:01:49 +0100
commitdda6f654d7d061017fbd671fe78c2a019aeef501 (patch)
tree45442820b27f363e023e889f3a9cb528087d799f
parenteb50cba358a3db1d49ac1cdc7aa39ef308fb6dc0 (diff)
EMF+: Implement line dashing.
Conflicts: cppcanvas/source/mtfrenderer/emfplus.cxx Change-Id: I9eb21c0a8b5baa5b0080845f61b12fc65034d959
-rw-r--r--cppcanvas/source/mtfrenderer/emfplus.cxx51
1 files changed, 49 insertions, 2 deletions
diff --git a/cppcanvas/source/mtfrenderer/emfplus.cxx b/cppcanvas/source/mtfrenderer/emfplus.cxx
index 41cb383eecba..72926a0a232d 100644
--- a/cppcanvas/source/mtfrenderer/emfplus.cxx
+++ b/cppcanvas/source/mtfrenderer/emfplus.cxx
@@ -92,6 +92,13 @@
#define EmfPlusRegionInitialStateEmpty 0x10000002
#define EmfPlusRegionInitialStateInfinite 0x10000003
+const sal_Int32 EmfPlusLineStyleSolid = 0x00000000;
+const sal_Int32 EmfPlusLineStyleDash = 0x00000001;
+const sal_Int32 EmfPlusLineStyleDot = 0x00000002;
+const sal_Int32 EmfPlusLineStyleDashDot = 0x00000003;
+const sal_Int32 EmfPlusLineStyleDashDotDot = 0x00000004;
+const sal_Int32 EmfPlusLineStyleCustom = 0x00000005;
+
#if OSL_DEBUG_LEVEL > 1
#define EMFP_DEBUG(x) x
#else
@@ -605,6 +612,34 @@ namespace cppcanvas
{
EMFP_DEBUG (if (width == 0.0) printf ("EMF+\tTODO: pen with zero width - using minimal which might not be correct\n"));
rStrokeAttributes.StrokeWidth = fabs((rState.mapModeTransform * rR.MapSize (width == 0.0 ? 0.05 : width, 0)).getX());
+
+ // set dashing
+ if (dashStyle != EmfPlusLineStyleSolid)
+ {
+ const float dash[] = {3, 3};
+ const float dot[] = {1, 3};
+ const float dashdot[] = {3, 3, 1, 3};
+ const float dashdotdot[] = {3, 3, 1, 3, 1, 3};
+
+ sal_Int32 nLen = 0;
+ const float *pPattern;
+ switch (dashStyle)
+ {
+ case EmfPlusLineStyleDash: nLen = SAL_N_ELEMENTS(dash); pPattern = dash; break;
+ case EmfPlusLineStyleDot: nLen = SAL_N_ELEMENTS(dot); pPattern = dot; break;
+ case EmfPlusLineStyleDashDot: nLen = SAL_N_ELEMENTS(dashdot); pPattern = dashdot; break;
+ case EmfPlusLineStyleDashDotDot: nLen = SAL_N_ELEMENTS(dashdotdot); pPattern = dashdotdot; break;
+ case EmfPlusLineStyleCustom: nLen = dashPatternLen; pPattern = dashPattern; break;
+ }
+ if (nLen > 0)
+ {
+ uno::Sequence<double> aDashArray(nLen);
+ for (int i = 0; i < nLen; ++i)
+ aDashArray[i] = pPattern[i];
+
+ rStrokeAttributes.DashArray = aDashArray;
+ }
+ }
}
void Read (SvStream& s, ImplRenderer& rR, sal_Int32, sal_Int32 )
@@ -640,7 +675,10 @@ namespace cppcanvas
mitterLimit = 0;
if (penFlags & 32)
+ {
s >> dashStyle;
+ SAL_INFO("cppcanvas.emf", "EMF+\t\tdashStyle: 0x" << std::hex << dashStyle);
+ }
else
dashStyle = 0;
@@ -654,14 +692,23 @@ namespace cppcanvas
else
dashOffset = 0;
- if (penFlags & 256) {
+ if (penFlags & 256)
+ {
+ dashStyle = EmfPlusLineStyleCustom;
+
s >> dashPatternLen;
+ SAL_INFO("cppcanvas.emf", "EMF+\t\tdashPatternLen: " << dashPatternLen);
+
if( dashPatternLen<0 || sal_uInt32(dashPatternLen)>SAL_MAX_INT32/sizeof(float) )
dashPatternLen = SAL_MAX_INT32/sizeof(float);
dashPattern = new float [dashPatternLen];
for (i = 0; i < dashPatternLen; i++)
+ {
s >> dashPattern [i];
- } else
+ SAL_INFO("cppcanvas.emf", "EMF+\t\t\tdashPattern[" << i << "]: " << dashPattern[i]);
+ }
+ }
+ else
dashPatternLen = 0;
if (penFlags & 512)