summaryrefslogtreecommitdiffstats
path: root/lib/kwmf/kwmf.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/kwmf/kwmf.h')
-rw-r--r--lib/kwmf/kwmf.h220
1 files changed, 220 insertions, 0 deletions
diff --git a/lib/kwmf/kwmf.h b/lib/kwmf/kwmf.h
new file mode 100644
index 000000000..4f1b050a5
--- /dev/null
+++ b/lib/kwmf/kwmf.h
@@ -0,0 +1,220 @@
+/*
+ Copyright (C) 2000, S.R.Haque <shaheedhaque@hotmail.com>.
+ This file is part of the KDE project
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ aS32 with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+
+DESCRIPTION
+
+ This is a generic parser for Windows MetaFiles (WMFs). The output is
+ a series of callbacks (a.k.a. virtual functions) which the caller can
+ override as required.
+
+ This is based on code originally written by Stefan Taferner
+ (taferner@kde.org).
+*/
+
+#ifndef KWMF_H
+#define KWMF_H
+
+#include <qvaluestack.h>
+#include <koffice_export.h>
+class QDataStream;
+class QPointArray;
+
+class KOWMF_EXPORT KWmf
+{
+public:
+
+ // Construction.
+
+ KWmf(
+ unsigned dpi);
+ virtual ~KWmf();
+
+ // Called to parse the given file.
+
+ bool parse(
+ const QString &file);
+ bool parse(
+ QDataStream &stream,
+ unsigned size);
+
+ class KOWMF_EXPORT DrawContext
+ {
+ public:
+ DrawContext();
+ bool m_winding;
+ unsigned m_brushColour;
+ unsigned m_brushStyle;
+ unsigned m_penColour;
+ unsigned m_penStyle;
+ unsigned m_penWidth;
+ };
+
+ // Should be protected...
+
+ void brushSet(
+ unsigned colour,
+ unsigned style);
+ void penSet(
+ unsigned colour,
+ unsigned style,
+ unsigned width);
+
+protected:
+ // Override to get results of parsing.
+
+ virtual void gotEllipse(
+ const DrawContext &dc,
+ QString type,
+ QPoint topLeft,
+ QSize halfAxes,
+ unsigned startAngle,
+ unsigned stopAngle) = 0;
+ virtual void gotPolygon(
+ const DrawContext &dc,
+ const QPointArray &points) = 0;
+ virtual void gotPolyline(
+ const DrawContext &dc,
+ const QPointArray &points) = 0;
+ virtual void gotRectangle(
+ const DrawContext &dc,
+ const QPointArray &points) = 0;
+
+private:
+ // Debug support.
+
+ static const int s_area;
+
+ // Use unambiguous names for Microsoft types.
+
+ typedef short S16;
+ typedef int S32;
+ typedef unsigned int U32;
+
+ int m_dpi;
+ int m_windowOrgX;
+ int m_windowOrgY;
+ int m_windowFlipX;
+ int m_windowFlipY;
+ DrawContext m_dc;
+ QValueStack<DrawContext> m_savedDcs;
+ QPoint m_lineFrom;
+
+ // Windows handle management.
+
+ class WinObjHandle
+ {
+ public:
+ virtual ~WinObjHandle () {}
+ virtual void apply(KWmf &p) = 0;
+ };
+
+ class WinObjBrushHandle: public WinObjHandle
+ {
+ public:
+ virtual void apply(KWmf &p);
+ unsigned m_colour;
+ unsigned m_style;
+ };
+
+ class WinObjPenHandle: public WinObjHandle
+ {
+ public:
+ virtual void apply(KWmf &p);
+ unsigned m_colour;
+ unsigned m_style;
+ unsigned m_width;
+ };
+
+ int handleIndex(void) const;
+ WinObjPenHandle *handleCreatePen(void);
+ WinObjBrushHandle *handleCreateBrush(void);
+ void handleDelete(int idx);
+ static const int s_maxHandles;
+ WinObjHandle **m_objectHandles;
+
+ unsigned getColour(S32 colour);
+ QPoint normalisePoint(
+ QDataStream &operands);
+ QSize normaliseSize(
+ QDataStream &operands);
+ void genericArc(
+ QString type,
+ QDataStream &operands);
+
+ // Opcode handling and painter methods.
+
+ void walk(
+ U32 words,
+ QDataStream &stream);
+ void skip(
+ U32 words,
+ QDataStream &operands);
+ void invokeHandler(
+ S16 opcode,
+ U32 words,
+ QDataStream &operands);
+/*
+ // draw multiple polygons
+ void opPolypolygon(U32 words, QDataStream &operands);
+*/
+ void opArc(U32 words, QDataStream &operands);
+ // create a logical brush
+ void opBrushCreateIndirect(U32 words, QDataStream &operands);
+ void opEllipse(U32 words, QDataStream &operands);
+ // draw line to coord
+ void opLineTo(U32 words, QDataStream &operands);
+ // move pen to coord
+ void opMoveTo(U32 words, QDataStream &operands);
+ // do nothing
+ void opNoop(U32 words, QDataStream &operands);
+ // Free object handle
+ void opObjectDelete(U32 words, QDataStream &operands);
+ // Activate object handle
+ void opObjectSelect(U32 words, QDataStream &operands);
+ // create a logical pen
+ void opPenCreateIndirect(U32 words, QDataStream &operands);
+ void opPie(U32 words, QDataStream &operands);
+ // draw polygon
+ void opPolygon(U32 words, QDataStream &operands);
+ // set polygon fill mode
+ void opPolygonSetFillMode(U32 words, QDataStream &operands);
+ // draw series of lines
+ void opPolyline(U32 words, QDataStream &operands);
+ void opRectangle(U32 words, QDataStream &operands);
+ // restore drawing context
+ void opRestoreDc(U32 words, QDataStream &operands);
+ // save drawing context
+ void opSaveDc(U32 words, QDataStream &operands);
+ // set window origin
+ void opWindowSetOrg(U32 words, QDataStream &operands);
+ // set window extents
+ void opWindowSetExt(U32 words, QDataStream &operands);
+/*
+ // set background pen color
+ void opsetBkColor(U32 words, QDataStream &operands);
+ // set background pen mode
+ void opsetBkMode(U32 words, QDataStream &operands);
+ // Set raster operation mode
+ void opsetRop(U32 words, QDataStream &operands);
+ // Escape (enhanced command set)
+ void opescape(U32 words, QDataStream &operands);
+*/
+};
+
+#endif