You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2012/04/17 21:34:37 UTC
svn commit: r1327241 - in
/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf:
GlyfCompositeComp.java GlyfCompositeDescript.java
Author: leleueri
Date: Tue Apr 17 19:34:37 2012
New Revision: 1327241
URL: http://svn.apache.org/viewvc?rev=1327241&view=rev
Log:
PDFBOX-490 & PDFBOX-1265 : read glyphIndex as UnsignedShort to avoid negative index & fix a null pointer
Modified:
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/GlyfCompositeComp.java
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/GlyfCompositeDescript.java
Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/GlyfCompositeComp.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/GlyfCompositeComp.java?rev=1327241&r1=1327240&r2=1327241&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/GlyfCompositeComp.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/GlyfCompositeComp.java Tue Apr 17 19:34:37 2012
@@ -91,7 +91,7 @@ public class GlyfCompositeComp
protected GlyfCompositeComp(TTFDataStream bais) throws IOException
{
flags = bais.readSignedShort();
- glyphIndex = bais.readSignedShort();
+ glyphIndex = bais.readUnsignedShort();// number of glyph in a font is uint16
// Get the arguments as just their raw values
if ((flags & ARG_1_AND_2_ARE_WORDS) != 0)
Modified: pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/GlyfCompositeDescript.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/GlyfCompositeDescript.java?rev=1327241&r1=1327240&r2=1327241&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/GlyfCompositeDescript.java (original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/ttf/GlyfCompositeDescript.java Tue Apr 17 19:34:37 2012
@@ -34,223 +34,225 @@ import java.util.List;
public class GlyfCompositeDescript extends GlyfDescript
{
- private List<GlyfCompositeComp> components = new ArrayList<GlyfCompositeComp>();
- private GlyphData[] glyphs = null;
- private boolean beingResolved = false;
- private boolean resolved = false;
-
- /**
- * Constructor.
- *
- * @param bais the stream to be read
- * @param glyphTable the Glyphtable containing all glyphs
- * @throws IOException is thrown if something went wrong
- */
- public GlyfCompositeDescript(TTFDataStream bais, GlyphTable glyphTable) throws IOException
- {
- super((short) -1, bais);
-
- glyphs = glyphTable.getGlyphs();
-
- // Get all of the composite components
- GlyfCompositeComp comp;
- do
- {
- comp = new GlyfCompositeComp(bais);
- components.add(comp);
- }
- while ((comp.getFlags() & GlyfCompositeComp.MORE_COMPONENTS) != 0);
-
- // Are there hinting instructions to read?
- if ((comp.getFlags() & GlyfCompositeComp.WE_HAVE_INSTRUCTIONS) != 0)
- {
- readInstructions(bais, (bais.read()<<8 | bais.read()));
- }
- }
-
- /**
- * {@inheritDoc}
- */
- public void resolve()
- {
- if (resolved)
- {
- return;
- }
- if (beingResolved)
- {
- System.err.println("Circular reference in GlyfCompositeDesc");
- return;
- }
- beingResolved = true;
-
- int firstIndex = 0;
- int firstContour = 0;
-
- Iterator<GlyfCompositeComp> i = components.iterator();
- while (i.hasNext())
- {
- GlyfCompositeComp comp = (GlyfCompositeComp)i.next();
- comp.setFirstIndex(firstIndex);
- comp.setFirstContour(firstContour);
-
- GlyphDescription desc;
- desc = getGlypDescription(comp.getGlyphIndex());
- if (desc != null)
- {
- desc.resolve();
- firstIndex += desc.getPointCount();
- firstContour += desc.getContourCount();
- }
- }
- resolved = true;
- beingResolved = false;
- }
-
- /**
- * {@inheritDoc}
- */
- public int getEndPtOfContours(int i)
- {
- GlyfCompositeComp c = getCompositeCompEndPt(i);
- if (c != null)
- {
- GlyphDescription gd = getGlypDescription(c.getGlyphIndex());
- return gd.getEndPtOfContours(i - c.getFirstContour()) + c.getFirstIndex();
- }
- return 0;
- }
-
- /**
- * {@inheritDoc}
- */
- public byte getFlags(int i)
- {
- GlyfCompositeComp c = getCompositeComp(i);
- if (c != null)
- {
- GlyphDescription gd = getGlypDescription(c.getGlyphIndex());
- return gd.getFlags(i - c.getFirstIndex());
- }
- return 0;
- }
-
- /**
- * {@inheritDoc}
- */
- public short getXCoordinate(int i)
- {
- GlyfCompositeComp c = getCompositeComp(i);
- if (c != null)
- {
- GlyphDescription gd = getGlypDescription(c.getGlyphIndex());
- int n = i - c.getFirstIndex();
- int x = gd.getXCoordinate(n);
- int y = gd.getYCoordinate(n);
- short x1 = (short) c.scaleX(x, y);
- x1 += c.getXTranslate();
- return x1;
- }
- return 0;
- }
-
- /**
- * {@inheritDoc}
- */
- public short getYCoordinate(int i)
- {
- GlyfCompositeComp c = getCompositeComp(i);
- if (c != null)
- {
- GlyphDescription gd = getGlypDescription(c.getGlyphIndex());
- int n = i - c.getFirstIndex();
- int x = gd.getXCoordinate(n);
- int y = gd.getYCoordinate(n);
- short y1 = (short) c.scaleY(x, y);
- y1 += c.getYTranslate();
- return y1;
- }
- return 0;
- }
-
- /**
- * {@inheritDoc}
- */
- public boolean isComposite()
- {
- return true;
- }
-
- /**
- * {@inheritDoc}
- */
- public int getPointCount()
- {
- if (!resolved)
- {
- System.err.println("getPointCount called on unresolved GlyfCompositeDescript");
- }
- GlyfCompositeComp c = (GlyfCompositeComp) components.get(components.size()-1);
- return c.getFirstIndex() + getGlypDescription(c.getGlyphIndex()).getPointCount();
- }
-
- /**
- * {@inheritDoc}
- */
- public int getContourCount()
- {
- if (!resolved)
- {
- System.err.println("getContourCount called on unresolved GlyfCompositeDescript");
- }
- GlyfCompositeComp c = (GlyfCompositeComp) components.get(components.size()-1);
- return c.getFirstContour() + getGlypDescription(c.getGlyphIndex()).getContourCount();
- }
-
- /**
- * {@inheritDoc}
- */
- public int getComponentCount()
- {
- return components.size();
- }
-
- private GlyfCompositeComp getCompositeComp(int i)
- {
- GlyfCompositeComp c;
- for (int n = 0; n < components.size(); n++)
- {
- c = (GlyfCompositeComp) components.get(n);
- GlyphDescription gd = getGlypDescription(c.getGlyphIndex());
- if (c.getFirstIndex() <= i && i < (c.getFirstIndex() + gd.getPointCount()))
- {
- return c;
- }
- }
- return null;
- }
-
- private GlyfCompositeComp getCompositeCompEndPt(int i)
- {
- GlyfCompositeComp c;
- for (int j = 0; j < components.size(); j++)
- {
- c = (GlyfCompositeComp) components.get(j);
- GlyphDescription gd = getGlypDescription(c.getGlyphIndex());
- if (c.getFirstContour() <= i && i < (c.getFirstContour() + gd.getContourCount()))
- {
- return c;
- }
- }
- return null;
- }
-
- private GlyphDescription getGlypDescription(int index)
- {
- if (glyphs != null && index < glyphs.length)
- {
- return glyphs[index].getDescription();
- }
- return null;
- }
+ private List<GlyfCompositeComp> components = new ArrayList<GlyfCompositeComp>();
+ private GlyphData[] glyphs = null;
+ private boolean beingResolved = false;
+ private boolean resolved = false;
+
+ /**
+ * Constructor.
+ *
+ * @param bais the stream to be read
+ * @param glyphTable the Glyphtable containing all glyphs
+ * @throws IOException is thrown if something went wrong
+ */
+ public GlyfCompositeDescript(TTFDataStream bais, GlyphTable glyphTable) throws IOException
+ {
+ super((short) -1, bais);
+
+ glyphs = glyphTable.getGlyphs();
+
+ // Get all of the composite components
+ GlyfCompositeComp comp;
+ do
+ {
+ comp = new GlyfCompositeComp(bais);
+ components.add(comp);
+ }
+ while ((comp.getFlags() & GlyfCompositeComp.MORE_COMPONENTS) != 0);
+
+ // Are there hinting instructions to read?
+ if ((comp.getFlags() & GlyfCompositeComp.WE_HAVE_INSTRUCTIONS) != 0)
+ {
+ readInstructions(bais, (bais.read()<<8 | bais.read()));
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void resolve()
+ {
+ if (resolved)
+ {
+ return;
+ }
+ if (beingResolved)
+ {
+ System.err.println("Circular reference in GlyfCompositeDesc");
+ return;
+ }
+ beingResolved = true;
+
+ int firstIndex = 0;
+ int firstContour = 0;
+
+ Iterator<GlyfCompositeComp> i = components.iterator();
+ while (i.hasNext())
+ {
+ GlyfCompositeComp comp = (GlyfCompositeComp)i.next();
+ comp.setFirstIndex(firstIndex);
+ comp.setFirstContour(firstContour);
+
+ GlyphDescription desc;
+ desc = getGlypDescription(comp.getGlyphIndex());
+ if (desc != null)
+ {
+ desc.resolve();
+ firstIndex += desc.getPointCount();
+ firstContour += desc.getContourCount();
+ }
+ }
+ resolved = true;
+ beingResolved = false;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public int getEndPtOfContours(int i)
+ {
+ GlyfCompositeComp c = getCompositeCompEndPt(i);
+ if (c != null)
+ {
+ GlyphDescription gd = getGlypDescription(c.getGlyphIndex());
+ return gd.getEndPtOfContours(i - c.getFirstContour()) + c.getFirstIndex();
+ }
+ return 0;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public byte getFlags(int i)
+ {
+ GlyfCompositeComp c = getCompositeComp(i);
+ if (c != null)
+ {
+ GlyphDescription gd = getGlypDescription(c.getGlyphIndex());
+ return gd.getFlags(i - c.getFirstIndex());
+ }
+ return 0;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public short getXCoordinate(int i)
+ {
+ GlyfCompositeComp c = getCompositeComp(i);
+ if (c != null)
+ {
+ GlyphDescription gd = getGlypDescription(c.getGlyphIndex());
+ int n = i - c.getFirstIndex();
+ int x = gd.getXCoordinate(n);
+ int y = gd.getYCoordinate(n);
+ short x1 = (short) c.scaleX(x, y);
+ x1 += c.getXTranslate();
+ return x1;
+ }
+ return 0;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public short getYCoordinate(int i)
+ {
+ GlyfCompositeComp c = getCompositeComp(i);
+ if (c != null)
+ {
+ GlyphDescription gd = getGlypDescription(c.getGlyphIndex());
+ int n = i - c.getFirstIndex();
+ int x = gd.getXCoordinate(n);
+ int y = gd.getYCoordinate(n);
+ short y1 = (short) c.scaleY(x, y);
+ y1 += c.getYTranslate();
+ return y1;
+ }
+ return 0;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isComposite()
+ {
+ return true;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public int getPointCount()
+ {
+ if (!resolved)
+ {
+ System.err.println("getPointCount called on unresolved GlyfCompositeDescript");
+ }
+ GlyfCompositeComp c = (GlyfCompositeComp) components.get(components.size()-1);
+ return c.getFirstIndex() + getGlypDescription(c.getGlyphIndex()).getPointCount();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public int getContourCount()
+ {
+ if (!resolved)
+ {
+ System.err.println("getContourCount called on unresolved GlyfCompositeDescript");
+ }
+ GlyfCompositeComp c = (GlyfCompositeComp) components.get(components.size()-1);
+ return c.getFirstContour() + getGlypDescription(c.getGlyphIndex()).getContourCount();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public int getComponentCount()
+ {
+ return components.size();
+ }
+
+ private GlyfCompositeComp getCompositeComp(int i)
+ {
+ GlyfCompositeComp c;
+ for (int n = 0; n < components.size(); n++)
+ {
+ c = (GlyfCompositeComp) components.get(n);
+ GlyphDescription gd = getGlypDescription(c.getGlyphIndex());
+ if (c.getFirstIndex() <= i && i < (c.getFirstIndex() + gd.getPointCount()))
+ {
+ return c;
+ }
+ }
+ return null;
+ }
+
+ private GlyfCompositeComp getCompositeCompEndPt(int i)
+ {
+ GlyfCompositeComp c;
+ for (int j = 0; j < components.size(); j++)
+ {
+ c = (GlyfCompositeComp) components.get(j);
+ GlyphDescription gd = getGlypDescription(c.getGlyphIndex());
+ if (c.getFirstContour() <= i && i < (c.getFirstContour() + gd.getContourCount()))
+ {
+ return c;
+ }
+ }
+ return null;
+ }
+
+ private GlyphDescription getGlypDescription(int index)
+ {
+ if (glyphs != null && index < glyphs.length)
+ {
+ GlyphData glyph = glyphs[index];
+ if (glyph != null)
+ return glyph.getDescription();
+ }
+ return null;
+ }
}