Browse Source

FOP-2633: Generate bold/italic versions of fonts for PDF

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1753972 13f79535-47bb-0310-9956-ffa450edef68
pull/3/head
Simon Steiner 7 years ago
parent
commit
b92d472319
28 changed files with 202 additions and 39 deletions
  1. 12
    0
      fop-core/src/main/java/org/apache/fop/fonts/CustomFont.java
  2. 28
    2
      fop-core/src/main/java/org/apache/fop/fonts/DefaultFontConfig.java
  3. 3
    2
      fop-core/src/main/java/org/apache/fop/fonts/DefaultFontConfigurator.java
  4. 15
    4
      fop-core/src/main/java/org/apache/fop/fonts/EmbedFontInfo.java
  5. 5
    0
      fop-core/src/main/java/org/apache/fop/fonts/FontEventAdapter.java
  6. 9
    0
      fop-core/src/main/java/org/apache/fop/fonts/FontEventProducer.java
  7. 2
    2
      fop-core/src/main/java/org/apache/fop/fonts/FontLoader.java
  8. 4
    2
      fop-core/src/main/java/org/apache/fop/fonts/LazyFont.java
  9. 2
    2
      fop-core/src/main/java/org/apache/fop/fonts/autodetect/FontInfoFinder.java
  10. 11
    2
      fop-core/src/main/java/org/apache/fop/fonts/truetype/OFFontLoader.java
  11. 3
    1
      fop-core/src/main/java/org/apache/fop/render/bitmap/BitmapRendererConfig.java
  12. 3
    1
      fop-core/src/main/java/org/apache/fop/render/bitmap/PNGRendererConfig.java
  13. 3
    1
      fop-core/src/main/java/org/apache/fop/render/bitmap/TIFFRendererConfig.java
  14. 3
    1
      fop-core/src/main/java/org/apache/fop/render/intermediate/IFRendererConfig.java
  15. 1
    1
      fop-core/src/main/java/org/apache/fop/render/java2d/ConfiguredFontCollection.java
  16. 3
    1
      fop-core/src/main/java/org/apache/fop/render/java2d/Java2DRendererConfig.java
  17. 3
    1
      fop-core/src/main/java/org/apache/fop/render/pcl/PCLRendererConfig.java
  18. 17
    1
      fop-core/src/main/java/org/apache/fop/render/pdf/PDFPainter.java
  19. 10
    2
      fop-core/src/main/java/org/apache/fop/render/pdf/PDFRendererConfig.java
  20. 3
    1
      fop-core/src/main/java/org/apache/fop/render/ps/PSRendererConfig.java
  21. 2
    1
      fop-core/src/main/java/org/apache/fop/render/txt/TxtRendererConfig.java
  22. 1
    0
      fop-core/src/main/resources/org/apache/fop/fonts/FontEventProducer.xml
  23. 1
    1
      fop-core/src/test/java/org/apache/fop/fonts/DejaVuLGCSerifTestCase.java
  24. 2
    1
      fop-core/src/test/java/org/apache/fop/fonts/EmbedFontInfoTestCase.java
  25. 1
    1
      fop-core/src/test/java/org/apache/fop/fonts/truetype/OTFToType1TestCase.java
  26. 3
    2
      fop-core/src/test/java/org/apache/fop/fonts/truetype/TTFFontLoaderTestCase.java
  27. 51
    5
      fop-core/src/test/java/org/apache/fop/render/pdf/PDFPainterTestCase.java
  28. 1
    1
      fop-core/src/test/java/org/apache/fop/svg/font/FontInfoBuilder.java

+ 12
- 0
fop-core/src/main/java/org/apache/fop/fonts/CustomFont.java View File

@@ -80,6 +80,7 @@ public abstract class CustomFont extends Typeface
/** the character map, mapping Unicode ranges to glyph indices. */
protected List<CMapSegment> cmap = new ArrayList<CMapSegment>();
private boolean useAdvanced = true;
private boolean simulateStyle;

/**
* @param resourceResolver the URI resource resolver for controlling file access
@@ -490,6 +491,17 @@ public abstract class CustomFont extends Typeface
this.useAdvanced = enabled;
}

/**
* {@inheritDoc}
*/
public void setSimulateStyle(boolean enabled) {
this.simulateStyle = enabled;
}

public boolean getSimulateStyle() {
return this.simulateStyle;
}

