diff --git a/validation-model/src/main/java/org/verapdf/gf/model/factory/fonts/FontFactory.java b/validation-model/src/main/java/org/verapdf/gf/model/factory/fonts/FontFactory.java index 8c66f0208..2077f4fbf 100644 --- a/validation-model/src/main/java/org/verapdf/gf/model/factory/fonts/FontFactory.java +++ b/validation-model/src/main/java/org/verapdf/gf/model/factory/fonts/FontFactory.java @@ -56,7 +56,7 @@ private FontFactory() { // Disable default constructor } - public static PDFont parseFont(org.verapdf.pd.font.PDFont rawFont, RenderingMode renderingMode, + public static PDFont parseFont(org.verapdf.pd.font.PDFont rawFont, String fontResourceName, RenderingMode renderingMode, PDResourcesHandler resources, GraphicState inheritedGraphicState) { if (rawFont == null) { return new GFPDEmptyFont(); @@ -64,21 +64,21 @@ public static PDFont parseFont(org.verapdf.pd.font.PDFont rawFont, RenderingMode if (TYPE_3.equals(rawFont.getSubtype().getValue())) { PDResources fontResources = ((PDType3Font) rawFont).getResources(); PDResourcesHandler pdResources = resources.getExtendedResources(fontResources); - return new GFPDType3Font((PDType3Font) rawFont, renderingMode, pdResources, inheritedGraphicState); + return new GFPDType3Font((PDType3Font) rawFont, renderingMode, pdResources, inheritedGraphicState, fontResourceName); } String id = GFIDGenerator.generateID(rawFont, renderingMode); PDFont res = StaticContainers.getCachedFonts().get(id); if (res == null) { switch (rawFont.getSubtype().getValue()) { case TYPE_0: - res = new GFPDType0Font((PDType0Font) rawFont, renderingMode); + res = new GFPDType0Font((PDType0Font) rawFont, renderingMode, fontResourceName); break; case TYPE_1: case MM_TYPE_1: - res = new GFPDType1Font((PDType1Font) rawFont, renderingMode); + res = new GFPDType1Font((PDType1Font) rawFont, renderingMode, fontResourceName); break; case TRUE_TYPE: - res = new GFPDTrueTypeFont((PDTrueTypeFont) rawFont, renderingMode); + res = new GFPDTrueTypeFont((PDTrueTypeFont) rawFont, renderingMode, fontResourceName); break; } StaticContainers.getCachedFonts().put(id, res); diff --git a/validation-model/src/main/java/org/verapdf/gf/model/factory/operators/GraphicState.java b/validation-model/src/main/java/org/verapdf/gf/model/factory/operators/GraphicState.java index 52e7806a8..2bcf6d22b 100644 --- a/validation-model/src/main/java/org/verapdf/gf/model/factory/operators/GraphicState.java +++ b/validation-model/src/main/java/org/verapdf/gf/model/factory/operators/GraphicState.java @@ -38,6 +38,7 @@ public class GraphicState implements Cloneable { private PDColorSpace strokeLastPatternUnderlyingColorSpace = null; private RenderingMode renderingMode = RenderingMode.FILL; private PDFont font; + private String fontResourceName; private boolean overprintingFlagStroke = false; private boolean overprintingFlagNonStroke = false; private int opm = 0; @@ -101,6 +102,14 @@ public void setFont(PDFont font) { this.font = font; } + public String getFontResourceName() { + return fontResourceName; + } + + public void setFontResourceName(String fontResourceName) { + this.fontResourceName = fontResourceName; + } + public Double getScaleFactor() { return scaleFactor; } @@ -157,6 +166,7 @@ public void copyProperties(GraphicState graphicState) { this.strokeLastPatternUnderlyingColorSpace = graphicState.getStrokeLastPatternUnderlyingColorSpace(); this.renderingMode = graphicState.getRenderingMode(); this.font = graphicState.getFont(); + this.fontResourceName = graphicState.getFontResourceName(); this.overprintingFlagStroke = graphicState.isOverprintingFlagStroke(); this.overprintingFlagNonStroke = graphicState.isOverprintingFlagNonStroke(); this.opm = graphicState.getOpm(); @@ -170,6 +180,7 @@ public void copyPropertiesFormExtGState(PDExtGState extGState) { if (font != null) { this.font = font; } + this.fontResourceName = null; COSNumber fontSize = extGState.getCOSFontSize(); if (fontSize != null) { this.scaleFactor = fontSize.getReal(); @@ -198,6 +209,7 @@ protected GraphicState clone() { clone.strokeLastPatternUnderlyingColorSpace = this.strokeLastPatternUnderlyingColorSpace; clone.renderingMode = this.renderingMode; clone.font = this.font; + clone.fontResourceName = this.fontResourceName; clone.scaleFactor = this.scaleFactor; clone.overprintingFlagStroke = this.overprintingFlagStroke; clone.overprintingFlagNonStroke = this.overprintingFlagNonStroke; diff --git a/validation-model/src/main/java/org/verapdf/gf/model/factory/operators/OperatorParser.java b/validation-model/src/main/java/org/verapdf/gf/model/factory/operators/OperatorParser.java index 775050d5b..3a30cb60d 100644 --- a/validation-model/src/main/java/org/verapdf/gf/model/factory/operators/OperatorParser.java +++ b/validation-model/src/main/java/org/verapdf/gf/model/factory/operators/OperatorParser.java @@ -368,7 +368,11 @@ void parseOperator(List processedOperators, processedOperators.add(new GFOp_Tr(arguments)); break; case Operators.TF: - this.graphicState.setFont(resourcesHandler.getFont(getFirstCOSName(arguments))); + COSName fontResourceName = getFirstCOSName(arguments); + if (fontResourceName != null) { + this.graphicState.setFontResourceName(fontResourceName.getString()); + } + this.graphicState.setFont(resourcesHandler.getFont(fontResourceName)); if (arguments.size() > 1) { COSBase scaleFactor = arguments.get(1); if (scaleFactor.getType().isNumber()) { diff --git a/validation-model/src/main/java/org/verapdf/gf/model/impl/operator/textshow/GFOpTextShow.java b/validation-model/src/main/java/org/verapdf/gf/model/impl/operator/textshow/GFOpTextShow.java index 9149c782f..693b800d8 100644 --- a/validation-model/src/main/java/org/verapdf/gf/model/impl/operator/textshow/GFOpTextShow.java +++ b/validation-model/src/main/java/org/verapdf/gf/model/impl/operator/textshow/GFOpTextShow.java @@ -69,6 +69,7 @@ public abstract class GFOpTextShow extends GFOperator implements OpTextShow { public static final String STROKE_COLOR_SPACE = "strokeCS"; private final org.verapdf.pd.font.PDFont font; + private final String fontResourceName; private final Double scaleFactor; private final RenderingMode renderingMode; @@ -90,6 +91,7 @@ protected GFOpTextShow(List arguments, GraphicState state, PDResourcesH boolean isRealContent, final String opType) { super(arguments, opType); this.font = state.getFont(); + this.fontResourceName = state.getFontResourceName(); this.scaleFactor = state.getScaleFactor(); this.renderingMode = state.getRenderingMode(); this.resourcesHandler = resourcesHandler; @@ -190,7 +192,7 @@ public org.verapdf.model.pdlayer.PDColorSpace getVeraModelStrokeColorSpace() { } private List parseFont() { - PDFont font = FontFactory.parseFont(this.font, renderingMode, this.resourcesHandler, this.inheritedGraphicState); + PDFont font = FontFactory.parseFont(this.font, this.fontResourceName, renderingMode, this.resourcesHandler, this.inheritedGraphicState); if (font != null) { List result = new ArrayList<>(MAX_NUMBER_OF_ELEMENTS); result.add(font); diff --git a/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDCIDFont.java b/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDCIDFont.java index 5a771285c..1d0deba15 100644 --- a/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDCIDFont.java +++ b/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDCIDFont.java @@ -57,8 +57,8 @@ public class GFPDCIDFont extends GFPDFont implements PDCIDFont { public static final int bufferSize = 2048; private final String externalFontID; - public GFPDCIDFont(PDFont font, RenderingMode renderingMode, String externalFontID) { - super(font, renderingMode, CID_FONT_TYPE); + public GFPDCIDFont(PDFont font, RenderingMode renderingMode, String externalFontID, String fontResourceName) { + super(font, renderingMode, fontResourceName, CID_FONT_TYPE); this.externalFontID = externalFontID; if (font != null) { FontProgram program = font.getFontProgram(); diff --git a/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDEmptyFont.java b/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDEmptyFont.java index 50b7843d5..6b550b342 100644 --- a/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDEmptyFont.java +++ b/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDEmptyFont.java @@ -31,7 +31,7 @@ public class GFPDEmptyFont extends GFPDFont { public GFPDEmptyFont() { - super(null, RenderingMode.NEITHER, RESOURCE_TYPE); + super(null, RenderingMode.NEITHER, null, RESOURCE_TYPE); } @Override diff --git a/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDFont.java b/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDFont.java index b3e34b825..9f32a4d7d 100644 --- a/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDFont.java +++ b/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDFont.java @@ -50,11 +50,13 @@ public class GFPDFont extends GFPDResource implements PDFont { protected boolean fontProgramParsed; protected final RenderingMode renderingMode; + private final String resourceName; protected GFPDFont(org.verapdf.pd.font.PDFont font, - RenderingMode renderingMode, final String type) { + RenderingMode renderingMode, String resourceName, final String type) { super(font, type); this.renderingMode = renderingMode; + this.resourceName = resourceName; } /** @@ -189,4 +191,9 @@ private List getBaseFont() { public Encoding getEncodingMapping() { return this.pdFont.getEncodingMapping(); } + + @Override + public String getExtraContext() { + return resourceName; + } } diff --git a/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDSimpleFont.java b/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDSimpleFont.java index effb71e01..a4b486c1a 100644 --- a/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDSimpleFont.java +++ b/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDSimpleFont.java @@ -34,8 +34,8 @@ public abstract class GFPDSimpleFont extends GFPDFont implements PDSimpleFont { protected GFPDSimpleFont(org.verapdf.pd.font.PDSimpleFont font, - RenderingMode renderingMode, final String type) { - super(font, renderingMode, type); + RenderingMode renderingMode, String fontResourceName, final String type) { + super(font, renderingMode, fontResourceName, type); } /** diff --git a/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDTrueTypeFont.java b/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDTrueTypeFont.java index e88408d69..e27730758 100644 --- a/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDTrueTypeFont.java +++ b/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDTrueTypeFont.java @@ -47,8 +47,8 @@ public class GFPDTrueTypeFont extends GFPDSimpleFont implements PDTrueTypeFont { public static final String TRUETYPE_FONT_TYPE = "PDTrueTypeFont"; public GFPDTrueTypeFont(org.verapdf.pd.font.truetype.PDTrueTypeFont font, - RenderingMode renderingMode) { - super(font, renderingMode, TRUETYPE_FONT_TYPE); + RenderingMode renderingMode, String fontResourceName) { + super(font, renderingMode, fontResourceName, TRUETYPE_FONT_TYPE); if (font != null) { this.fontProgramParsed = font.parseFontProgram(); } diff --git a/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDType0Font.java b/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDType0Font.java index cab254b34..09aed8913 100644 --- a/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDType0Font.java +++ b/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDType0Font.java @@ -54,8 +54,8 @@ public class GFPDType0Font extends GFPDFont implements PDType0Font { private final PDCIDFont descendantFont; private org.verapdf.pd.font.PDCIDFont cidFont; - public GFPDType0Font(org.verapdf.pd.font.PDType0Font font, RenderingMode renderingMode) { - super(font, renderingMode, TYPE_0_FONT_TYPE); + public GFPDType0Font(org.verapdf.pd.font.PDType0Font font, RenderingMode renderingMode, String fontResourceName) { + super(font, renderingMode, fontResourceName, TYPE_0_FONT_TYPE); this.descendantFont = this.calculateDescendantFont(); ((org.verapdf.pd.font.PDType0Font) this.pdFont).setFontProgramFromDescendant(this.cidFont); this.fontProgramParsed = this.descendantFont != null @@ -98,7 +98,7 @@ private PDCIDFont calculateDescendantFont() { ((org.verapdf.pd.font.PDType0Font) this.pdFont).getCMap().getCMapFile(), this.pdFont.getFontProgram(), this.pdFont.isSuccessfullyParsed()); this.cidFont = cidFont; - return new GFPDCIDFont(cidFont, renderingMode, GFIDGenerator.generateID(this.pdFont)); + return new GFPDCIDFont(cidFont, renderingMode, GFIDGenerator.generateID(this.pdFont), null); } return null; } diff --git a/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDType1Font.java b/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDType1Font.java index 73edea0b0..3feb6a53c 100644 --- a/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDType1Font.java +++ b/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDType1Font.java @@ -56,8 +56,8 @@ public class GFPDType1Font extends GFPDSimpleFont implements PDType1Font { public static final String NOTDEF_STRING = ".notdef"; public GFPDType1Font(org.verapdf.pd.font.type1.PDType1Font pdFont, - RenderingMode renderingMode) { - super(pdFont, renderingMode, TYPE1_FONT_TYPE); + RenderingMode renderingMode, String fontResourceName) { + super(pdFont, renderingMode, fontResourceName, TYPE1_FONT_TYPE); if (pdFont != null) { FontProgram program = pdFont.getFontProgram(); if (program != null) { diff --git a/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDType3Font.java b/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDType3Font.java index eae9a8846..d01476451 100644 --- a/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDType3Font.java +++ b/validation-model/src/main/java/org/verapdf/gf/model/impl/pd/font/GFPDType3Font.java @@ -61,8 +61,8 @@ public class GFPDType3Font extends GFPDSimpleFont implements PDType3Font { public GFPDType3Font(org.verapdf.pd.font.type3.PDType3Font font, RenderingMode renderingMode, PDResourcesHandler resources, - GraphicState inheritedGraphicState) { - super(font, renderingMode, TYPE3_FONT_TYPE); + GraphicState inheritedGraphicState, String fontResourceName) { + super(font, renderingMode, fontResourceName, TYPE3_FONT_TYPE); this.resources = resources; this.inheritedGraphicState = inheritedGraphicState; }