git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1812122 13f79535-47bb-0310-9956-ffa450edef68pull/6/head
import org.apache.fontbox.cff.CFFStandardString; | import org.apache.fontbox.cff.CFFStandardString; | ||||
import org.apache.xmlgraphics.fonts.Glyphs; | import org.apache.xmlgraphics.fonts.Glyphs; | ||||
import org.apache.xmlgraphics.java2d.GeneralGraphics2DImagePainter; | |||||
import org.apache.xmlgraphics.ps.DSCConstants; | import org.apache.xmlgraphics.ps.DSCConstants; | ||||
import org.apache.xmlgraphics.ps.PSGenerator; | import org.apache.xmlgraphics.ps.PSGenerator; | ||||
import org.apache.xmlgraphics.ps.PSResource; | import org.apache.xmlgraphics.ps.PSResource; | ||||
import org.apache.fop.fonts.EmbeddingMode; | import org.apache.fop.fonts.EmbeddingMode; | ||||
import org.apache.fop.fonts.Font; | import org.apache.fop.fonts.Font; | ||||
import org.apache.fop.fonts.FontInfo; | import org.apache.fop.fonts.FontInfo; | ||||
import org.apache.fop.fonts.FontTriplet; | |||||
import org.apache.fop.fonts.FontType; | import org.apache.fop.fonts.FontType; | ||||
import org.apache.fop.fonts.LazyFont; | import org.apache.fop.fonts.LazyFont; | ||||
import org.apache.fop.fonts.MultiByteFont; | import org.apache.fop.fonts.MultiByteFont; | ||||
gen.getResourceTracker().registerSuppliedResource(res); | gen.getResourceTracker().registerSuppliedResource(res); | ||||
return res; | return res; | ||||
} | } | ||||
public static void addFallbackFonts(FontInfo fontInfo, GeneralGraphics2DImagePainter painter) throws IOException { | |||||
for (Map.Entry<FontTriplet, String> x : fontInfo.getFontTriplets().entrySet()) { | |||||
String name = x.getKey().getName(); | |||||
Typeface typeface = fontInfo.getFonts().get(x.getValue()); | |||||
painter.addFallbackFont(name, typeface); | |||||
} | |||||
} | |||||
} | } |
import org.apache.xmlgraphics.java2d.ps.PSGraphics2D; | import org.apache.xmlgraphics.java2d.ps.PSGraphics2D; | ||||
import org.apache.xmlgraphics.ps.PSGenerator; | import org.apache.xmlgraphics.ps.PSGenerator; | ||||
import org.apache.fop.fonts.FontInfo; | |||||
import org.apache.fop.pdf.PDFFactory; | import org.apache.fop.pdf.PDFFactory; | ||||
import org.apache.fop.render.AbstractGraphics2DAdapter; | import org.apache.fop.render.AbstractGraphics2DAdapter; | ||||
import org.apache.fop.render.ImageHandlerUtil; | import org.apache.fop.render.ImageHandlerUtil; | ||||
private PSGenerator gen; | private PSGenerator gen; | ||||
private boolean clip = true; | private boolean clip = true; | ||||
private FontInfo fontInfo; | |||||
/** | /** | ||||
* Creates a new instance. | * Creates a new instance. | ||||
* @param gen the PostScript generator | * @param gen the PostScript generator | ||||
* @param clip true if the image should be clipped | * @param clip true if the image should be clipped | ||||
*/ | */ | ||||
public PSGraphics2DAdapter(PSGenerator gen, boolean clip) { | |||||
public PSGraphics2DAdapter(PSGenerator gen, boolean clip, FontInfo fontInfo) { | |||||
this.gen = gen; | this.gen = gen; | ||||
this.clip = clip; | this.clip = clip; | ||||
this.fontInfo = fontInfo; | |||||
} | } | ||||
/** {@inheritDoc} */ | /** {@inheritDoc} */ | ||||
/ context.getUserAgent().getTargetResolution(); | / context.getUserAgent().getTargetResolution(); | ||||
graphics.drawImage(bi, new AffineTransform(scale, 0, 0, scale, 0, 0), null); | graphics.drawImage(bi, new AffineTransform(scale, 0, 0, scale, 0, 0), null); | ||||
} else { | } else { | ||||
if (painter instanceof GeneralGraphics2DImagePainter) { | |||||
PSFontUtils.addFallbackFonts(fontInfo, (GeneralGraphics2DImagePainter) painter); | |||||
} | |||||
Rectangle2D area = new Rectangle2D.Double(0.0, 0.0, imw, imh); | Rectangle2D area = new Rectangle2D.Double(0.0, 0.0, imw, imh); | ||||
painter.paint(graphics, area); | painter.paint(graphics, area); | ||||
} | } |
import org.apache.xmlgraphics.ps.PSGenerator; | import org.apache.xmlgraphics.ps.PSGenerator; | ||||
import org.apache.xmlgraphics.ps.PSProcSets; | import org.apache.xmlgraphics.ps.PSProcSets; | ||||
import org.apache.fop.fonts.FontInfo; | |||||
import org.apache.fop.render.RenderingContext; | import org.apache.fop.render.RenderingContext; | ||||
/** | /** | ||||
transform.translate(fx, fy); | transform.translate(fx, fy); | ||||
gen.getCurrentState().concatMatrix(transform); | gen.getCurrentState().concatMatrix(transform); | ||||
Rectangle2D area = new Rectangle2D.Double(0.0, 0.0, imw, imh); | Rectangle2D area = new Rectangle2D.Double(0.0, 0.0, imw, imh); | ||||
if (painter instanceof GeneralGraphics2DImagePainter) { | |||||
PSFontUtils.addFallbackFonts(psContext.getFontInfo(), (GeneralGraphics2DImagePainter) painter); | |||||
} | |||||
painter.paint(graphics, area); | painter.paint(graphics, area); | ||||
gen.restoreGraphicsState(); | gen.restoreGraphicsState(); | ||||
gen.commentln("%FOPEndGraphics2D"); | gen.commentln("%FOPEndGraphics2D"); | ||||
final ImageGraphics2D imageG2D = (ImageGraphics2D)image; | final ImageGraphics2D imageG2D = (ImageGraphics2D)image; | ||||
ImageInfo info = image.getInfo(); | ImageInfo info = image.getInfo(); | ||||
FormGenerator formGen = buildFormGenerator(gen.getPSLevel(), form, info, imageG2D); | |||||
FormGenerator formGen = buildFormGenerator(gen.getPSLevel(), form, info, imageG2D, psContext.getFontInfo()); | |||||
formGen.generate(gen); | formGen.generate(gen); | ||||
} | } | ||||
/** {@inheritDoc} */ | /** {@inheritDoc} */ | ||||
return false; | return false; | ||||
} | } | ||||
private FormGenerator buildFormGenerator(int psLanguageLevel, final PSImageFormResource form, | |||||
final ImageInfo info, final ImageGraphics2D imageG2D) { | |||||
private FormGenerator buildFormGenerator(int psLanguageLevel, final PSImageFormResource form, final ImageInfo info, | |||||
final ImageGraphics2D imageG2D, final FontInfo fontInfo) { | |||||
String imageDescription = info.getMimeType() + " " + info.getOriginalURI(); | String imageDescription = info.getMimeType() + " " + info.getOriginalURI(); | ||||
final Dimension2D dimensionsPt = info.getSize().getDimensionPt(); | final Dimension2D dimensionsPt = info.getSize().getDimensionPt(); | ||||
final Dimension2D dimensionsMpt = info.getSize().getDimensionMpt(); | final Dimension2D dimensionsMpt = info.getSize().getDimensionMpt(); | ||||
@Override | @Override | ||||
void doGeneratePaintProc(PSGenerator gen) throws IOException { | void doGeneratePaintProc(PSGenerator gen) throws IOException { | ||||
paintImageG2D(imageG2D, dimensionsMpt, gen); | |||||
paintImageG2D(imageG2D, dimensionsMpt, gen, fontInfo); | |||||
} | } | ||||
}; | }; | ||||
} else { | } else { | ||||
gen.writeln(" /Filter /SubFileDecode"); | gen.writeln(" /Filter /SubFileDecode"); | ||||
gen.writeln(" /DecodeParms << /EODCount 0 /EODString (%FOPEndOfData) >>"); | gen.writeln(" /DecodeParms << /EODCount 0 /EODString (%FOPEndOfData) >>"); | ||||
gen.writeln(">> /ReusableStreamDecode filter"); | gen.writeln(">> /ReusableStreamDecode filter"); | ||||
paintImageG2D(imageG2D, dimensionsMpt, gen); | |||||
paintImageG2D(imageG2D, dimensionsMpt, gen, fontInfo); | |||||
gen.writeln("%FOPEndOfData"); | gen.writeln("%FOPEndOfData"); | ||||
gen.writeln("def"); | gen.writeln("def"); | ||||
} | } | ||||
} | } | ||||
protected void paintImageG2D(final ImageGraphics2D imageG2D, Dimension2D dimensionsMpt, | protected void paintImageG2D(final ImageGraphics2D imageG2D, Dimension2D dimensionsMpt, | ||||
PSGenerator gen) throws IOException { | |||||
PSGraphics2DAdapter adapter = new PSGraphics2DAdapter(gen, false); | |||||
PSGenerator gen, FontInfo fontInfo) throws IOException { | |||||
PSGraphics2DAdapter adapter = new PSGraphics2DAdapter(gen, false, fontInfo); | |||||
adapter.paintImage(imageG2D.getGraphics2DImagePainter(), | adapter.paintImage(imageG2D.getGraphics2DImagePainter(), | ||||
null, | null, | ||||
0, 0, | 0, 0, |
/* | |||||
* Licensed to the Apache Software Foundation (ASF) under one or more | |||||
* contributor license agreements. See the NOTICE file distributed with | |||||
* this work for additional information regarding copyright ownership. | |||||
* The ASF licenses this file to You under the Apache License, Version 2.0 | |||||
* (the "License"); you may not use this file except in compliance with | |||||
* the License. You may obtain a copy of the License at | |||||
* | |||||
* http://www.apache.org/licenses/LICENSE-2.0 | |||||
* | |||||
* Unless required by applicable law or agreed to in writing, software | |||||
* distributed under the License is distributed on an "AS IS" BASIS, | |||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
* See the License for the specific language governing permissions and | |||||
* limitations under the License. | |||||
*/ | |||||
package org.apache.fop.render.ps; | |||||
import java.awt.Dimension; | |||||
import java.awt.Graphics2D; | |||||
import java.awt.geom.Rectangle2D; | |||||
import java.io.ByteArrayOutputStream; | |||||
import java.io.IOException; | |||||
import org.junit.Assert; | |||||
import org.junit.Test; | |||||
import org.apache.xmlgraphics.java2d.GeneralGraphics2DImagePainter; | |||||
import org.apache.xmlgraphics.java2d.ps.PSGraphics2D; | |||||
import org.apache.xmlgraphics.ps.PSGenerator; | |||||
import org.apache.fop.fonts.FontInfo; | |||||
public class PSGraphics2DAdapterTestCase { | |||||
@Test | |||||
public void testFontFallback() throws IOException { | |||||
PSGenerator gen = new PSGenerator(new ByteArrayOutputStream()); | |||||
FontInfo fi = new FontInfo(); | |||||
fi.addFontProperties("a", "b", "c", 400); | |||||
PSGraphics2DAdapter psGraphics2DAdapter = new PSGraphics2DAdapter(gen, true, fi); | |||||
MyPainter painter = new MyPainter(); | |||||
psGraphics2DAdapter.paintImage(painter, null, 0, 0, 0, 0); | |||||
Assert.assertEquals(painter.font, "b"); | |||||
} | |||||
static class MyPainter implements GeneralGraphics2DImagePainter { | |||||
String font; | |||||
public Graphics2D getGraphics(boolean textAsShapes, PSGenerator gen) { | |||||
return new PSGraphics2D(true); | |||||
} | |||||
public void addFallbackFont(String name, Object font) { | |||||
this.font = name; | |||||
} | |||||
public void paint(Graphics2D g2d, Rectangle2D area) { | |||||
} | |||||
public Dimension getImageSize() { | |||||
return new Dimension(); | |||||
} | |||||
} | |||||
} |