From 1b306c7d77d21dc59ac9e4f92904a2a6e92f5efe Mon Sep 17 00:00:00 2001 From: Said Ryan Ackley Date: Thu, 27 Jun 2002 12:16:08 +0000 Subject: [PATCH] initial check-in. git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@352726 13f79535-47bb-0310-9956-ffa450edef68 --- .../model/hdftypes/CHPFormattedDiskPage.java | 58 +++++++++++++++++++ .../model/hdftypes/PAPFormattedDiskPage.java | 57 ++++++++++++++++++ .../poi/hdf/model/hdftypes/PlexOfCps.java | 30 ++++++++++ 3 files changed, 145 insertions(+) create mode 100644 src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/CHPFormattedDiskPage.java create mode 100644 src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/PAPFormattedDiskPage.java create mode 100644 src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/PlexOfCps.java diff --git a/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/CHPFormattedDiskPage.java b/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/CHPFormattedDiskPage.java new file mode 100644 index 000000000..63c670a7b --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/CHPFormattedDiskPage.java @@ -0,0 +1,58 @@ +package org.apache.poi.hdf.model.hdftypes; + +import org.apache.poi.util.LittleEndian; + +/** + * Represents a CHP fkp. The style properties for paragraph and character runs + * are stored in fkps. There are PAP fkps for paragraph properties and CHP fkps + * for character run properties. The first part of the fkp for both CHP and PAP + * fkps consists of an array of 4 byte int offsets that represent a + * Paragraph's or Character run's text offset in the main stream. The ending + * offset is the next value in the array. For example, if an fkp has X number of + * Paragraph's stored in it then there are (x + 1) 4 byte ints in the beginning + * array. The number X is determined by the last byte in a 512 byte fkp. + * + * CHP and PAP fkps also store the compressed styles(grpprl) that correspond to + * the offsets on the front of the fkp. The offset of the grpprls is determined + * differently for CHP fkps and PAP fkps. + */ +public class CHPFormattedDiskPage extends FormattedDiskPage +{ + + + /** + * This constructs a CHPFormattedDiskPage from a raw fkp (512 byte array + * read from a Word file). + * + * @param fkp The 512 byte array to read data from + */ + public CHPFormattedDiskPage(byte[] fkp) + { + super(fkp); + } + + /** + * Gets the chpx for the character run at index in this fkp. + * + * @param index The index of the chpx to get. + * @return a chpx grpprl. + */ + public byte[] getGrpprl(int index) + { + int chpxOffset = 2 * LittleEndian.getUnsignedByte(_fkp, ((_crun + 1) * 4) + index); + + //optimization if offset == 0 use "Normal" style + if(chpxOffset == 0) + { + return new byte[0]; + + } + + int size = LittleEndian.getUnsignedByte(_fkp, chpxOffset); + + byte[] chpx = new byte[size]; + + System.arraycopy(_fkp, ++chpxOffset, chpx, 0, size); + return chpx; + } +} \ No newline at end of file diff --git a/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/PAPFormattedDiskPage.java b/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/PAPFormattedDiskPage.java new file mode 100644 index 000000000..50b5e6d38 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/PAPFormattedDiskPage.java @@ -0,0 +1,57 @@ +package org.apache.poi.hdf.model.hdftypes; + +import org.apache.poi.util.LittleEndian; + +/** + * Represents a PAP FKP. The style properties for paragraph and character runs + * are stored in fkps. There are PAP fkps for paragraph properties and CHP fkps + * for character run properties. The first part of the fkp for both CHP and PAP + * fkps consists of an array of 4 byte int offsets in the main stream for that + * Paragraph's or Character run's text. The ending offset is the next + * value in the array. For example, if an fkp has X number of Paragraph's + * stored in it then there are (x + 1) 4 byte ints in the beginning array. The + * number X is determined by the last byte in a 512 byte fkp. + * + * CHP and PAP fkps also store the compressed styles(grpprl) that correspond to + * the offsets on the front of the fkp. The offset of the grpprls is determined + * differently for CHP fkps and PAP fkps. + * + * @author Ryan Ackley + */ +public class PAPFormattedDiskPage extends FormattedDiskPage +{ + + /** + * Creates a PAPFormattedDiskPage from a 512 byte array + * + * @param fkp a 512 byte array. + */ + public PAPFormattedDiskPage(byte[] fkp) + { + super(fkp); + } + + /** + * Gets the papx for the pagraph at index in this fkp. + * + * @param index The index of the papx to get. + * @return a papx grpprl. + */ + public byte[] getGrpprl(int index) + { + int papxOffset = 2 * LittleEndian.getUnsignedByte(_fkp, ((_crun + 1) * 4) + (index * 13)); + int size = 2 * LittleEndian.getUnsignedByte(_fkp, papxOffset); + if(size == 0) + { + size = 2 * LittleEndian.getUnsignedByte(_fkp, ++papxOffset); + } + else + { + size--; + } + + byte[] papx = new byte[size]; + System.arraycopy(_fkp, ++papxOffset, papx, 0, size); + return papx; + } +} \ No newline at end of file diff --git a/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/PlexOfCps.java b/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/PlexOfCps.java new file mode 100644 index 000000000..35e00acc4 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hdf/model/hdftypes/PlexOfCps.java @@ -0,0 +1,30 @@ +package org.apache.poi.hdf.model.hdftypes; + + +/** + * common data structure in a Word file. Contains an array of 4 byte ints in + * the front that relate to an array of abitrary data structures in the back. + */ +public class PlexOfCps +{ + private int _count; + private int _offset; + private int _sizeOfStruct; + + + + public PlexOfCps(int offset, int size, int sizeOfStruct) + { + _count = (size - 4)/(4 + sizeOfStruct); + _offset = offset; + _sizeOfStruct = sizeOfStruct; + } + public int size() + { + return _count; + } + public int getStructOffset(int index) + { + return (4 * (_count + 1)) + (_sizeOfStruct * index); + } +} \ No newline at end of file