diff --git a/xmerge/source/writer2latex/source/writer2latex/office/SVMReader.java b/xmerge/source/writer2latex/source/writer2latex/office/SVMReader.java new file mode 100644 index 000000000000..f2dd2fd991e2 --- /dev/null +++ b/xmerge/source/writer2latex/source/writer2latex/office/SVMReader.java @@ -0,0 +1,232 @@ +/************************************************************************ + * + * SVMReader.java + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * Copyright: 2004 by Urban Widmark + * + * All Rights Reserved. + * + * Version 0.3.3b (2004-02-26) + * + */ + +package writer2latex.office; + +/** This class contains a static method to extract EPS data from an SVM file */ +public final class SVMReader { + + /* Notes on SVM file format: + + Relevant OO 1.1.0 Source Files include: + tools/source/stream/vcompat.cxx + vcl/source/gdi/gdimtf.cxx + vcl/inc/gdimtf.hxx + vcl/source/gdi/metaact.cxx + vcl/inc/metaact.hxx + vcl/source/gdi/mapmod.cxx + vcl/inc/mapmod.hxx + tools/source/generic/fract.cxx + tools/inc/fract.hxx + tools/source/generic/gen.cxx + tools/inc/gen.hxx + + VersionCompat (6 bytes) + version - 2 bytes + totalsize - 4 bytes + + Point (Pair) (8 bytes) + X - 4 bytes (long) + Y - 4 bytes (long) + + Fraction (8 bytes) + nNumerator - 4 bytes (long) + nDenominator - 4 bytes (long) + + MapMode (6 + 2 + 8 + 8 + 8 + 1 = 33 bytes) + VersionCompat + meUnit - UINT16 + maOrigin - Point + maScaleX - Fraction + maScaleY - Fraction + mbSimple - BOOL (1 byte) + + Size (Pair) (8 bytes) + width - 4 bytes (long) + height - 4 bytes (long) + + GfxLink (16 or 57 bytes) + VersionCompat + nType - 2 bytes + nSize - 4 bytes + nUserId - 4 bytes + aSize - Size (version >=2) + aMapMode - MapMode (version >=2) + + MetaEPSAction + VersionCompat + maGfxLink - GfxLink + data[maGfxLink.nSize] - bytes + maPoint - Point + maSize - Size + maSubst - GDIMetaFile (alternative image?) + + SVM file + "VCLMTF" + Compat - VersionCompat + nStmCompressMode - UINT32 + aPrefMapMode - MapMode + aPrefSize - Size + count - UINT32 + action[count] - MetaAction + + + Example header from an EPS image included in a Writer document: + 00000000: 5643 4c4d 5446 0100 3100 0000 0000 0000 VCLMTF..1....... + 00000010: 0100 1b00 0000 0800 0000 0000 0000 0000 ................ + 00000020: 0100 0000 0100 0000 0100 0000 0100 0000 ................ + 00000030: 0169 0100 00fd 0000 0001 0000 008f 0001 .i.............. + 00000040: 0096 3200 0002 0033 0000 0001 003f 3000 ..2....3.....?0. + 00000050: 0000 0000 0000 0000 0000 0000 0001 001b ................ + 00000060: 0000 000a 0000 0000 0000 0000 0001 0000 ................ + 00000070: 0001 0000 0001 0000 0001 0000 0001 2521 ..............%! + + 5643 4c4d 5446 "VCLMTF" 0 + + 0100 version 6 + 3100 0000 totalsize + + 0000 0000 compress 12 + + 0100 aPrefMapMode.version 16 + 1b00 0000 aPrefMapMode.totalsize + 0800 aPrefMapMode.meUnit + 0000 0000 aPrefMapMode.maOrigin + 0000 0000 + 0100 0000 aPrefMapMode.maScaleX + 0100 0000 + 0100 0000 aPrefMapMode.maScaleY + 0100 0000 + 01 aPrefMapMode.mbSimple + + 6901 0000 aPrefSize 49 + fd00 0000 + + 0100 0000 nCount 57 + + 8f00 type == META_EPS_ACTION 61 + + 0100 version + 9632 0000 totalsize + + 0200 version + 3300 0000 totalsize + + 0100 nType + 3f30 0000 nSize 75 + 0000 0000 nUserId + + 0000 0000 aSize + 0000 0000 + + 0100 + 1b00 0000 + 0a00 + + 0000 0000 + 0000 0000 + 0100 0000 + 0100 0000 + 0100 0000 + 0100 0000 + 01 + + Beginning of EPS data: + + 2521 + + Note that maPoint/maSize/maSubst are all after the EPS file. + + */ + + /** Determine if this SVM contains an EPS document and retrieve start and + * end positions if so. + * + * @param blob byte array containing SVM file + * @param offlen integer array to retrieve the offset into the SVM file + * (offlen[0]) and the length (offlen[1]) of the EPS + * document. If the method returns false, the array + * will be unchanged. + * + * @return returns true if the SVM contains an EPS document + */ + public static final boolean readSVM(byte[] blob, int[] offlen) { + int pos = 57; + int nCount = getInt(blob, pos); + pos += 4; + + for (int i=0; i= 2) + pos += 41; + + for (int j=0; j