From 40977516a515e21bc809a4d05f71be7dd481b1f7 Mon Sep 17 00:00:00 2001 From: Jan Holesovsky Date: Fri, 22 Nov 2013 12:01:15 +0100 Subject: EMF+: Implement line dashing. Change-Id: I9eb21c0a8b5baa5b0080845f61b12fc65034d959 --- cppcanvas/source/mtfrenderer/emfplus.cxx | 51 ++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) (limited to 'cppcanvas') diff --git a/cppcanvas/source/mtfrenderer/emfplus.cxx b/cppcanvas/source/mtfrenderer/emfplus.cxx index be2bfbd4a716..9dc50d7fae7b 100644 --- a/cppcanvas/source/mtfrenderer/emfplus.cxx +++ b/cppcanvas/source/mtfrenderer/emfplus.cxx @@ -89,6 +89,13 @@ #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; + using namespace ::com::sun::star; using namespace ::basegfx; @@ -626,6 +633,34 @@ namespace cppcanvas } #endif 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 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 ) @@ -663,7 +698,10 @@ namespace cppcanvas mitterLimit = 0; if (penFlags & 32) + { s >> dashStyle; + SAL_INFO("cppcanvas.emf", "EMF+\t\tdashStyle: 0x" << std::hex << dashStyle); + } else dashStyle = 0; @@ -677,14 +715,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) -- cgit