--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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