diff options
author | Vincent Hennebert <vhennebert@apache.org> | 2010-06-14 17:01:14 +0000 |
---|---|---|
committer | Vincent Hennebert <vhennebert@apache.org> | 2010-06-14 17:01:14 +0000 |
commit | e119fc463614cb098c9d935e497a8282437438bf (patch) | |
tree | f5ecedb839152400df47f010bfcdf66574921d1b /src/java/org/apache | |
parent | 0c11c0d32561d68c97d9bafcd8e5d823558419d8 (diff) | |
parent | 2150f3f35acbe14ca11c60a948d7a8d8df1b7769 (diff) | |
download | xmlgraphics-fop-e119fc463614cb098c9d935e497a8282437438bf.tar.gz xmlgraphics-fop-e119fc463614cb098c9d935e497a8282437438bf.zip |
Merged changes from Trunk up to revision 954512
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript@954554 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/java/org/apache')
19 files changed, 334 insertions, 115 deletions
diff --git a/src/java/org/apache/fop/afp/AFPGraphics2D.java b/src/java/org/apache/fop/afp/AFPGraphics2D.java index fdfde8cca..fa9c0d7bf 100644 --- a/src/java/org/apache/fop/afp/AFPGraphics2D.java +++ b/src/java/org/apache/fop/afp/AFPGraphics2D.java @@ -45,7 +45,6 @@ import java.awt.image.RenderedImage; import java.awt.image.renderable.RenderableImage; import java.io.IOException; -import org.apache.commons.io.output.ByteArrayOutputStream; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -56,8 +55,6 @@ import org.apache.xmlgraphics.java2d.AbstractGraphics2D; import org.apache.xmlgraphics.java2d.GraphicContext; import org.apache.xmlgraphics.java2d.StrokingTextHandler; import org.apache.xmlgraphics.java2d.TextHandler; -import org.apache.xmlgraphics.ps.ImageEncodingHelper; -import org.apache.xmlgraphics.util.MimeConstants; import org.apache.xmlgraphics.util.UnitConv; import org.apache.fop.afp.goca.GraphicsSetLineType; @@ -65,6 +62,8 @@ import org.apache.fop.afp.modca.GraphicsObject; import org.apache.fop.afp.svg.AFPGraphicsConfiguration; import org.apache.fop.afp.util.CubicBezierApproximator; import org.apache.fop.fonts.FontInfo; +import org.apache.fop.render.afp.AFPImageHandlerRenderedImage; +import org.apache.fop.render.afp.AFPRenderingContext; import org.apache.fop.svg.NativeImageHandler; /** @@ -559,68 +558,6 @@ public class AFPGraphics2D extends AbstractGraphics2D implements NativeImageHand BufferedImage.TYPE_INT_ARGB); } - private AFPImageObjectInfo createImageObjectInfo( - RenderedImage img, int x, int y, int width, int height) throws IOException { - ImageInfo imageInfo = new ImageInfo(null, "image/unknown"); - ImageSize size = new ImageSize(img.getWidth(), img.getHeight(), 72); - imageInfo.setSize(size); - - ImageRendered imageRendered = new ImageRendered(imageInfo, img, null); - RenderedImage renderedImage = imageRendered.getRenderedImage(); - - // create image object info - AFPImageObjectInfo imageObjectInfo = new AFPImageObjectInfo(); - - imageObjectInfo.setMimeType(MimeConstants.MIME_AFP_IOCA_FS45); - - int bitsPerPixel = paintingState.getBitsPerPixel(); - imageObjectInfo.setBitsPerPixel(bitsPerPixel); - - imageObjectInfo.setResourceInfo(resourceInfo); - - int dataHeight = renderedImage.getHeight(); - imageObjectInfo.setDataHeight(dataHeight); - - int dataWidth = renderedImage.getWidth(); - imageObjectInfo.setDataWidth(dataWidth); - - boolean colorImages = paintingState.isColorImages(); - imageObjectInfo.setColor(colorImages); - - ByteArrayOutputStream boas = new ByteArrayOutputStream(); - ImageEncodingHelper.encodeRenderedImageAsRGB(renderedImage, boas); - byte[] imageData = boas.toByteArray(); - - // convert to grayscale - if (!colorImages) { - boas.reset(); - imageObjectInfo.setBitsPerPixel(bitsPerPixel); - ImageEncodingHelper.encodeRGBAsGrayScale( - imageData, dataWidth, dataHeight, bitsPerPixel, boas); - imageData = boas.toByteArray(); - } - imageObjectInfo.setData(imageData); - - if (imageInfo != null) { - imageObjectInfo.setUri(imageInfo.getOriginalURI()); - } - - // create object area info - AFPObjectAreaInfo objectAreaInfo = new AFPObjectAreaInfo(); - objectAreaInfo.setX(x); - objectAreaInfo.setY(y); - objectAreaInfo.setWidth(width); - objectAreaInfo.setHeight(height); - - int resolution = paintingState.getResolution(); - objectAreaInfo.setWidthRes(resolution); - objectAreaInfo.setHeightRes(resolution); - - imageObjectInfo.setObjectAreaInfo(objectAreaInfo); - - return imageObjectInfo; - } - /** * Draws an AWT image into a BufferedImage using an AWT Graphics2D implementation * @@ -660,30 +597,13 @@ public class AFPGraphics2D extends AbstractGraphics2D implements NativeImageHand /** {@inheritDoc} */ public boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) { - // draw with AWT Graphics2D Dimension imageSize = new Dimension(width, height); BufferedImage bufferedImage = buildBufferedImage(imageSize); boolean drawn = drawBufferedImage(img, bufferedImage, width, height, observer); if (drawn) { - AffineTransform at = gc.getTransform(); - float[] srcPts = new float[] {x, y}; - float[] dstPts = new float[srcPts.length]; - at.transform(srcPts, 0, dstPts, 0, 1); - x = Math.round(dstPts[X]); - y = Math.round(dstPts[Y]); - try { - // get image object info - AFPImageObjectInfo imageObjectInfo - = createImageObjectInfo(bufferedImage, x, y, width, height); - - // create image resource - resourceManager.createObject(imageObjectInfo); - return true; - } catch (IOException ioe) { - handleIOException(ioe); - } + drawRenderedImage(bufferedImage, new AffineTransform()); } return false; } @@ -693,20 +613,33 @@ public class AFPGraphics2D extends AbstractGraphics2D implements NativeImageHand int imgWidth = img.getWidth(); int imgHeight = img.getHeight(); - AffineTransform at = paintingState.getData().getTransform(); AffineTransform gat = gc.getTransform(); int graphicsObjectHeight = graphicsObj.getObjectEnvironmentGroup().getObjectAreaDescriptor().getHeight(); - int x = (int)Math.round(at.getTranslateX() + gat.getTranslateX()); - int y = (int)Math.round(at.getTranslateY() - (gat.getTranslateY() - graphicsObjectHeight)); - int width = (int)Math.round(imgWidth * gat.getScaleX()); - int height = (int)Math.round(imgHeight * -gat.getScaleY()); + + double toMillipointFactor = UnitConv.IN2PT * 1000 / (double)paintingState.getResolution(); + double x = gat.getTranslateX(); + double y = -(gat.getTranslateY() - graphicsObjectHeight); + x = toMillipointFactor * x; + y = toMillipointFactor * y; + double w = toMillipointFactor * imgWidth * gat.getScaleX(); + double h = toMillipointFactor * imgHeight * -gat.getScaleY(); + + AFPImageHandlerRenderedImage handler = new AFPImageHandlerRenderedImage(); + ImageInfo imageInfo = new ImageInfo(null, null); + imageInfo.setSize(new ImageSize( + img.getWidth(), img.getHeight(), paintingState.getResolution())); + imageInfo.getSize().calcSizeFromPixels(); + ImageRendered red = new ImageRendered(imageInfo, img, null); + Rectangle targetPos = new Rectangle( + (int)Math.round(x), + (int)Math.round(y), + (int)Math.round(w), + (int)Math.round(h)); + AFPRenderingContext context = new AFPRenderingContext(null, + resourceManager, paintingState, fontInfo, null); try { - // get image object info - AFPImageObjectInfo imageObjectInfo - = createImageObjectInfo(img, x, y, width, height); - // create image resource - resourceManager.createObject(imageObjectInfo); + handler.handleImage(context, red, targetPos); } catch (IOException ioe) { handleIOException(ioe); } diff --git a/src/java/org/apache/fop/afp/AFPPaintingState.java b/src/java/org/apache/fop/afp/AFPPaintingState.java index a19874183..e92a6cdb2 100644 --- a/src/java/org/apache/fop/afp/AFPPaintingState.java +++ b/src/java/org/apache/fop/afp/AFPPaintingState.java @@ -24,9 +24,9 @@ import java.awt.Point; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.xmlgraphics.java2d.ColorConverter; -import org.apache.xmlgraphics.java2d.DefaultColorConverter; -import org.apache.xmlgraphics.java2d.GrayScaleColorConverter; +import org.apache.xmlgraphics.java2d.color.ColorConverter; +import org.apache.xmlgraphics.java2d.color.DefaultColorConverter; +import org.apache.xmlgraphics.java2d.color.GrayScaleColorConverter; import org.apache.fop.afp.fonts.AFPPageFonts; import org.apache.fop.util.AbstractPaintingState; @@ -51,6 +51,9 @@ public class AFPPaintingState extends org.apache.fop.util.AbstractPaintingState /** color image support */ private boolean colorImages = false; + /** dithering quality setting (0.0f..1.0f) */ + private float ditheringQuality; + /** color image handler */ private ColorConverter colorConverter = GrayScaleColorConverter.getInstance(); @@ -234,6 +237,25 @@ public class AFPPaintingState extends org.apache.fop.util.AbstractPaintingState } /** + * Gets the dithering quality setting to use when converting images to monochrome images. + * @return the dithering quality (a value between 0.0f and 1.0f) + */ + public float getDitheringQuality() { + return this.ditheringQuality; + } + + /** + * Sets the dithering quality setting to use when converting images to monochrome images. + * @param quality Defines the desired quality level for the conversion. + * Valid values: a value between 0.0f (fastest) and 1.0f (best) + */ + public void setDitheringQuality(float quality) { + quality = Math.max(quality, 0.0f); + quality = Math.min(quality, 1.0f); + this.ditheringQuality = quality; + } + + /** * Sets the output/device resolution * * @param resolution diff --git a/src/java/org/apache/fop/afp/modca/GraphicsDataDescriptor.java b/src/java/org/apache/fop/afp/modca/GraphicsDataDescriptor.java index 5495e2e9c..5fa3b70a9 100644 --- a/src/java/org/apache/fop/afp/modca/GraphicsDataDescriptor.java +++ b/src/java/org/apache/fop/afp/modca/GraphicsDataDescriptor.java @@ -104,8 +104,8 @@ public class GraphicsDataDescriptor extends AbstractDescriptor { return data; } - private static final int ABS = 2; - private static final int IMGRES = 8; + private static final int ABS = 64; + private static final int IMGRES = 16; /** * Returns the window specification data diff --git a/src/java/org/apache/fop/afp/modca/GraphicsObject.java b/src/java/org/apache/fop/afp/modca/GraphicsObject.java index cdc0a44bc..b677a0f7c 100644 --- a/src/java/org/apache/fop/afp/modca/GraphicsObject.java +++ b/src/java/org/apache/fop/afp/modca/GraphicsObject.java @@ -25,7 +25,7 @@ import java.io.OutputStream; import java.util.Iterator; import java.util.List; -import org.apache.xmlgraphics.java2d.ColorConverter; +import org.apache.xmlgraphics.java2d.color.ColorConverter; import org.apache.fop.afp.AFPDataObjectInfo; import org.apache.fop.afp.AFPObjectAreaInfo; diff --git a/src/java/org/apache/fop/pdf/PDFColor.java b/src/java/org/apache/fop/pdf/PDFColor.java index c4a8e5be6..42a9c7223 100644 --- a/src/java/org/apache/fop/pdf/PDFColor.java +++ b/src/java/org/apache/fop/pdf/PDFColor.java @@ -26,8 +26,8 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -import org.apache.xmlgraphics.java2d.CMYKColorSpace; -import org.apache.xmlgraphics.java2d.ColorExt; +import org.apache.xmlgraphics.java2d.color.CMYKColorSpace; +import org.apache.xmlgraphics.java2d.color.ColorExt; /** * PDF Color object. diff --git a/src/java/org/apache/fop/pdf/PDFNumber.java b/src/java/org/apache/fop/pdf/PDFNumber.java index 3c103f3f2..5bc648ced 100644 --- a/src/java/org/apache/fop/pdf/PDFNumber.java +++ b/src/java/org/apache/fop/pdf/PDFNumber.java @@ -88,7 +88,7 @@ public class PDFNumber extends PDFObject { if (hasObjectNumber()) { sb.append(getObjectID()); } - sb.append(getNumber().toString()); + sb.append(doubleOut(getNumber().doubleValue(), 10)); if (hasObjectNumber()) { sb.append("\nendobj\n"); } diff --git a/src/java/org/apache/fop/render/afp/AFPCustomizable.java b/src/java/org/apache/fop/render/afp/AFPCustomizable.java index 5f3fe6823..93aaa8b1a 100644 --- a/src/java/org/apache/fop/render/afp/AFPCustomizable.java +++ b/src/java/org/apache/fop/render/afp/AFPCustomizable.java @@ -65,6 +65,13 @@ public interface AFPCustomizable { void setShadingMode(AFPShadingMode shadingMode); /** + * Sets the dithering quality setting to use when converting images to monochrome images. + * @param quality Defines the desired quality level for the conversion. + * Valid values: a value between 0.0f (fastest) and 1.0f (best) + */ + void setDitheringQuality(float quality); + + /** * Sets the output/device resolution * * @param resolution diff --git a/src/java/org/apache/fop/render/afp/AFPDocumentHandler.java b/src/java/org/apache/fop/render/afp/AFPDocumentHandler.java index 3fec25d8d..21d4faf56 100644 --- a/src/java/org/apache/fop/render/afp/AFPDocumentHandler.java +++ b/src/java/org/apache/fop/render/afp/AFPDocumentHandler.java @@ -46,8 +46,8 @@ import org.apache.fop.fonts.FontManager; import org.apache.fop.render.afp.extensions.AFPElementMapping; import org.apache.fop.render.afp.extensions.AFPIncludeFormMap; import org.apache.fop.render.afp.extensions.AFPInvokeMediumMap; -import org.apache.fop.render.afp.extensions.AFPPageSetup; import org.apache.fop.render.afp.extensions.AFPPageOverlay; +import org.apache.fop.render.afp.extensions.AFPPageSetup; import org.apache.fop.render.intermediate.AbstractBinaryWritingIFDocumentHandler; import org.apache.fop.render.intermediate.IFDocumentHandler; import org.apache.fop.render.intermediate.IFDocumentHandlerConfigurator; @@ -362,6 +362,11 @@ public class AFPDocumentHandler extends AbstractBinaryWritingIFDocumentHandler } /** {@inheritDoc} */ + public void setDitheringQuality(float quality) { + this.paintingState.setDitheringQuality(quality); + } + + /** {@inheritDoc} */ public void setShadingMode(AFPShadingMode shadingMode) { this.shadingMode = shadingMode; } diff --git a/src/java/org/apache/fop/render/afp/AFPImageHandlerGraphics2D.java b/src/java/org/apache/fop/render/afp/AFPImageHandlerGraphics2D.java index 32a95b445..aaaecf2ea 100644 --- a/src/java/org/apache/fop/render/afp/AFPImageHandlerGraphics2D.java +++ b/src/java/org/apache/fop/render/afp/AFPImageHandlerGraphics2D.java @@ -20,6 +20,7 @@ package org.apache.fop.render.afp; import java.awt.Rectangle; +import java.awt.geom.AffineTransform; import java.io.IOException; import org.apache.xmlgraphics.image.loader.Image; @@ -136,6 +137,12 @@ public class AFPImageHandlerGraphics2D extends AFPImageHandler implements ImageH setDefaultResourceLevel(graphicsObjectInfo, afpContext.getResourceManager()); + AFPPaintingState paintingState = afpContext.getPaintingState(); + paintingState.save(); // save + AffineTransform placement = new AffineTransform(); + placement.translate(pos.x, pos.y); + paintingState.concatenate(placement); + // Image content ImageGraphics2D imageG2D = (ImageGraphics2D)image; boolean textAsShapes = false; //TODO Make configurable @@ -152,6 +159,8 @@ public class AFPImageHandlerGraphics2D extends AFPImageHandler implements ImageH // Create image afpContext.getResourceManager().createObject(graphicsObjectInfo); + + paintingState.restore(); // resume } /** {@inheritDoc} */ diff --git a/src/java/org/apache/fop/render/afp/AFPImageHandlerRenderedImage.java b/src/java/org/apache/fop/render/afp/AFPImageHandlerRenderedImage.java index 330f78d63..cb7b23da2 100644 --- a/src/java/org/apache/fop/render/afp/AFPImageHandlerRenderedImage.java +++ b/src/java/org/apache/fop/render/afp/AFPImageHandlerRenderedImage.java @@ -101,6 +101,7 @@ public class AFPImageHandlerRenderedImage extends AFPImageHandler implements Ima maxPixelSize *= 3; //RGB is maximum } } + float ditheringQuality = paintingState.getDitheringQuality(); RenderedImage renderedImage = imageRendered.getRenderedImage(); ImageInfo imageInfo = imageRendered.getInfo(); @@ -130,9 +131,13 @@ public class AFPImageHandlerRenderedImage extends AFPImageHandler implements Ima log.debug("Resample from " + intrinsicSize.getDimensionPx() + " to " + resampledDim); } - renderedImage = BitmapImageUtil.convertToMonochrome(renderedImage, resampledDim); + renderedImage = BitmapImageUtil.convertToMonochrome(renderedImage, + resampledDim, ditheringQuality); effIntrinsicSize = new ImageSize( resampledDim.width, resampledDim.height, resolution); + } else if (ditheringQuality >= 0.5f) { + renderedImage = BitmapImageUtil.convertToMonochrome(renderedImage, + intrinsicSize.getDimensionPx(), ditheringQuality); } } @@ -157,7 +162,6 @@ public class AFPImageHandlerRenderedImage extends AFPImageHandler implements Ima if (cm.hasAlpha()) { pixelSize -= 8; } - //TODO Add support for CMYK images byte[] imageData = null; ByteArrayOutputStream baos = new ByteArrayOutputStream(); diff --git a/src/java/org/apache/fop/render/afp/AFPRenderer.java b/src/java/org/apache/fop/render/afp/AFPRenderer.java index d88deadfe..1f373023c 100644 --- a/src/java/org/apache/fop/render/afp/AFPRenderer.java +++ b/src/java/org/apache/fop/render/afp/AFPRenderer.java @@ -839,6 +839,11 @@ public class AFPRenderer extends AbstractPathOrientedRenderer implements AFPCust } /** {@inheritDoc} */ + public void setDitheringQuality(float quality) { + this.paintingState.setDitheringQuality(quality); + } + + /** {@inheritDoc} */ public void setShadingMode(AFPShadingMode shadingMode) { this.shadingMode = shadingMode; } diff --git a/src/java/org/apache/fop/render/afp/AFPRendererConfigurator.java b/src/java/org/apache/fop/render/afp/AFPRendererConfigurator.java index 23f413813..1720667df 100644 --- a/src/java/org/apache/fop/render/afp/AFPRendererConfigurator.java +++ b/src/java/org/apache/fop/render/afp/AFPRendererConfigurator.java @@ -390,6 +390,21 @@ public class AFPRendererConfigurator extends PrintRendererConfigurator customizable.setBitsPerPixel(bitsPerPixel); } + String dithering = imagesCfg.getAttribute("dithering-quality", "medium"); + float dq = 0.5f; + if (dithering.startsWith("min")) { + dq = 0.0f; + } else if (dithering.startsWith("max")) { + dq = 1.0f; + } else { + try { + dq = Float.parseFloat(dithering); + } catch (NumberFormatException nfe) { + //ignore and leave the default above + } + } + customizable.setDitheringQuality(dq); + // native image support boolean nativeImageSupport = imagesCfg.getAttributeAsBoolean("native", false); customizable.setNativeImagesSupported(nativeImageSupport); diff --git a/src/java/org/apache/fop/render/awt/viewer/PageChangeEvent.java b/src/java/org/apache/fop/render/awt/viewer/PageChangeEvent.java new file mode 100644 index 000000000..045ce7fe4 --- /dev/null +++ b/src/java/org/apache/fop/render/awt/viewer/PageChangeEvent.java @@ -0,0 +1,61 @@ +/* + * 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. + */ + +/* $Id$ */ + +package org.apache.fop.render.awt.viewer; + +import java.util.EventObject; + +/** + * Swing event fired whenever the current page selection of a + * {@link PreviewPanel} changes. Page numbers are 0-based. + */ +public class PageChangeEvent extends EventObject { + + private int oldPage; + private int newPage; + + /** + * Creates an new page change event. + * @param panel the preview panel the event is produced for. + * @param oldPage the old page (zero based) + * @param newPage the new page (zero based) + */ + public PageChangeEvent(PreviewPanel panel, int oldPage, int newPage) { + super(panel); + this.oldPage = oldPage; + this.newPage = newPage; + } + + /** + * Returns the new page. + * @return the new page (zero based) + */ + public int getNewPage() { + return newPage; + } + + /** + * Returns the old page. + * @return the old page (zero based) + */ + public int getOldPage() { + return oldPage; + } + +} diff --git a/src/java/org/apache/fop/render/awt/viewer/PageChangeListener.java b/src/java/org/apache/fop/render/awt/viewer/PageChangeListener.java new file mode 100644 index 000000000..b350f891d --- /dev/null +++ b/src/java/org/apache/fop/render/awt/viewer/PageChangeListener.java @@ -0,0 +1,36 @@ +/* + * 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. + */ + +/* $Id$ */ + +package org.apache.fop.render.awt.viewer; + +import java.util.EventListener; + +/** + * Swing listener interface for classes which wish to receive + * notification of page change events. + */ +public interface PageChangeListener extends EventListener { + + /** + * Called whenever the current page is changed. + * @param pce the page change event + */ + void pageChanged(PageChangeEvent pce); + +} diff --git a/src/java/org/apache/fop/render/awt/viewer/PreviewDialog.java b/src/java/org/apache/fop/render/awt/viewer/PreviewDialog.java index e3f510853..031021a6f 100644 --- a/src/java/org/apache/fop/render/awt/viewer/PreviewDialog.java +++ b/src/java/org/apache/fop/render/awt/viewer/PreviewDialog.java @@ -171,6 +171,11 @@ public class PreviewDialog extends JFrame implements StatusListener { //Page view stuff previewPanel = new PreviewPanel(foUserAgent, renderable, renderer); getContentPane().add(previewPanel, BorderLayout.CENTER); + previewPanel.addPageChangeListener(new PageChangeListener() { + public void pageChanged(PageChangeEvent pce) { + new ShowInfo().run(); + } + }); // Keyboard shortcuts - pgup/pgdn InputMap im = previewPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); @@ -260,6 +265,7 @@ public class PreviewDialog extends JFrame implements StatusListener { * Creates and initialize the AWT Viewer main window. * @param foUserAgent the FO user agent * @param renderable the target for the rendering + * @param asMainWindow true if the window shall act as the main application window. * @return the newly initialized preview dialog */ public static PreviewDialog createPreviewDialog(FOUserAgent foUserAgent, @@ -530,12 +536,18 @@ public class PreviewDialog extends JFrame implements StatusListener { goToPage(currentPage); } - /** Scales page image */ + /** + * Scales page image. + * @param scaleFactor the scale factor + */ public void setScale(double scaleFactor) { scale.setSelectedItem(percentFormat.format(scaleFactor) + "%"); previewPanel.setScaleFactor(scaleFactor / 100d); } + /** + * Sets the scaling so the contents fit into the window. + */ public void setScaleToFitWindow() { try { setScale(previewPanel.getScaleToFitWindow() * 100); @@ -544,6 +556,9 @@ public class PreviewDialog extends JFrame implements StatusListener { } } + /** + * Sets the scaling so the contents are spread over the whole width available. + */ public void setScaleToFitWidth() { try { setScale(previewPanel.getScaleToFitWidth() * 100); @@ -569,7 +584,7 @@ public class PreviewDialog extends JFrame implements StatusListener { //Restore originally configured target resolution float saveResolution = foUserAgent.getTargetResolution(); foUserAgent.setTargetResolution(this.configuredTargetResolution); - + PrinterJob pj = PrinterJob.getPrinterJob(); pj.setPageable(renderer); if (!showDialog || pj.printDialog()) { @@ -579,7 +594,7 @@ public class PreviewDialog extends JFrame implements StatusListener { e.printStackTrace(); } } - + foUserAgent.setTargetResolution(saveResolution); } diff --git a/src/java/org/apache/fop/render/awt/viewer/PreviewPanel.java b/src/java/org/apache/fop/render/awt/viewer/PreviewPanel.java index f8152a978..2303c0e8e 100644 --- a/src/java/org/apache/fop/render/awt/viewer/PreviewPanel.java +++ b/src/java/org/apache/fop/render/awt/viewer/PreviewPanel.java @@ -19,11 +19,14 @@ package org.apache.fop.render.awt.viewer; +import java.awt.Adjustable; import java.awt.Color; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.Point; import java.awt.Toolkit; +import java.awt.event.AdjustmentEvent; +import java.awt.event.AdjustmentListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; @@ -166,6 +169,8 @@ public class PreviewPanel extends JPanel { previewArea = new JScrollPane(gridPanel); previewArea.getViewport().setBackground(Color.gray); + previewArea.getVerticalScrollBar().addAdjustmentListener(new PageNumberListener()); + // FIXME should add scroll wheel support here at some point. scroller = new ViewportScroller(previewArea.getViewport()); previewArea.addMouseListener(scroller); @@ -188,6 +193,7 @@ public class PreviewPanel extends JPanel { * @param number the page number */ public void setPage(int number) { + int oldPage = currentPage; if (displayMode == CONTINUOUS || displayMode == CONT_FACING) { currentPage = number; gridPanel.scrollRectToVisible(pagePanels[currentPage].getBounds()); @@ -196,6 +202,7 @@ public class PreviewPanel extends JPanel { firstPage = currentPage; } showPage(); + firePageChange(oldPage, currentPage); } /** @@ -237,6 +244,42 @@ public class PreviewPanel extends JPanel { } /** + * Add a listener to receive notification of page change events. Events will + * be fired whenever the currentPage value is changed. The values recorded + * are 0-based. + * @param l the page change listener to add + */ + public void addPageChangeListener(PageChangeListener l) { + listenerList.add(PageChangeListener.class, l); + } + + /** + * Removes a page change listener. + * @param l the page change listener to remove + */ + public void removePageChangeListener(PageChangeListener l) { + listenerList.remove(PageChangeListener.class, l); + } + + /** + * Notify all registered listeners of a page change event. + * @param oldPage the old page + * @param newPage the new page + */ + protected void firePageChange(int oldPage, int newPage) { + Object[] listeners = listenerList.getListenerList(); + PageChangeEvent e = null; + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == PageChangeListener.class) { + if (e == null) { + e = new PageChangeEvent(this, newPage, oldPage); + } + ((PageChangeListener)listeners[i + 1]).pageChanged(e); + } + } + } + + /** * Allows any mouse drag on the page area to scroll the display window. */ private class ViewportScroller implements MouseListener, MouseMotionListener { @@ -352,6 +395,23 @@ public class PreviewPanel extends JPanel { } } + private class PageNumberListener implements AdjustmentListener { + public void adjustmentValueChanged(AdjustmentEvent e) { + if (displayMode == PreviewPanel.CONTINUOUS || displayMode == PreviewPanel.CONT_FACING) { + Adjustable a = e.getAdjustable(); + int value = +e.getValue(); + int min = a.getMinimum(); + int max = a.getMaximum(); + int page = ( (renderer.getNumberOfPages() * value) / (max - min) ); + if (page != currentPage) { + int oldPage = currentPage; + currentPage = page; + firePageChange(oldPage, currentPage); + } + } + } + } + /** * Scales page image * @param scale [0;1] diff --git a/src/java/org/apache/fop/svg/PDFGraphics2D.java b/src/java/org/apache/fop/svg/PDFGraphics2D.java index e25fbbdbe..f0084da09 100644 --- a/src/java/org/apache/fop/svg/PDFGraphics2D.java +++ b/src/java/org/apache/fop/svg/PDFGraphics2D.java @@ -66,8 +66,8 @@ import org.apache.xmlgraphics.image.loader.impl.ImageRawCCITTFax; import org.apache.xmlgraphics.image.loader.impl.ImageRawJPEG; import org.apache.xmlgraphics.image.loader.impl.ImageRendered; import org.apache.xmlgraphics.java2d.AbstractGraphics2D; -import org.apache.xmlgraphics.java2d.ColorExt; import org.apache.xmlgraphics.java2d.GraphicContext; +import org.apache.xmlgraphics.java2d.color.ColorExt; import org.apache.fop.fonts.Font; import org.apache.fop.fonts.FontInfo; @@ -762,7 +762,7 @@ public class PDFGraphics2D extends AbstractGraphics2D implements NativeImageHand //currentStream.write(currentColour.getColorSpaceOut(fill)); } else { throw new UnsupportedOperationException( - "Color Space not supported by PDFGraphics2D"); + "Color Space not supported by PDFGraphics2D: " + c.getColorSpace()); } } diff --git a/src/java/org/apache/fop/util/ColorUtil.java b/src/java/org/apache/fop/util/ColorUtil.java index 4ec858ca6..656d9ef98 100644 --- a/src/java/org/apache/fop/util/ColorUtil.java +++ b/src/java/org/apache/fop/util/ColorUtil.java @@ -27,8 +27,8 @@ import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.xmlgraphics.java2d.CMYKColorSpace; -import org.apache.xmlgraphics.java2d.ColorExt; +import org.apache.xmlgraphics.java2d.color.CMYKColorSpace; +import org.apache.xmlgraphics.java2d.color.ColorExt; import org.apache.fop.apps.FOUserAgent; import org.apache.fop.fo.expr.PropertyException; @@ -682,7 +682,7 @@ public final class ColorUtil { * @return the modified color */ public static Color lightenColor(Color col, float factor) { - return org.apache.xmlgraphics.java2d.ColorUtil.lightenColor(col, factor); + return org.apache.xmlgraphics.java2d.color.ColorUtil.lightenColor(col, factor); } /** @@ -701,7 +701,7 @@ public final class ColorUtil { * @return true if it is a gray value */ public static boolean isGray(Color col) { - return org.apache.xmlgraphics.java2d.ColorUtil.isGray(col); + return org.apache.xmlgraphics.java2d.color.ColorUtil.isGray(col); } /** @@ -711,6 +711,6 @@ public final class ColorUtil { */ public static Color toCMYKGrayColor(float black) { - return org.apache.xmlgraphics.java2d.ColorUtil.toCMYKGrayColor(black); + return org.apache.xmlgraphics.java2d.color.ColorUtil.toCMYKGrayColor(black); } } diff --git a/src/java/org/apache/fop/util/bitmap/BitmapImageUtil.java b/src/java/org/apache/fop/util/bitmap/BitmapImageUtil.java index cb46395ca..c08076316 100644 --- a/src/java/org/apache/fop/util/bitmap/BitmapImageUtil.java +++ b/src/java/org/apache/fop/util/bitmap/BitmapImageUtil.java @@ -135,6 +135,53 @@ public class BitmapImageUtil { */ public static final BufferedImage convertToMonochrome(RenderedImage img, Dimension targetDimension) { + return toBufferedImage(convertToMonochrome(img, targetDimension, 0.0f)); + } + + /** + * Converts an image to a monochrome 1-bit image. Optionally, the image can be scaled. + * @param img the image to be converted + * @param targetDimension the new target dimensions or null if no scaling is necessary + * @param quality Defines the desired quality level for the conversion. + * Valid values: a value between 0.0f (fastest) and 1.0f (best) + * @return the monochrome image + */ + public static final RenderedImage convertToMonochrome(RenderedImage img, + Dimension targetDimension, float quality) { + if (!isMonochromeImage(img)) { + if (quality >= 0.5f) { + BufferedImage bi; + Dimension orgDim = new Dimension(img.getWidth(), img.getHeight()); + if (targetDimension != null && !orgDim.equals(targetDimension)) { + //Scale only before dithering + ColorModel cm = img.getColorModel(); + BufferedImage tgt = new BufferedImage(cm, + cm.createCompatibleWritableRaster( + targetDimension.width, targetDimension.height), + cm.isAlphaPremultiplied(), null); + transferImage(img, tgt); + bi = tgt; + } else { + bi = toBufferedImage(img); + } + //Now convert to monochrome (dithering if available) + MonochromeBitmapConverter converter = createDefaultMonochromeBitmapConverter(); + if (quality >= 0.8f) { + //Activates error diffusion if JAI is available + converter.setHint("quality", Boolean.TRUE.toString()); + //Need to convert to grayscale first since otherwise, there may be encoding + //problems later with the images JAI can generate. + bi = convertToGrayscale(bi, targetDimension); + } + try { + return converter.convertToMonochrome(bi); + } catch (Exception e) { + //Provide a fallback if exotic formats are encountered + bi = convertToGrayscale(bi, targetDimension); + return converter.convertToMonochrome(bi); + } + } + } return convertAndScaleImage(img, targetDimension, BufferedImage.TYPE_BYTE_BINARY); } |