From fa109b4603f06533a63ee19518c482a23976bfe8 Mon Sep 17 00:00:00 2001 From: Radek Doulik Date: Fri, 15 Mar 2013 15:30:40 +0100 Subject: implemented EmfPlusRecordTypeDrawEllipse record Change-Id: If8d7c210e437a041f3202c09f3d26d621b5af748 --- cppcanvas/source/inc/implrenderer.hxx | 1 + cppcanvas/source/mtfrenderer/emfplus.cxx | 79 +++++++++++++++++++------------- 2 files changed, 47 insertions(+), 33 deletions(-) diff --git a/cppcanvas/source/inc/implrenderer.hxx b/cppcanvas/source/inc/implrenderer.hxx index 7d82ea7847de..c2902d6c0b6a 100644 --- a/cppcanvas/source/inc/implrenderer.hxx +++ b/cppcanvas/source/inc/implrenderer.hxx @@ -264,6 +264,7 @@ static float GetSwapFloat( SvStream& rSt ) /* EMF+ */ void processEMFPlus( MetaCommentAction* pAct, const ActionFactoryParameters& rFactoryParms, OutDevState& rState, const CanvasSharedPtr& rCanvas ); double setFont( sal_uInt8 objectId, const ActionFactoryParameters& rParms, OutDevState& rState ); + void EMFPPlusDrawPolygon (::basegfx::B2DPolyPolygon& polygon, const ActionFactoryParameters& rParms, OutDevState& rState, const CanvasSharedPtr& rCanvas, sal_uInt32 penIndex); void EMFPPlusFillPolygon (::basegfx::B2DPolyPolygon& polygon, const ActionFactoryParameters& rParms, OutDevState& rState, const CanvasSharedPtr& rCanvas, bool isColor, sal_uInt32 brushIndexOrColor); ActionVector maActions; diff --git a/cppcanvas/source/mtfrenderer/emfplus.cxx b/cppcanvas/source/mtfrenderer/emfplus.cxx index f8ae8c319c0b..5864182c3a91 100644 --- a/cppcanvas/source/mtfrenderer/emfplus.cxx +++ b/cppcanvas/source/mtfrenderer/emfplus.cxx @@ -1096,6 +1096,41 @@ namespace cppcanvas } } + void ImplRenderer::EMFPPlusDrawPolygon (::basegfx::B2DPolyPolygon& polygon, const ActionFactoryParameters& rParms, + OutDevState& rState, const CanvasSharedPtr& rCanvas, sal_uInt32 penIndex) + { + EMFPPen* pen = (EMFPPen*) aObjects [penIndex & 0xff]; + + SAL_WARN_IF( !pen, "cppcanvas", "emf+ missing pen" ); + + if (pen) + { + rState.isFillColorSet = false; + rState.isLineColorSet = true; + rState.lineColor = ::vcl::unotools::colorToDoubleSequence (pen->GetColor (), + rCanvas->getUNOCanvas ()->getDevice()->getDeviceColorSpace()); + + polygon.transform( rState.mapModeTransform ); + rendering::StrokeAttributes aStrokeAttributes; + + pen->SetStrokeAttributes (aStrokeAttributes, *this, rState); + + ActionSharedPtr pPolyAction( + internal::PolyPolyActionFactory::createPolyPolyAction( + polygon, rParms.mrCanvas, rState, aStrokeAttributes ) ); + + if( pPolyAction ) + { + maActions.push_back( + MtfAction( + pPolyAction, + rParms.mrCurrActionIndex ) ); + + rParms.mrCurrActionIndex += pPolyAction->getActionCount()-1; + } + } + } + void ImplRenderer::processObjectRecord(SvMemoryStream& rObjectStream, sal_uInt16 flags, sal_uInt32 dataSize, sal_Bool bUseWholeStream) { sal_uInt32 index; @@ -1298,13 +1333,15 @@ namespace cppcanvas EMFPPlusFillPolygon (((EMFPPath*) aObjects [index])->GetPolygon (*this), rFactoryParms, rState, rCanvas, flags & 0x8000, brushIndexOrColor); } break; + case EmfPlusRecordTypeDrawEllipse: case EmfPlusRecordTypeFillEllipse: { sal_uInt32 brushIndexOrColor; - rMF >> brushIndexOrColor; + if ( type == EmfPlusRecordTypeFillEllipse ) + rMF >> brushIndexOrColorOrPen; - EMFP_DEBUG (printf ("EMF+ FillEllipse slot: %u\n", static_cast(flags && 0xff))); + EMFP_DEBUG (printf ("EMF+ %sEllipse slot: %u\n", type == EmfPlusRecordTypeFillEllipse ? "Fill" : "Draw", static_cast(flags & 0xff))); float dx, dy, dw, dh; @@ -1317,8 +1354,12 @@ namespace cppcanvas ::basegfx::B2DPolyPolygon polyPolygon( ::basegfx::B2DPolygon( ::basegfx::tools::createPolygonFromEllipse( mappedCenter, mappedSize.getX (), mappedSize.getY () ) ) ); - EMFPPlusFillPolygon( polyPolygon, - rFactoryParms, rState, rCanvas, flags & 0x8000, brushIndexOrColor ); + if ( type == EmfPlusRecordTypeFillEllipse ) + EMFPPlusFillPolygon( polyPolygon, + rFactoryParms, rState, rCanvas, flags & 0x8000, brushIndexOrColor ); + else + EMFPPlusDrawPolygon( polyPolygon, + rFactoryParms, rState, rCanvas, flags & 0xff ); } break; case EmfPlusRecordTypeFillRects: @@ -1438,38 +1479,10 @@ namespace cppcanvas EMFP_DEBUG (printf ("EMF+\tpen: %u\n", (unsigned int)penIndex)); EMFPPath* path = (EMFPPath*) aObjects [flags & 0xff]; - EMFPPen* pen = (EMFPPen*) aObjects [penIndex & 0xff]; - - SAL_WARN_IF( !pen, "cppcanvas", "EmfPlusRecordTypeDrawPath missing pen" ); SAL_WARN_IF( !path, "cppcanvas", "EmfPlusRecordTypeDrawPath missing path" ); - if (pen && path) - { - rState.isFillColorSet = false; - rState.isLineColorSet = true; - rState.lineColor = ::vcl::unotools::colorToDoubleSequence (pen->GetColor (), - rCanvas->getUNOCanvas ()->getDevice()->getDeviceColorSpace()); - ::basegfx::B2DPolyPolygon& polygon (path->GetPolygon (*this)); - - polygon.transform( rState.mapModeTransform ); - rendering::StrokeAttributes aStrokeAttributes; - - pen->SetStrokeAttributes (aStrokeAttributes, *this, rState); + EMFPPlusDrawPolygon (path->GetPolygon (*this), rFactoryParms, rState, rCanvas, penIndex); - ActionSharedPtr pPolyAction( - internal::PolyPolyActionFactory::createPolyPolyAction( - polygon, rFactoryParms.mrCanvas, rState, aStrokeAttributes ) ); - - if( pPolyAction ) - { - maActions.push_back( - MtfAction( - pPolyAction, - rFactoryParms.mrCurrActionIndex ) ); - - rFactoryParms.mrCurrActionIndex += pPolyAction->getActionCount()-1; - } - } break; } case EmfPlusRecordTypeDrawImage: -- cgit v1.2.3