bool Parser::readRecord( QDataStream &stream ) { if ( ! mOutput ) { qWarning() << "Output device not set"; return false; } quint32 type; quint32 size; stream >> type; stream >> size; { QString name; if (0 < type && type <= EMR_LASTRECORD) name = EmfRecords[type].name; else name = "(out of bounds)"; #if DEBUG_EMFPARSER kDebug(31000) << "Record length" << size << "type " << hex << type << "(" << dec << type << ")" << name; #endif } #if DEBUG_EMFPARSER == 2 soakBytes(stream, size - 8); #else switch ( type ) { case EMR_POLYLINE: { QRect bounds; stream >> bounds; quint32 count; stream >> count; QList<QPoint> aPoints; for (quint32 i = 0; i < count; ++i) { QPoint point; stream >> point; aPoints.append( point ); } mOutput->polyLine( bounds, aPoints ); } break; case EMR_SETWINDOWEXTEX: { QSize size; //stream >> size; qint32 width, height; stream >> width >> height; //kDebug(31000) << "SETWINDOWEXTEX" << width << height; size = QSize(width, height); mOutput->setWindowExtEx( size ); } break; case EMR_SETWINDOWORGEX: { QPoint origin; stream >> origin; mOutput->setWindowOrgEx( origin ); } break; case EMR_SETVIEWPORTEXTEX: { QSize size; stream >> size; mOutput->setViewportExtEx( size ); } break; case EMR_SETVIEWPORTORGEX: { QPoint origin; stream >> origin; mOutput->setViewportOrgEx( origin ); } break; case EMR_SETBRUSHORGEX: { QPoint origin; stream >> origin; #if DEBUG_EMFPARSER kDebug(33100) << "EMR_SETBRUSHORGEX" << origin; #endif } break; case EMR_EOF: { mOutput->eof(); soakBytes( stream, size-8 ); // because we already took 8. return false; } break; case EMR_SETPIXELV: { QPoint point; quint8 red, green, blue, reserved; stream >> point; stream >> red >> green >> blue >> reserved; mOutput->setPixelV( point, red, green, blue, reserved ); } break; case EMR_SETMAPMODE: { quint32 mapMode; stream >> mapMode; mOutput->setMapMode( mapMode ); } break; case EMR_SETBKMODE: { quint32 backgroundMode; stream >> backgroundMode; mOutput->setBkMode( backgroundMode ); } break; case EMR_SETPOLYFILLMODE: { quint32 PolygonFillMode; stream >> PolygonFillMode; mOutput->setPolyFillMode( PolygonFillMode ); } break; case EMR_SETROP2: { quint32 ROP2Mode; stream >> ROP2Mode; //kDebug(33100) << "EMR_SETROP2" << ROP2Mode; } break; case EMR_SETSTRETCHBLTMODE: { quint32 stretchMode; stream >> stretchMode; mOutput->setStretchBltMode( stretchMode ); } break; case EMR_SETTEXTALIGN: { quint32 textAlignMode; stream >> textAlignMode; mOutput->setTextAlign( textAlignMode ); } break; case EMR_SETTEXTCOLOR: { quint8 red, green, blue, reserved; stream >> red >> green >> blue >> reserved; mOutput->setTextColor( red, green, blue, reserved ); } break; case EMR_SETBKCOLOR: { quint8 red, green, blue, reserved; stream >> red >> green >> blue >> reserved; mOutput->setBkColor( red, green, blue, reserved ); } break; case EMR_MOVETOEX: { quint32 x, y; stream >> x >> y; mOutput->moveToEx( x, y ); //kDebug(33100) << "xx EMR_MOVETOEX" << x << y; } break; case EMR_SETMETARGN: { // Takes no arguments mOutput->setMetaRgn(); } break; case EMR_INTERSECTCLIPRECT: { QRect clip; stream >> clip; //kDebug(33100) << "EMR_INTERSECTCLIPRECT" << clip; } break; case EMR_SAVEDC: { mOutput->saveDC(); } break; case EMR_RESTOREDC: { qint32 savedDC; stream >> savedDC; mOutput->restoreDC( savedDC ); } break; case EMR_SETWORLDTRANSFORM: { stream.setFloatingPointPrecision(QDataStream::SinglePrecision); float M11, M12, M21, M22, Dx, Dy; stream >> M11; stream >> M12; stream >> M21; stream >> M22; stream >> Dx; stream >> Dy; //kDebug(31000) << "Set world transform" << M11 << M12 << M21 << M22 << Dx << Dy; mOutput->setWorldTransform( M11, M12, M21, M22, Dx, Dy ); } break; case EMR_MODIFYWORLDTRANSFORM: { stream.setFloatingPointPrecision(QDataStream::SinglePrecision); float M11, M12, M21, M22, Dx, Dy; stream >> M11; stream >> M12; stream >> M21; stream >> M22; stream >> Dx; stream >> Dy; //kDebug(31000) << "stream position after the matrix: " << stream.device()->pos(); quint32 ModifyWorldTransformMode; stream >> ModifyWorldTransformMode; mOutput->modifyWorldTransform( ModifyWorldTransformMode, M11, M12, M21, M22, Dx, Dy ); } break; case EMR_SELECTOBJECT: quint32 ihObject; stream >> ihObject; mOutput->selectObject( ihObject ); break; case EMR_CREATEPEN: { quint32 ihPen; stream >> ihPen; quint32 penStyle; stream >> penStyle; quint32 x, y; stream >> x; stream >> y; // unused quint8 red, green, blue, reserved; stream >> red >> green >> blue; stream >> reserved; // unused; mOutput->createPen( ihPen, penStyle, x, y, red, green, blue, reserved ); break; } case EMR_CREATEBRUSHINDIRECT: { quint32 ihBrush; stream >> ihBrush; quint32 BrushStyle; stream >> BrushStyle; quint8 red, green, blue, reserved; stream >> red >> green >> blue; stream >> reserved; // unused; quint32 BrushHatch; stream >> BrushHatch; mOutput->createBrushIndirect( ihBrush, BrushStyle, red, green, blue, reserved, BrushHatch ); break; } case EMR_DELETEOBJECT: { quint32 ihObject; stream >> ihObject; mOutput->deleteObject( ihObject ); } break; case EMR_ELLIPSE: { QRect box; stream >> box; mOutput->ellipse( box ); } break; case EMR_RECTANGLE: { QRect box; stream >> box; mOutput->rectangle( box ); //kDebug(33100) << "xx EMR_RECTANGLE" << box; } break; case EMR_ARC: { QRect box; QPoint start, end; stream >> box; stream >> start >> end; mOutput->arc( box, start, end ); } break; case EMR_CHORD: { QRect box; QPoint start, end; stream >> box; stream >> start >> end; mOutput->chord( box, start, end ); } break; case EMR_PIE: { QRect box; QPoint start, end; stream >> box; stream >> start >> end; mOutput->pie( box, start, end ); } break; case EMR_SELECTPALLETTE: { quint32 ihPal; stream >> ihPal; #if DEBUG_EMFPARSER kDebug(33100) << "EMR_SELECTPALLETTE" << ihPal; #endif } break; case EMR_SETMITERLIMIT: { stream.setFloatingPointPrecision(QDataStream::SinglePrecision); float miterLimit; stream >> miterLimit; #if DEBUG_EMFPARSER kDebug(33100) << "EMR_SETMITERLIMIT" << miterLimit; #endif } break; case EMR_BEGINPATH: mOutput->beginPath(); break; case EMR_ENDPATH: mOutput->endPath(); break; case EMR_CLOSEFIGURE: mOutput->closeFigure(); break; case EMR_FILLPATH: { QRect bounds; stream >> bounds; mOutput->fillPath( bounds ); //kDebug(33100) << "xx EMR_FILLPATH" << bounds; } break; case EMR_STROKEANDFILLPATH: { QRect bounds; stream >> bounds; mOutput->strokeAndFillPath( bounds ); //kDebug(33100) << "xx EMR_STROKEANDFILLPATHPATH" << bounds; } break; case EMR_STROKEPATH: { QRect bounds; stream >> bounds; mOutput->strokePath( bounds ); //kDebug(33100) << "xx EMR_STROKEPATH" << bounds; } break; case EMR_SETCLIPPATH: { quint32 regionMode; stream >> regionMode; mOutput->setClipPath( regionMode ); } break; case EMR_LINETO: { quint32 x, y; stream >> x >> y; QPoint finishPoint( x, y ); mOutput->lineTo( finishPoint ); //kDebug(33100) << "xx EMR_LINETO" << x << y; } break; case EMR_ARCTO: { QRect box; stream >> box; QPoint start; stream >> start; QPoint end; stream >> end; mOutput->arcTo( box, start, end ); } break; case EMR_COMMENT: { quint32 dataSize; stream >> dataSize; quint32 maybeIdentifier; stream >> maybeIdentifier; if ( maybeIdentifier == 0x2B464D45 ) { // EMFPLUS //kDebug(33100) << "EMR_COMMENT_EMFPLUS"; soakBytes( stream, size-16 ); // because we already took 16. } else if ( maybeIdentifier == 0x00000000 ) { //kDebug(33100) << "EMR_EMFSPOOL"; soakBytes( stream, size-16 ); // because we already took 16. } else if ( maybeIdentifier == 0x43494447 ) { quint32 commentType; stream >> commentType; //kDebug(33100) << "EMR_COMMENT_PUBLIC" << commentType; soakBytes( stream, size-20 ); // because we already took 20. } else { //kDebug(33100) << "EMR_COMMENT" << dataSize << maybeIdentifier; soakBytes( stream, size-16 ); // because we already took 16. } }
BitBltRecord::BitBltRecord( QDataStream &stream, quint32 recordSize ) : m_bitmap(0) { //kDebug(31000) << "stream position at the start: " << stream.device()->pos(); //kDebug(31000) << "record size: " << recordSize; stream >> m_bounds; stream >> m_xDest; // x, y of upper left corner of the destination. stream >> m_yDest; stream >> m_cxDest; // width, height of the rectangle in logical coords. stream >> m_cyDest; //kDebug(31000) << "Destination" << m_xDest << m_yDest << m_cxDest << m_cyDest; stream >> m_BitBltRasterOperation; //kDebug(31000) << "bitblt raster operation:" << hex << m_BitBltRasterOperation << dec; stream >> m_xSrc; // x, y of the source stream >> m_ySrc; //kDebug(31000) << "Source" << m_xSrc << m_ySrc; //kDebug(31000) << "position before the matrix: " << stream.device()->pos(); stream.setFloatingPointPrecision(QDataStream::SinglePrecision); float M11, M12, M21, M22, Dx, Dy; stream >> M11; // Transformation matrix stream >> M12; stream >> M21; stream >> M22; stream >> Dx; stream >> Dy; m_XFormSrc = QTransform( M11, M12, M21, M22, Dx, Dy ); //kDebug(31000) << "Matrix" << m_XFormSrc; //kDebug(31000) << "position after the matrix: " << stream.device()->pos(); stream >> m_red >> m_green >> m_blue >> m_reserved; //kDebug(31000) << "Background color" << m_red << m_green << m_blue << m_reserved; //kDebug(31000) << "position after background color: " << stream.device()->pos(); stream >> m_UsageSrc; //kDebug(31000) << "Color table interpretation" << m_UsageSrc; stream >> m_offBmiSrc; // Offset to start of bitmap header from start of record stream >> m_cbBmiSrc; // Size of source bitmap header stream >> m_offBitsSrc; // Offset to source bitmap from start of record stream >> m_cbBitsSrc; // Size of source bitmap #if 0 kDebug(31000) << "header offset:" << m_offBmiSrc; kDebug(31000) << "header size: " << m_cbBmiSrc; kDebug(31000) << "bitmap offset:" << m_offBitsSrc; kDebug(31000) << "bitmap size: " << m_cbBitsSrc; #endif //kDebug(31000) << "stream position before the image: " << stream.device()->pos(); if (m_cbBmiSrc > 0) { m_bitmap = new Bitmap( stream, recordSize, 8 + 23 * 4, // header + 23 ints m_offBmiSrc, m_cbBmiSrc, m_offBitsSrc, m_cbBitsSrc ); } //kDebug(31000) << "stream position at the end: " << stream.device()->pos(); }