From f2d9db4ef951d04c63733b08dd8746c196dd5f05 Mon Sep 17 00:00:00 2001 From: Radek Doulik Date: Fri, 15 Mar 2013 16:07:53 +0100 Subject: implemented EmfPlusRecordTypeSetClipRect record Change-Id: I0778cf44a1f4e920e723c17c34f6de4f8eed2342 --- cppcanvas/source/mtfrenderer/emfplus.cxx | 37 ++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/cppcanvas/source/mtfrenderer/emfplus.cxx b/cppcanvas/source/mtfrenderer/emfplus.cxx index 7389e2336ffa..011a204a1b33 100644 --- a/cppcanvas/source/mtfrenderer/emfplus.cxx +++ b/cppcanvas/source/mtfrenderer/emfplus.cxx @@ -72,6 +72,7 @@ #define EmfPlusRecordTypeResetWorldTransform 16427 #define EmfPlusRecordTypeMultiplyWorldTransform 16428 #define EmfPlusRecordTypeSetPageTransform 16432 +#define EmfPlusRecordTypeSetClipRect 16434 #define EmfPlusRecordTypeSetClipPath 16435 #define EmfPlusRecordTypeSetClipRegion 16436 #define EmfPlusRecordTypeDrawDriverString 16438 @@ -1701,27 +1702,55 @@ namespace cppcanvas aWorldTransform.eDx, aWorldTransform.eDy)); break; } + case EmfPlusRecordTypeSetClipRect: + { + int combineMode = (flags >> 8) & 0xf; + + EMFP_DEBUG (printf ("EMF+ SetClipRect combine mode: %d\n", combineMode)); + EMFP_DEBUG (if ( combineMode > 1 ) printf ("EMF+ TODO combine mode > 1\n")); + + float dx, dy, dw, dh; + + ReadRectangle (rMF, dx, dy, dw, dh, false); + + EMFP_DEBUG (printf ("EMF+ RectData: %f,%f %fx%f\n", dx, dy, dw, dh)); + + B2DPoint mappedPoint (Map (dx, dy)); + B2DSize mappedSize( MapSize (dw, dh)); + + ::basegfx::B2DPolyPolygon polyPolygon( ::basegfx::B2DPolygon( ::basegfx::tools::createPolygonFromRect( ::basegfx::B2DRectangle( mappedPoint.getX(), mappedPoint.getY(), + mappedPoint.getX() + mappedSize.getX(), + mappedPoint.getY() + mappedSize.getY() ) ) ) ); + + updateClipping (polyPolygon, rFactoryParms, combineMode == 1); + + break; + } case EmfPlusRecordTypeSetClipPath: { - EMFP_DEBUG (printf ("EMF+ SetClipPath\n")); + int combineMode = (flags >> 8) & 0xf; + + EMFP_DEBUG (printf ("EMF+ SetClipPath combine mode: %d\n", combineMode)); EMFP_DEBUG (printf ("EMF+\tpath in slot: %d\n", flags & 0xff)); EMFPPath& path = *(EMFPPath*) aObjects [flags & 0xff]; ::basegfx::B2DPolyPolygon& clipPoly (path.GetPolygon (*this)); clipPoly.transform (rState.mapModeTransform); - updateClipping (clipPoly, rFactoryParms, false); + updateClipping (clipPoly, rFactoryParms, combineMode == 1); break; } case EmfPlusRecordTypeSetClipRegion: { + int combineMode = (flags >> 8) & 0xf; + EMFP_DEBUG (printf ("EMF+ SetClipRegion\n")); - EMFP_DEBUG (printf ("EMF+\tregion in slot: %d combine mode: %d\n", flags & 0xff, (flags & 0xff00) >> 8)); + EMFP_DEBUG (printf ("EMF+\tregion in slot: %d combine mode: %d\n", flags & 0xff, combineMode)); EMFPRegion *region = (EMFPRegion*)aObjects [flags & 0xff]; // reset clip if (region && region->parts == 0 && region->initialState == EmfPlusRegionInitialStateInfinite) { - updateClipping (::basegfx::B2DPolyPolygon (), rFactoryParms, false); + updateClipping (::basegfx::B2DPolyPolygon (), rFactoryParms, combineMode == 1); } else { EMFP_DEBUG (printf ("EMF+\tTODO\n")); } -- cgit v1.2.3