summaryrefslogtreecommitdiff
path: root/cppcanvas/source
diff options
context:
space:
mode:
authorRadek Doulik <rodo@novell.com>2010-09-15 11:29:57 +0200
committerRadek Doulik <rodo@novell.com>2010-09-15 17:54:14 +0200
commita529db20d67dd8ac6979865a86f814b62661f0fc (patch)
tree2fd9ed8efdd9adf900180f4a305fb1cc56e0cf1e /cppcanvas/source
parent0f0e1c12029ade01ff1780a5f5f93bf75e16eb3a (diff)
emf+-multipart-objects.diff: emf+ import - support multipart objects
Diffstat (limited to 'cppcanvas/source')
-rw-r--r--cppcanvas/source/inc/implrenderer.hxx5
-rw-r--r--cppcanvas/source/mtfrenderer/emfplus.cxx157
-rw-r--r--cppcanvas/source/mtfrenderer/implrenderer.cxx1
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