lib

kowmfreadprivate.h

00001 /* This file is part of the KDE libraries
00002  * Copyright (c) 1998 Stefan Taferner
00003  *                       2001/2003 thierry lorthiois (lorthioist@wanadoo.fr)
00004  * With the help of WMF documentation by Caolan Mc Namara
00005 
00006    This library is free software; you can redistribute it and/or
00007    modify it under the terms of the GNU Library General Public
00008    License version 2 as published by the Free Software Foundation.
00009 
00010    This library is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013    Library General Public License for more details.
00014 
00015    You should have received a copy of the GNU Library General Public License
00016    along with this library; see the file COPYING.LIB.  If not, write to
00017    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00018  * Boston, MA 02110-1301, USA.
00019 */
00020 #ifndef _KOWMFREADPRIVATE_H_
00021 #define _KOWMFREADPRIVATE_H_
00022 
00023 #include <qpen.h>
00024 #include <qcolor.h>
00025 #include <qfont.h>
00026 #include <qrect.h>
00027 #include <qregion.h>
00028 #include <qbuffer.h>
00029 #include <qstring.h>
00030 
00031 #include "kowmfstruct.h"
00032 #include "kowmfstack.h"
00033 
00034 class KoWmfRead;
00035 
00041 class KoWmfReadPrivate
00042 {
00043 public:
00044     KoWmfReadPrivate();
00045     virtual ~KoWmfReadPrivate();
00046 
00050     bool load( const QByteArray& array );
00051 
00056     bool play( KoWmfRead* readKwmf );
00057 
00058 
00059     /* Metafile painter methods */
00060 
00062     void setWindowOrg( Q_UINT32 size, QDataStream& stream );
00064     void setWindowExt( Q_UINT32 size, QDataStream& stream );
00066     void ScaleWindowExt( Q_UINT32, QDataStream& stream );
00068     void OffsetWindowOrg( Q_UINT32, QDataStream& stream );
00069 
00070     /****************** Drawing *******************/
00072     void lineTo( Q_UINT32 size, QDataStream& stream );
00074     void moveTo( Q_UINT32 size, QDataStream& stream );
00076     void ellipse( Q_UINT32 size, QDataStream& stream );
00078     void polygon( Q_UINT32 size, QDataStream& stream );
00080     void polyPolygon( Q_UINT32 size, QDataStream& stream );
00082     void polyline( Q_UINT32 size, QDataStream& stream );
00084     void rectangle( Q_UINT32 size, QDataStream& stream );
00086     void roundRect( Q_UINT32 size, QDataStream& stream );
00088     void arc( Q_UINT32 size, QDataStream& stream );
00090     void chord( Q_UINT32 size, QDataStream& stream );
00092     void pie( Q_UINT32 size, QDataStream& stream );
00094     void setPolyFillMode( Q_UINT32 size, QDataStream& stream );
00096     void setBkColor( Q_UINT32 size, QDataStream& stream );
00098     void setBkMode( Q_UINT32 size, QDataStream& stream );
00100     void setPixel( Q_UINT32 size, QDataStream& stream );
00102     void setRop( Q_UINT32 size, QDataStream& stream );
00104     void saveDC( Q_UINT32 size, QDataStream& stream );
00106     void restoreDC( Q_UINT32 size, QDataStream& stream );
00108     void intersectClipRect( Q_UINT32 size, QDataStream& stream );
00110     void excludeClipRect( Q_UINT32 size, QDataStream& stream );
00111 
00112     /****************** Text *******************/
00114     void setTextColor( Q_UINT32 size, QDataStream& stream );
00116     void setTextAlign( Q_UINT32 size, QDataStream& stream );
00118     void textOut( Q_UINT32 size, QDataStream& stream );
00119     void extTextOut( Q_UINT32 size, QDataStream& stream );
00120 
00121     /****************** Bitmap *******************/
00122     void SetStretchBltMode( Q_UINT32, QDataStream& stream );
00124     void dibBitBlt( Q_UINT32 size, QDataStream& stream );
00126     void dibStretchBlt( Q_UINT32 size, QDataStream& stream );
00127     void stretchDib( Q_UINT32 size, QDataStream& stream );
00129     void dibCreatePatternBrush( Q_UINT32 size, QDataStream& stream );
00130 
00131     /****************** Object handle *******************/
00133     void selectObject( Q_UINT32 size, QDataStream& stream );
00135     void deleteObject( Q_UINT32 size, QDataStream& stream );
00137     void createEmptyObject();
00139     void createBrushIndirect( Q_UINT32 size, QDataStream& stream );
00141     void createPenIndirect( Q_UINT32 size, QDataStream& stream );
00143     void createFontIndirect( Q_UINT32 size, QDataStream& stream );
00144 
00145     /****************** misc *******************/
00147     void end( Q_UINT32, QDataStream& stream );
00148 
00150     static Q_UINT16 calcCheckSum( WmfPlaceableHeader* );
00151 
00152     // function unimplemented
00153     void notyet( Q_UINT32, QDataStream& stream );
00154     void region( Q_UINT32, QDataStream& stream );
00155     void palette( Q_UINT32, QDataStream& stream );
00156     void escape( Q_UINT32, QDataStream& stream );
00157     void setRelAbs( Q_UINT32, QDataStream& stream );
00158     void setMapMode( Q_UINT32, QDataStream& stream );
00159     void extFloodFill( Q_UINT32, QDataStream& stream );
00160     void startDoc( Q_UINT32, QDataStream& stream );
00161     void startPage( Q_UINT32, QDataStream& stream );
00162     void endDoc( Q_UINT32, QDataStream& stream );
00163     void endPage( Q_UINT32, QDataStream& stream );
00164     void resetDC( Q_UINT32, QDataStream& stream );
00165     void bitBlt( Q_UINT32, QDataStream& stream );
00166     void setDibToDev( Q_UINT32, QDataStream& stream );
00167     void createBrush( Q_UINT32, QDataStream& stream );
00168     void createPatternBrush( Q_UINT32, QDataStream& stream );
00169     void createBitmap( Q_UINT32, QDataStream& stream );
00170     void createBitmapIndirect( Q_UINT32, QDataStream& stream );
00171     void createPalette( Q_UINT32, QDataStream& stream );
00172     void createRegion( Q_UINT32, QDataStream& stream );
00173 
00174 private:
00175     //-----------------------------------------------------------------------------
00176     // Utilities and conversion Wmf -> Qt
00177 
00179     bool addHandle( KoWmfHandle*  );
00180     void deleteHandle( int );
00181 
00183     void pointArray( QDataStream& stream, QPointArray& pa );
00184 
00186     QColor qtColor( Q_UINT32 color ) const
00187     { return QColor( color & 0xFF, (color>>8) & 0xFF, (color>>16) & 0xFF ); }
00188 
00190     void xyToAngle( int xStart, int yStart, int xEnd, int yEnd, int& angle, int& aLength );
00191 
00193     Qt::RasterOp winToQtRaster( Q_UINT16 param ) const;
00194     Qt::RasterOp winToQtRaster( Q_UINT32 param ) const;
00195 
00197     bool dibToBmp( QImage& bmp, QDataStream& stream, Q_UINT32 size);
00198 
00199 
00200 public:
00201     // state of the WMF
00202     bool mValid;
00203     bool mStandard;
00204     bool mPlaceable;
00205     bool mEnhanced;
00206 
00208     QRect  mBBox;     // placeable file : this is the header
00209                       // standard file : this is the value in setWindowOrg and setWindowExt
00211     int mDpi;
00212 
00214     int mNbrFunc;
00215 
00216 private:
00217     // the output
00218     KoWmfRead *mReadWmf;
00219 
00220     // current coordinate != mBBox
00221     QRect  mWindow;
00222     // current state of the drawing
00223     QColor  mTextColor;
00224     Q_UINT16  mTextAlign;
00225     int     mTextRotation;
00226     bool    mWinding;
00227 
00228     // memory allocation for WMF file
00229     QBuffer*  mBuffer;
00230     int    mOffsetFirstRecord;
00231 
00232     // stack of object handle
00233     KoWmfHandle**  mObjHandleTab;
00234     // number of object on the stack
00235     int    mNbrObject;
00236     bool   mStackOverflow;
00237 };
00238 
00242     static const struct KoWmfFunc {
00243         void ( KoWmfReadPrivate::*method )( Q_UINT32, QDataStream& );
00244     } koWmfFunc[] = {
00245       { &KoWmfReadPrivate::end }, // 0
00246       { &KoWmfReadPrivate::setBkColor }, // 1
00247       { &KoWmfReadPrivate::setBkMode }, // 2
00248       { &KoWmfReadPrivate::setMapMode }, // 3
00249       { &KoWmfReadPrivate::setRop }, // 4
00250       { &KoWmfReadPrivate::setRelAbs }, // 5
00251       { &KoWmfReadPrivate::setPolyFillMode }, // 6
00252       { &KoWmfReadPrivate::SetStretchBltMode }, // 7
00253       { &KoWmfReadPrivate::notyet }, // 8
00254       { &KoWmfReadPrivate::setTextColor }, // 9
00255       { &KoWmfReadPrivate::ScaleWindowExt }, // 10
00256       { &KoWmfReadPrivate::setWindowOrg }, // 11
00257       { &KoWmfReadPrivate::setWindowExt }, // 12
00258       { &KoWmfReadPrivate::notyet }, // 13
00259       { &KoWmfReadPrivate::notyet }, // 14
00260       { &KoWmfReadPrivate::OffsetWindowOrg }, // 15
00261       { &KoWmfReadPrivate::notyet }, // 16
00262       { &KoWmfReadPrivate::notyet }, // 17
00263       { &KoWmfReadPrivate::notyet }, // 18
00264       { &KoWmfReadPrivate::lineTo }, // 19
00265       { &KoWmfReadPrivate::moveTo }, // 20
00266       { &KoWmfReadPrivate::excludeClipRect }, // 21
00267       { &KoWmfReadPrivate::intersectClipRect }, // 22
00268       { &KoWmfReadPrivate::arc }, // 23
00269       { &KoWmfReadPrivate::ellipse }, // 24
00270       { &KoWmfReadPrivate::notyet }, // 25
00271       { &KoWmfReadPrivate::pie }, // 26
00272       { &KoWmfReadPrivate::rectangle }, // 27
00273       { &KoWmfReadPrivate::roundRect }, // 28
00274       { &KoWmfReadPrivate::notyet }, // 29
00275       { &KoWmfReadPrivate::saveDC }, // 30
00276       { &KoWmfReadPrivate::setPixel }, // 31
00277       { &KoWmfReadPrivate::notyet }, // 32
00278       { &KoWmfReadPrivate::textOut }, // 33
00279       { &KoWmfReadPrivate::bitBlt }, // 34
00280       { &KoWmfReadPrivate::notyet }, // 35
00281       { &KoWmfReadPrivate::polygon }, // 36
00282       { &KoWmfReadPrivate::polyline }, // 37
00283       { &KoWmfReadPrivate::escape }, // 38
00284       { &KoWmfReadPrivate::restoreDC }, // 39
00285       { &KoWmfReadPrivate::region }, // 40
00286       { &KoWmfReadPrivate::region }, // 41
00287       { &KoWmfReadPrivate::region }, // 42
00288       { &KoWmfReadPrivate::region }, // 43
00289       { &KoWmfReadPrivate::region }, // 44
00290       { &KoWmfReadPrivate::selectObject }, // 45
00291       { &KoWmfReadPrivate::setTextAlign }, // 46
00292       { 0 }, // 47
00293       { &KoWmfReadPrivate::chord }, // 48
00294       { &KoWmfReadPrivate::notyet }, // 49
00295       { &KoWmfReadPrivate::extTextOut }, // 50
00296       { &KoWmfReadPrivate::setDibToDev }, // 51
00297       { &KoWmfReadPrivate::palette }, // 52
00298       { &KoWmfReadPrivate::palette }, // 53
00299       { &KoWmfReadPrivate::palette }, // 54
00300       { &KoWmfReadPrivate::palette }, // 55
00301       { &KoWmfReadPrivate::polyPolygon }, // 56
00302       { &KoWmfReadPrivate::palette }, // 57
00303       { 0 }, // 58
00304       { 0 }, // 59
00305       { 0 }, // 60
00306       { 0 }, // 61
00307       { 0 }, // 62
00308       { 0 }, // 63
00309       { &KoWmfReadPrivate::dibBitBlt }, // 64
00310       { &KoWmfReadPrivate::dibStretchBlt }, // 65
00311       { &KoWmfReadPrivate::dibCreatePatternBrush }, // 66
00312       { &KoWmfReadPrivate::stretchDib }, // 67
00313       { 0 }, // 68
00314       { 0 }, // 69
00315       { 0 }, // 70
00316       { 0 }, // 71
00317       { &KoWmfReadPrivate::extFloodFill }, // 72
00318       { 0 }, // 73
00319       { 0 }, // 74
00320       { 0 }, // 75
00321       { &KoWmfReadPrivate::resetDC }, // 76
00322       { &KoWmfReadPrivate::startDoc }, // 77
00323       { 0 }, // 78
00324       { &KoWmfReadPrivate::startPage }, // 79
00325       { &KoWmfReadPrivate::endPage }, // 80
00326       { 0 }, // 81
00327       { 0 }, // 82
00328       { 0 }, // 83
00329       { 0 }, // 84
00330       { 0 }, // 85
00331       { 0 }, // 86
00332       { 0 }, // 87
00333       { 0 }, // 88
00334       { 0 }, // 89
00335       { 0 }, // 90
00336       { 0 }, // 91
00337       { 0 }, // 92
00338       { 0 }, // 93
00339       { &KoWmfReadPrivate::endDoc }, // 94
00340       { 0 }, // 95
00341       // 0x5F last function until 0xF0
00342       { &KoWmfReadPrivate::deleteObject }, // 96
00343       { 0 }, // 97
00344       { 0 }, // 98
00345       { 0 }, // 99
00346       { 0 }, // 100
00347       { 0 }, // 101
00348       { 0 }, // 102
00349       { &KoWmfReadPrivate::createPalette }, // 103
00350       { &KoWmfReadPrivate::createBrush }, // 104
00351       { &KoWmfReadPrivate::createPatternBrush }, // 105
00352       { &KoWmfReadPrivate::createPenIndirect }, // 106
00353       { &KoWmfReadPrivate::createFontIndirect }, // 107
00354       { &KoWmfReadPrivate::createBrushIndirect }, //108
00355       { &KoWmfReadPrivate::createBitmapIndirect }, //109
00356       { &KoWmfReadPrivate::createBitmap }, // 110
00357       { &KoWmfReadPrivate::createRegion } // 111
00358     };
00359 
00360 
00361 #endif
00362 
KDE Home | KDE Accessibility Home | Description of Access Keys