summaryrefslogtreecommitdiff
path: root/src/lib/Pict2Parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/Pict2Parser.cpp')
-rw-r--r--src/lib/Pict2Parser.cpp660
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));
}