/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ /* libwpd * Version: MPL 2.0 / LGPLv2.1+ * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Major Contributor(s): * Copyright (C) 2007 Fridrich Strba (fridrich.strba@bluewin.ch) * Copyright (C) 2007 Novell Inc. (http://www.novell.com) * * For minor contributions see the git repository. * * Alternatively, the contents of this file may be used under the terms * of the GNU Lesser General Public License Version 2.1 or later * (LGPLv2.1+), in which case the provisions of the LGPLv2.1+ are * applicable instead of those above. * * For further information visit http://libwpd.sourceforge.net */ /* "This product is not manufactured, approved, or supported by * Corel Corporation or Corel Corporation Limited." */ #include #include "WP6GraphicsBoxStylePacket.h" #include "WP6Parser.h" WP6GraphicsBoxStylePacket::WP6GraphicsBoxStylePacket(librevenge::RVNGInputStream *input, WPXEncryption *encryption, int /* id */, unsigned dataOffset, unsigned dataSize): WP6PrefixDataPacket(input, encryption), m_isLibraryStyle(false), m_boxStyleName(), m_generalPositioningFlags(0x00), m_horizontalPositioningFlags(0x00), m_horizontalOffset(0), m_leftColumn(0x00), m_rightColumn(0x00), m_verticalPositioningFlags(0x00), m_verticalOffset(0), m_widthFlags(0x00), m_width(0), m_heightFlags(0x00), m_height(0), m_contentType(0x00), m_contentHAlign(0), m_contentVAlign(0), m_contentPreserveAspectRatio(true), m_nativeWidth(0), m_nativeHeight(0) { _read(input, encryption, dataOffset, dataSize); } WP6GraphicsBoxStylePacket::~WP6GraphicsBoxStylePacket() { } void WP6GraphicsBoxStylePacket::_readContents(librevenge::RVNGInputStream *input, WPXEncryption *encryption) { WPD_DEBUG_MSG(("WP6GraphicsBoxStylePacket position: 0x%.8x\n", (unsigned)input->tell())); unsigned short tmpNumChildIDs = readU16(input, encryption); input->seek(tmpNumChildIDs * 2, librevenge::RVNG_SEEK_CUR); unsigned short tmpSizeOfBoxData = readU16(input, encryption); long tmpStartOfBoxData = input->tell(); // Reading the box name/library data unsigned short tmpSizeOfBoxNameLibraryData = readU16(input, encryption); long tmpBoxNameLibraryDataPosition = input->tell(); input->seek(1, librevenge::RVNG_SEEK_CUR); m_isLibraryStyle = ((readU8(input, encryption) & 0x01) != 0x00); signed short tmpBoxNameLength = (signed short)readU16(input, encryption); if (tmpBoxNameLength > 0) { for (signed short i = 0; i < (tmpBoxNameLength/2); i++) { unsigned short charWord = readU16(input, encryption); unsigned char characterSet = (unsigned char)((charWord >> 8) & 0x00FF); unsigned char character = (unsigned char)(charWord & 0xFF); if (character == 0x00 && characterSet == 0x00) break; const unsigned *chars; int len = extendedCharacterWP6ToUCS4(character, characterSet, &chars); for (int j = 0; j < len; j++) appendUCS4(m_boxStyleName, (unsigned)chars[j]); } } else { switch (tmpBoxNameLength) { case 0: m_boxStyleName = "Figure Box"; break; case -1: m_boxStyleName = "Table Box"; break; case -2: m_boxStyleName = "Text Box"; break; case -3: m_boxStyleName = "User Box"; break; case -4: m_boxStyleName = "Equation Box"; break; case -5: m_boxStyleName = "Button Box"; break; default: break; } } WPD_DEBUG_MSG(("WP6GraphicsBoxStylePacket -- Box Style name: %s\n", m_boxStyleName.cstr())); input->seek(tmpSizeOfBoxNameLibraryData + tmpBoxNameLibraryDataPosition, librevenge::RVNG_SEEK_SET); // Skipping box counter data unsigned short tmpSizeOfBoxCounterData = readU16(input, encryption); WPD_DEBUG_MSG(("WP6GraphicsBoxStylePacket -- Box counter data\n")); input->seek(tmpSizeOfBoxCounterData, librevenge::RVNG_SEEK_CUR); // Reading Box positioning data unsigned short tmpSizeOfBoxPositioningData = readU16(input, encryption); long tmpBoxPositioningDataPosition = input->tell(); input->seek(1, librevenge::RVNG_SEEK_CUR); m_generalPositioningFlags = readU8(input, encryption); WPD_DEBUG_MSG(("WP6GraphicsBoxStylePacket -- Box Positioning data (general positioning flags: 0x%.2x)\n", m_generalPositioningFlags)); WPD_DEBUG_MSG(("WP6GraphicsBoxStylePacket -- Box Positioning data (anchor value: %i) (page offset bit: %i) (overlap flag: %i) (auto flag: %i)\n", m_generalPositioningFlags & 0x07, (m_generalPositioningFlags & 0x08) >> 3, (m_generalPositioningFlags & 0x10) >> 4, (m_generalPositioningFlags & 0x20) >> 5)); m_horizontalPositioningFlags = readU8(input, encryption); WPD_DEBUG_MSG(("WP6GraphicsBoxStylePacket -- Box Horizontal position (horizontal alignment type: %i) (horizontal alignment: %i)\n", m_horizontalPositioningFlags & 0x03, (m_horizontalPositioningFlags & 0x1C) >> 2)); m_horizontalOffset = (signed short)readU16(input, encryption); WPD_DEBUG_MSG(("WP6GraphicsBoxStylePacket -- Box Horizontal Offset (%i)\n", m_horizontalOffset)); m_leftColumn = readU8(input, encryption); m_rightColumn = readU8(input, encryption); WPD_DEBUG_MSG(("WP6GraphicsBoxStylePacket -- Box Horizontal position (between columns %i and %i)\n", m_leftColumn, m_rightColumn)); m_verticalPositioningFlags = readU8(input, encryption); WPD_DEBUG_MSG(("WP6GraphicsBoxStylePacket -- Box Vertical position (vertical alignment type: %i) (vertical alignment: %i) (vertical effect: %i)\n", m_verticalPositioningFlags & 0x03, (m_verticalPositioningFlags & 0x1C) >> 2, (m_verticalPositioningFlags & 0x20) >> 5)); m_verticalOffset = (signed short)readU16(input, encryption); WPD_DEBUG_MSG(("WP6GraphicsBoxStylePacket -- Box Vertical Offset (%i)\n", m_verticalOffset)); m_widthFlags = readU8(input, encryption) & 0x01; WPD_DEBUG_MSG(("WP6GraphicsBoxStylePacket -- Box Width Flags: 0x%.2x\n", m_widthFlags)); m_width = readU16(input, encryption); WPD_DEBUG_MSG(("WP6GraphicsBoxStylePacket -- Box Width: %i\n", m_width)); m_heightFlags = readU8(input, encryption) & 0x01; WPD_DEBUG_MSG(("WP6GraphicsBoxStylePacket -- Box Height Flags: 0x%.2x\n", m_heightFlags)); m_height = readU16(input, encryption); WPD_DEBUG_MSG(("WP6GraphicsBoxStylePacket -- Box Height: %i\n", m_height)); input->seek(tmpSizeOfBoxPositioningData + tmpBoxPositioningDataPosition, librevenge::RVNG_SEEK_SET); // Reading box content data unsigned short tmpSizeOfBoxContentData = readU16(input, encryption); long tmpBoxContentDataPosition = input->tell(); input->seek(1, librevenge::RVNG_SEEK_CUR); m_contentType = readU8(input, encryption); unsigned char tmpContentAlignFlags = readU8(input, encryption); m_contentHAlign = tmpContentAlignFlags & 0x03; m_contentVAlign = (unsigned char)((tmpContentAlignFlags & 0xC0) >> 2); m_contentPreserveAspectRatio = ((tmpContentAlignFlags & 0x10) == 0x00); WPD_DEBUG_MSG(("WP6GraphicsBoxStylePacket -- Box Content Type (%i)\n", m_contentType)); WPD_DEBUG_MSG(("WP6GraphicsBoxStylePacket -- Box Content Alignment (horizontal: 0x%.2x) (vertical: 0x%.2x) (preserve aspect ratio: %s)\n", m_contentHAlign, m_contentVAlign, m_contentPreserveAspectRatio ? "true" : "false")); switch (m_contentType) { case 0x03: { unsigned short tmpGraphicsRenderingInfoSize = readU16(input, encryption); long tmpGraphicsRenderingInfoBegin = input->tell(); if (0x01 == (readU8(input, encryption) & 0xFF)) { m_nativeWidth = readU16(input, encryption); m_nativeHeight = readU16(input, encryption); } else input->seek(4, librevenge::RVNG_SEEK_CUR); input->seek(tmpGraphicsRenderingInfoSize + tmpGraphicsRenderingInfoBegin, librevenge::RVNG_SEEK_CUR); } break; default: break; } input->seek(tmpSizeOfBoxContentData + tmpBoxContentDataPosition, librevenge::RVNG_SEEK_SET); // Reading box caption data unsigned short tmpSizeOfBoxCaptionData = readU16(input, encryption); long tmpBoxCaptionDataPosition = input->tell(); input->seek(tmpSizeOfBoxCaptionData + tmpBoxCaptionDataPosition, librevenge::RVNG_SEEK_SET); // Reading box border data unsigned short tmpSizeOfBoxBorderData = readU16(input, encryption); long tmpBoxBorderDataPosition = input->tell(); input->seek(tmpSizeOfBoxBorderData + tmpBoxBorderDataPosition, librevenge::RVNG_SEEK_SET); // Reading box fill data unsigned short tmpSizeOfBoxFillData = readU16(input, encryption); long tmpBoxFillDataPosition = input->tell(); input->seek(tmpSizeOfBoxFillData + tmpBoxFillDataPosition, librevenge::RVNG_SEEK_SET); // Reading box wrapping data unsigned short tmpSizeOfBoxWrappingData = readU16(input, encryption); long tmpBoxWrappingDataPosition = input->tell(); input->seek(tmpSizeOfBoxWrappingData + tmpBoxWrappingDataPosition, librevenge::RVNG_SEEK_SET); // Reading box hypertext data unsigned short tmpSizeOfBoxHypertextData = readU16(input, encryption); long tmpBoxHypertextDataPosition = input->tell(); input->seek(tmpSizeOfBoxHypertextData + tmpBoxHypertextDataPosition, librevenge::RVNG_SEEK_SET); // Dumping hexadecimally the rest of the packet long tmpCurrentPosition = input->tell(); if ((long)tmpStartOfBoxData + (long)tmpSizeOfBoxData - tmpCurrentPosition < 0) throw FileException(); #ifdef DEBUG for (unsigned i = 0; i < tmpStartOfBoxData + tmpSizeOfBoxData - tmpCurrentPosition; i++) { if (i % 8 == 0) WPD_DEBUG_MSG(("\n ")); WPD_DEBUG_MSG(("%.2x ", readU8(input, encryption))); } #else if (input->seek(tmpStartOfBoxData + tmpSizeOfBoxData, librevenge::RVNG_SEEK_SET)) throw FileException(); #endif } /* vim:set shiftwidth=4 softtabstop=4 noexpandtab: */