24#include <tqfileinfo.h>
27#include <tqdatastream.h>
28#include <tqapplication.h>
32bool qwmfDebug = false;
44 ~WmfCmd() { if ( next ) delete next; }
46 unsigned short funcIndex;
55 virtual void apply( TQPainter& p ) = 0;
58class WinObjBrushHandle: public WinObjHandle
61 virtual void apply( TQPainter& p );
63 virtual ~WinObjBrushHandle() {};
66class WinObjPenHandle: public WinObjHandle
69 virtual void apply( TQPainter& p );
71 virtual ~WinObjPenHandle() {};
74class WinObjPatternBrushHandle: public WinObjHandle
77 virtual void apply( TQPainter& p );
80 virtual ~WinObjPatternBrushHandle() {};
83class WinObjFontHandle: public WinObjHandle
86 virtual void apply( TQPainter& p );
89 virtual ~WinObjFontHandle() {};
92void WinObjBrushHandle::apply( TQPainter& p )
97void WinObjPenHandle::apply( TQPainter& p )
102void WinObjPatternBrushHandle::apply( TQPainter& p )
107void WinObjFontHandle::apply( TQPainter& p )
112#define MAX_OBJHANDLE 64
117QWinMetaFile::QWinMetaFile()
121 mObjHandleTab = NULL;
127QWinMetaFile::~QWinMetaFile()
129 if ( mFirstCmd ) delete mFirstCmd;
130 if ( mObjHandleTab ) delete[] mObjHandleTab;
137 TQFile file( filename );
139 if ( !file.exists() )
141 kdDebug() << "File " << TQString(TQFile::encodeName(filename)) << " does not exist" << endl;
145 if ( !file.open( IO_ReadOnly ) )
147 kdDebug() << "Cannot open file " << TQString(TQFile::encodeName(filename)) << endl;
151 TQByteArray ba = file.readAll();
154 TQBuffer buffer( ba );
155 buffer.open( IO_ReadOnly );
156 return load( buffer );
163 WmfEnhMetaHeader eheader;
164 WmfMetaHeader header;
165 WmfPlaceableHeader pheader;
174 mTextColor = TQt::black;
175 if ( mFirstCmd ) delete mFirstCmd;
178 st.setDevice( &buffer );
179 st.setByteOrder( TQDataStream::LittleEndian );
183 mIsPlaceable = ( pheader.key==( DWORD )APMHEADER_KEY );
187 st >> pheader.bbox.left;
188 st >> pheader.bbox.top;
189 st >> pheader.bbox.right;
190 st >> pheader.bbox.bottom;
192 st >> pheader.reserved;
193 st >> pheader.checksum;
195 if ( pheader.checksum!=checksum ) mIsPlaceable = false;
198 mBBox.setLeft( pheader.bbox.left );
199 mBBox.setTop( pheader.bbox.top );
200 mBBox.setRight( pheader.bbox.right );
201 mBBox.setBottom( pheader.bbox.bottom );
202 mHeaderBoundingBox = mBBox;
205 kdDebug() << endl << "-------------------------------------------------" << endl;
206 kdDebug() << "WMF Placeable Header ( " << static_cast<int>( sizeof( pheader ) ) << "):" << endl;
207 kdDebug() << " bbox=( " << mBBox.left() << "; " << mBBox.top() << "; " << mBBox.width()
208 << "; " << mBBox.height() << ")" << endl;
209 kdDebug() << " inch=" << pheader.inch << endl;
210 kdDebug() << " checksum=" << pheader.checksum << "( "
211 << (pheader.checksum==checksum? "ok": "wrong") << " )" << endl;
217 filePos = buffer.at();
220 st >> eheader.rclBounds.left;
221 st >> eheader.rclBounds.top;
222 st >> eheader.rclBounds.right;
223 st >> eheader.rclBounds.bottom;
224 st >> eheader.rclFrame.left;
225 st >> eheader.rclFrame.top;
226 st >> eheader.rclFrame.right;
227 st >> eheader.rclFrame.bottom;
228 st >> eheader.dSignature;
229 mIsEnhanced = ( eheader.dSignature==ENHMETA_SIGNATURE );
232 st >> eheader.nVersion;
233 st >> eheader.nBytes;
234 st >> eheader.nRecords;
235 st >> eheader.nHandles;
236 st >> eheader.sReserved;
237 st >> eheader.nDescription;
238 st >> eheader.offDescription;
239 st >> eheader.nPalEntries;
240 st >> eheader.szlDevice.width;
241 st >> eheader.szlDevice.height;
242 st >> eheader.szlMillimeters.width;
243 st >> eheader.szlMillimeters.height;
247 kdDebug() << endl << "-------------------------------------------------" << endl;
248 kdDebug() << "WMF Extended Header:" << endl;
249 kdDebug() << " iType=" << eheader.iType << endl;
250 kdDebug() << " nSize=" << eheader.nSize << endl;
251 kdDebug() << " rclBounds=( " << eheader.rclBounds.left << "; " << eheader.rclBounds.top << "; "
252 << eheader.rclBounds.right << "; " << eheader.rclBounds.bottom << ")" << endl;
253 kdDebug() << " rclFrame=( " << eheader.rclFrame.left << "; " << eheader.rclFrame.top << "; "
254 << eheader.rclFrame.right << "; " << eheader.rclFrame.bottom << ")" << endl;
255 kdDebug() << " nBytes=" << eheader.nBytes << endl;
256 kdDebug() << "\nNOT YET IMPLEMENTED, SORRY." << endl;
262 buffer.at( filePos );
264 st >> header.mtHeaderSize;
265 st >> header.mtVersion;
267 st >> header.mtNoObjects;
268 st >> header.mtMaxRecord;
269 st >> header.mtNoParameters;
271 kdDebug() << "WMF Header: " << "mtSize=" << header.mtSize << endl;
276 mValid = ((header.mtHeaderSize == 9) && (header.mtNoParameters == 0)) || mIsEnhanced || mIsPlaceable;
282 while ( !st.eof() && (rdFunc != 0) )
291 if ( last ) last->next = cmd;
292 else mFirstCmd = cmd;
294 cmd->funcIndex = idx;
295 cmd->numParm = rdSize;
296 cmd->parm = new WORD[ rdSize ];
299 for ( i=0; i<rdSize && !st.eof(); i++ )
300 st >> cmd->parm[ i ];
303 if ( rdFunc == 0x020B ) {
304 mBBox.setLeft( cmd->parm[ 1 ] );
305 mBBox.setTop( cmd->parm[ 0 ] );
307 if ( rdFunc == 0x020C ) {
308 mBBox.setWidth( cmd->parm[ 1 ] );
309 mBBox.setHeight( cmd->parm[ 0 ] );
314 kdDebug() << "WMF : file truncated !" << endl;
319 mValid = (rdFunc == 0) && (mBBox.width() != 0) && (mBBox.height() != 0);
321 kdDebug() << "WMF : incorrect file format !" << endl;
325 kdDebug() << "WMF Header : incorrect header !" << endl;
339 if ( !mValid ) return false;
341 assert( aTarget!=NULL );
342 if ( mPainter.isActive() ) return false;
344 if ( mObjHandleTab ) delete[] mObjHandleTab;
345 mObjHandleTab = new WinObjHandle* [ MAX_OBJHANDLE ];
346 for ( i=MAX_OBJHANDLE-1; i>=0; i-- )
347 mObjHandleTab[ i ] = NULL;
349 mPainter.resetXForm();
351 mAbsoluteCoord = absolute;
353 mPainter.begin( const_cast<TQPaintDevice* >(aTarget) );
355 kdDebug() << "Bounding box : " << mBBox.left()
356 << " " << mBBox.top() << " " << mBBox.right() << " " << mBBox.bottom() << endl;
359 if ( mAbsoluteCoord ) {
360 mPainter.setWindow( mBBox.top(), mBBox.left(), mBBox.width(), mBBox.height() );
362 mInternalWorldMatrix.reset();
364 for ( cmd=mFirstCmd; cmd; cmd=cmd->next )
366 idx = cmd->funcIndex;
367 ( this->*metaFuncTab[ idx ].method )( cmd->numParm, cmd->parm );
370 TQString str = "", param;
371 if ( metaFuncTab[ idx ].name == NULL ) {
375 str += "UNIMPLEMENTED ";
377 str += metaFuncTab[ idx ].name;
380 for ( i=0 ; i < cmd->numParm ; i++ ) {
381 param.setNum( cmd->parm[ i ] );
385 kdDebug() << str << endl;
409 if ( mAbsoluteCoord ) {
410 TQRect r = mPainter.window();
411 mPainter.setWindow( parm[ 1 ], parm[ 0 ], r.width(), r.height() );
414 double dx = mInternalWorldMatrix.dx();
415 double dy = mInternalWorldMatrix.dy();
417 mInternalWorldMatrix.translate( -dx, -dy );
418 mInternalWorldMatrix.translate( -parm[ 1 ], -parm[ 0 ] );
419 mPainter.translate( -dx, -dy );
420 mPainter.translate( -parm[ 1 ], -parm[ 0 ] );
429 if ( mAbsoluteCoord ) {
430 TQRect r = mPainter.window();
431 mPainter.setWindow( r.left(), r.top(), parm[ 1 ], parm[ 0 ] );
434 if ( (parm[ 0 ] != 0) && (parm[ 1 ] != 0) ) {
435 TQRect r = mPainter.window();
436 double dx = mInternalWorldMatrix.dx();
437 double dy = mInternalWorldMatrix.dy();
438 double sx = mInternalWorldMatrix.m11();
439 double sy = mInternalWorldMatrix.m22();
441 mInternalWorldMatrix.translate( -dx, -dy );
442 mInternalWorldMatrix.scale( 1/sx, 1/sy );
443 mPainter.translate( -dx, -dy );
444 mPainter.scale( 1/sx, 1/sy );
446 sx = (double)r.width() / (double)parm[ 1 ];
447 sy = (double)r.height() / (double)parm[ 0 ];
449 mInternalWorldMatrix.scale( sx, sy );
450 mInternalWorldMatrix.translate( dx, dy );
451 mPainter.scale( sx, sy );
452 mPainter.translate( dx, dy );
463 mPainter.lineTo( parm[ 1 ], parm[ 0 ] );
470 mPainter.moveTo( parm[ 1 ], parm[ 0 ] );
477 mPainter.drawEllipse( parm[ 3 ], parm[ 2 ], parm[ 1 ]-parm[ 3 ], parm[ 0 ]-parm[ 2 ] );
487 mPainter.drawPolygon( *pa, mWinding );
495 int i, j, startPolygon;
501 startPolygon = 1+parm[ 0 ];
502 for ( i=0 ; i < parm[ 0 ] ; i++ ) {
503 TQPointArray pa1( parm[ 1+i ] );
504 for ( j=0 ; j < parm[ 1+i ] ; j++) {
505 pa1.setPoint ( j, parm[ startPolygon ], parm[ startPolygon+1 ] );
509 region = region.eor( r );
511 mPainter.setClipRegion( region, TQPainter::CoordPainter );
514 mPainter.fillRect( win.left(), win.top(), win.width(), win.height(), mPainter.brush() );
517 if ( mPainter.pen().style() != TQt::NoPen ) {
518 mPainter.setClipping( false );
519 mPainter.setBrush( TQt::NoBrush );
522 int idxPolygon = 1 + parm[ 0 ];
523 for ( i=0 ; i < parm[ 0 ] ; i++ ) {
524 pa = pointArray( parm[ 1+i ], &parm[ idxPolygon ] );
525 mPainter.drawPolygon( *pa );
526 idxPolygon += parm[ 1+i ] * 2;
540 mPainter.drawPolyline( *pa );
547 mPainter.drawRect( parm[ 3 ], parm[ 2 ], parm[ 1 ]-parm[ 3 ], parm[ 0 ]-parm[ 2 ] );
554 int xRnd = 0, yRnd = 0;
557 if ( (parm[ 3 ] - parm[ 5 ]) != 0 )
558 xRnd = (parm[ 1 ] * 100) / (parm[ 3 ] - parm[ 5 ]) ;
559 if ( (parm[ 2 ] - parm[ 4 ]) != 0 )
560 yRnd = (parm[ 0 ] * 100) / (parm[ 2 ] - parm[ 4 ]) ;
562 mPainter.drawRoundRect( parm[ 5 ], parm[ 4 ], parm[ 3 ]-parm[ 5 ], parm[ 2 ]-parm[ 4 ], xRnd, yRnd );
569 int xCenter, yCenter, angleStart, aLength;
571 xCenter = parm[ 7 ] + ((parm[ 5 ] - parm[ 7 ]) / 2);
572 yCenter = parm[ 6 ] + ((parm[ 4 ] - parm[ 6 ]) / 2);
574 xyToAngle ( parm[ 3 ] - xCenter, yCenter - parm[ 2 ], parm[ 1 ] - xCenter, yCenter - parm[ 0 ], angleStart, aLength );
576 mPainter.drawArc( parm[ 7 ], parm[ 6 ], parm[ 5 ]-parm[ 7 ], parm[ 4 ]-parm[ 6 ], angleStart, aLength);
583 int xCenter, yCenter, angleStart, aLength;
585 xCenter = parm[ 7 ] + ((parm[ 5 ] - parm[ 7 ]) / 2);
586 yCenter = parm[ 6 ] + ((parm[ 4 ] - parm[ 6 ]) / 2);
588 xyToAngle ( parm[ 3 ] - xCenter, yCenter - parm[ 2 ], parm[ 1 ] - xCenter, yCenter - parm[ 0 ], angleStart, aLength );
590 mPainter.drawChord( parm[ 7 ], parm[ 6 ], parm[ 5 ]-parm[ 7 ], parm[ 4 ]-parm[ 6 ], angleStart, aLength);
597 int xCenter, yCenter, angleStart, aLength;
599 xCenter = parm[ 7 ] + ((parm[ 5 ] - parm[ 7 ]) / 2);
600 yCenter = parm[ 6 ] + ((parm[ 4 ] - parm[ 6 ]) / 2);
602 xyToAngle ( parm[ 3 ] - xCenter, yCenter - parm[ 2 ], parm[ 1 ] - xCenter, yCenter - parm[ 0 ], angleStart, aLength );
604 mPainter.drawPie( parm[ 7 ], parm[ 6 ], parm[ 5 ]-parm[ 7 ], parm[ 4 ]-parm[ 6 ], angleStart, aLength);
611 mWinding = parm[ 0 ];
618 mPainter.setBackgroundColor( color( parm ) );
625 if ( parm[ 0 ]==1 ) mPainter.setBackgroundMode( TQt::TransparentMode );
626 else mPainter.setBackgroundMode( TQt::OpaqueMode );
633 TQPen pen = mPainter.pen();
634 mPainter.setPen( color( parm ) );
635 mPainter.drawPoint( parm[ 3 ], parm[ 2 ] );
636 mPainter.setPen( pen );
657 for ( int i=0; i > parm[ 0 ] ; i-- )
670 TQRegion region( bbox() );
672 TQRegion newRegion( parm[ 3 ], parm[ 2 ], parm[ 1 ] - parm[ 3 ], parm[ 0 ] - parm[ 2 ] );
673 region = region.intersect( newRegion );
675 mPainter.setClipRegion( region, TQPainter::CoordPainter );
687 TQRegion region( bbox() );
689 TQRegion newRegion( parm[ 3 ], parm[ 2 ], parm[ 1 ] - parm[ 3 ], parm[ 0 ] - parm[ 2 ] );
690 region = region.subtract( newRegion );
692 mPainter.setClipRegion( region, TQPainter::CoordPainter );
701 mTextColor = color( parm );
708 mTextAlign = parm[ 0 ];
716 short *copyParm = new short[ num + 1 ];
719 int idxOffset = (parm[ 0 ] / 2) + 1 + (parm[ 0 ] & 1);
720 copyParm[ 0 ] = parm[ idxOffset ];
721 copyParm[ 1 ] = parm[ idxOffset + 1 ];
722 copyParm[ 2 ] = parm[ 0 ];
724 memcpy( ©Parm[ 4 ], &parm[ 1 ], parm[ 0 ] );
726 extTextOut( num + 1, copyParm );
732void QWinMetaFile::extTextOut( long num, short* parm )
735 int x, y, width, height;
738 if ( parm[ 3 ] != 0 )
739 ptStr = ( char*)&parm[ 8 ];
741 ptStr = ( char*)&parm[ 4 ];
743 TQCString text( ptStr, parm[ 2 ] + 1 );
745 TQFontMetrics fm( mPainter.font() );
746 width = fm.width( text ) + fm.descent();
747 height = fm.height();
751 if ( mTextAlign & 0x01 ) {
752 TQPoint pos = mPainter.pos();
762 mPainter.translate( parm[ 1 ], parm[ 0 ]);
763 mPainter.rotate ( mRotation );
764 mPainter.translate( -parm[ 1 ], -parm[ 0 ] );
768 if ( mTextAlign & 0x06 )
770 if ( mTextAlign & 0x08 )
771 y -= (height - fm.descent());
773 mPainter.setPen( mTextColor );
774 idxOffset = (parm[ 2 ] / 2) + 4 + (parm[ 2 ] & 1);
775 if ( ( parm[ 2 ] > 1 ) && ( num >= (idxOffset + parm[ 2 ]) ) && ( parm[ 3 ] == 0 ) ) {
778 mPainter.drawText( left, y, width, height, TQt::AlignLeft | TQt::AlignTop, text.mid(0, 1) );
779 for ( int i = 1; i < parm[ 2 ] ; i++ ) {
780 left += parm[ idxOffset + i - 1 ];
781 mPainter.drawText( left, y, width, height, TQt::AlignLeft | TQt::AlignTop, text.mid(i, 1) );
785 mPainter.drawText( x, y, width, height, TQt::AlignLeft | TQt::AlignTop, text );
802 if ( dibToBmp( bmpSrc, ( char*)&parm[ 8 ], (num - 8) * 2 ) ) {
809 if ( parm[ 5 ] < 0 ) {
810 TQWMatrix m( -1.0F, 0.0F, 0.0F, 1.0F, 0.0F, 0.0F );
811 mPainter.setWorldMatrix( m, true );
813 if ( parm[ 4 ] < 0 ) {
814 TQWMatrix m( 1.0F, 0.0F, 0.0F, -1.0F, 0.0F, 0.0F );
815 mPainter.setWorldMatrix( m, true );
817 mPainter.drawImage( parm[ 7 ], parm[ 6 ], bmpSrc, parm[ 3 ], parm[ 2 ], parm[ 5 ], parm[ 4 ] );
822 kdDebug() << "QWinMetaFile::dibBitBlt without image: not implemented " << endl;
832 if ( dibToBmp( bmpSrc, ( char*)&parm[ 10 ], (num - 10) * 2 ) ) {
839 if ( parm[ 7 ] < 0 ) {
840 TQWMatrix m( -1.0F, 0.0F, 0.0F, 1.0F, 0.0F, 0.0F );
841 mPainter.setWorldMatrix( m, true );
843 if ( parm[ 6 ] < 0 ) {
844 TQWMatrix m( 1.0F, 0.0F, 0.0F, -1.0F, 0.0F, 0.0F );
845 mPainter.setWorldMatrix( m, true );
847 bmpSrc = bmpSrc.copy( parm[ 5 ], parm[ 4 ], parm[ 3 ], parm[ 2 ] );
850 mPainter.drawImage( parm[ 9 ], parm[ 8 ], bmpSrc );
857void QWinMetaFile::stretchDib( long num, short* parm )
861 if ( dibToBmp( bmpSrc, ( char*)&parm[ 11 ], (num - 11) * 2 ) ) {
868 if ( parm[ 8 ] < 0 ) {
869 TQWMatrix m( -1.0F, 0.0F, 0.0F, 1.0F, 0.0F, 0.0F );
870 mPainter.setWorldMatrix( m, true );
872 if ( parm[ 7 ] < 0 ) {
873 TQWMatrix m( 1.0F, 0.0F, 0.0F, -1.0F, 0.0F, 0.0F );
874 mPainter.setWorldMatrix( m, true );
876 bmpSrc = bmpSrc.copy( parm[ 6 ], parm[ 5 ], parm[ 4 ], parm[ 3 ] );
879 mPainter.drawImage( parm[ 10 ], parm[ 9 ], bmpSrc );
888 WinObjPatternBrushHandle* handle = new WinObjPatternBrushHandle;
892 if ( dibToBmp( bmpSrc, ( char*)&parm[ 2 ], (num - 2) * 2 ) ) {
893 handle->image = bmpSrc;
894 handle->brush.setPixmap( handle->image );
905 if ( idx>=0 && idx < MAX_OBJHANDLE && mObjHandleTab[ idx ] )
906 mObjHandleTab[ idx ]->apply( mPainter );
913 deleteHandle( parm[ 0 ] );
921 WinObjPenHandle* handle = new WinObjPenHandle;
923 kdDebug() << "QWinMetaFile: unimplemented createObject " << endl;
930 static TQt::BrushStyle hatchedStyleTab[] =
936 TQt::DiagCrossPattern
938 static TQt::BrushStyle styleTab[] =
949 TQt::BrushStyle style;
951 WinObjBrushHandle* handle = new WinObjBrushHandle;
958 if ( arg>=0 && arg<5 ) style = hatchedStyleTab[ arg ];
961 kdDebug() << "QWinMetaFile::createBrushIndirect: invalid hatched brush " << arg << endl;
962 style = TQt::SolidPattern;
965 else if ( arg>=0 && arg<9 )
966 style = styleTab[ arg ];
969 kdDebug() << "QWinMetaFile::createBrushIndirect: invalid brush " << arg << endl;
970 style = TQt::SolidPattern;
972 handle->brush.setStyle( style );
973 handle->brush.setColor( color( parm+1 ) );
980 static TQt::PenStyle styleTab[] =
981 { TQt::SolidLine, TQt::DashLine, TQt::DotLine, TQt::DashDotLine, TQt::DashDotDotLine,
982 TQt::NoPen, TQt::SolidLine };
984 WinObjPenHandle* handle = new WinObjPenHandle;
987 if ( parm[ 0 ]>=0 && parm[ 0 ]<6 ) style=styleTab[ parm[ 0 ] ];
990 kdDebug() << "QWinMetaFile::createPenIndirect: invalid pen " << parm[ 0 ] << endl;
991 style = TQt::SolidLine;
994 handle->pen.setStyle( style );
995 handle->pen.setColor( color( parm+3 ) );
996 handle->pen.setCapStyle( TQt::RoundCap );
1017 WinObjFontHandle* handle = new WinObjFontHandle;
1020 TQString family( ( const char*)&parm[ 9 ] );
1022 mRotation = -parm[ 2 ] / 10;
1024 handle->font.setFamily( family );
1025 handle->font.setFixedPitch( ((parm[ 8 ] & 0x01) == 0) );
1027 handle->font.setPointSize( TQABS(parm[ 0 ]) - 2 );
1028 handle->font.setWeight( (parm[ 4 ] >> 3) );
1029 handle->font.setItalic( (parm[ 5 ] & 0x01) );
1030 handle->font.setUnderline( (parm[ 5 ] & 0x100) );
1056 wResult = *( lpWord = ( WORD* )( apmfh ) );
1058 for( i=1; i<=9; i++ )
1060 wResult ^= lpWord[ i ];
1071 for ( i=0; metaFuncTab[ i ].name; i++ )
1072 if ( metaFuncTab[ i ].func == aFunc ) return i;
1083 mPoints.resize( num );
1085 for ( i=0; i<num; i++, parm+=2 )
1086 mPoints.setPoint( i, parm[ 0 ], parm[ 1 ] );
1096#if !defined( WORDS_BIGENDIAN )
1097 l = *( unsigned int* )( parm );
1101 bytes = ( char* )parm;
1102 swap[ 0 ] = bytes[ 2 ];
1103 swap[ 1 ] = bytes[ 3 ];
1104 swap[ 2 ] = bytes[ 0 ];
1105 swap[ 3 ] = bytes[ 1 ];
1106 l = *( unsigned int* )( swap );
1116 unsigned int colorRef;
1117 int red, green, blue;
1119 colorRef = toDWord( parm ) & 0xffffff;
1120 red = colorRef & 255;
1121 green = ( colorRef>>8 ) & 255;
1122 blue = ( colorRef>>16 ) & 255;
1124 return TQColor( red, green, blue );
1131 float aStart, aLength;
1133 aStart = atan2( yStart, xStart );
1134 aLength = atan2( yEnd, xEnd ) - aStart;
1136 angleStart = (int)(aStart * 2880 / 3.14166);
1137 angleLength = (int)(aLength * 2880 / 3.14166);
1138 if ( angleLength < 0 ) angleLength = 5760 + angleLength;
1147 for ( idx=0; idx < MAX_OBJHANDLE ; idx++ )
1148 if ( mObjHandleTab[ idx ] == NULL ) break;
1150 if ( idx < MAX_OBJHANDLE )
1151 mObjHandleTab[ idx ] = handle;
1153 kdDebug() << "QWinMetaFile error: handle table full !" << endl;
1157void QWinMetaFile::deleteHandle( int idx )
1159 if ( idx >= 0 && idx < MAX_OBJHANDLE && mObjHandleTab[ idx ] )
1161 delete mObjHandleTab[ idx ];
1162 mObjHandleTab[ idx ] = NULL;
1169 static const TQt::RasterOp opTab[] =
1172 TQt::ClearROP, TQt::NandROP, TQt::NotAndROP, TQt::NotCopyROP,
1173 TQt::AndNotROP, TQt::NotROP, TQt::XorROP, TQt::NorROP,
1174 TQt::AndROP, TQt::NotXorROP, TQt::NopROP, TQt::NotOrROP,
1175 TQt::CopyROP, TQt::OrNotROP, TQt::OrROP, TQt::SetROP
1178 if ( parm > 0 && parm <= 16 )
1179 return opTab[ parm ];
1181 return TQt::CopyROP;
1192 static const struct OpTab
1195 TQt::RasterOp qtRasterOp;
1198 { 0x00CC0020, TQt::CopyROP },
1199 { 0x00EE0086, TQt::OrROP },
1200 { 0x008800C6, TQt::AndROP },
1201 { 0x00660046, TQt::XorROP },
1202 { 0x00440328, TQt::AndNotROP },
1203 { 0x00330008, TQt::NotCopyROP },
1204 { 0x001100A6, TQt::NandROP },
1205 { 0x00C000CA, TQt::CopyROP },
1206 { 0x00BB0226, TQt::NotOrROP },
1207 { 0x00F00021, TQt::CopyROP },
1208 { 0x00FB0A09, TQt::CopyROP },
1209 { 0x005A0049, TQt::CopyROP },
1210 { 0x00550009, TQt::NotROP },
1211 { 0x00000042, TQt::ClearROP },
1212 { 0x00FF0062, TQt::SetROP }
1216 for ( i=0 ; i < 15 ; i++ )
1217 if ( opTab[ i ].winRasterOp == parm )
1221 return opTab[ i ].qtRasterOp;
1223 return TQt::CopyROP;
1229 typedef struct _BMPFILEHEADER {
1237 int sizeBmp = size + 14;
1239 TQByteArray pattern( sizeBmp );
1241 memcpy( &pattern[ 14 ], dib, size );
1244 BMPFILEHEADER* bmpHeader;
1245 bmpHeader = (BMPFILEHEADER*)(( const char*)pattern);
1246 bmpHeader->bmType = 0x4D42;
1247 bmpHeader->bmSize = sizeBmp;
1249 if ( !bmp.loadFromData( ( const uchar*)bmpHeader, pattern.size(), "BMP" ) ) {
1250 kdDebug() << "QWinMetaFile::dibToBmp: invalid bitmap " << endl;
TDEAction * next(const TQObject *recvr, const char *slot, TDEActionCollection *parent, const char *name=0)
|