diff options
Diffstat (limited to 'src/lib/Pict2Parser.cpp')
-rw-r--r-- | src/lib/Pict2Parser.cpp | 660 |
1 files changed, 330 insertions, 330 deletions
diff --git a/src/lib/Pict2Parser.cpp b/src/lib/Pict2Parser.cpp index 5260484..e9bb65d 100644 --- a/src/lib/Pict2Parser.cpp +++ b/src/lib/Pict2Parser.cpp @@ -23,249 +23,249 @@ #include <libwpg/libwpg.h> Pict2Parser::Pict2Parser(WPXInputStream *input, libwpg::WPGPaintInterface *painter): - PictXParser(input, painter), - m_recordSize(0) + PictXParser(input, painter), + m_recordSize(0) { } bool Pict2Parser::parse() { - typedef void (Pict2Parser::*Method)(); - - struct RecordHandler - { - int type; - const char *name; - Method handler; - int size; - }; - - static const struct RecordHandler handlers[] = - { - { 0x00, "NOP", &Pict2Parser::handleNOP, 2 }, - { 0x01, "clipRgn", &Pict2Parser::handleClipRgn, -1 }, - { 0x02, "bkPat", &Pict2Parser::handleBkPat, 10 }, - { 0x03, "txFont", &Pict2Parser::handleTxFont, 4 }, - { 0x04, "txFace", &Pict2Parser::handleTxFace, 3 }, - { 0x05, "txMode", &Pict2Parser::handleTxMode, 4 }, - { 0x06, "spExtra", &Pict2Parser::handleSpExtra, 6 }, - { 0x07, "pnSize", &Pict2Parser::handlePnSize, 6 }, - { 0x08, "pnMode", &Pict2Parser::handlePnMode, 4 }, - { 0x09, "pnPat", &Pict2Parser::handlePnPat, 10 }, - { 0x0a, "thePat", &Pict2Parser::handleThePat, 10 }, - { 0x0b, "owSize", &Pict2Parser::handleOwSize, 6 }, - { 0x0c, "origin", &Pict2Parser::handleOrigin, 6 }, - { 0x0d, "txSize", &Pict2Parser::handleTxSize, 4 }, - { 0x0e, "fgColor", &Pict2Parser::handleFgColor, 6 }, - { 0x0f, "bkColor", &Pict2Parser::handleBkColor, 6 }, - { 0x10, "txRatio", &Pict2Parser::handleTxRatio, 10 }, - { 0x11, "picVersion", &Pict2Parser::handlePicVersion, 4 }, - { 0x12, "BkPixPat", &Pict2Parser::handleBkPixPat, -1 }, - { 0x13, "PnPixPat", &Pict2Parser::handlePnPixPat, -1 }, - { 0x14, "FillPixPat", &Pict2Parser::handleFillPixPat, -1 }, - { 0x15, "PnLocHFrac", &Pict2Parser::handlePnLocHFrac, 4 }, - { 0x16, "ChExtra", &Pict2Parser::handleChExtra, 4 }, - - { 0x1a, "RGBFgCol", &Pict2Parser::handleRGBFgCol, 8 }, - { 0x1b, "RGBBkCol", &Pict2Parser::handleRGBBkCol, 8 }, - { 0x1c, "HiliteMode", &Pict2Parser::handleHiliteMode, 2 }, - { 0x1d, "HiliteColor", &Pict2Parser::handleHiliteColor, 8 }, - { 0x1e, "DefHilite", &Pict2Parser::handleDefHilite, 2 }, - { 0x1f, "OpColor", &Pict2Parser::handleOpColor, 8 }, - { 0x20, "line", &Pict2Parser::handleLine, 10 }, - { 0x21, "line from", &Pict2Parser::handleLineFrom, 6 }, - { 0x22, "short line", &Pict2Parser::handleShortLine, 8 }, - { 0x23, "short line from", &Pict2Parser::handleShortLineFrom, 4 }, - { 0x24, "Reserved", &Pict2Parser::skipData, -1 }, - { 0x25, "Reserved", &Pict2Parser::skipData, -1 }, - { 0x26, "Reserved", &Pict2Parser::skipData, -1 }, - { 0x27, "Reserved", &Pict2Parser::skipData, -1 }, - { 0x28, "long text", &Pict2Parser::handleLongText, -1 }, - { 0x29, "DH text", &Pict2Parser::handleDHText, -1 }, - { 0x2a, "DV text", &Pict2Parser::handleDVText, -1 }, - { 0x2b, "DHDV text", &Pict2Parser::handleDHDVText, -1 }, - { 0x2c, "fontName", &Pict2Parser::handleFontName, -1 }, - { 0x2d, "lineJustify", &Pict2Parser::handleLineJustify, 12 }, - { 0x2e, "glyphState", &Pict2Parser::handleGlyphState, 10 }, - { 0x2f, "Reserved", &Pict2Parser::skipData, -1 }, - { 0x30, "frameRect", &Pict2Parser::handleFrameRect, 10 }, - { 0x31, "paintRect", &Pict2Parser::handlePaintRect, 10 }, - { 0x32, "eraseRect", &Pict2Parser::handleEraseRect, 10 }, - { 0x33, "invertRect", &Pict2Parser::handleInvertRect, 10 }, - { 0x34, "fillRect", &Pict2Parser::handleFillRect, 10 }, - { 0x35, "Reserved", &Pict2Parser::handleNOP, 10 }, - { 0x36, "Reserved", &Pict2Parser::handleNOP, 10 }, - { 0x38, "frameSameRect", &Pict2Parser::handleFrameSameRect, 2 }, - { 0x39, "paintSameRect", &Pict2Parser::handlePaintSameRect, 2 }, - { 0x3a, "eraseSameRect", &Pict2Parser::handleEraseSameRect, 2 }, - { 0x3b, "invertSameRect", &Pict2Parser::handleInvertSameRect, 2 }, - { 0x3c, "fillSameRect", &Pict2Parser::handleFillSameRect, 2 }, - { 0x3d, "Reserved", &Pict2Parser::handleNOP, 2 }, - { 0x3e, "Reserved", &Pict2Parser::handleNOP, 2 }, - { 0x3f, "Reserved", &Pict2Parser::handleNOP, 2 }, - { 0x40, "frameRRect", &Pict2Parser::handleFrameRRect, 10 }, - { 0x41, "paintRRect", &Pict2Parser::handlePaintRRect, 10 }, - { 0x42, "eraseRRect", &Pict2Parser::handleEraseRRect, 10 }, - { 0x43, "invertRRect", &Pict2Parser::handleInvertRRect, 10 }, - { 0x44, "fillRRect", &Pict2Parser::handleFillRRect, 10 }, - { 0x45, "Reserved", &Pict2Parser::handleNOP, 10 }, - { 0x46, "Reserved", &Pict2Parser::handleNOP, 10 }, - { 0x47, "Reserved", &Pict2Parser::handleNOP, 10 }, - { 0x48, "frameSameRRect", &Pict2Parser::handleFrameSameRRect, 2 }, - { 0x49, "paintSameRRect", &Pict2Parser::handlePaintSameRRect, 2 }, - { 0x4a, "eraseSameRRect", &Pict2Parser::handleEraseSameRRect, 2 }, - { 0x4b, "invertSameRRect", &Pict2Parser::handleInvertSameRRect, 2 }, - { 0x4c, "fillSameRRect", &Pict2Parser::handleFillSameRRect, 2 }, - { 0x4d, "Reserved", &Pict2Parser::handleNOP, 2 }, - { 0x4e, "Reserved", &Pict2Parser::handleNOP, 2 }, - { 0x4f, "Reserved", &Pict2Parser::handleNOP, 2 }, - { 0x50, "frameOval", &Pict2Parser::handleFrameOval, 10 }, - { 0x51, "paintOval", &Pict2Parser::handlePaintOval, 10 }, - { 0x52, "eraseOval", &Pict2Parser::handleEraseOval, 10 }, - { 0x53, "invertOval", &Pict2Parser::handleInsertOval, 10 }, - { 0x54, "fillOval", &Pict2Parser::handleFillOval, 10 }, - { 0x55, "Reserved", &Pict2Parser::handleNOP, 10 }, - { 0x56, "Reserved", &Pict2Parser::handleNOP, 10 }, - { 0x57, "Reserved", &Pict2Parser::handleNOP, 10 }, - { 0x58, "frameSameOval", &Pict2Parser::handleFrameSameOval, 2 }, - { 0x59, "paintSameOval", &Pict2Parser::handlePaintSameOval, 2 }, - { 0x5a, "eraseSameOval", &Pict2Parser::handleEraseSameOval, 2 }, - { 0x5b, "invertSameOval", &Pict2Parser::handleInsertSameOval, 2 }, - { 0x5c, "fillSameOval", &Pict2Parser::handleFillSameOval, 2 }, - { 0x5d, "Reserved", &Pict2Parser::handleNOP, 2 }, - { 0x5e, "Reserved", &Pict2Parser::handleNOP, 2 }, - { 0x5f, "Reserved", &Pict2Parser::handleNOP, 2 }, - { 0x60, "frameArc", &Pict2Parser::handleFrameArc, 14 }, - { 0x61, "paintArc", &Pict2Parser::handlePaintArc, 14 }, - { 0x62, "eraseArc", &Pict2Parser::handleEraseArc, 14 }, - { 0x63, "invertArc", &Pict2Parser::handleInsertArc, 14 }, - { 0x64, "fillArc", &Pict2Parser::handleFillArc, 14 }, - { 0x65, "Reserved", &Pict2Parser::handleNOP, 14 }, - { 0x66, "Reserved", &Pict2Parser::handleNOP, 14 }, - { 0x67, "Reserved", &Pict2Parser::handleNOP, 14 }, - { 0x68, "frameSameArc", &Pict2Parser::handleFrameSameArc, 6 }, - { 0x69, "paintSameArc", &Pict2Parser::handlePaintSameArc, 6 }, - { 0x6a, "eraseSameArc", &Pict2Parser::handleEraseSameArc, 6 }, - { 0x6b, "inverSameArc", &Pict2Parser::handleInsertSameArc, 6 }, - { 0x6c, "fillSameArc", &Pict2Parser::handleFillSameArc, 6 }, - { 0x6d, "Reserved", &Pict2Parser::handleNOP, 6 }, - { 0x6e, "Reserved", &Pict2Parser::handleNOP, 6 }, - { 0x6f, "Reserved", &Pict2Parser::handleNOP, 6 }, - { 0x70, "framePoly", &Pict2Parser::handleFramePoly, -1 }, - { 0x71, "paintPoly", &Pict2Parser::handlePaintPoly, -1 }, - { 0x72, "erasePoly", &Pict2Parser::handleErasePoly, -1 }, - { 0x73, "invertPoly", &Pict2Parser::handleInvertPoly, -1 }, - { 0x74, "fillPoly", &Pict2Parser::handleFillPoly, -1 }, - { 0x75, "Reserved", &Pict2Parser::skipData, -1 }, - { 0x76, "Reserved", &Pict2Parser::skipData, -1 }, - { 0x77, "Reserved", &Pict2Parser::skipData, -1 }, - { 0x78, "frameSamePoly", &Pict2Parser::handleFrameSamePoly, 2 }, - { 0x79, "paintSamePoly", &Pict2Parser::handlePaintSamePoly, 2 }, - { 0x7a, "eraseSamePoly", &Pict2Parser::handleEraseSamePoly, 2 }, - { 0x7b, "invertSamePoly", &Pict2Parser::handleInvertSamePoly, 2 }, - { 0x7c, "fillSamePoly", &Pict2Parser::handleFillSamePoly, 2 }, - { 0x7d, "Reserved", &Pict2Parser::handleNOP, 2 }, - { 0x7e, "Reserved", &Pict2Parser::handleNOP, 2 }, - { 0x7f, "Reserved", &Pict2Parser::handleNOP, 2 }, - { 0x80, "frameRgn", &Pict2Parser::handleFrameRgn, -1 }, - { 0x81, "paintRgn", &Pict2Parser::handlePaintRgn, -1 }, - { 0x82, "eraseRgn", &Pict2Parser::handleEraseRgn, -1 }, - { 0x83, "invertRgn", &Pict2Parser::handleInvertRgn, -1 }, - { 0x84, "fillRgn", &Pict2Parser::handleFillRgn, -1 }, - { 0x85, "Reserved", &Pict2Parser::skipData, -1 }, - { 0x86, "Reserved", &Pict2Parser::skipData, -1 }, - { 0x87, "Reserved", &Pict2Parser::skipData, -1 }, - { 0x88, "frameSameRgn", &Pict2Parser::handleFrameSameRgn, 2 }, - { 0x89, "paintSameRgn", &Pict2Parser::handlePaintSameRgn, 2 }, - { 0x8a, "eraseSameRgn", &Pict2Parser::handleEraseSameRgn, 2 }, - { 0x8b, "invertSameRgn", &Pict2Parser::handleInvertSameRgn, 2 }, - { 0x8c, "fillSameRgn", &Pict2Parser::handleFillSameRgn, 2 }, - { 0x8d, "Reserved", &Pict2Parser::handleNOP, 2 }, - { 0x8e, "Reserved", &Pict2Parser::handleNOP, 2 }, - { 0x8f, "Reserved", &Pict2Parser::handleNOP, 2 }, - { 0x90, "BitsRect", &Pict2Parser::handleBitsRect, -1 }, - { 0x91, "BitsRgn", &Pict2Parser::handleBitsRgn, -1 }, - { 0x92, "Reserved", &Pict2Parser::skipData, -1 }, - { 0x93, "Reserved", &Pict2Parser::skipData, -1 }, - { 0x94, "Reserved", &Pict2Parser::skipData, -1 }, - { 0x95, "Reserved", &Pict2Parser::skipData, -1 }, - { 0x96, "Reserved", &Pict2Parser::skipData, -1 }, - { 0x97, "Reserved", &Pict2Parser::skipData, -1 }, - { 0x98, "PackBitsRect", &Pict2Parser::handlePackBitsRect, -1 }, - { 0x99, "PackBitsRgn", &Pict2Parser::handlePackBitsRgn, -1 }, - { 0x9a, "DirectBitsRect", &Pict2Parser::handleDirectBitsRect, -1 }, - { 0x9b, "DirectBitsRgn", &Pict2Parser::handleDirectBitsRgn, -1 }, - { 0x9c, "Reserved", &Pict2Parser::skipData, -1 }, - { 0x9d, "Reserved", &Pict2Parser::skipData, -1 }, - { 0x9e, "Reserved", &Pict2Parser::skipData, -1 }, - { 0x9f, "Reserved", &Pict2Parser::skipData, -1 }, - { 0xa0, "shortComment", &Pict2Parser::handleShortComment, 4 }, - { 0xa1, "longComment", &Pict2Parser::handleLongComment, -1 }, - - { 0xff, "EndOfPicture", &Pict2Parser::handleEndOfPicture, 2 } - }; - - while(!m_input->atEOS()) - { - m_recordSize = -1; - long initialPosition = m_input->tell(); - // Opcodes are aligned to 2 bytes - if (initialPosition % 2) - m_input->seek((int)(++initialPosition), WPX_SEEK_SET); - int recordType = readU16(); - if (recordType == 0x00ff) - break; - else if ((recordType >= 0x00a2) && (recordType <= 0x00af)) - skipData(); - else if ((recordType >= 0x00b0) && (recordType <= 0x00cf)) - m_recordSize = 2; - else if ((recordType >= 0x00d0) && (recordType <= 0x00fe)) - skipLongData(); - else if ((recordType >= 0x0100) && (recordType <= 0x01ff)) - m_recordSize = 4; - else if (recordType == 0x0200) - m_recordSize = 6; - else if (recordType == 0x02ff) - m_recordSize = 4; - else if (recordType == 0x0bff) - m_recordSize = 24; - else if (recordType == 0x0c00) - m_recordSize = 26; - else if (recordType == 0x0c01) - m_recordSize = 24; - /* Add other skipped opcodes here */ - else - { - // search function to handler this record - int index = -1; - for(int i=0; i < (int)(sizeof(handlers)/sizeof(RecordHandler)); i++) - { - if(handlers[i].type == recordType) - { - index = i; - break; - } - } - - if(index >= 0) - { - PICT_DEBUG_MSG(("Position: 0x%.8x, Opcode: 0x%.2x, Opcode Name: %s\n", (int)initialPosition, recordType, handlers[index].name)); - m_recordSize = handlers[index].size; - Method recordHandler = handlers[index].handler; - if(recordHandler) - { - // invoke the handler for this record - (this->*recordHandler)(); - } - } - } - - if (m_recordSize <= 0) // we were not able to compute variable record size - return false; - else - m_input->seek(initialPosition + m_recordSize, WPX_SEEK_SET); - } - return true; + typedef void (Pict2Parser::*Method)(); + + struct RecordHandler + { + int type; + const char *name; + Method handler; + int size; + }; + + static const struct RecordHandler handlers[] = + { + { 0x00, "NOP", &Pict2Parser::handleNOP, 2 }, + { 0x01, "clipRgn", &Pict2Parser::handleClipRgn, -1 }, + { 0x02, "bkPat", &Pict2Parser::handleBkPat, 10 }, + { 0x03, "txFont", &Pict2Parser::handleTxFont, 4 }, + { 0x04, "txFace", &Pict2Parser::handleTxFace, 3 }, + { 0x05, "txMode", &Pict2Parser::handleTxMode, 4 }, + { 0x06, "spExtra", &Pict2Parser::handleSpExtra, 6 }, + { 0x07, "pnSize", &Pict2Parser::handlePnSize, 6 }, + { 0x08, "pnMode", &Pict2Parser::handlePnMode, 4 }, + { 0x09, "pnPat", &Pict2Parser::handlePnPat, 10 }, + { 0x0a, "thePat", &Pict2Parser::handleThePat, 10 }, + { 0x0b, "owSize", &Pict2Parser::handleOwSize, 6 }, + { 0x0c, "origin", &Pict2Parser::handleOrigin, 6 }, + { 0x0d, "txSize", &Pict2Parser::handleTxSize, 4 }, + { 0x0e, "fgColor", &Pict2Parser::handleFgColor, 6 }, + { 0x0f, "bkColor", &Pict2Parser::handleBkColor, 6 }, + { 0x10, "txRatio", &Pict2Parser::handleTxRatio, 10 }, + { 0x11, "picVersion", &Pict2Parser::handlePicVersion, 4 }, + { 0x12, "BkPixPat", &Pict2Parser::handleBkPixPat, -1 }, + { 0x13, "PnPixPat", &Pict2Parser::handlePnPixPat, -1 }, + { 0x14, "FillPixPat", &Pict2Parser::handleFillPixPat, -1 }, + { 0x15, "PnLocHFrac", &Pict2Parser::handlePnLocHFrac, 4 }, + { 0x16, "ChExtra", &Pict2Parser::handleChExtra, 4 }, + + { 0x1a, "RGBFgCol", &Pict2Parser::handleRGBFgCol, 8 }, + { 0x1b, "RGBBkCol", &Pict2Parser::handleRGBBkCol, 8 }, + { 0x1c, "HiliteMode", &Pict2Parser::handleHiliteMode, 2 }, + { 0x1d, "HiliteColor", &Pict2Parser::handleHiliteColor, 8 }, + { 0x1e, "DefHilite", &Pict2Parser::handleDefHilite, 2 }, + { 0x1f, "OpColor", &Pict2Parser::handleOpColor, 8 }, + { 0x20, "line", &Pict2Parser::handleLine, 10 }, + { 0x21, "line from", &Pict2Parser::handleLineFrom, 6 }, + { 0x22, "short line", &Pict2Parser::handleShortLine, 8 }, + { 0x23, "short line from", &Pict2Parser::handleShortLineFrom, 4 }, + { 0x24, "Reserved", &Pict2Parser::skipData, -1 }, + { 0x25, "Reserved", &Pict2Parser::skipData, -1 }, + { 0x26, "Reserved", &Pict2Parser::skipData, -1 }, + { 0x27, "Reserved", &Pict2Parser::skipData, -1 }, + { 0x28, "long text", &Pict2Parser::handleLongText, -1 }, + { 0x29, "DH text", &Pict2Parser::handleDHText, -1 }, + { 0x2a, "DV text", &Pict2Parser::handleDVText, -1 }, + { 0x2b, "DHDV text", &Pict2Parser::handleDHDVText, -1 }, + { 0x2c, "fontName", &Pict2Parser::handleFontName, -1 }, + { 0x2d, "lineJustify", &Pict2Parser::handleLineJustify, 12 }, + { 0x2e, "glyphState", &Pict2Parser::handleGlyphState, 10 }, + { 0x2f, "Reserved", &Pict2Parser::skipData, -1 }, + { 0x30, "frameRect", &Pict2Parser::handleFrameRect, 10 }, + { 0x31, "paintRect", &Pict2Parser::handlePaintRect, 10 }, + { 0x32, "eraseRect", &Pict2Parser::handleEraseRect, 10 }, + { 0x33, "invertRect", &Pict2Parser::handleInvertRect, 10 }, + { 0x34, "fillRect", &Pict2Parser::handleFillRect, 10 }, + { 0x35, "Reserved", &Pict2Parser::handleNOP, 10 }, + { 0x36, "Reserved", &Pict2Parser::handleNOP, 10 }, + { 0x38, "frameSameRect", &Pict2Parser::handleFrameSameRect, 2 }, + { 0x39, "paintSameRect", &Pict2Parser::handlePaintSameRect, 2 }, + { 0x3a, "eraseSameRect", &Pict2Parser::handleEraseSameRect, 2 }, + { 0x3b, "invertSameRect", &Pict2Parser::handleInvertSameRect, 2 }, + { 0x3c, "fillSameRect", &Pict2Parser::handleFillSameRect, 2 }, + { 0x3d, "Reserved", &Pict2Parser::handleNOP, 2 }, + { 0x3e, "Reserved", &Pict2Parser::handleNOP, 2 }, + { 0x3f, "Reserved", &Pict2Parser::handleNOP, 2 }, + { 0x40, "frameRRect", &Pict2Parser::handleFrameRRect, 10 }, + { 0x41, "paintRRect", &Pict2Parser::handlePaintRRect, 10 }, + { 0x42, "eraseRRect", &Pict2Parser::handleEraseRRect, 10 }, + { 0x43, "invertRRect", &Pict2Parser::handleInvertRRect, 10 }, + { 0x44, "fillRRect", &Pict2Parser::handleFillRRect, 10 }, + { 0x45, "Reserved", &Pict2Parser::handleNOP, 10 }, + { 0x46, "Reserved", &Pict2Parser::handleNOP, 10 }, + { 0x47, "Reserved", &Pict2Parser::handleNOP, 10 }, + { 0x48, "frameSameRRect", &Pict2Parser::handleFrameSameRRect, 2 }, + { 0x49, "paintSameRRect", &Pict2Parser::handlePaintSameRRect, 2 }, + { 0x4a, "eraseSameRRect", &Pict2Parser::handleEraseSameRRect, 2 }, + { 0x4b, "invertSameRRect", &Pict2Parser::handleInvertSameRRect, 2 }, + { 0x4c, "fillSameRRect", &Pict2Parser::handleFillSameRRect, 2 }, + { 0x4d, "Reserved", &Pict2Parser::handleNOP, 2 }, + { 0x4e, "Reserved", &Pict2Parser::handleNOP, 2 }, + { 0x4f, "Reserved", &Pict2Parser::handleNOP, 2 }, + { 0x50, "frameOval", &Pict2Parser::handleFrameOval, 10 }, + { 0x51, "paintOval", &Pict2Parser::handlePaintOval, 10 }, + { 0x52, "eraseOval", &Pict2Parser::handleEraseOval, 10 }, + { 0x53, "invertOval", &Pict2Parser::handleInsertOval, 10 }, + { 0x54, "fillOval", &Pict2Parser::handleFillOval, 10 }, + { 0x55, "Reserved", &Pict2Parser::handleNOP, 10 }, + { 0x56, "Reserved", &Pict2Parser::handleNOP, 10 }, + { 0x57, "Reserved", &Pict2Parser::handleNOP, 10 }, + { 0x58, "frameSameOval", &Pict2Parser::handleFrameSameOval, 2 }, + { 0x59, "paintSameOval", &Pict2Parser::handlePaintSameOval, 2 }, + { 0x5a, "eraseSameOval", &Pict2Parser::handleEraseSameOval, 2 }, + { 0x5b, "invertSameOval", &Pict2Parser::handleInsertSameOval, 2 }, + { 0x5c, "fillSameOval", &Pict2Parser::handleFillSameOval, 2 }, + { 0x5d, "Reserved", &Pict2Parser::handleNOP, 2 }, + { 0x5e, "Reserved", &Pict2Parser::handleNOP, 2 }, + { 0x5f, "Reserved", &Pict2Parser::handleNOP, 2 }, + { 0x60, "frameArc", &Pict2Parser::handleFrameArc, 14 }, + { 0x61, "paintArc", &Pict2Parser::handlePaintArc, 14 }, + { 0x62, "eraseArc", &Pict2Parser::handleEraseArc, 14 }, + { 0x63, "invertArc", &Pict2Parser::handleInsertArc, 14 }, + { 0x64, "fillArc", &Pict2Parser::handleFillArc, 14 }, + { 0x65, "Reserved", &Pict2Parser::handleNOP, 14 }, + { 0x66, "Reserved", &Pict2Parser::handleNOP, 14 }, + { 0x67, "Reserved", &Pict2Parser::handleNOP, 14 }, + { 0x68, "frameSameArc", &Pict2Parser::handleFrameSameArc, 6 }, + { 0x69, "paintSameArc", &Pict2Parser::handlePaintSameArc, 6 }, + { 0x6a, "eraseSameArc", &Pict2Parser::handleEraseSameArc, 6 }, + { 0x6b, "inverSameArc", &Pict2Parser::handleInsertSameArc, 6 }, + { 0x6c, "fillSameArc", &Pict2Parser::handleFillSameArc, 6 }, + { 0x6d, "Reserved", &Pict2Parser::handleNOP, 6 }, + { 0x6e, "Reserved", &Pict2Parser::handleNOP, 6 }, + { 0x6f, "Reserved", &Pict2Parser::handleNOP, 6 }, + { 0x70, "framePoly", &Pict2Parser::handleFramePoly, -1 }, + { 0x71, "paintPoly", &Pict2Parser::handlePaintPoly, -1 }, + { 0x72, "erasePoly", &Pict2Parser::handleErasePoly, -1 }, + { 0x73, "invertPoly", &Pict2Parser::handleInvertPoly, -1 }, + { 0x74, "fillPoly", &Pict2Parser::handleFillPoly, -1 }, + { 0x75, "Reserved", &Pict2Parser::skipData, -1 }, + { 0x76, "Reserved", &Pict2Parser::skipData, -1 }, + { 0x77, "Reserved", &Pict2Parser::skipData, -1 }, + { 0x78, "frameSamePoly", &Pict2Parser::handleFrameSamePoly, 2 }, + { 0x79, "paintSamePoly", &Pict2Parser::handlePaintSamePoly, 2 }, + { 0x7a, "eraseSamePoly", &Pict2Parser::handleEraseSamePoly, 2 }, + { 0x7b, "invertSamePoly", &Pict2Parser::handleInvertSamePoly, 2 }, + { 0x7c, "fillSamePoly", &Pict2Parser::handleFillSamePoly, 2 }, + { 0x7d, "Reserved", &Pict2Parser::handleNOP, 2 }, + { 0x7e, "Reserved", &Pict2Parser::handleNOP, 2 }, + { 0x7f, "Reserved", &Pict2Parser::handleNOP, 2 }, + { 0x80, "frameRgn", &Pict2Parser::handleFrameRgn, -1 }, + { 0x81, "paintRgn", &Pict2Parser::handlePaintRgn, -1 }, + { 0x82, "eraseRgn", &Pict2Parser::handleEraseRgn, -1 }, + { 0x83, "invertRgn", &Pict2Parser::handleInvertRgn, -1 }, + { 0x84, "fillRgn", &Pict2Parser::handleFillRgn, -1 }, + { 0x85, "Reserved", &Pict2Parser::skipData, -1 }, + { 0x86, "Reserved", &Pict2Parser::skipData, -1 }, + { 0x87, "Reserved", &Pict2Parser::skipData, -1 }, + { 0x88, "frameSameRgn", &Pict2Parser::handleFrameSameRgn, 2 }, + { 0x89, "paintSameRgn", &Pict2Parser::handlePaintSameRgn, 2 }, + { 0x8a, "eraseSameRgn", &Pict2Parser::handleEraseSameRgn, 2 }, + { 0x8b, "invertSameRgn", &Pict2Parser::handleInvertSameRgn, 2 }, + { 0x8c, "fillSameRgn", &Pict2Parser::handleFillSameRgn, 2 }, + { 0x8d, "Reserved", &Pict2Parser::handleNOP, 2 }, + { 0x8e, "Reserved", &Pict2Parser::handleNOP, 2 }, + { 0x8f, "Reserved", &Pict2Parser::handleNOP, 2 }, + { 0x90, "BitsRect", &Pict2Parser::handleBitsRect, -1 }, + { 0x91, "BitsRgn", &Pict2Parser::handleBitsRgn, -1 }, + { 0x92, "Reserved", &Pict2Parser::skipData, -1 }, + { 0x93, "Reserved", &Pict2Parser::skipData, -1 }, + { 0x94, "Reserved", &Pict2Parser::skipData, -1 }, + { 0x95, "Reserved", &Pict2Parser::skipData, -1 }, + { 0x96, "Reserved", &Pict2Parser::skipData, -1 }, + { 0x97, "Reserved", &Pict2Parser::skipData, -1 }, + { 0x98, "PackBitsRect", &Pict2Parser::handlePackBitsRect, -1 }, + { 0x99, "PackBitsRgn", &Pict2Parser::handlePackBitsRgn, -1 }, + { 0x9a, "DirectBitsRect", &Pict2Parser::handleDirectBitsRect, -1 }, + { 0x9b, "DirectBitsRgn", &Pict2Parser::handleDirectBitsRgn, -1 }, + { 0x9c, "Reserved", &Pict2Parser::skipData, -1 }, + { 0x9d, "Reserved", &Pict2Parser::skipData, -1 }, + { 0x9e, "Reserved", &Pict2Parser::skipData, -1 }, + { 0x9f, "Reserved", &Pict2Parser::skipData, -1 }, + { 0xa0, "shortComment", &Pict2Parser::handleShortComment, 4 }, + { 0xa1, "longComment", &Pict2Parser::handleLongComment, -1 }, + + { 0xff, "EndOfPicture", &Pict2Parser::handleEndOfPicture, 2 } + }; + + while(!m_input->atEOS()) + { + m_recordSize = -1; + long initialPosition = m_input->tell(); + // Opcodes are aligned to 2 bytes + if (initialPosition % 2) + m_input->seek((int)(++initialPosition), WPX_SEEK_SET); + int recordType = readU16(); + if (recordType == 0x00ff) + break; + else if ((recordType >= 0x00a2) && (recordType <= 0x00af)) + skipData(); + else if ((recordType >= 0x00b0) && (recordType <= 0x00cf)) + m_recordSize = 2; + else if ((recordType >= 0x00d0) && (recordType <= 0x00fe)) + skipLongData(); + else if ((recordType >= 0x0100) && (recordType <= 0x01ff)) + m_recordSize = 4; + else if (recordType == 0x0200) + m_recordSize = 6; + else if (recordType == 0x02ff) + m_recordSize = 4; + else if (recordType == 0x0bff) + m_recordSize = 24; + else if (recordType == 0x0c00) + m_recordSize = 26; + else if (recordType == 0x0c01) + m_recordSize = 24; + /* Add other skipped opcodes here */ + else + { + // search function to handler this record + int index = -1; + for(int i=0; i < (int)(sizeof(handlers)/sizeof(RecordHandler)); i++) + { + if(handlers[i].type == recordType) + { + index = i; + break; + } + } + + if(index >= 0) + { + PICT_DEBUG_MSG(("Position: 0x%.8x, Opcode: 0x%.2x, Opcode Name: %s\n", (int)initialPosition, recordType, handlers[index].name)); + m_recordSize = handlers[index].size; + Method recordHandler = handlers[index].handler; + if(recordHandler) + { + // invoke the handler for this record + (this->*recordHandler)(); + } + } + } + + if (m_recordSize <= 0) // we were not able to compute variable record size + return false; + else + m_input->seek(initialPosition + m_recordSize, WPX_SEEK_SET); + } + return true; } void Pict2Parser::handleNOP() @@ -274,8 +274,8 @@ void Pict2Parser::handleNOP() void Pict2Parser::handleClipRgn() { - m_recordSize = (int)readU16() + 1; - PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); + m_recordSize = (int)readU16() + 1; + PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); } void Pict2Parser::handleBkPat() @@ -404,30 +404,30 @@ void Pict2Parser::handleShortLineFrom() void Pict2Parser::handleLongText() { - m_input->seek(6, WPX_SEEK_CUR); - m_recordSize = (int)readU16() + 6; - PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); + m_input->seek(6, WPX_SEEK_CUR); + m_recordSize = (int)readU16() + 6; + PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); } void Pict2Parser::handleDHText() { - m_input->seek(2, WPX_SEEK_CUR); - m_recordSize = (int)readU16() + 3; - PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); + m_input->seek(2, WPX_SEEK_CUR); + m_recordSize = (int)readU16() + 3; + PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); } void Pict2Parser::handleDVText() { - m_input->seek(2, WPX_SEEK_CUR); - m_recordSize = (int)readU16() + 3; - PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); + m_input->seek(2, WPX_SEEK_CUR); + m_recordSize = (int)readU16() + 3; + PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); } void Pict2Parser::handleDHDVText() { - m_input->seek(3, WPX_SEEK_CUR); - m_recordSize = (int)readU16() + 4; - PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); + m_input->seek(3, WPX_SEEK_CUR); + m_recordSize = (int)readU16() + 4; + PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); } @@ -593,32 +593,32 @@ void Pict2Parser::handleFillSameArc() void Pict2Parser::handleFramePoly() { - m_recordSize = (int)readU16() + 1; - PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); + m_recordSize = (int)readU16() + 1; + PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); } void Pict2Parser::handlePaintPoly() { - m_recordSize = (int)readU16() + 1; - PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); + m_recordSize = (int)readU16() + 1; + PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); } void Pict2Parser::handleErasePoly() { - m_recordSize = (int)readU16() + 1; - PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); + m_recordSize = (int)readU16() + 1; + PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); } void Pict2Parser::handleInvertPoly() { - m_recordSize = (int)readU16() + 1; - PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); + m_recordSize = (int)readU16() + 1; + PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); } void Pict2Parser::handleFillPoly() { - m_recordSize = (int)readU16() + 1; - PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); + m_recordSize = (int)readU16() + 1; + PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); } void Pict2Parser::handleFrameSamePoly() @@ -643,32 +643,32 @@ void Pict2Parser::handleFillSamePoly() void Pict2Parser::handleFrameRgn() { - m_recordSize = (int)readU16() + 1; - PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); + m_recordSize = (int)readU16() + 1; + PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); } void Pict2Parser::handlePaintRgn() { - m_recordSize = (int)readU16() + 1; - PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); + m_recordSize = (int)readU16() + 1; + PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); } void Pict2Parser::handleEraseRgn() { - m_recordSize = (int)readU16() + 1; - PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); + m_recordSize = (int)readU16() + 1; + PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); } void Pict2Parser::handleInvertRgn() { - m_recordSize = (int)readU16() + 1; - PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); + m_recordSize = (int)readU16() + 1; + PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); } void Pict2Parser::handleFillRgn() { - m_recordSize = (int)readU16() + 1; - PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); + m_recordSize = (int)readU16() + 1; + PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); } @@ -694,82 +694,82 @@ void Pict2Parser::handleFillSameRgn() void Pict2Parser::handleBitsRect() { - unsigned short rowBytes = readU16(); - PICT_DEBUG_MSG(("Row bytes: %i\n", rowBytes)); - unsigned short bounds_top = readU16(); - PICT_DEBUG_MSG(("Bounds.top: %i\n", bounds_top)); - readU16(); - unsigned short bounds_bottom = readU16(); - PICT_DEBUG_MSG(("Bounds.bottom: %i\n", bounds_bottom)); - readU16(); - m_input->seek(18, WPX_SEEK_CUR); - m_recordSize = 29 + (0x7fff & rowBytes)*((bounds_bottom > bounds_top) ? bounds_bottom - bounds_top : bounds_top - bounds_bottom); - PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); + unsigned short rowBytes = readU16(); + PICT_DEBUG_MSG(("Row bytes: %i\n", rowBytes)); + unsigned short bounds_top = readU16(); + PICT_DEBUG_MSG(("Bounds.top: %i\n", bounds_top)); + readU16(); + unsigned short bounds_bottom = readU16(); + PICT_DEBUG_MSG(("Bounds.bottom: %i\n", bounds_bottom)); + readU16(); + m_input->seek(18, WPX_SEEK_CUR); + m_recordSize = 29 + (0x7fff & rowBytes)*((bounds_bottom > bounds_top) ? bounds_bottom - bounds_top : bounds_top - bounds_bottom); + PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); } void Pict2Parser::handleBitsRgn() { - unsigned short rowBytes = readU16(); - PICT_DEBUG_MSG(("Row bytes: %i\n", rowBytes)); - unsigned short bounds_top = readU16(); - PICT_DEBUG_MSG(("Bounds.top: %i\n", bounds_top)); - readU16(); - unsigned short bounds_bottom = readU16(); - PICT_DEBUG_MSG(("Bounds.bottom: %i\n", bounds_bottom)); - readU16(); - m_input->seek(18, WPX_SEEK_CUR); - m_recordSize = 29 + (0x7fff & rowBytes)*((bounds_bottom > bounds_top) ? (int)(bounds_bottom - bounds_top) : (int)(bounds_top - bounds_bottom)); - m_recordSize += readU16(); - PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); + unsigned short rowBytes = readU16(); + PICT_DEBUG_MSG(("Row bytes: %i\n", rowBytes)); + unsigned short bounds_top = readU16(); + PICT_DEBUG_MSG(("Bounds.top: %i\n", bounds_top)); + readU16(); + unsigned short bounds_bottom = readU16(); + PICT_DEBUG_MSG(("Bounds.bottom: %i\n", bounds_bottom)); + readU16(); + m_input->seek(18, WPX_SEEK_CUR); + m_recordSize = 29 + (0x7fff & rowBytes)*((bounds_bottom > bounds_top) ? (int)(bounds_bottom - bounds_top) : (int)(bounds_top - bounds_bottom)); + m_recordSize += readU16(); + PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); } void Pict2Parser::handlePackBitsRect() { #ifdef DEBUG - unsigned short rowBytes = readU16(); - PICT_DEBUG_MSG(("Row bytes: %i\n", rowBytes)); - unsigned short bounds_top = readU16(); - PICT_DEBUG_MSG(("Bounds.top: %i\n", bounds_top)); - readU16(); - unsigned short bounds_bottom = readU16(); - PICT_DEBUG_MSG(("Bounds.bottom: %i\n", bounds_bottom)); + unsigned short rowBytes = readU16(); + PICT_DEBUG_MSG(("Row bytes: %i\n", rowBytes)); + unsigned short bounds_top = readU16(); + PICT_DEBUG_MSG(("Bounds.top: %i\n", bounds_top)); + readU16(); + unsigned short bounds_bottom = readU16(); + PICT_DEBUG_MSG(("Bounds.bottom: %i\n", bounds_bottom)); #else - readU16(); - readU16(); - readU16(); - readU16(); + readU16(); + readU16(); + readU16(); + readU16(); #endif - readU16(); - m_input->seek(18, WPX_SEEK_CUR); + readU16(); + m_input->seek(18, WPX_SEEK_CUR); #if 0 - m_recordSize = 29 + (0x7fff & rowBytes)*((bounds_bottom > bounds_top) ? bounds_bottom - bounds_top : bounds_top - bounds_bottom); + m_recordSize = 29 + (0x7fff & rowBytes)*((bounds_bottom > bounds_top) ? bounds_bottom - bounds_top : bounds_top - bounds_bottom); #endif - PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); + PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); } void Pict2Parser::handlePackBitsRgn() { #ifdef DEBUG - unsigned short rowBytes = readU16(); - PICT_DEBUG_MSG(("Row bytes: %i\n", rowBytes)); - unsigned short bounds_top = readU16(); - PICT_DEBUG_MSG(("Bounds.top: %i\n", bounds_top)); - readU16(); - unsigned short bounds_bottom = readU16(); - PICT_DEBUG_MSG(("Bounds.bottom: %i\n", bounds_bottom)); + unsigned short rowBytes = readU16(); + PICT_DEBUG_MSG(("Row bytes: %i\n", rowBytes)); + unsigned short bounds_top = readU16(); + PICT_DEBUG_MSG(("Bounds.top: %i\n", bounds_top)); + readU16(); + unsigned short bounds_bottom = readU16(); + PICT_DEBUG_MSG(("Bounds.bottom: %i\n", bounds_bottom)); #else - readU16(); - readU16(); - readU16(); - readU16(); + readU16(); + readU16(); + readU16(); + readU16(); #endif - readU16(); - m_input->seek(18, WPX_SEEK_CUR); + readU16(); + m_input->seek(18, WPX_SEEK_CUR); #if 0 - m_recordSize = 29 + (0x7fff & rowBytes)*((bounds_bottom > bounds_top) ? bounds_bottom - bounds_top : bounds_top - bounds_bottom); - m_recordSize += readU16(); + m_recordSize = 29 + (0x7fff & rowBytes)*((bounds_bottom > bounds_top) ? bounds_bottom - bounds_top : bounds_top - bounds_bottom); + m_recordSize += readU16(); #endif - PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); + PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); } void Pict2Parser::handleShortComment() @@ -806,12 +806,12 @@ void Pict2Parser::handleDirectBitsRgn() void Pict2Parser::skipData() { - m_recordSize = (int)readU16() + 2 + 2; - PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); + m_recordSize = (int)readU16() + 2 + 2; + PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); } void Pict2Parser::skipLongData() { - m_recordSize = (int)readU32() + 4 + 2; - PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); + m_recordSize = (int)readU32() + 4 + 2; + PICT_DEBUG_MSG(("Size of the data: %i\n", m_recordSize)); } |