PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@353054 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
81230699e2
commit
98f829f916
@ -632,12 +632,13 @@ public class HDFObjectFactory
|
|||||||
System.arraycopy(_tableBuffer, lfoOffset, plflfo, 0, lfoSize);
|
System.arraycopy(_tableBuffer, lfoOffset, plflfo, 0, lfoSize);
|
||||||
|
|
||||||
int lstOffset = _fib.getFcPlcfLst();
|
int lstOffset = _fib.getFcPlcfLst();
|
||||||
int lstSize = lstOffset;
|
int lstSize = _fib.getLcbPlcfLst();
|
||||||
//not sure if this is a mistake or what. I vaguely remember a trick like
|
if (lstOffset > 0 && lstSize > 0)
|
||||||
//this
|
|
||||||
//int lstSize = LittleEndian.getInt(_header, 0x2e2);
|
|
||||||
if(lstOffset > 0 && lstSize > 0)
|
|
||||||
{
|
{
|
||||||
|
// The lstSize returned by _fib.getLcbPlcfLst() doesn't appear
|
||||||
|
// to take into account any LVLs. Therefore, we recalculate
|
||||||
|
// lstSize based on where the LFO section begins (because the
|
||||||
|
// LFO section immediately follows the LST section).
|
||||||
lstSize = lfoOffset - lstOffset;
|
lstSize = lfoOffset - lstOffset;
|
||||||
byte[] plcflst = new byte[lstSize];
|
byte[] plcflst = new byte[lstSize];
|
||||||
System.arraycopy(_tableBuffer, lstOffset, plcflst, 0, lstSize);
|
System.arraycopy(_tableBuffer, lstOffset, plcflst, 0, lstSize);
|
||||||
|
@ -74,6 +74,8 @@ public class LVL
|
|||||||
boolean _fWord6;
|
boolean _fWord6;
|
||||||
public byte[] _rgbxchNums = new byte[9];
|
public byte[] _rgbxchNums = new byte[9];
|
||||||
public byte _ixchFollow;
|
public byte _ixchFollow;
|
||||||
|
public int _dxaSpace;
|
||||||
|
public int _dxaIndent;
|
||||||
public byte[] _chpx;
|
public byte[] _chpx;
|
||||||
public byte[] _papx;
|
public byte[] _papx;
|
||||||
public char[] _xst;
|
public char[] _xst;
|
||||||
|
@ -167,56 +167,81 @@ public class ListTables implements HDFType
|
|||||||
int lfolvlNum = 0;
|
int lfolvlNum = 0;
|
||||||
for(int x = 0; x < lfoSize; x++)
|
for(int x = 0; x < lfoSize; x++)
|
||||||
{
|
{
|
||||||
for(int y = 0; y < _pllfo[x]._clfolvl; y++)
|
if (_pllfo[x]._clfolvl == 0)
|
||||||
{
|
// If LFO._clfolvl is 0, then it appears that Word writes
|
||||||
int offset = lfolvlOffset + (lfolvlNum * 8) + lvlOffset;
|
// out a LFOLVL anyway - however, it's all 0xff. We need
|
||||||
LFOLVL lfolvl = new LFOLVL();
|
// to skip over it.
|
||||||
lfolvl._iStartAt = Utils.convertBytesToInt(plflfo, offset);
|
|
||||||
lfolvl._ilvl = Utils.convertBytesToInt(plflfo, offset + 4);
|
|
||||||
lfolvl._fStartAt = StyleSheet.getFlag(lfolvl._ilvl & 0x10);
|
|
||||||
lfolvl._fFormatting = StyleSheet.getFlag(lfolvl._ilvl & 0x20);
|
|
||||||
lfolvl._ilvl = (lfolvl._ilvl & (byte)0x0f);
|
|
||||||
lfolvlNum++;
|
lfolvlNum++;
|
||||||
|
else
|
||||||
if(lfolvl._fFormatting)
|
{
|
||||||
{
|
for(int y = 0; y < _pllfo[x]._clfolvl; y++)
|
||||||
offset = lfolvlOffset + (lfolvlNum * 12) + lvlOffset;
|
{
|
||||||
lfolvl._override = new LVL();
|
int offset = lfolvlOffset + (lfolvlNum * 8) + lvlOffset;
|
||||||
lvlOffset += createLVL(plflfo, offset, lfolvl._override);
|
LFOLVL lfolvl = new LFOLVL();
|
||||||
}
|
lfolvl._iStartAt = Utils.convertBytesToInt(plflfo, offset);
|
||||||
_pllfo[x]._levels[y] = lfolvl;
|
lfolvl._ilvl = Utils.convertBytesToInt(plflfo, offset + 4);
|
||||||
|
lfolvl._fStartAt = StyleSheet.getFlag(lfolvl._ilvl & 0x10);
|
||||||
|
lfolvl._fFormatting = StyleSheet.getFlag(lfolvl._ilvl & 0x20);
|
||||||
|
lfolvl._ilvl = (lfolvl._ilvl & (byte)0x0f);
|
||||||
|
lfolvlNum++;
|
||||||
|
|
||||||
|
if(lfolvl._fFormatting)
|
||||||
|
{
|
||||||
|
// The size of a LFOLVL is 8 bytes.
|
||||||
|
offset = lfolvlOffset + (lfolvlNum * 8) + lvlOffset;
|
||||||
|
lfolvl._override = new LVL();
|
||||||
|
lvlOffset += createLVL(plflfo, offset, lfolvl._override);
|
||||||
|
}
|
||||||
|
_pllfo[x]._levels[y] = lfolvl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private int createLVL(byte[] data, int offset, LVL lvl)
|
private int createLVL(byte[] data, int offset, LVL lvl)
|
||||||
{
|
{
|
||||||
|
int startingOffset = offset;
|
||||||
lvl._iStartAt = Utils.convertBytesToInt(data, offset);
|
lvl._iStartAt = Utils.convertBytesToInt(data, offset);
|
||||||
lvl._nfc = data[offset + 4];
|
offset += 4;
|
||||||
int code = Utils.convertBytesToInt(data, offset + 5);
|
lvl._nfc = data[offset++];
|
||||||
|
byte code = data[offset++];
|
||||||
lvl._jc = (byte)(code & 0x03);
|
lvl._jc = (byte)(code & 0x03);
|
||||||
lvl._fLegal = StyleSheet.getFlag(code & 0x04);
|
lvl._fLegal = StyleSheet.getFlag(code & 0x04);
|
||||||
lvl._fNoRestart = StyleSheet.getFlag(code & 0x08);
|
lvl._fNoRestart = StyleSheet.getFlag(code & 0x08);
|
||||||
lvl._fPrev = StyleSheet.getFlag(code & 0x10);
|
lvl._fPrev = StyleSheet.getFlag(code & 0x10);
|
||||||
lvl._fPrevSpace = StyleSheet.getFlag(code & 0x20);
|
lvl._fPrevSpace = StyleSheet.getFlag(code & 0x20);
|
||||||
lvl._fWord6 = StyleSheet.getFlag(code & 0x40);
|
lvl._fWord6 = StyleSheet.getFlag(code & 0x40);
|
||||||
System.arraycopy(data, offset + 6, lvl._rgbxchNums, 0, 9);
|
|
||||||
lvl._ixchFollow = data[offset + 15];
|
// rgbxchNums - This array should be zero terminated unless it is full
|
||||||
int chpxSize = data[offset + 24];
|
// (all 9 levels full).
|
||||||
int papxSize = data[offset + 25];
|
System.arraycopy(data, offset, lvl._rgbxchNums, 0, 9);
|
||||||
|
offset += 9;
|
||||||
|
|
||||||
|
lvl._ixchFollow = data[offset++];
|
||||||
|
|
||||||
|
if (lvl._fWord6)
|
||||||
|
{
|
||||||
|
lvl._dxaSpace = Utils.convertBytesToInt(data, offset);
|
||||||
|
lvl._dxaIndent = Utils.convertBytesToInt(data, offset + 4);
|
||||||
|
}
|
||||||
|
offset += 8;
|
||||||
|
|
||||||
|
int chpxSize = data[offset++];
|
||||||
|
int papxSize = data[offset++];
|
||||||
lvl._chpx = new byte[chpxSize];
|
lvl._chpx = new byte[chpxSize];
|
||||||
lvl._papx = new byte[papxSize];
|
lvl._papx = new byte[papxSize];
|
||||||
System.arraycopy(data, offset + 28, lvl._papx, 0, papxSize);
|
|
||||||
System.arraycopy(data, offset + 28 + papxSize, lvl._chpx, 0, chpxSize);
|
System.arraycopy(data, offset, lvl._chpx, 0, chpxSize);
|
||||||
offset += 28 + papxSize + chpxSize;//modify offset
|
System.arraycopy(data, offset + chpxSize, lvl._papx, 0, papxSize);
|
||||||
|
|
||||||
|
offset += papxSize + chpxSize + 2; //don't forget to skip reserved word
|
||||||
int xstSize = Utils.convertBytesToShort(data, offset);
|
int xstSize = Utils.convertBytesToShort(data, offset);
|
||||||
|
offset += 2;
|
||||||
lvl._xst = new char[xstSize];
|
lvl._xst = new char[xstSize];
|
||||||
|
|
||||||
offset += 2;
|
|
||||||
for(int x = 0; x < xstSize; x++)
|
for(int x = 0; x < xstSize; x++)
|
||||||
{
|
{
|
||||||
lvl._xst[x] = (char)Utils.convertBytesToShort(data, offset + (x * 2));
|
lvl._xst[x] = (char)Utils.convertBytesToShort(data, offset + (x * 2));
|
||||||
}
|
}
|
||||||
return 28 + papxSize + chpxSize + 2 + (xstSize * 2);
|
return offset + (xstSize * 2) - startingOffset;
|
||||||
}
|
}
|
||||||
}
|
}
|
File diff suppressed because it is too large
Load Diff
@ -247,7 +247,13 @@
|
|||||||
<field type="int" size="4" name="lcbSttbAutoCaption"/>
|
<field type="int" size="4" name="lcbSttbAutoCaption"/>
|
||||||
<field type="int" size="4" name="fcPlcfwkb"/>
|
<field type="int" size="4" name="fcPlcfwkb"/>
|
||||||
<field type="int" size="4" name="lcbPlcfwkb"/>
|
<field type="int" size="4" name="lcbPlcfwkb"/>
|
||||||
<field type="int" size="4" name="fcPlcfsplfcPlcfspl"/>
|
<!--
|
||||||
|
possible typo - was
|
||||||
|
<field type="int" size="4" name="fcPlcfsplfcPlcfspl"/>
|
||||||
|
|
||||||
|
documented as fcPlcfspl in MS Word Binary Format doc
|
||||||
|
-->
|
||||||
|
<field type="int" size="4" name="fcPlcfspl"/>
|
||||||
<field type="int" size="4" name="lcbPlcfspl"/>
|
<field type="int" size="4" name="lcbPlcfspl"/>
|
||||||
|
|
||||||
<field type="int" size="4" name="fcPlcftxbxTxt"/>
|
<field type="int" size="4" name="fcPlcftxbxTxt"/>
|
||||||
@ -265,7 +271,12 @@
|
|||||||
<field type="int" size="4" name="cbSttbttmbd"/>
|
<field type="int" size="4" name="cbSttbttmbd"/>
|
||||||
<field type="int" size="4" name="fcUnused"/>
|
<field type="int" size="4" name="fcUnused"/>
|
||||||
<field type="int" size="4" name="lcbUnused"/>
|
<field type="int" size="4" name="lcbUnused"/>
|
||||||
<field type="int" size="4" name="rgpgdbkd"/>
|
<!--
|
||||||
|
Bug - this field is meant to be an array that "overlays"
|
||||||
|
the following fields. See MS Word Binary Format doc
|
||||||
|
for details.
|
||||||
|
<field type="int" size="4" name="rgpgdbkd"/>
|
||||||
|
-->
|
||||||
<field type="int" size="4" name="fcPgdMother"/>
|
<field type="int" size="4" name="fcPgdMother"/>
|
||||||
<field type="int" size="4" name="lcbPgdMother"/>
|
<field type="int" size="4" name="lcbPgdMother"/>
|
||||||
<field type="int" size="4" name="fcBkdMother"/>
|
<field type="int" size="4" name="fcBkdMother"/>
|
||||||
@ -318,7 +329,12 @@
|
|||||||
<field type="int" size="4" name="lcbPlcocx"/>
|
<field type="int" size="4" name="lcbPlcocx"/>
|
||||||
<field type="int" size="4" name="fcPlcfbteLvc"/>
|
<field type="int" size="4" name="fcPlcfbteLvc"/>
|
||||||
<field type="int" size="4" name="lcbPlcfbteLvc"/>
|
<field type="int" size="4" name="lcbPlcfbteLvc"/>
|
||||||
<field type="int" size="4" name="ftModified"/>
|
<!--
|
||||||
|
Bug - this field is meant to "overlay" the following
|
||||||
|
two fields. See MS Word Binary Format doc
|
||||||
|
for details.
|
||||||
|
<field type="int" size="4" name="ftModified"/>
|
||||||
|
-->
|
||||||
<field type="int" size="4" name="dwLowDateTime"/>
|
<field type="int" size="4" name="dwLowDateTime"/>
|
||||||
<field type="int" size="4" name="dwHighDateTime"/>
|
<field type="int" size="4" name="dwHighDateTime"/>
|
||||||
<field type="int" size="4" name="fcPlcflvc"/>
|
<field type="int" size="4" name="fcPlcflvc"/>
|
||||||
|
Loading…
Reference in New Issue
Block a user