From 3565fa8a67811f39a406429209979bb885db2ffd Mon Sep 17 00:00:00 2001 From: eschaeffer Date: Tue, 21 Nov 2000 07:30:14 +0000 Subject: [PATCH] Bug correction in my previous patch. Can only test that the image can fit in a page (test height), and that it can fit in the area (test width). PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@193830 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/fop/fo/flow/ExternalGraphic.java | 432 +++++++++--------- 1 file changed, 213 insertions(+), 219 deletions(-) diff --git a/src/org/apache/fop/fo/flow/ExternalGraphic.java b/src/org/apache/fop/fo/flow/ExternalGraphic.java index 297908a4b..f2a145926 100644 --- a/src/org/apache/fop/fo/flow/ExternalGraphic.java +++ b/src/org/apache/fop/fo/flow/ExternalGraphic.java @@ -1,53 +1,41 @@ /* - - ============================================================================ - The Apache Software License, Version 1.1 - ============================================================================ - - Copyright (C) 1999 The Apache Software Foundation. All rights reserved. - - Redistribution and use in source and binary forms, with or without modifica- - tion, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. The end-user documentation included with the redistribution, if any, must - include the following acknowledgment: "This product includes software - developed by the Apache Software Foundation (http://www.apache.org/)." - Alternately, this acknowledgment may appear in the software itself, if - and wherever such third-party acknowledgments normally appear. - - 4. The names "FOP" and "Apache Software Foundation" must not be used to - endorse or promote products derived from this software without prior - written permission. For written permission, please contact - apache@apache.org. - - 5. Products derived from this software may not be called "Apache", nor may - "Apache" appear in their name, without prior written permission of the - Apache Software Foundation. - - THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- - DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - This software consists of voluntary contributions made by many individuals - on behalf of the Apache Software Foundation and was originally created by - James Tauber . For more information on the Apache - Software Foundation, please see . - - */ + * ============================================================================ + * The Apache Software License, Version 1.1 + * ============================================================================ + * Copyright (C) 1999 The Apache Software Foundation. All rights reserved. + * Redistribution and use in source and binary forms, with or without modifica- + * tion, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The end-user documentation included with the redistribution, if any, must + * include the following acknowledgment: "This product includes software + * developed by the Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, if + * and wherever such third-party acknowledgments normally appear. + * 4. The names "FOP" and "Apache Software Foundation" must not be used to + * endorse or promote products derived from this software without prior + * written permission. For written permission, please contact + * apache@apache.org. + * 5. Products derived from this software may not be called "Apache", nor may + * "Apache" appear in their name, without prior written permission of the + * Apache Software Foundation. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- + * DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * This software consists of voluntary contributions made by many individuals + * on behalf of the Apache Software Foundation and was originally created by + * James Tauber . For more information on the Apache + * Software Foundation, please see . */ /* Modified by Eric SCHAEFFER */ package org.apache.fop.fo.flow; @@ -70,174 +58,180 @@ import java.net.MalformedURLException; public class ExternalGraphic extends FObj { - public static class Maker extends FObj.Maker { - public FObj make(FObj parent, - PropertyList propertyList) throws FOPException { - return new ExternalGraphic(parent, propertyList); - } - } - - public static FObj.Maker maker() { - return new ExternalGraphic.Maker(); - } - - FontState fs; - int align; - int startIndent; - int endIndent; - int spaceBefore; - int spaceAfter; - String src; - int height; - int width; - String id; - - ImageArea imageArea; - - public ExternalGraphic(FObj parent, PropertyList propertyList) { - super(parent, propertyList); - this.name = "fo:external-graphic"; - } - - public Status layout(Area area) throws FOPException { - - if (this.marker == START) { - String fontFamily = - this.properties.get("font-family").getString(); - String fontStyle = - this.properties.get("font-style").getString(); - String fontWeight = - this.properties.get("font-weight").getString(); - int fontSize = - this.properties.get("font-size").getLength().mvalue(); - - this.fs = new FontState(area.getFontInfo(), fontFamily, - fontStyle, fontWeight, fontSize); - - // FIXME - this.align = this.properties.get("text-align").getEnum(); - - this.startIndent = this.properties.get( - "start-indent").getLength().mvalue(); - this.endIndent = this.properties.get( - "end-indent").getLength().mvalue(); - - this.spaceBefore = this.properties.get( - "space-before.optimum").getLength().mvalue(); - this.spaceAfter = this.properties.get( - "space-after.optimum").getLength().mvalue(); - - this.src = this.properties.get("src").getString(); - - this.width = this.properties.get("width").getLength().mvalue(); - - this.height = - this.properties.get("height").getLength().mvalue(); - this.id = this.properties.get("id").getString(); - - area.getIDReferences().createID(id); - - if (area instanceof BlockArea) { - area.end(); - } - - if (this.isInLabel) { - startIndent += bodyIndent; - endIndent += (area.getAllocationWidth() - - distanceBetweenStarts - startIndent) + - labelSeparation; - } - - if (this.isInListBody) { - startIndent += bodyIndent + distanceBetweenStarts; - } - - if (this.isInTableCell) { - startIndent += forcedStartOffset; - endIndent = area.getAllocationWidth() - forcedWidth - - forcedStartOffset; - } - - this.marker = 0; - } - - try { - FopImage img = FopImageFactory.Make(src); - // if width / height needs to be computed - if ((width == 0) || (height == 0)) { - // aspect ratio - double imgWidth = img.getWidth(); - double imgHeight = img.getHeight(); - if ((width == 0) && (height == 0)) { - width = (int) ((imgWidth * 1000d)); - height = (int) ((imgHeight * 1000d)); - } else if (height == 0) { - height = (int)((imgHeight * ((double) width)) / - imgWidth); - } else if (width == 0) { - width = (int)((imgWidth * ((double) height)) / - imgHeight); - } - //MessageHandler.errorln("DisplayGraphic: imgW=" + imgWidth + " imgH=" + imgHeight + " w=" + width + " h=" + height); - } - - // scale image if it doesn't fit in the area/page - // Need to be more tested... - double ratio = ((double) width) / ((double) height); - int areaWidth = area.getAllocationWidth() - startIndent - endIndent; - int areaHeight = area.getMaxHeight(); - if ((width > areaWidth) || (height > areaHeight)) { - if (width > height) { - width = areaWidth; - height = (int) (((double) width) / ratio); - } else { - height = areaHeight; - width = (int) (ratio * ((double) width)); - } - } - - if (area.spaceLeft() < (height + spaceBefore)) { - return new Status(Status.AREA_FULL_NONE); - } - - this.imageArea = - new ImageArea(fs, img, area.getAllocationWidth(), - width, height, startIndent, endIndent, align); - - if ((spaceBefore != 0) && (this.marker == 0)) { - area.addDisplaySpace(spaceBefore); - } - - if (marker == 0) { - // configure id - area.getIDReferences().configureID(id, area); - } - - imageArea.start(); - imageArea.end(); - area.addChild(imageArea); - area.increaseHeight(imageArea.getHeight()); - - if (spaceAfter != 0) { - area.addDisplaySpace(spaceAfter); - } - - } - catch (MalformedURLException urlex) { - // bad URL - MessageHandler.errorln("Error while creating area : " + - urlex.getMessage()); - } - catch (FopImageException imgex) { - // image error - MessageHandler.errorln("Error while creating area : " + - imgex.getMessage()); - } - - if (area instanceof BlockArea) { - area.start(); - } - - return new Status(Status.OK); - } + FontState fs; + int align; + int startIndent; + int endIndent; + int spaceBefore; + int spaceAfter; + String src; + int height; + int width; + String id; + + ImageArea imageArea; + + + public ExternalGraphic(FObj parent, PropertyList propertyList) { + super(parent, propertyList); + this.name = "fo:external-graphic"; + } + + + public Status layout(Area area) throws FOPException { + + if (this.marker == START) { + String fontFamily = + this.properties.get("font-family").getString(); + String fontStyle = + this.properties.get("font-style").getString(); + String fontWeight = + this.properties.get("font-weight").getString(); + int fontSize = + this.properties.get("font-size").getLength().mvalue(); + + this.fs = new FontState(area.getFontInfo(), fontFamily, + fontStyle, fontWeight, fontSize); + + // FIXME + this.align = this.properties.get("text-align").getEnum(); + + this.startIndent = this.properties.get( + "start-indent").getLength().mvalue(); + this.endIndent = this.properties.get( + "end-indent").getLength().mvalue(); + + this.spaceBefore = this.properties.get( + "space-before.optimum").getLength().mvalue(); + this.spaceAfter = this.properties.get( + "space-after.optimum").getLength().mvalue(); + + this.src = this.properties.get("src").getString(); + + this.width = this.properties.get("width").getLength().mvalue(); + + this.height = + this.properties.get("height").getLength().mvalue(); + + this.id = this.properties.get("id").getString(); + + area.getIDReferences().createID(id); + + if (area instanceof BlockArea) { + area.end(); + } + + if (this.isInLabel) { + startIndent += bodyIndent; + endIndent += (area.getAllocationWidth() - + distanceBetweenStarts - startIndent) + + labelSeparation; + } + + if (this.isInListBody) { + startIndent += bodyIndent + distanceBetweenStarts; + } + + if (this.isInTableCell) { + startIndent += forcedStartOffset; + endIndent = area.getAllocationWidth() - forcedWidth - + forcedStartOffset; + } + + this.marker = 0; + } + + try { + FopImage img = FopImageFactory.Make(src); + // if width / height needs to be computed + if ((width == 0) || (height == 0)) { + // aspect ratio + double imgWidth = img.getWidth(); + double imgHeight = img.getHeight(); + if ((width == 0) && (height == 0)) { + width = (int) ((imgWidth * 1000d)); + height = (int) ((imgHeight * 1000d)); + } + else if (height == 0) { + height = (int) ((imgHeight * ((double) width)) / + imgWidth); + } + else if (width == 0) { + width = (int) ((imgWidth * ((double) height)) / + imgHeight); + } + } + + // scale image if it doesn't fit in the area/page + // Need to be more tested... + double ratio = ((double) width) / ((double) height); + int areaWidth = area.getAllocationWidth() - startIndent - endIndent; + int pageHeight = area.getPage().getHeight(); + if (height > pageHeight) { + height = pageHeight; + width = (int) (ratio * ((double) height)); + } + if (width > areaWidth) { + width = areaWidth; + height = (int) (((double) width) / ratio); + } + + if (area.spaceLeft() < (height + spaceBefore)) { + return new Status(Status.AREA_FULL_NONE); + } + + this.imageArea = + new ImageArea(fs, img, area.getAllocationWidth(), + width, height, startIndent, endIndent, align); + + if ((spaceBefore != 0) && (this.marker == 0)) { + area.addDisplaySpace(spaceBefore); + } + + if (marker == 0) { + // configure id + area.getIDReferences().configureID(id, area); + } + + imageArea.start(); + imageArea.end(); + area.addChild(imageArea); + area.increaseHeight(imageArea.getHeight()); + + if (spaceAfter != 0) { + area.addDisplaySpace(spaceAfter); + } + + } + catch (MalformedURLException urlex) { + // bad URL + MessageHandler.errorln("Error while creating area : " + + urlex.getMessage()); + } + catch (FopImageException imgex) { + // image error + MessageHandler.errorln("Error while creating area : " + + imgex.getMessage()); + } + + if (area instanceof BlockArea) { + area.start(); + } + + return new Status(Status.OK); + } + + + public static FObj.Maker maker() { + return new ExternalGraphic.Maker(); + } + + + public static class Maker extends FObj.Maker { + public FObj make(FObj parent, + PropertyList propertyList) throws FOPException { + return new ExternalGraphic(parent, propertyList); + } + } } + -- 2.39.5