/** {@inheritDoc} */
public void putKerningEntry(Integer key, Map<Integer, Integer> value) {
if (kerning == null) {

+ 28
- 2
fop-core/src/main/java/org/apache/fop/fonts/DefaultFontConfig.java View File

@@ -68,6 +68,12 @@ public final class DefaultFontConfig implements FontConfig {
return new ParserHelper(cfg, strict).instance;
}

/** {@inheritDoc} */
public DefaultFontConfig parse(Configuration cfg, boolean strict,
FontEventAdapter eventAdapter) throws FOPException {
return new ParserHelper(cfg, strict, eventAdapter).instance;
}

/** {@inheritDoc} */
public FontConfig parse(Configuration cfg, FontManager fontManager, boolean strict,
EventProducer eventProducer) throws FOPException {
@@ -81,10 +87,17 @@ public final class DefaultFontConfig implements FontConfig {

private Configuration config;
private Configuration fontInfoCfg;
private FontEventAdapter eventAdapter;

private DefaultFontConfig instance;

private ParserHelper(Configuration cfg, boolean strict) throws FOPException {
this(cfg, strict, null);
}

private ParserHelper(Configuration cfg, boolean strict, FontEventAdapter eventAdapter)
throws FOPException {
this.eventAdapter = eventAdapter;
if (cfg == null || cfg.getChild("fonts", false) == null) {
instance = null;
} else {
@@ -118,6 +131,7 @@ public final class DefaultFontConfig implements FontConfig {
fontCfg.getAttributeAsBoolean("advanced", true),
fontCfg.getAttribute("encoding-mode", EncodingMode.AUTO.getName()),
fontCfg.getAttribute("embedding-mode", EncodingMode.AUTO.getName()),
fontCfg.getAttributeAsBoolean("simulate-style", false),
fontCfg.getAttributeAsBoolean("embed-as-type1", false));
instance.fonts.add(font);
boolean hasTriplets = false;
@@ -131,7 +145,12 @@ public final class DefaultFontConfig implements FontConfig {
LogUtil.handleError(log, "font without font-triplet", strict);
}
try {
if (font.getEmbedAsType1() && !config.getAttribute("mime").equals("application/postscript")) {
if (eventAdapter != null && font.getSimulateStyle()
&& !config.getAttribute("mime").equals("application/pdf")) {
eventAdapter.fontFeatureNotSuppprted(this, "simulate-style", "PDF");
}
if (eventAdapter != null && font.getEmbedAsType1()
&& !config.getAttribute("mime").equals("application/postscript")) {
throw new FOPException("The embed-as-type1 attribute is only supported in postscript");
}
} catch (ConfigurationException ex) {
@@ -301,6 +320,7 @@ public final class DefaultFontConfig implements FontConfig {
}

private final boolean embedAsType1;
private final boolean simulateStyle;

private final List<FontTriplet> tripletList = new ArrayList<FontTriplet>();

@@ -309,7 +329,8 @@ public final class DefaultFontConfig implements FontConfig {
}

private Font(String metrics, String embed, String afm, String pfm, String subFont, boolean kerning,
boolean advanced, String encodingMode, String embeddingMode, boolean embedAsType1) {
boolean advanced, String encodingMode, String embeddingMode, boolean simulateStyle,
boolean embedAsType1) {
this.metrics = metrics;
this.embedUri = embed;
this.afm = afm;
@@ -319,6 +340,7 @@ public final class DefaultFontConfig implements FontConfig {
this.advanced = advanced;
this.encodingMode = encodingMode;
this.embeddingMode = embeddingMode;
this.simulateStyle = simulateStyle;
this.embedAsType1 = embedAsType1;
}

@@ -370,6 +392,10 @@ public final class DefaultFontConfig implements FontConfig {
return pfm;
}

public boolean getSimulateStyle() {
return simulateStyle;
}

public boolean getEmbedAsType1() {
return embedAsType1;
}

+ 3
- 2
fop-core/src/main/java/org/apache/fop/fonts/DefaultFontConfigurator.java View File

@@ -166,8 +166,9 @@ public class DefaultFontConfigurator implements FontConfigurator<EmbedFontInfo>
}
EncodingMode encodingMode = EncodingMode.getValue(font.getEncodingMode());
EmbeddingMode embeddingMode = EmbeddingMode.getValue(font.getEmbeddingMode());
EmbedFontInfo embedFontInfo = new EmbedFontInfo(fontUris, font.isKerning(), font.isAdvanced(),
tripletList, subFont, encodingMode, embeddingMode, font.getEmbedAsType1());
EmbedFontInfo embedFontInfo = new EmbedFontInfo(fontUris, font.isKerning(),
font.isAdvanced(), tripletList, subFont, encodingMode, embeddingMode,
font.getSimulateStyle(), font.getEmbedAsType1());
if (fontCache != null) {
if (!fontCache.containsFont(embedFontInfo)) {
fontCache.addFont(embedFontInfo, resourceResolver);

+ 15
- 4
fop-core/src/main/java/org/apache/fop/fonts/EmbedFontInfo.java View File

@@ -42,12 +42,14 @@ public class EmbedFontInfo implements Serializable {
private final EncodingMode encodingMode;
/** the requested embedding mode for this font */
private final EmbeddingMode embeddingMode;
/** simulates bold or italic on a regular font */
private final boolean simulateStyle;
private final boolean embedAsType1;

/** the PostScript name of the font */
protected String postScriptName;
/** the sub-fontname of the font (used for TrueType Collections, null otherwise) */
protected String subFontName;
private boolean embedAsType1;

/** the list of associated font triplets */
private List<FontTriplet> fontTriplets;
@@ -67,8 +69,8 @@ public class EmbedFontInfo implements Serializable {
* @param encodingMode the encoding mode to use for this font
*/
public EmbedFontInfo(FontUris fontUris, boolean kerning, boolean advanced,
List<FontTriplet> fontTriplets, String subFontName,
EncodingMode encodingMode, EmbeddingMode embeddingMode, boolean embedAsType1) {
List<FontTriplet> fontTriplets, String subFontName, EncodingMode encodingMode,
EmbeddingMode embeddingMode, boolean simulateStyle, boolean embedAsType1) {
this.kerning = kerning;
this.advanced = advanced;
this.fontTriplets = fontTriplets;
@@ -76,6 +78,7 @@ public class EmbedFontInfo implements Serializable {
this.encodingMode = encodingMode;
this.embeddingMode = embeddingMode;
this.fontUris = fontUris;
this.simulateStyle = simulateStyle;
this.embedAsType1 = embedAsType1;
}

@@ -90,7 +93,7 @@ public class EmbedFontInfo implements Serializable {
public EmbedFontInfo(FontUris fontUris, boolean kerning, boolean advanced,
List<FontTriplet> fontTriplets, String subFontName) {
this(fontUris, kerning, advanced, fontTriplets, subFontName, EncodingMode.AUTO,
EmbeddingMode.AUTO, false);
EmbeddingMode.AUTO, false, false);
}

/**
@@ -196,6 +199,14 @@ public class EmbedFontInfo implements Serializable {
return this.encodingMode;
}

/**
* Determines whether the font can simulate a style such as bold or italic.
* @return true if the font is being simulated as a different style.
*/
public boolean getSimulateStyle() {
return this.simulateStyle;
}

public boolean getEmbedAsType1() {
return embedAsType1;
}

+ 5
- 0
fop-core/src/main/java/org/apache/fop/fonts/FontEventAdapter.java View File

@@ -71,4 +71,9 @@ public class FontEventAdapter implements FontEventListener {
getEventProducer().svgTextStrokedAsShapes(source, fontFamily);
}

/** {@inheritDoc} */
public void fontFeatureNotSuppprted(Object source, String feature, String onlySupportedIn) {
getEventProducer().fontFeatureNotSuppprted(source, feature, onlySupportedIn);
}

}

+ 9
- 0
fop-core/src/main/java/org/apache/fop/fonts/FontEventProducer.java View File

@@ -87,4 +87,13 @@ public interface FontEventProducer extends EventProducer {
*/
void svgTextStrokedAsShapes(Object source, String fontFamily);

/**
* A method to warn the user that the feature they are trying to use is not supported with either the renderer or
* other setting.
* @param source
* @param feature The feature that has caused the not supported issue
* @param onlySupportedIn The renderer / setting that this feature works with.
* @event.severity ERROR
*/
void fontFeatureNotSuppprted(Object source, String feature, String onlySupportedIn);
}

+ 2
- 2
fop-core/src/main/java/org/apache/fop/fonts/FontLoader.java View File

@@ -92,7 +92,7 @@ public abstract class FontLoader {
public static CustomFont loadFont(FontUris fontUris, String subFontName,
boolean embedded, EmbeddingMode embeddingMode, EncodingMode encodingMode,
boolean useKerning, boolean useAdvanced, InternalResourceResolver resourceResolver,
boolean embedAsType1) throws IOException {
boolean simulateStyle, boolean embedAsType1) throws IOException {
boolean type1 = isType1(fontUris.getEmbed());
FontLoader loader;
if (type1) {
@@ -104,7 +104,7 @@ public abstract class FontLoader {
resourceResolver);
} else {
loader = new OFFontLoader(fontUris.getEmbed(), subFontName, embedded, embeddingMode,
encodingMode, useKerning, useAdvanced, resourceResolver, embedAsType1);
encodingMode, useKerning, useAdvanced, resourceResolver, simulateStyle, embedAsType1);
}
return loader.getFont();
}

+ 4
- 2
fop-core/src/main/java/org/apache/fop/fonts/LazyFont.java View File

@@ -47,6 +47,7 @@ public class LazyFont extends Typeface implements FontDescriptor, Substitutable,

private final boolean useKerning;
private final boolean useAdvanced;
private boolean simulateStyle;
private boolean embedAsType1;
private final EncodingMode encodingMode;
private final EmbeddingMode embeddingMode;
@@ -73,6 +74,7 @@ public class LazyFont extends Typeface implements FontDescriptor, Substitutable,
} else {
this.useAdvanced = fontInfo.getAdvanced();
}
this.simulateStyle = fontInfo.getSimulateStyle();
this.embedAsType1 = fontInfo.getEmbedAsType1();
this.encodingMode = fontInfo.getEncodingMode() != null ? fontInfo.getEncodingMode()
: EncodingMode.AUTO;
@@ -115,8 +117,8 @@ public class LazyFont extends Typeface implements FontDescriptor, Substitutable,
if (fontUris.getEmbed() == null) {
throw new RuntimeException("Cannot load font. No font URIs available.");
}
realFont = FontLoader.loadFont(fontUris, subFontName, embedded,
embeddingMode, encodingMode, useKerning, useAdvanced, resourceResolver, embedAsType1);
realFont = FontLoader.loadFont(fontUris, subFontName, embedded, embeddingMode,
encodingMode, useKerning, useAdvanced, resourceResolver, simulateStyle, embedAsType1);
}
if (realFont instanceof FontDescriptor) {
realFontDescriptor = (FontDescriptor) realFont;

+ 2
- 2
fop-core/src/main/java/org/apache/fop/fonts/autodetect/FontInfoFinder.java View File

@@ -223,7 +223,7 @@ public class FontInfoFinder {
try {
OFFontLoader ttfLoader = new OFFontLoader(fontURI, fontName, true,
EmbeddingMode.AUTO, EncodingMode.AUTO, useKerning, useAdvanced,
resourceResolver, false);
resourceResolver, false, false);
customFont = ttfLoader.getFont();
if (this.eventListener != null) {
customFont.setEventListener(this.eventListener);
@@ -251,7 +251,7 @@ public class FontInfoFinder {
try {
FontUris fontUris = new FontUris(fontURI, null);
customFont = FontLoader.loadFont(fontUris, null, true, EmbeddingMode.AUTO, EncodingMode.AUTO,
useKerning, useAdvanced, resourceResolver, false);
useKerning, useAdvanced, resourceResolver, false, false);
if (this.eventListener != null) {
customFont.setEventListener(this.eventListener);
}

+ 11
- 2
fop-core/src/main/java/org/apache/fop/fonts/truetype/OFFontLoader.java View File

@@ -32,6 +32,7 @@ import org.apache.fop.apps.io.InternalResourceResolver;
import org.apache.fop.fonts.CFFToType1Font;
import org.apache.fop.fonts.CIDFontType;
import org.apache.fop.fonts.CMapSegment;
import org.apache.fop.fonts.CustomFont;
import org.apache.fop.fonts.EmbeddingMode;
import org.apache.fop.fonts.EncodingMode;
import org.apache.fop.fonts.FontLoader;
@@ -52,6 +53,7 @@ public class OFFontLoader extends FontLoader {
private final String subFontName;
private EncodingMode encodingMode;
private EmbeddingMode embeddingMode;
private boolean simulateStyle;
private boolean embedAsType1;

/**
@@ -60,7 +62,8 @@ public class OFFontLoader extends FontLoader {
* @param resourceResolver the resource resolver for font URI resolution
*/
public OFFontLoader(URI fontFileURI, InternalResourceResolver resourceResolver) {
this(fontFileURI, null, true, EmbeddingMode.AUTO, EncodingMode.AUTO, true, true, resourceResolver, false);
this(fontFileURI, null, true, EmbeddingMode.AUTO, EncodingMode.AUTO, true, true, resourceResolver, false,
false);
}

/**
@@ -74,14 +77,16 @@ public class OFFontLoader extends FontLoader {
* @param useKerning true to enable loading kerning info if available, false to disable
* @param useAdvanced true to enable loading advanced info if available, false to disable
* @param resolver the FontResolver for font URI resolution
* @param simulateStyle Determines whether to simulate font styles if a font does not support those by default.
*/
public OFFontLoader(URI fontFileURI, String subFontName, boolean embedded,
EmbeddingMode embeddingMode, EncodingMode encodingMode, boolean useKerning,
boolean useAdvanced, InternalResourceResolver resolver, boolean embedAsType1) {
boolean useAdvanced, InternalResourceResolver resolver, boolean simulateStyle, boolean embedAsType1) {
super(fontFileURI, embedded, useKerning, useAdvanced, resolver);
this.subFontName = subFontName;
this.encodingMode = encodingMode;
this.embeddingMode = embeddingMode;
this.simulateStyle = simulateStyle;
this.embedAsType1 = embedAsType1;
if (this.encodingMode == EncodingMode.AUTO) {
this.encodingMode = EncodingMode.CID; //Default to CID mode for TrueType
@@ -134,6 +139,7 @@ public class OFFontLoader extends FontLoader {
isCid = false;
}

CustomFont font;
if (isCid) {
if (otf instanceof OTFFile && embedAsType1) {
multiFont = new CFFToType1Font(resourceResolver, embeddingMode);
@@ -143,10 +149,13 @@ public class OFFontLoader extends FontLoader {
multiFont.setIsOTFFile(otf instanceof OTFFile);
returnFont = multiFont;
multiFont.setTTCName(ttcFontName);
font = multiFont;
} else {
singleFont = new SingleByteFont(resourceResolver, embeddingMode);
returnFont = singleFont;
font = singleFont;
}
font.setSimulateStyle(simulateStyle);

returnFont.setFontURI(fontFileURI);
if (!otf.getEmbedFontName().equals("")) {

+ 3
- 1
fop-core/src/main/java/org/apache/fop/render/bitmap/BitmapRendererConfig.java View File

@@ -29,6 +29,7 @@ import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.fonts.DefaultFontConfig;
import org.apache.fop.fonts.DefaultFontConfig.DefaultFontConfigParser;
import org.apache.fop.fonts.FontEventAdapter;
import org.apache.fop.render.RendererConfig;
import org.apache.fop.render.java2d.Java2DRendererConfig;
import org.apache.fop.render.java2d.Java2DRendererConfig.Java2DRendererConfigParser;
@@ -139,7 +140,8 @@ public class BitmapRendererConfig implements RendererConfig {
public BitmapRendererConfig build(FOUserAgent userAgent, Configuration cfg)
throws FOPException {
BitmapRendererConfig config = new BitmapRendererConfig(new DefaultFontConfigParser()
.parse(cfg, userAgent.validateStrictly()));
.parse(cfg, userAgent.validateStrictly(),
new FontEventAdapter(userAgent.getEventBroadcaster())));
build(config, userAgent, cfg);
return config;
}

+ 3
- 1
fop-core/src/main/java/org/apache/fop/render/bitmap/PNGRendererConfig.java View File

@@ -25,6 +25,7 @@ import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.fonts.DefaultFontConfig;
import org.apache.fop.fonts.DefaultFontConfig.DefaultFontConfigParser;
import org.apache.fop.fonts.FontEventAdapter;

/**
* The PNG renderer configuration data object.
@@ -43,7 +44,8 @@ public final class PNGRendererConfig extends BitmapRendererConfig {
public PNGRendererConfig build(FOUserAgent userAgent, Configuration cfg)
throws FOPException {
return new PNGRendererConfig(new DefaultFontConfigParser().parse(cfg,
userAgent.validateStrictly()));
userAgent.validateStrictly(),
new FontEventAdapter(userAgent.getEventBroadcaster())));
}

/** {@inheritDoc} */

+ 3
- 1
fop-core/src/main/java/org/apache/fop/render/bitmap/TIFFRendererConfig.java View File

@@ -30,6 +30,7 @@ import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.MimeConstants;
import org.apache.fop.fonts.DefaultFontConfig;
import org.apache.fop.fonts.DefaultFontConfig.DefaultFontConfigParser;
import org.apache.fop.fonts.FontEventAdapter;
import org.apache.fop.render.RendererConfigOption;

import static org.apache.fop.render.bitmap.TIFFCompressionValue.PACKBITS;
@@ -111,7 +112,8 @@ public final class TIFFRendererConfig extends BitmapRendererConfig {
/** {@inheritDoc} */
public TIFFRendererConfig build(FOUserAgent userAgent, Configuration cfg) throws FOPException {
config = new TIFFRendererConfig(new DefaultFontConfigParser()
.parse(cfg, userAgent.validateStrictly()));
.parse(cfg, userAgent.validateStrictly(),
new FontEventAdapter(userAgent.getEventBroadcaster())));
super.build(config, userAgent, cfg);
if (cfg != null) {
setParam(TIFFRendererOption.COMPRESSION,

+ 3
- 1
fop-core/src/main/java/org/apache/fop/render/intermediate/IFRendererConfig.java View File

@@ -26,6 +26,7 @@ import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.fonts.DefaultFontConfig;
import org.apache.fop.fonts.DefaultFontConfig.DefaultFontConfigParser;
import org.apache.fop.fonts.FontConfig;
import org.apache.fop.fonts.FontEventAdapter;
import org.apache.fop.render.RendererConfig;

/**
@@ -52,7 +53,8 @@ public final class IFRendererConfig implements RendererConfig {
public RendererConfig build(FOUserAgent userAgent, Configuration cfg)
throws FOPException {
return new IFRendererConfig(new DefaultFontConfigParser().parse(cfg,
userAgent.validateStrictly()));
userAgent.validateStrictly(),
new FontEventAdapter(userAgent.getEventBroadcaster())));
}

/** {@inheritDoc} */

+ 1
- 1
fop-core/src/main/java/org/apache/fop/render/java2d/ConfiguredFontCollection.java View File

@@ -87,7 +87,7 @@ public class ConfiguredFontCollection implements FontCollection {
configFontInfo.getSubFontName(), true,
configFontInfo.getEmbeddingMode(), configFontInfo.getEncodingMode(),
configFontInfo.getKerning(), configFontInfo.getAdvanced(), resourceResolver,
configFontInfo.getEmbedAsType1());
configFontInfo.getSimulateStyle(), configFontInfo.getEmbedAsType1());
font = new CustomFontMetricsMapper(fontMetrics);
}


+ 3
- 1
fop-core/src/main/java/org/apache/fop/render/java2d/Java2DRendererConfig.java View File

@@ -27,6 +27,7 @@ import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.fonts.DefaultFontConfig;
import org.apache.fop.fonts.DefaultFontConfig.DefaultFontConfigParser;
import org.apache.fop.fonts.FontEventAdapter;
import org.apache.fop.render.RendererConfig;

import static org.apache.fop.render.java2d.Java2DRendererOption.JAVA2D_TRANSPARENT_PAGE_BACKGROUND;
@@ -68,7 +69,8 @@ public final class Java2DRendererConfig implements RendererConfig {
public Java2DRendererConfig build(FOUserAgent userAgent, Configuration cfg)
throws FOPException {
Java2DRendererConfig config = new Java2DRendererConfig(new DefaultFontConfigParser()
.parse(cfg, userAgent.validateStrictly()));
.parse(cfg, userAgent.validateStrictly(),
new FontEventAdapter(userAgent.getEventBroadcaster())));
boolean value = cfg.getChild(
JAVA2D_TRANSPARENT_PAGE_BACKGROUND.getName(), true).getValueAsBoolean(false);
config.params.put(JAVA2D_TRANSPARENT_PAGE_BACKGROUND, value);

+ 3
- 1
fop-core/src/main/java/org/apache/fop/render/pcl/PCLRendererConfig.java View File

@@ -29,6 +29,7 @@ import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.MimeConstants;
import org.apache.fop.fonts.DefaultFontConfig;
import org.apache.fop.fonts.DefaultFontConfig.DefaultFontConfigParser;
import org.apache.fop.fonts.FontEventAdapter;
import org.apache.fop.render.RendererConfig;

import static org.apache.fop.render.pcl.Java2DRendererOption.DISABLE_PJL;
@@ -88,7 +89,8 @@ public final class PCLRendererConfig implements RendererConfig {
/** {@inheritDoc} */
public PCLRendererConfig build(FOUserAgent userAgent, Configuration cfg) throws FOPException {
PCLRendererConfig config = new PCLRendererConfig(new DefaultFontConfigParser()
.parse(cfg, userAgent.validateStrictly()));
.parse(cfg, userAgent.validateStrictly(),
new FontEventAdapter(userAgent.getEventBroadcaster())));
configure(cfg, config);
return config;
}

+ 17
- 1
fop-core/src/main/java/org/apache/fop/render/pdf/PDFPainter.java View File

@@ -39,6 +39,7 @@ import org.apache.xmlgraphics.image.loader.ImageManager;
import org.apache.xmlgraphics.image.loader.ImageSessionContext;

import org.apache.fop.ResourceEventProducer;
import org.apache.fop.fonts.CustomFont;
import org.apache.fop.fonts.Font;
import org.apache.fop.fonts.FontTriplet;
import org.apache.fop.fonts.LazyFont;
@@ -458,9 +459,21 @@ public class PDFPainter extends AbstractIFPainter<PDFDocumentHandler> {
PDFTextUtil textutil = generator.getTextUtil();
textutil.updateTf(fontKey, fontSize, tf.isMultiByte());

double shear = 0;
boolean simulateStyle = tf instanceof CustomFont && ((CustomFont) tf).getSimulateStyle();
if (simulateStyle) {
if (triplet.getWeight() == 700) {
generator.add("q\n");
generator.add("2 Tr 0.31543 w\n");
}
if (triplet.getStyle().equals("italic")) {
shear = 0.3333;
}
}

generator.updateCharacterSpacing(letterSpacing / 1000f);

textutil.writeTextMatrix(new AffineTransform(1, 0, 0, -1, x / 1000f, y / 1000f));
textutil.writeTextMatrix(new AffineTransform(1, 0, shear, -1, x / 1000f, y / 1000f));
int l = text.length();
int dxl = (dx != null ? dx.length : 0);

@@ -504,6 +517,9 @@ public class PDFPainter extends AbstractIFPainter<PDFDocumentHandler> {

}
textutil.writeTJ();
if (simulateStyle && triplet.getWeight() == 700) {
generator.add("Q\n");
}
}

private static int[] paZero = new int[4];

+ 10
- 2
fop-core/src/main/java/org/apache/fop/render/pdf/PDFRendererConfig.java View File

@@ -27,6 +27,7 @@ import java.util.Map;

import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

@@ -35,6 +36,7 @@ import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.MimeConstants;
import org.apache.fop.fonts.DefaultFontConfig;
import org.apache.fop.fonts.DefaultFontConfig.DefaultFontConfigParser;
import org.apache.fop.fonts.FontEventAdapter;
import org.apache.fop.pdf.PDFEncryptionParams;
import org.apache.fop.pdf.PDFFilterList;
import org.apache.fop.render.RendererConfig;
@@ -117,8 +119,14 @@ public final class PDFRendererConfig implements RendererConfig {
if (cfg != null) {
configure(cfg, userAgent, strict);
}
pdfConfig = new PDFRendererConfig(new DefaultFontConfigParser().parse(cfg, strict),
new PDFRendererOptionsConfig(configOptions, encryptionConfig));
if (userAgent == null) {
pdfConfig = new PDFRendererConfig(new DefaultFontConfigParser().parse(cfg, strict),
new PDFRendererOptionsConfig(configOptions, encryptionConfig));
} else {
pdfConfig = new PDFRendererConfig(new DefaultFontConfigParser().parse(cfg, strict,
new FontEventAdapter(userAgent.getEventBroadcaster())),
new PDFRendererOptionsConfig(configOptions, encryptionConfig));
}
}

private void parseAndPut(PDFRendererOption option, Configuration cfg) {

+ 3
- 1
fop-core/src/main/java/org/apache/fop/render/ps/PSRendererConfig.java View File

@@ -32,6 +32,7 @@ import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.MimeConstants;
import org.apache.fop.fonts.DefaultFontConfig;
import org.apache.fop.fonts.DefaultFontConfig.DefaultFontConfigParser;
import org.apache.fop.fonts.FontEventAdapter;
import org.apache.fop.render.RendererConfig;
import org.apache.fop.util.LogUtil;

@@ -113,7 +114,8 @@ public final class PSRendererConfig implements RendererConfig {
private ParserHelper(Configuration cfg, FOUserAgent userAgent)
throws ConfigurationException, FOPException {
config = new PSRendererConfig(new DefaultFontConfigParser().parse(cfg,
userAgent.validateStrictly()));
userAgent.validateStrictly(),
new FontEventAdapter(userAgent.getEventBroadcaster())));
if (cfg != null) {
setBoolConfigParam(cfg, AUTO_ROTATE_LANDSCAPE);
setConfigParameter(LANGUAGE_LEVEL,

+ 2
- 1
fop-core/src/main/java/org/apache/fop/render/txt/TxtRendererConfig.java View File

@@ -28,6 +28,7 @@ import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.MimeConstants;
import org.apache.fop.fonts.DefaultFontConfig;
import org.apache.fop.fonts.DefaultFontConfig.DefaultFontConfigParser;
import org.apache.fop.fonts.FontEventAdapter;
import org.apache.fop.render.RendererConfig;
import org.apache.fop.render.RendererConfigOption;

@@ -81,7 +82,7 @@ public final class TxtRendererConfig implements RendererConfig {
/** {@inheritDoc} */
public TxtRendererConfig build(FOUserAgent userAgent, Configuration cfg) throws FOPException {
TxtRendererConfig config = new TxtRendererConfig(new DefaultFontConfigParser().parse(cfg,
userAgent.validateStrictly()));
userAgent.validateStrictly(), new FontEventAdapter(userAgent.getEventBroadcaster())));
if (cfg != null) {
TxtRendererOption option = TxtRendererOption.ENCODING;
String value = cfg.getChild(option.getName(), true).getValue(null);

+ 1
- 0
fop-core/src/main/resources/org/apache/fop/fonts/FontEventProducer.xml View File

@@ -22,4 +22,5 @@
<message key="glyphNotAvailable">Glyph "{ch}" (0x{ch,hex}[, {ch,glyph-name}]) not available in font "{fontName}".</message>
<message key="fontDirectoryNotFound">The font directory {dir} could not be found.</message>
<message key="svgTextStrokedAsShapes">The SVG text for font {fontFamily} will be stroked as shapes.</message>
<message key="fontFeatureNotSuppprted">The {feature} property is only supported in {onlySupportedIn}.</message>
</catalogue>

+ 1
- 1
fop-core/src/test/java/org/apache/fop/fonts/DejaVuLGCSerifTestCase.java View File

@@ -49,7 +49,7 @@ public class DejaVuLGCSerifTestCase {
File file = new File("test/resources/fonts/ttf/DejaVuLGCSerif.ttf");
FontUris fontUris = new FontUris(file.toURI(), null);
font = FontLoader.loadFont(fontUris, "", true, EmbeddingMode.AUTO, EncodingMode.AUTO,
false, false, resolver, false);
false, false, resolver, false, false);
}

/**

+ 2
- 1
fop-core/src/test/java/org/apache/fop/fonts/EmbedFontInfoTestCase.java View File

@@ -53,7 +53,8 @@ public class EmbedFontInfoTestCase {
List<FontTriplet> triplets = new ArrayList<FontTriplet>();
triplets.add(triplet);
FontUris fontUris = new FontUris(embedURI, metricsURI);
sut = new EmbedFontInfo(fontUris, kerning, useAdvanced, triplets, subFontName, encMode, embedMode, false);
sut = new EmbedFontInfo(fontUris, kerning, useAdvanced, triplets, subFontName, encMode,
embedMode, false, false);
}

@Test

+ 1
- 1
fop-core/src/test/java/org/apache/fop/fonts/truetype/OTFToType1TestCase.java View File

@@ -51,7 +51,7 @@ public class OTFToType1TestCase {
InternalResourceResolver rr = ResourceResolverFactory.createDefaultInternalResourceResolver(
new File(".").toURI());
CustomFont realFont = FontLoader.loadFont(new FontUris(new File(s).toURI(), null), null, true,
EmbeddingMode.SUBSET, EncodingMode.AUTO, true, true, rr, true);
EmbeddingMode.SUBSET, EncodingMode.AUTO, true, true, rr, false, true);
realFont.mapChar('d');
InputStream is = ((CFFToType1Font)realFont).getInputStreams().get(0);
return Type1Font.createWithPFB(is);

+ 3
- 2
fop-core/src/test/java/org/apache/fop/fonts/truetype/TTFFontLoaderTestCase.java View File

@@ -50,12 +50,13 @@ public class TTFFontLoaderTestCase {
boolean useKerning = true;

OFFontLoader fontLoader = new OFFontLoader(absoluteFilePath, fontName, embedded,
EmbeddingMode.AUTO, EncodingMode.AUTO, useKerning, useComplexScriptFeatures, resourceResolver, false);
EmbeddingMode.AUTO, EncodingMode.AUTO, useKerning, useComplexScriptFeatures,
resourceResolver, false, false);
assertTrue(fontLoader.getFont().hasKerningInfo());
useKerning = false;

fontLoader = new OFFontLoader(absoluteFilePath, fontName, embedded, EmbeddingMode.AUTO,
EncodingMode.AUTO, useKerning, useComplexScriptFeatures, resourceResolver, false);
EncodingMode.AUTO, useKerning, useComplexScriptFeatures, resourceResolver, false, false);
assertFalse(fontLoader.getFont().hasKerningInfo());
}
}

+ 51
- 5
fop-core/src/test/java/org/apache/fop/render/pdf/PDFPainterTestCase.java View File

@@ -38,9 +38,13 @@ import static org.mockito.Mockito.when;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.fo.Constants;
import org.apache.fop.fonts.FontInfo;
import org.apache.fop.fonts.FontTriplet;
import org.apache.fop.fonts.MultiByteFont;
import org.apache.fop.pdf.PDFDocument;
import org.apache.fop.pdf.PDFProfile;
import org.apache.fop.pdf.PDFStructElem;
import org.apache.fop.pdf.PDFTextUtil;
import org.apache.fop.render.RenderingContext;
import org.apache.fop.render.intermediate.IFContext;
import org.apache.fop.render.intermediate.IFException;
@@ -51,7 +55,7 @@ import junit.framework.Assert;
public class PDFPainterTestCase {

private FOUserAgent foUserAgent;
private PDFContentGenerator pdfContentGenerator;
private PDFContentGenerator pdfContentGenerator;
private PDFDocumentHandler pdfDocumentHandler;
private PDFPainter pdfPainter;
private PDFStructElem elem = new PDFStructElem();
@@ -73,17 +77,17 @@ public class PDFPainterTestCase {
verify(pdfContentGenerator, times(16)).add(endsWith(" c "));
}

private void createPDFPainter(boolean value) {
mockFOUserAgent(value);
private void createPDFPainter(boolean accessibility) {
mockFOUserAgent(accessibility);
mockPDFContentGenerator();
mockPDFDocumentHandler();
PDFLogicalStructureHandler handler = mock(PDFLogicalStructureHandler.class);
pdfPainter = new PDFPainter(pdfDocumentHandler, handler);
}

private void mockFOUserAgent(boolean value) {
private void mockFOUserAgent(boolean accessibility) {
foUserAgent = mock(FOUserAgent.class);
when(foUserAgent.isAccessibilityEnabled()).thenReturn(value);
when(foUserAgent.isAccessibilityEnabled()).thenReturn(accessibility);
}

private void mockPDFContentGenerator() {
@@ -132,4 +136,46 @@ public class PDFPainterTestCase {
return renderingContext;
}
}

@Test
public void testSimulateStyle() throws IFException {
FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI());
foUserAgent = fopFactory.newFOUserAgent();
mockPDFContentGenerator();
final StringBuilder sb = new StringBuilder();
PDFTextUtil pdfTextUtil = new PDFTextUtil() {
protected void write(String code) {
sb.append(code);
}
protected void write(StringBuffer code) {
sb.append(code);
}
};
pdfTextUtil.beginTextObject();

when(pdfContentGenerator.getTextUtil()).thenReturn(pdfTextUtil);
PDFDocumentHandler pdfDocumentHandler = new PDFDocumentHandler(new IFContext(foUserAgent)) {
PDFContentGenerator getGenerator() {
return pdfContentGenerator;
}
};

pdfDocumentHandler.setResult(new StreamResult(new ByteArrayOutputStream()));
pdfDocumentHandler.startDocument();
pdfDocumentHandler.startPage(0, "", "", new Dimension());
FontInfo fi = new FontInfo();
fi.addFontProperties("f1", new FontTriplet("a", "italic", 700));
MultiByteFont font = new MultiByteFont(null, null);
font.setSimulateStyle(true);
fi.addMetrics("f1", font);
pdfDocumentHandler.setFontInfo(fi);
MyPDFPainter pdfPainter = new MyPDFPainter(pdfDocumentHandler, null);
pdfPainter.setFont("a", "italic", 700, null, 12, null);
pdfPainter.drawText(0, 0, 0, 0, null, "test");

Assert.assertEquals(sb.toString(), "BT\n/f1 0.012 Tf\n1 0 0.3333 -1 0 0 Tm [<0000000000000000>] TJ\n");
verify(pdfContentGenerator).add("q\n");
verify(pdfContentGenerator).add("2 Tr 0.31543 w\n");
verify(pdfContentGenerator).add("Q\n");
}
}

+ 1
- 1
fop-core/src/test/java/org/apache/fop/svg/font/FontInfoBuilder.java View File

@@ -83,7 +83,7 @@ class FontInfoBuilder {
URI baseURI = new File("test/resources/fonts/ttf").toURI();
InternalResourceResolver resolver = ResourceResolverFactory.createDefaultInternalResourceResolver(baseURI);
OFFontLoader fontLoader = new OFFontLoader(new URI(filename), null, true,
EmbeddingMode.AUTO, EncodingMode.AUTO, true, useAdvanced, resolver, false);
EmbeddingMode.AUTO, EncodingMode.AUTO, true, useAdvanced, resolver, false, false);
FontMetrics font = fontLoader.getFont();
registerFont(font, "F" + fontKey++, fontName);
return this;

Loading…
Cancel
Save