diff --git a/src/main/java/org/verapdf/pd/font/type3/PDType3Font.java b/src/main/java/org/verapdf/pd/font/type3/PDType3Font.java index d4f80ac5..6d48b4f6 100644 --- a/src/main/java/org/verapdf/pd/font/type3/PDType3Font.java +++ b/src/main/java/org/verapdf/pd/font/type3/PDType3Font.java @@ -157,4 +157,30 @@ public float getWidthFromProgram(int code) { public boolean glyphIsPresent(int code) { return containsCharString(code); } + + public Double getAscentFromProgram(int code) { + COSObject charProc = getCharProc(code); + if (charProc.getType() == COSObjType.COS_STREAM) { + try (Type3CharProcParser parser = new Type3CharProcParser(charProc.getData(COSStream.FilterFlags.DECODE))) { + parser.parse(); + return parser.getAscent(); + } catch (IOException e) { + LOGGER.log(Level.FINE, "Can't get ascent from type 3 char proc"); + } + } + return null; + } + + public Double getDescentFromProgram(int code) { + COSObject charProc = getCharProc(code); + if (charProc.getType() == COSObjType.COS_STREAM) { + try (Type3CharProcParser parser = new Type3CharProcParser(charProc.getData(COSStream.FilterFlags.DECODE))) { + parser.parse(); + return parser.getDescent(); + } catch (IOException e) { + LOGGER.log(Level.FINE, "Can't get descent from type 3 char proc"); + } + } + return null; + } } diff --git a/src/main/java/org/verapdf/pd/font/type3/Type3CharProcParser.java b/src/main/java/org/verapdf/pd/font/type3/Type3CharProcParser.java index 8efa183f..8e711b57 100644 --- a/src/main/java/org/verapdf/pd/font/type3/Type3CharProcParser.java +++ b/src/main/java/org/verapdf/pd/font/type3/Type3CharProcParser.java @@ -34,6 +34,8 @@ public class Type3CharProcParser extends NotSeekableBaseParser { private double width = -1; + private Double ascent; + private Double descent; private static final String D0 = "d0"; private static final String D1 = "d1"; @@ -64,12 +66,20 @@ public void parse() throws IOException { } // else ll_x nextToken(); // ll_y + if (getToken().type == Token.Type.TT_INTEGER || getToken().type == Token.Type.TT_REAL) { + this.descent = getToken().real; + } nextToken(); // ur_x nextToken(); // ur_y + if (getToken().type == Token.Type.TT_INTEGER || getToken().type == Token.Type.TT_REAL) { + this.ascent = getToken().real; + } nextToken(); // d1 if (getToken().type != Token.Type.TT_KEYWORD || !getToken().getValue().equals(D1)) { // stream is corrupted this.width = -1; + this.ascent = null; + this.descent = null; throw new IOException("Can't parse type 3 char proc"); } } @@ -81,4 +91,12 @@ public void parse() throws IOException { public double getWidth() { return width; } + + public double getAscent() { + return ascent; + } + + public double getDescent() { + return descent; + } }