You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@pdfbox.apache.org by Petr Slabý <sl...@kadel.cz> on 2014/01/30 11:34:13 UTC
Bug in GlyphTable
Hi,
according to https://developer.apple.com/fonts/TTRefMan/RM06/Chap6loca.html, the “loca” table is supposed to contain glyphcount+1 offset. If an index of a glyph is the same as the offset of the previous one, the glyph has no data (does not exist in the font). The code of initData() in GlyphTable expects that each glyph is defined and with a table of offset such as [0,86,.....,86,172,172,....172] ends up in nirvana. There is no glyph at the offset 172 and trying to read it there fails.
The code of initData should therefore be something like:
public void initData( TrueTypeFont ttf, TTFDataStream data ) throws IOException
{
MaximumProfileTable maxp = ttf.getMaximumProfile();
IndexToLocationTable loc = ttf.getIndexToLocation();
long[] offsets = loc.getOffsets();
int numGlyphs = maxp.getNumGlyphs();
glyphs = new GlyphData[numGlyphs];
GlyphData glyph = null;
for( int i=0; i<numGlyphs-1; i++ )
{
long ofs = offsets[i];
long size = offsets[i+1] - ofs;
if(size > 0) {
glyph = new GlyphData();
data.seek( getOffset() + ofs );
glyph.initData( ttf, data );
glyphs[i] = glyph;
}
else {
glyphs[i] = EMPTY_GLYPH;
}
}
}
EMPTY_GLYPH is a constant initialized with an empty GlyfSimpleDescript.
Re: Bug in GlyphTable
Posted by Petr Slabý <sl...@kadel.cz>.
Oops,
I must apologize. The problem I was describing is already fixed in the head
revision of fontbox trunk. I was on an older state.
Sorry again,
Petr.
-----Původní zpráva-----
From: Timo Boehme
Sent: Thursday, January 30, 2014 1:26 PM
To: dev@pdfbox.apache.org
Subject: Re: Bug in GlyphTable
Hi Petr,
thank you for finding this problem and providing a solution.
Could you please open a bug report issue for this on
https://issues.apache.org/jira/browse/PDFBOX
and providing information if the issue is in PDFBOX trunk or another
version?
Ideally you could provide your solution as patch against PDFBOX trunk.
Thanks,
Timo
Am 30.01.2014 11:34, schrieb Petr Slabý:
> Hi,
> according to
> https://developer.apple.com/fonts/TTRefMan/RM06/Chap6loca.html, the “loca”
> table is supposed to contain glyphcount+1 offset. If an index of a glyph
> is the same as the offset of the previous one, the glyph has no data (does
> not exist in the font). The code of initData() in GlyphTable expects that
> each glyph is defined and with a table of offset such as
> [0,86,.....,86,172,172,....172] ends up in nirvana. There is no glyph at
> the offset 172 and trying to read it there fails.
>
> The code of initData should therefore be something like:
> public void initData( TrueTypeFont ttf, TTFDataStream data ) throws
> IOException
> {
> MaximumProfileTable maxp = ttf.getMaximumProfile();
> IndexToLocationTable loc = ttf.getIndexToLocation();
> long[] offsets = loc.getOffsets();
> int numGlyphs = maxp.getNumGlyphs();
> glyphs = new GlyphData[numGlyphs];
> GlyphData glyph = null;
> for( int i=0; i<numGlyphs-1; i++ )
> {
> long ofs = offsets[i];
> long size = offsets[i+1] - ofs;
> if(size > 0) {
> glyph = new GlyphData();
> data.seek( getOffset() + ofs );
> glyph.initData( ttf, data );
> glyphs[i] = glyph;
> }
> else {
> glyphs[i] = EMPTY_GLYPH;
> }
> }
> }
>
> EMPTY_GLYPH is a constant initialized with an empty GlyfSimpleDescript.
>
--
Timo Boehme
OntoChem GmbH
H.-Damerow-Str. 4
06120 Halle/Saale
T: +49 345 4780474
F: +49 345 4780471
timo.boehme@ontochem.com
_____________________________________________________________________
OntoChem GmbH
Geschäftsführer: Dr. Lutz Weber
Sitz: Halle / Saale
Registergericht: Stendal
Registernummer: HRB 215461
_____________________________________________________________________
Re: Bug in GlyphTable
Posted by Timo Boehme <ti...@ontochem.com>.
Hi Petr,
thank you for finding this problem and providing a solution.
Could you please open a bug report issue for this on
https://issues.apache.org/jira/browse/PDFBOX
and providing information if the issue is in PDFBOX trunk or another
version?
Ideally you could provide your solution as patch against PDFBOX trunk.
Thanks,
Timo
Am 30.01.2014 11:34, schrieb Petr Slabý:
> Hi,
> according to https://developer.apple.com/fonts/TTRefMan/RM06/Chap6loca.html, the “loca” table is supposed to contain glyphcount+1 offset. If an index of a glyph is the same as the offset of the previous one, the glyph has no data (does not exist in the font). The code of initData() in GlyphTable expects that each glyph is defined and with a table of offset such as [0,86,.....,86,172,172,....172] ends up in nirvana. There is no glyph at the offset 172 and trying to read it there fails.
>
> The code of initData should therefore be something like:
> public void initData( TrueTypeFont ttf, TTFDataStream data ) throws IOException
> {
> MaximumProfileTable maxp = ttf.getMaximumProfile();
> IndexToLocationTable loc = ttf.getIndexToLocation();
> long[] offsets = loc.getOffsets();
> int numGlyphs = maxp.getNumGlyphs();
> glyphs = new GlyphData[numGlyphs];
> GlyphData glyph = null;
> for( int i=0; i<numGlyphs-1; i++ )
> {
> long ofs = offsets[i];
> long size = offsets[i+1] - ofs;
> if(size > 0) {
> glyph = new GlyphData();
> data.seek( getOffset() + ofs );
> glyph.initData( ttf, data );
> glyphs[i] = glyph;
> }
> else {
> glyphs[i] = EMPTY_GLYPH;
> }
> }
> }
>
> EMPTY_GLYPH is a constant initialized with an empty GlyfSimpleDescript.
>
--
Timo Boehme
OntoChem GmbH
H.-Damerow-Str. 4
06120 Halle/Saale
T: +49 345 4780474
F: +49 345 4780471
timo.boehme@ontochem.com
_____________________________________________________________________
OntoChem GmbH
Geschäftsführer: Dr. Lutz Weber
Sitz: Halle / Saale
Registergericht: Stendal
Registernummer: HRB 215461
_____________________________________________________________________