diff options
Diffstat (limited to 'src/extension/internal/libwpg/WPG1Parser.cpp')
| -rw-r--r-- | src/extension/internal/libwpg/WPG1Parser.cpp | 432 |
1 files changed, 0 insertions, 432 deletions
diff --git a/src/extension/internal/libwpg/WPG1Parser.cpp b/src/extension/internal/libwpg/WPG1Parser.cpp deleted file mode 100644 index a8b97cbdf..000000000 --- a/src/extension/internal/libwpg/WPG1Parser.cpp +++ /dev/null @@ -1,432 +0,0 @@ -/* libwpg - * Copyright (C) 2006 Ariya Hidayat (ariya@kde.org) - * Copyright (C) 2005 Fridrich Strba (fridrich.strba@bluewin.ch) - * Copyright (C) 2004 Marc Oude Kotte (marc@solcon.nl) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02111-1301 USA - * - * For further information visit http://libwpg.sourceforge.net - */ - -/* "This product is not manufactured, approved, or supported by - * Corel Corporation or Corel Corporation Limited." - */ - -#include "WPG1Parser.h" -#include "WPGPaintInterface.h" -#include "libwpg_utils.h" - -static const unsigned char defaultWPG1PaletteRed[] = { - 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x7F, 0x7F, - 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x14, 0x20, 0x2C, 0x38, 0x45, 0x51, 0x61, - 0x71, 0x82, 0x92, 0xA2, 0xB6, 0xCB, 0xE3, 0xFF, - 0x00, 0x41, 0x7D, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x7D, 0x41, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x7D, 0x9E, 0xBE, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xBE, 0x9E, - 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, - 0xB6, 0xC7, 0xDB, 0xEB, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xDB, 0xC7, - 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, - 0x00, 0x1C, 0x38, 0x55, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x55, 0x38, 0x1C, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x38, 0x45, 0x55, 0x61, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x61, 0x55, 0x45, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, - 0x51, 0x59, 0x61, 0x69, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x69, 0x61, 0x59, - 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, - 0x00, 0x10, 0x20, 0x30, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x30, 0x20, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x28, 0x30, 0x38, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x38, 0x30, 0x28, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3C, 0x30, 0x34, 0x3C, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x3C, 0x34, 0x30, - 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static const unsigned char defaultWPG1PaletteGreen[] = { - 0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x3F, 0x7F, - 0xC0, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, - 0x00, 0x14, 0x20, 0x2C, 0x38, 0x45, 0x51, 0x61, - 0x71, 0x82, 0x92, 0xA2, 0xB6, 0xCB, 0xE3, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x41, 0x7D, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x7D, 0x41, - 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, - 0x7D, 0x9E, 0xBE, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xBE, 0x9E, - 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, - 0xB6, 0xC7, 0xDB, 0xEB, 0xFF, 0xFF, 0xFF, 0xFF, - 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xDB, 0xC7, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1C, 0x38, 0x55, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x55, 0x38, 0x1C, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, - 0x38, 0x45, 0x55, 0x61, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x61, 0x55, 0x45, - 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, - 0x51, 0x59, 0x61, 0x69, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x69, 0x61, 0x59, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x20, 0x30, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x30, 0x20, 0x10, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x30, 0x38, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x38, 0x30, 0x28, - 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, - 0x3C, 0x30, 0x34, 0x3C, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x3C, 0x34, 0x30, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -static const unsigned char defaultWPG1PaletteBlue[] = { - 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x7F, - 0xC0, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, - 0x00, 0x14, 0x20, 0x2C, 0x38, 0x45, 0x51, 0x61, - 0x71, 0x82, 0x92, 0xA2, 0xB6, 0xCB, 0xE3, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0x7D, 0x41, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x41, 0x7D, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xBE, 0x9E, - 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, - 0x7D, 0x9E, 0xBE, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0xDB, 0xC7, - 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, - 0xB6, 0xC7, 0xDB, 0xEB, 0xFF, 0xFF, 0xFF, 0xFF, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x55, 0x38, 0x1C, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1C, 0x38, 0x55, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x61, 0x55, 0x45, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, - 0x38, 0x45, 0x55, 0x61, 0x71, 0x71, 0x71, 0x71, - 0x71, 0x71, 0x71, 0x71, 0x71, 0x69, 0x61, 0x59, - 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, - 0x51, 0x59, 0x61, 0x69, 0x71, 0x71, 0x71, 0x71, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x30, 0x20, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x20, 0x30, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x38, 0x30, 0x28, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x28, 0x30, 0x38, 0x41, 0x41, 0x41, 0x41, - 0x41, 0x41, 0x41, 0x41, 0x41, 0x3C, 0x34, 0x30, - 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, - 0x2C, 0x30, 0x34, 0x3C, 0x41, 0x41, 0x41, 0x41, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - - -WPG1Parser::WPG1Parser(libwpg::WPGInputStream *input, libwpg::WPGPaintInterface* painter): - WPGXParser(input, painter), - m_success(true), m_exit(false), - m_width(0), m_height(0) -{ -} - -bool WPG1Parser::parse() -{ - typedef void (WPG1Parser::*Method)(); - - struct RecordHandler - { - int type; - const char *name; - Method handler; - }; - - static const struct RecordHandler handlers[] = - { - { 0x01, "Fill Attributes", &WPG1Parser::handleFillAttributes }, - { 0x02, "Line Attributes", &WPG1Parser::handleLineAttributes }, - { 0x03, "Marker Atttibutes", 0 }, - { 0x04, "Polymarker", 0 }, - { 0x05, "Line", &WPG1Parser::handleLine }, - { 0x06, "Polyline", &WPG1Parser::handlePolyline }, - { 0x07, "Rectangle", &WPG1Parser::handleRectangle }, - { 0x08, "Polygon", &WPG1Parser::handlePolygon }, - { 0x09, "Ellipse", &WPG1Parser::handleEllipse }, - { 0x0e, "Colormap", &WPG1Parser::handleColormap }, - { 0x0f, "Start WPG", &WPG1Parser::handleStartWPG }, - { 0x10, "End WPG", &WPG1Parser::handleEndWPG }, - { 0x00, 0, 0 } // end marker - }; - - // initialization - m_success = true; - m_exit = false; - - // default style - m_pen.foreColor = libwpg::WPGColor(0,0,0); - m_pen.backColor = libwpg::WPGColor(0,0,0); - m_pen.width = 0.001; - m_pen.height = 0.001; - m_pen.solid = true; - m_pen.dashArray = libwpg::WPGDashArray(); - m_brush.foreColor = libwpg::WPGColor(0,0,0); - m_brush.backColor = libwpg::WPGColor(0,0,0); - resetPalette(); - - while(!m_input->atEnd()) - { -#ifdef DEBUG - long recordPos = m_input->tell(); -#endif - int recordType = readU8(); - int length = readVariableLengthInteger(); - long nextPos = m_input->tell() + length; -#if !defined(DEBUG) - //(void)recordPos; -#endif // !defined(DEBUG) - - // search function to handler this record - int index = -1; - for(int i = 0; (index < 0) && handlers[i].name; i++) - if(handlers[i].type == recordType) - index = i; - - WPG_DEBUG_MSG(("\n")); - if(index < 0) - WPG_DEBUG_MSG(("Unknown record type 0x%02x at %d size %d\n", - recordType, recordPos, length)); - else - { - Method recordHandler = handlers[index].handler; - if(!recordHandler) - WPG_DEBUG_MSG(("Record '%s' (ignored) type 0x%02x at %d size %d\n", - handlers[index].name, recordType, recordPos, length)); - else - { - WPG_DEBUG_MSG(("Record '%s' type 0x%02x at %d size %d\n", - handlers[index].name, recordType, recordPos, length)); - - // invoke the handler for this record - (this->*recordHandler)(); - } - } - - //if(m_input->tell() > nextPos) - { - //WPG_DEBUG_MSG(("Record 0x%x consumes more bytes than necessary!\n", recordType)); - WPG_DEBUG_MSG(("Current stream position: %d\n", m_input->tell())); - } - - if(m_exit) break; - - m_input->seek(nextPos); - } - - return m_success; -} - -void WPG1Parser::handleStartWPG() -{ - // unsigned char version = readU8(); - // unsigned char bitFlags = readU8(); - m_input->seek(m_input->tell() + 2); - //(void)version; - //(void)bitFlags; - m_width = readU16(); - m_height = readU16(); - - double width = (double)m_width / 1200.0; - double height = (double)m_height / 1200.0; - m_painter->startDocument(width, height); - - WPG_DEBUG_MSG(("StartWPG\n")); -} - -void WPG1Parser::handleEndWPG() -{ - m_painter->endDocument(); - m_exit = true; - - WPG_DEBUG_MSG(("EndWPG\n")); -} - -void WPG1Parser::handleColormap() -{ - unsigned startIndex = readU16(); - unsigned numEntries = readU16(); - - WPG_DEBUG_MSG(("Colormap\n")); - for(unsigned int i = 0; i < numEntries; i++) - { - libwpg::WPGColor color; - color.red = readU8(); - color.green = readU8(); - color.blue = readU8(); - m_colorPalette[startIndex+i] = color; - WPG_DEBUG_MSG(("Index#%d: RGB %d %d %d\n", startIndex+i, color.red, color.green, color.blue)); - } -} - -void WPG1Parser::handleFillAttributes() -{ - unsigned char style = readU8(); - unsigned char color = readU8(); - - if(style == 0) - m_brush.style = libwpg::WPGBrush::NoBrush; - if(style == 1) - m_brush.style = libwpg::WPGBrush::Solid; - - m_brush.foreColor = m_colorPalette[color]; - - WPG_DEBUG_MSG(("Fill Attributes\n")); - WPG_DEBUG_MSG((" Fill style: %d\n", style)); - WPG_DEBUG_MSG((" Fill color index: %d\n", color)); -} - -void WPG1Parser::handleLineAttributes() -{ - unsigned char style = readU8(); - unsigned char color = readU8(); - unsigned int width = readU16(); - - m_pen.solid = style != 0; - m_pen.foreColor = m_colorPalette[color]; - m_pen.width = (double)width / 1200.0; - - WPG_DEBUG_MSG(("Line Attributes\n")); - WPG_DEBUG_MSG((" Line style: %d\n", style)); - WPG_DEBUG_MSG((" Line color index: %d\n", color)); - WPG_DEBUG_MSG((" Line width: %d\n", width)); -} - -void WPG1Parser::handleLine() -{ - int sx = readS16(); - int sy = readS16(); - int ex = readS16(); - int ey = readS16(); - - libwpg::WPGPointArray points; - points.add(libwpg::WPGPoint((double)sx/1200.0, (double)(m_height-sy)/1200.0)); - points.add(libwpg::WPGPoint((double)ex/1200.0, (double)(m_height-ey)/1200.0)); - - m_painter->setBrush(m_brush); - m_painter->setPen(m_pen); - m_painter->drawPolygon(points); - - WPG_DEBUG_MSG(("Line\n")); - WPG_DEBUG_MSG((" Starting point: %d,%d\n", sx, sy)); - WPG_DEBUG_MSG((" End point: %d,%d\n", ex, ey)); -} - -void WPG1Parser::handlePolyline() -{ - unsigned int count = readU16(); - - libwpg::WPGPointArray points; - for(unsigned int i = 0; i < count; i++ ) - { - long x = readS16(); - long y = readS16(); - points.add(libwpg::WPGPoint((double)x/1200.0, (double)(m_height-y)/1200.0)); - } - - m_painter->setBrush(libwpg::WPGBrush()); // not filled - m_painter->setPen(m_pen); - m_painter->drawPolygon(points); - - WPG_DEBUG_MSG(("Polyline\n")); -} - -void WPG1Parser::handleRectangle() -{ - int x = readS16(); - int y = readS16(); - int w = readS16(); - int h = readS16(); - - libwpg::WPGRect rect; - rect.x1 = (double)x/1200.0; - rect.y1 = (double)(m_height-y)/1200.0; - rect.x2 = rect.x1 + (double)w/1200.0; - rect.y2 = rect.y1 + (double)h/1200.0; - - m_painter->setBrush(m_brush); - m_painter->setPen(m_pen); - m_painter->drawRectangle(rect, 0, 0); - - WPG_DEBUG_MSG(("Line\n")); - WPG_DEBUG_MSG((" Corner point: %d,%d\n", x, y)); - WPG_DEBUG_MSG((" Width: %d\n", w)); - WPG_DEBUG_MSG((" Height: %d\n", h)); -} - -void WPG1Parser::handlePolygon() -{ - unsigned int count = readU16(); - - libwpg::WPGPointArray points; - for(unsigned int i = 0; i < count; i++ ) - { - long x = readS16(); - long y = readS16(); - points.add(libwpg::WPGPoint((double)x/1200.0, (double)(m_height-y)/1200.0)); - } - - m_painter->setBrush(m_brush); - m_painter->setPen(m_pen); - m_painter->drawPolygon(points); - - WPG_DEBUG_MSG(("Polygon\n")); -} - -void WPG1Parser::handleEllipse() -{ - int cx = readS16(); - int cy = readS16(); - int rx = readS16(); - int ry = readS16(); - - libwpg::WPGPoint center; - center.x = (double)cx/1200.0; - center.y = (double)(m_height-cy)/1200.0; - - double radx = (double)rx/1200.0; - double rady = (double)ry/1200.0; - - m_painter->setBrush(m_brush); - m_painter->setPen(m_pen); - m_painter->drawEllipse(center, radx, rady); - - WPG_DEBUG_MSG(("Ellipse\n")); - WPG_DEBUG_MSG((" Center point: %d,%d\n", cx, cy)); - WPG_DEBUG_MSG((" Radius x: %d\n", rx)); - WPG_DEBUG_MSG((" Radius y: %d\n", ry)); -} - -void WPG1Parser::resetPalette() -{ - m_colorPalette.clear(); - for (int i=0; i<256; i++) - { - libwpg::WPGColor color; - color.red = defaultWPG1PaletteRed[i]; - color.green = defaultWPG1PaletteGreen[i]; - color.blue = defaultWPG1PaletteBlue[i]; - m_colorPalette[i] = color; - } -} - |
