diff options
author | Jan Holesovsky <kendy@collabora.com> | 2013-11-22 12:01:15 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@suse.cz> | 2014-04-23 22:14:41 +0200 |
commit | ee52a8acbe145795c0fc4bc954286971d76b1026 (patch) | |
tree | f81aac37df87fa8b765621a6dc49d51960fc58e5 | |
parent | cc0de7e6a93596745936e7e715c8d46ad97e5b0e (diff) |
EMF+: Implement line dashing.
Conflicts:
cppcanvas/source/mtfrenderer/emfplus.cxx
Change-Id: I9eb21c0a8b5baa5b0080845f61b12fc65034d959
-rw-r--r-- | cppcanvas/source/mtfrenderer/emfplus.cxx | 51 |
1 files changed, 49 insertions, 2 deletions
diff --git a/cppcanvas/source/mtfrenderer/emfplus.cxx b/cppcanvas/source/mtfrenderer/emfplus.cxx index 6025eb7240ea..7be23f6dee53 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 @@ -610,6 +617,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 ) @@ -645,7 +680,10 @@ namespace cppcanvas mitterLimit = 0; if (penFlags & 32) + { s >> dashStyle; + SAL_INFO("cppcanvas.emf", "EMF+\t\tdashStyle: 0x" << std::hex << dashStyle); + } else dashStyle = 0; @@ -659,14 +697,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) |