/* Windows Meta File Loader
 *
 * Copyright ( C ) 1998 Stefan Taferner
 * Modified 2002 thierry lorthiois
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2 of the License, or ( at your
 * option ) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABLILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details. You should have received a copy
 * of the GNU General Public License along with this program; if not, write
 * to the Free Software Foundation, Inc, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
 * USA.
 */
#ifndef qwmf_h
#define qwmf_h

#include <tqstring.h>
#include <tqpainter.h>
#include <tqwmatrix.h>
#include <tqpointarray.h>
#include <tqpen.h>
#include <tqcolor.h>
#include <tqimage.h>
#include <tqrect.h>

class TQBuffer;
class TQString;
class WmfCmd;
class WinObjHandle;
class WinObjPenHandle;
class WinObjBrushHandle;
struct WmfPlaceableHeader;

/**
 * TQWinMetaFile is a WMF viewer based on QT toolkit
 * How to use TQWinMetaFile :
 * #include "qwmf.h"
 * TQWinMetaFile wmf;
 * TQPicture pic;     // or TQImage pic;
 * if ( wmf.load( filename )
 *    wmf.paint( &pic );
 */


class TQWinMetaFile
{
public:
    TQWinMetaFile();
    virtual ~TQWinMetaFile();

    /**
     * Load WMF file. Returns true on success.
     */
    virtual bool load( const TQString &fileName );
    virtual bool load( TQBuffer &buffer );

    /**
     * Paint metafile to given paint-device using absolute or relative coordinate.
     * abosute coord. reset the world transfomation Matrix
     * relative coord. use the existing world transfomation Matrix
     * Returns true on success.
     */
    virtual bool paint( const TQPaintDevice* target, bool absolute=false );

    /**
     * Returns true if the metafile is placeable.
     */
    bool isPlaceable( void ) const { return mIsPlaceable; }

    /**
     * Returns true if the metafile is enhanced.
     */
    bool isEnhanced( void ) const { return mIsEnhanced; }

    /**
     * Returns bounding rectangle
     */
    TQRect bbox( void ) const { return mBBox; }
	void setBbox( TQRect r )  { mBBox = r; }

public: // should be protected but cannot
    /** Metafile painter methods */

    // set window origin
    void setWindowOrg( long num, short* parms );
    // set window extents
    void setWindowExt( long num, short* parms );

    /****************** Drawing *******************/
    // draw line to coord
    void lineTo( long num, short* parms );
    // move pen to coord
    void moveTo( long num, short* parms );
    // draw ellipse
    void ellipse( long num, short* parms );
    // draw polygon
    void polygon( long num, short* parms );
    /* draw a list of polygons */
    void polyPolygon( long num, short* parms );
    // draw series of lines
    void polyline( long num, short* parms );
    /* draw a rectangle */
    void rectangle( long num, short* parms );
    /* draw round rectangle */
    void roundRect( long num, short* parms );
    /* draw arc */
    void arc( long num, short* parms );
    /* draw chord */
    void chord( long num, short* parms );
    /* draw pie */
    void pie( long num, short* parms );
    // set polygon fill mode
    void setPolyFillMode( long num, short* parms );
    // set background pen color
    void setBkColor( long num, short* parms );
    // set background pen mode
    void setBkMode( long num, short* parms );
    /* set a pixel */
    void setPixel( long num, short* parms );
    // Set raster operation mode
    void setRop( long num, short* parms );
    /* save device context */
    void saveDC( long num, short* parms );
    /* restore device context */
    void restoreDC( long num, short* parms );
    /*  clipping region is the intersection of this region and the original region */
    void intersectClipRect( long num, short* parms );
    /* delete a clipping rectangle of the original region */
    void excludeClipRect( long num, short* parms );

    /****************** Text *******************/
    /* set text color */
    void setTextColor( long num, short* parms );
    /* set text alignment */
    void setTextAlign( long num, short* parms );
    /* draw text */
    void textOut( long num, short* parms );
    void extTextOut( long num, short* parms );

    /****************** Bitmap *******************/
    /* copies a DIB into a dest location */
    void dibBitBlt( long num, short* parms );
    /* stretches a DIB into a dest location */
    void dibStretchBlt( long num, short* parms );
    void stretchDib( long num, short* parms );
    /* create a pattern brush */
    void dibCreatePatternBrush( long num, short* parms );

    /****************** Object handle *******************/
    // Activate object handle
    void selectObject( long num, short* parms );
    // Free object handle
    void deleteObject( long num, short* parms );
    /* create an empty object in the object list */
    void createEmptyObject( long num, short* parms );
    // create a logical brush
    void createBrushIndirect( long num, short* parms );
    // create a logical pen
    void createPenIndirect( long num, short* parms );
    /* create a logical font */
    void createFontIndirect( long num, short* parms );

    /****************** misc *******************/
    // nothing to do
    void noop( long , short* );
    // end of meta file
    void end( long /*num*/, short* /*parms*/ );
    // Resolution of the image in dots per inch
    int dpi( void ) const { return mDpi; }

protected:
    /** Calculate header checksum */
    unsigned short calcCheckSum( WmfPlaceableHeader* );

    /** Find function in metafunc table by metafile-function.
        Returns index or -1 if not found. */
    virtual int findFunc( unsigned short aFunc ) const;

    /** Fills given parms into mPoints. */
    TQPointArray* pointArray( short num, short* parms );

    /** Returns color given by the two parameters */
    TQColor color( short* parm );

    /** Converts two parameters to long */
    unsigned int toDWord( short* parm );

    /** Convert (x1,y1) and (x2, y2) positions in angle and angleLength */
    void xyToAngle( int xStart, int yStart, int xEnd, int yEnd, int& angle, int& aLength );

    /** Handle win-object-handles */
    void addHandle( WinObjHandle*  );
    void deleteHandle( int );

    /** Convert windows rasterOp in QT rasterOp */
    TQt::RasterOp winToTQtRaster( short parm ) const;
    TQt::RasterOp winToTQtRaster( long parm ) const;

    /** Converts DIB to BMP */
    bool dibToBmp( TQImage& bmp, const char* dib, long size);

protected:
    TQPainter mPainter;
    bool mIsPlaceable, mIsEnhanced, mValid;

    // coordinate system
    bool   mAbsoluteCoord;
    TQWMatrix  mInternalWorldMatrix;   // memorisation of WMF matrix transformation
    TQRect mHeaderBoundingBox;
    TQRect mBBox;

    // informtion shared between Metafile Functions
    TQColor mTextColor;
    int mTextAlign, mRotation;
    bool mWinding;

    WmfCmd* mFirstCmd;
    WinObjHandle** mObjHandleTab;
    TQPointArray mPoints;
    int mDpi;
};

#endif /*qwmf_h*/
