]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
FOP-2245: height attribute on external-graphic with percentage value behaves incorrectly
authorLuis Bernardo <lbernardo@apache.org>
Tue, 30 Apr 2013 23:25:18 +0000 (23:25 +0000)
committerLuis Bernardo <lbernardo@apache.org>
Tue, 30 Apr 2013 23:25:18 +0000 (23:25 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1477872 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/datatypes/Numeric.java
src/java/org/apache/fop/fo/expr/RelativeNumericProperty.java
src/java/org/apache/fop/fo/properties/EnumNumber.java
src/java/org/apache/fop/layoutmgr/inline/ImageLayout.java
test/layoutengine/standard-testcases/external-graphic_height_percentage.xml [new file with mode: 0644]

index 2004c672128d1d4ded7906e28eb591a0fb09215b..8ed5a0e5c03865eb374424ad640e055892beacb2 100644 (file)
@@ -19,8 +19,6 @@
 
 package org.apache.fop.datatypes;
 
-import org.apache.fop.fo.expr.PropertyException;
-
 /**
  * An interface for classes that can participate in numeric operations.
  * All the numeric operation (+, -, *, ...) are expressed in terms of
@@ -39,7 +37,7 @@ public interface Numeric {
      * @return the computed value.
      * @throws PropertyException if a property exception occurs
      */
-    double getNumericValue() throws PropertyException;
+    double getNumericValue();
 
     /**
      * Return the value of this Numeric
@@ -47,7 +45,7 @@ public interface Numeric {
      * @return the computed value.
      * @throws PropertyException if a property exception occurs
      */
-    double getNumericValue(PercentBaseContext context) throws PropertyException;
+    double getNumericValue(PercentBaseContext context);
 
     /**
      * Return the dimension of this numeric. Plain numbers has a dimension of
index e99c8c7beca0c89edaa189dbcca2015db6cfa11a..3d6b7df5bf518d5cb6595e958f352e81fda91b28 100644 (file)
@@ -142,15 +142,23 @@ public class RelativeNumericProperty extends Property implements Length {
      * Return the resolved (calculated) value of the expression.
      * {@inheritDoc}
      */
-    public double getNumericValue() throws PropertyException {
-        return getResolved(null).getNumericValue(null);
+    public double getNumericValue() {
+        try {
+            return getResolved(null).getNumericValue(null);
+        } catch (PropertyException pe) {
+            throw new RuntimeException(pe);
+        }
     }
 
     /**
      * {@inheritDoc}
      */
-    public double getNumericValue(PercentBaseContext context) throws PropertyException {
-        return getResolved(context).getNumericValue(context);
+    public double getNumericValue(PercentBaseContext context) {
+        try {
+            return getResolved(context).getNumericValue(context);
+        } catch (PropertyException pe) {
+            throw new RuntimeException(pe);
+        }
     }
 
     /**
@@ -193,24 +201,14 @@ public class RelativeNumericProperty extends Property implements Length {
      * {@inheritDoc}
      */
     public int getValue() {
-        try {
-            return (int) getNumericValue();
-        } catch (PropertyException exc) {
-            log.error(exc);
-        }
-        return 0;
+        return (int) getNumericValue();
     }
 
     /**
      * {@inheritDoc}
      */
     public int getValue(PercentBaseContext context) {
-        try {
-            return (int) getNumericValue(context);
-        } catch (PropertyException exc) {
-            log.error(exc);
-        }
-        return 0;
+        return (int) getNumericValue(context);
     }
 
     /**
index 9c018e0eb27f98d49825860fa5d3f23ad87d929d..dfe1eb8779775032378cf30f0b9336a9797727ae 100644 (file)
@@ -21,7 +21,6 @@ package org.apache.fop.fo.properties;
 
 import org.apache.fop.datatypes.Numeric;
 import org.apache.fop.datatypes.PercentBaseContext;
-import org.apache.fop.fo.expr.PropertyException;
 import org.apache.fop.util.CompareUtil;
 
 /**
@@ -104,7 +103,7 @@ public final class EnumNumber extends Property implements Numeric {
      * {@inheritDoc}
      * logs an error, because it's not supposed to be called
      */
-    public double getNumericValue(PercentBaseContext context) throws PropertyException {
+    public double getNumericValue(PercentBaseContext context) {
         log.error("getNumericValue() called on " + enumProperty + " number");
         return 0;
     }
index 31ede9aeef2e288e61391a0f5a6336609183cbca..183b83e70aa12faf81051da53d5b8afdc8edd8d7 100644 (file)
@@ -75,12 +75,11 @@ public class ImageLayout implements Constants {
 
         len = props.getBlockProgressionDimension().getOptimum(percentBaseContext).getLength();
         if (len.getEnum() != EN_AUTO) {
-            bpd = len.getValue(percentBaseContext);
+            bpd = evaluateLength(len, intrinsicSize.height);
         }
         len = props.getBlockProgressionDimension().getMinimum(percentBaseContext).getLength();
         if (bpd == -1 && len.getEnum() != EN_AUTO) {
-            //Establish minimum viewport size
-            bpd = len.getValue(percentBaseContext);
+            bpd = evaluateLength(len, intrinsicSize.height);
         }
 
         len = props.getInlineProgressionDimension().getOptimum(percentBaseContext).getLength();
@@ -197,14 +196,14 @@ public class ImageLayout implements Constants {
         Length len;
         len = range.getMaximum(percentBaseContext).getLength();
         if (len.getEnum() != EN_AUTO) {
-            int max = len.getValue(percentBaseContext);
+            int max = evaluateLength(len);
             if (max != -1 && mayScaleDown) {
                 extent = Math.min(extent, max);
             }
         }
         len = range.getMinimum(percentBaseContext).getLength();
         if (len.getEnum() != EN_AUTO) {
-            int min = len.getValue(percentBaseContext);
+            int min = evaluateLength(len);
             if (min != -1 && mayScaleUp) {
                 extent = Math.max(extent, min);
             }
@@ -364,4 +363,13 @@ public class ImageLayout implements Constants {
         return this.clip;
     }
 
+    private int evaluateLength(Length length, int referenceValue) {
+        double numericValue = length.getNumericValue(percentBaseContext);
+        int bpd = numericValue < 0 ? referenceValue : (int) Math.round(numericValue);
+        return bpd;
+    }
+
+    private int evaluateLength(Length length) {
+        return evaluateLength(length, -1);
+    }
 }
diff --git a/test/layoutengine/standard-testcases/external-graphic_height_percentage.xml b/test/layoutengine/standard-testcases/external-graphic_height_percentage.xml
new file mode 100644 (file)
index 0000000..8c917c4
--- /dev/null
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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$ -->
+<testcase>
+  <info>
+    <p>
+      This test checks external-graphics with relative height
+    </p>
+  </info>
+  <variables>
+    <img>../resources/images/bgimg300dpi.jpg</img>
+  </variables>
+  <fo>
+    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+      <fo:layout-master-set>
+        <fo:simple-page-master master-name="normal" page-width="5in" page-height="5in">
+          <fo:region-body/>
+        </fo:simple-page-master>
+      </fo:layout-master-set>
+      <fo:page-sequence master-reference="normal">
+        <fo:flow flow-name="xsl-region-body">
+          <fo:block>plain external-graphic</fo:block>
+          <fo:block>
+            <fo:external-graphic src="##img" height="50%" content-height="scale-to-fit" />EOG
+          </fo:block>
+          <fo:block>EOF</fo:block>
+        </fo:flow>
+      </fo:page-sequence>
+    </fo:root>
+  </fo>
+  <checks>
+    <eval expected="360000" xpath="//flow/block[2]/@ipd"/>
+    <eval expected="46080" xpath="//flow/block[2]/lineArea/viewport/@ipd"/>
+    <eval expected="46080" xpath="//flow/block[2]/lineArea/viewport/@ipda"/>
+    <eval expected="46080" xpath="//flow/block[2]/lineArea/viewport/@bpd"/>
+    <eval expected="46080" xpath="//flow/block[2]/lineArea/viewport/@bpda"/>
+  </checks>
+</testcase>