diff options
author | Radek Doulik <rodo@novell.com> | 2010-09-15 11:29:57 +0200 |
---|---|---|
committer | Radek Doulik <rodo@novell.com> | 2010-09-15 17:54:14 +0200 |
commit | a529db20d67dd8ac6979865a86f814b62661f0fc (patch) | |
tree | 2fd9ed8efdd9adf900180f4a305fb1cc56e0cf1e /cppcanvas | |
parent | 0f0e1c12029ade01ff1780a5f5f93bf75e16eb3a (diff) |
emf+-multipart-objects.diff: emf+ import - support multipart objects
Diffstat (limited to 'cppcanvas')
-rw-r--r-- | cppcanvas/source/inc/implrenderer.hxx | 5 | ||||
-rw-r--r-- | cppcanvas/source/mtfrenderer/emfplus.cxx | 157 | ||||
-rw-r--r-- | cppcanvas/source/mtfrenderer/implrenderer.cxx | 1 |
3 files changed, 96 insertions, 67 deletions
diff --git a/cppcanvas/source/inc/implrenderer.hxx b/cppcanvas/source/inc/implrenderer.hxx index b550fca2ebbd..abae942eaa15 100644 --- a/cppcanvas/source/inc/implrenderer.hxx +++ b/cppcanvas/source/inc/implrenderer.hxx @@ -267,6 +267,7 @@ static float GetSwapFloat( SvStream& rSt ) ActionVector::const_iterator& o_rRangeBegin, ActionVector::const_iterator& o_rRangeEnd ) const; + void processObjectRecord(SvMemoryStream& rObjectStream, UINT16 flags); void processEMFPlus( MetaCommentAction* pAct, const ActionFactoryParameters& rFactoryParms, OutDevState& rState, const CanvasSharedPtr& rCanvas ); void EMFPPlusFillPolygon (::basegfx::B2DPolyPolygon& polygon, const ActionFactoryParameters& rParms, OutDevState& rState, const CanvasSharedPtr& rCanvas, bool isColor, sal_uInt32 brushIndexOrColor); @@ -291,6 +292,10 @@ static float GetSwapFloat( SvStream& rSt ) sal_Int32 nPixY; sal_Int32 nMmX; sal_Int32 nMmY; + /* multipart object data */ + bool mbMultipart; + UINT16 mMFlags; + SvMemoryStream mMStream; }; diff --git a/cppcanvas/source/mtfrenderer/emfplus.cxx b/cppcanvas/source/mtfrenderer/emfplus.cxx index 699c2d4cb8d2..8d22704ee23f 100644 --- a/cppcanvas/source/mtfrenderer/emfplus.cxx +++ b/cppcanvas/source/mtfrenderer/emfplus.cxx @@ -663,6 +663,8 @@ namespace cppcanvas { sal_uInt32 header, unknown; + EMFP_DEBUG (dumpWords(s, 16)); + s >> header >> type; EMFP_DEBUG (printf ("EMF+\timage\nEMF+\theader: 0x%08x type: 0x%08x\n", header, type)); @@ -974,6 +976,72 @@ namespace cppcanvas } } + void ImplRenderer::processObjectRecord(SvMemoryStream& rObjectStream, UINT16 flags) + { + UINT32 objectLen; + sal_uInt32 index; + + EMFP_DEBUG (printf ("EMF+ Object slot: %hd flags: %hx\n", flags & 0xff, flags & 0xff00)); + + index = flags & 0xff; + if (aObjects [index] != NULL) { + delete aObjects [index]; + aObjects [index] = NULL; + } + + switch (flags & 0x7f00) { + case EmfPlusObjectTypeBrush: + { + EMFPBrush *brush; + aObjects [index] = brush = new EMFPBrush (); + brush->Read (rObjectStream, *this); + + break; + } + case EmfPlusObjectTypePen: + { + EMFPPen *pen; + aObjects [index] = pen = new EMFPPen (); + pen->Read (rObjectStream, *this, nHDPI, nVDPI); + + break; + } + case EmfPlusObjectTypePath: + sal_uInt32 header, pathFlags; + sal_Int32 points; + + rObjectStream >> header >> points >> pathFlags; + + EMFP_DEBUG (printf ("EMF+\tpath\n")); + EMFP_DEBUG (printf ("EMF+\theader: 0x%08x points: %d additional flags: 0x%08x\n", header, points, pathFlags)); + + EMFPPath *path; + aObjects [index] = path = new EMFPPath (points); + path->Read (rObjectStream, pathFlags, *this); + + break; + case EmfPlusObjectTypeRegion: { + EMFPRegion *region; + + aObjects [index] = region = new EMFPRegion (); + region->Read (rObjectStream); + + break; + } + case EmfPlusObjectTypeImage: + { + EMFPImage *image; + aObjects [index] = image = new EMFPImage (); + image->Read (rObjectStream); + + break; + } + default: + EMFP_DEBUG (printf ("EMF+\tObject unhandled flags: 0x%04x\n", flags & 0xff00)); + break; + } + } + void ImplRenderer::processEMFPlus( MetaCommentAction* pAct, const ActionFactoryParameters& rFactoryParms, OutDevState& rState, const CanvasSharedPtr& rCanvas ) { @@ -993,6 +1061,26 @@ namespace cppcanvas EMFP_DEBUG (printf ("EMF+ record size: %d type: %04hx flags: %04hx data size: %d\n", size, type, flags, dataSize)); + if (type == EmfPlusRecordTypeObject && (mbMultipart && flags & 0x7fff == mMFlags & 0x7fff || flags & 0x8000)) { + if (!mbMultipart) { + mbMultipart = true; + mMFlags = flags; + mMStream.Seek(0); + } + EMFP_DEBUG (dumpWords(rMF, 16)); + // 1st 4 bytes are unknown + mMStream.Write (((const char *)rMF.GetData()) + rMF.Tell() + 4, dataSize - 4); + EMFP_DEBUG (printf ("EMF+ read next object part size: %d type: %04hx flags: %04hx data size: %d\n", size, type, flags, dataSize)); + } else { + if (mbMultipart) { + EMFP_DEBUG (printf ("EMF+ multipart record flags: %04hx\n", mMFlags)); + mMStream.Seek (0); + processObjectRecord (mMStream, mMFlags); + } + mbMultipart = false; + } + + if (type != EmfPlusRecordTypeObject || !(flags & 0x8000)) switch (type) { case EmfPlusRecordTypeHeader: UINT32 header, version; @@ -1011,73 +1099,8 @@ namespace cppcanvas EMFP_DEBUG (printf ("EMF+\talready used in svtools wmf/emf filter parser\n")); break; case EmfPlusRecordTypeObject: - { - UINT32 objectLen; - sal_uInt32 index; - - EMFP_DEBUG (printf ("EMF+ Object slot: %hd flags: %hx\n", flags & 0xff, flags & 0xff00)); - - index = flags & 0xff; - if (aObjects [index] != NULL) { - delete aObjects [index]; - aObjects [index] = NULL; - } - - // not sure yet, what 0x8000 means - switch (flags & 0x7f00) { - case EmfPlusObjectTypeBrush: - { - EMFPBrush *brush; - aObjects [index] = brush = new EMFPBrush (); - brush->Read (rMF, *this); - - break; - } - case EmfPlusObjectTypePen: - { - EMFPPen *pen; - aObjects [index] = pen = new EMFPPen (); - pen->Read (rMF, *this, nHDPI, nVDPI); - - break; - } - case EmfPlusObjectTypePath: - sal_uInt32 header, pathFlags; - sal_Int32 points; - - rMF >> header >> points >> pathFlags; - - EMFP_DEBUG (printf ("EMF+\tpath\n")); - EMFP_DEBUG (printf ("EMF+\theader: 0x%08x points: %d additional flags: 0x%08x\n", header, points, pathFlags)); - - EMFPPath *path; - aObjects [index] = path = new EMFPPath (points); - path->Read (rMF, pathFlags, *this); - - break; - case EmfPlusObjectTypeRegion: { - EMFPRegion *region; - - aObjects [index] = region = new EMFPRegion (); - region->Read (rMF); - - break; - } - case EmfPlusObjectTypeImage: - { - EMFPImage *image; - aObjects [index] = image = new EMFPImage (); - image->Read (rMF); - - break; - } - default: - EMFP_DEBUG (printf ("EMF+\tObject unhandled flags: 0x%04x\n", flags & 0xff00)); - break; - } - - break; - } + processObjectRecord (rMF, flags); + break; case EmfPlusRecordTypeFillPath: { sal_uInt32 index = flags & 0xff; diff --git a/cppcanvas/source/mtfrenderer/implrenderer.cxx b/cppcanvas/source/mtfrenderer/implrenderer.cxx index b83cbacdcd29..080c7d39740b 100644 --- a/cppcanvas/source/mtfrenderer/implrenderer.cxx +++ b/cppcanvas/source/mtfrenderer/implrenderer.cxx @@ -3007,6 +3007,7 @@ namespace cppcanvas /* EMF+ */ memset (aObjects, 0, sizeof (aObjects)); + mbMultipart = false; createActions( const_cast<GDIMetaFile&>(rMtf), // HACK(Q2): // we're |