]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Merged revisions 693433,693462,693720,693742,693781,693784,693841,695491,695500,69577...
authorAdrian Cumiskey <acumiskey@apache.org>
Fri, 26 Sep 2008 11:27:35 +0000 (11:27 +0000)
committerAdrian Cumiskey <acumiskey@apache.org>
Fri, 26 Sep 2008 11:27:35 +0000 (11:27 +0000)
https://svn.eu.apache.org/repos/asf/xmlgraphics/fop/trunk

........
  r693433 | acumiskey | 2008-09-09 12:00:58 +0100 (Tue, 09 Sep 2008) | 1 line

  Make PFM string parsing a little more robust
........
  r693462 | acumiskey | 2008-09-09 14:35:13 +0100 (Tue, 09 Sep 2008) | 1 line

  This is a better fix which will cater for the case where the first character encountered is the EOF (-1) character.  EOF test now only occurs when loop is exit so this should execute more efficiently.
........
  r693720 | jeremias | 2008-09-10 08:46:23 +0100 (Wed, 10 Sep 2008) | 1 line

  Some older TTF fonts have shorter OS/2 tables. This fixes potential EOFExceptions.
........
  r693742 | jeremias | 2008-09-10 10:00:16 +0100 (Wed, 10 Sep 2008) | 3 lines

  Bugzilla #45616:
  Fix for table handling in RTF output, so the output works with OpenOffice and AbiWord, too.
  Submitted by: Pavel Kysilka <goldenfish.at.linuxsoft.cz>
........
  r693781 | jeremias | 2008-09-10 11:52:45 +0100 (Wed, 10 Sep 2008) | 3 lines

  Bugzilla #45734:
  Fix for PFMReader after bug #43089 (r567078) changed the behavior of PFMFile. Fixes baseline problems when Type 1 fonts are used in conjunction with XML font metric files.
  Submitted by: J. Frantzius <jfrantzius.at.web.de>
........
  r693784 | jeremias | 2008-09-10 11:59:27 +0100 (Wed, 10 Sep 2008) | 1 line

  Credits where credits are due. I only noticed afterwards that there was a patch attached to the issue.
........
  r693841 | adelmelle | 2008-09-10 14:24:00 +0100 (Wed, 10 Sep 2008) | 1 line

  Minor fix: avoid attempts at converting a default namespace declaration as a FO property, if the parser reports it as a regular attribute
........
  r695491 | jeremias | 2008-09-15 16:06:28 +0100 (Mon, 15 Sep 2008) | 1 line

  PDF Output: Made sure the XMP Metadata stream is never compressed.
........
  r695500 | jeremias | 2008-09-15 16:15:44 +0100 (Mon, 15 Sep 2008) | 2 lines

  Bugzilla #45755:
  Removed ALv2 license header as this file does not have a "creativity" value and only serves as an example.
........
  r695776 | maxberger | 2008-09-16 09:56:12 +0100 (Tue, 16 Sep 2008) | 4 lines

  Re-enabled image loader testcases
  Made sure SVG converters use SVG flavor (updated in commons)
  Added new ImageLoaderTest which tests JPGs embedded in SVG
........
  r696365 | jeremias | 2008-09-17 17:41:14 +0100 (Wed, 17 Sep 2008) | 3 lines

  Bugzilla #45795:
  PDF Output: Added support for handling 16-bit alpha channel. They are currently converted to 8 bits.
........
  r697140 | jeremias | 2008-09-19 16:57:54 +0100 (Fri, 19 Sep 2008) | 1 line

  Fixed stray "xml.apache.org".
........
  r697152 | adelmelle | 2008-09-19 18:01:03 +0100 (Fri, 19 Sep 2008) | 1 line

  Bugzilla 45842: Use FOP_OPTS environment variable in fop.bat and fop.cmd (patch submitted by Carsten Siedentop)
........
  r698280 | adelmelle | 2008-09-23 19:48:34 +0100 (Tue, 23 Sep 2008) | 3 lines

  Bugzilla 40798: A conditional-page-master-reference with page-position="last" is also eligible for an only page (first as well as last)
  Additionally: added support for page-position="only"
........
  r698322 | adelmelle | 2008-09-23 20:55:02 +0100 (Tue, 23 Sep 2008) | 1 line

  Cleanup firstWhiteSpaceInSeq at end of block too...
........
  r698670 | adelmelle | 2008-09-24 18:45:51 +0100 (Wed, 24 Sep 2008) | 1 line

  Added two missing files from r698280
........

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_AFPGOCAResources@699279 13f79535-47bb-0310-9956-ffa450edef68

32 files changed:
conf/fop.xconf
fop.bat
fop.cmd
lib/xmlgraphics-commons-1.4svn.jar
src/documentation/content/xdocs/0.94/extensions.xml
src/documentation/content/xdocs/0.95/extensions.xml
src/documentation/content/xdocs/trunk/extensions.xml
src/java/org/apache/fop/fo/PropertyList.java
src/java/org/apache/fop/fo/XMLWhiteSpaceHandler.java
src/java/org/apache/fop/fo/pagination/ConditionalPageMasterReference.java
src/java/org/apache/fop/fo/pagination/PageSequence.java
src/java/org/apache/fop/fo/pagination/PageSequenceMaster.java
src/java/org/apache/fop/fo/pagination/RepeatablePageMasterAlternatives.java
src/java/org/apache/fop/fo/pagination/RepeatablePageMasterReference.java
src/java/org/apache/fop/fo/pagination/SinglePageMasterReference.java
src/java/org/apache/fop/fo/pagination/SubSequenceSpecifier.java
src/java/org/apache/fop/fonts/apps/PFMReader.java
src/java/org/apache/fop/fonts/truetype/TTFFile.java
src/java/org/apache/fop/fonts/type1/PFMInputStream.java
src/java/org/apache/fop/image/loader/batik/ImageConverterSVG2G2D.java
src/java/org/apache/fop/image/loader/batik/ImageLoaderFactorySVG.java
src/java/org/apache/fop/image/loader/batik/ImageLoaderSVG.java
src/java/org/apache/fop/layoutmgr/PageProvider.java
src/java/org/apache/fop/pdf/AlphaRasterImage.java
src/java/org/apache/fop/pdf/PDFFilterList.java
src/java/org/apache/fop/render/rtf/RTFHandler.java
src/java/org/apache/fop/render/rtf/rtflib/rtfdoc/RtfTableCell.java
status.xml
test/java/org/apache/fop/StandardTestSuite.java
test/java/org/apache/fop/image/loader/batik/ImageLoaderTestCase.java
test/layoutengine/standard-testcases/page-position_last_bug40798.xml [new file with mode: 0644]
test/layoutengine/standard-testcases/page-position_only.xml [new file with mode: 0644]

index 2f638c2b2ab3df57956cd777a13c90d0a48d37a9..86b72a811589f90fac23a3878e5c8a202eb0c765 100644 (file)
@@ -1,20 +1,4 @@
 <?xml version="1.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.
--->
 <!-- $Id$ -->
 
 <!--
diff --git a/fop.bat b/fop.bat
index a01c5ddb7e735254eb203fa2a1ba6a5cb011db8e..640ec56d286de073260c1b46f0d4266761b3d10a 100644 (file)
--- a/fop.bat
+++ b/fop.bat
@@ -81,4 +81,4 @@ if "%JAVACMD%" == "" set JAVACMD=java
 \r
 :runFop\r
 rem ECHO "%JAVACMD%"\r
-"%JAVACMD%" %JAVAOPTS% %LOGCHOICE% %LOGLEVEL% -cp "%LOCALCLASSPATH%" org.apache.fop.cli.Main %FOP_CMD_LINE_ARGS%\r
+"%JAVACMD%" %JAVAOPTS% %LOGCHOICE% %LOGLEVEL% -cp "%LOCALCLASSPATH%" %FOP_OPTS% org.apache.fop.cli.Main %FOP_CMD_LINE_ARGS%\r
diff --git a/fop.cmd b/fop.cmd
index 554b8079565b2e31bcdbc13a64f365e8ea3eb8b7..b8bfb2096da7e86a14ab600b0a772bbc430cf9e9 100644 (file)
--- a/fop.cmd
+++ b/fop.cmd
@@ -70,6 +70,6 @@ if "%JAVACMD%" == "" set JAVACMD=java
 \r
 :runFop\r
 rem echo "%JAVACMD%" %LOGCHOICE% %LOGLEVEL% -cp "%LOCALCLASSPATH%" org.apache.fop.cli.Main %FOP_CMD_LINE_ARGS%\r
-"%JAVACMD%" %JAVAOPTS% %LOGCHOICE% %LOGLEVEL% -cp "%LOCALCLASSPATH%" org.apache.fop.cli.Main %FOP_CMD_LINE_ARGS%\r
+"%JAVACMD%" %JAVAOPTS% %LOGCHOICE% %LOGLEVEL% -cp "%LOCALCLASSPATH%" %FOP_OPTS% org.apache.fop.cli.Main %FOP_CMD_LINE_ARGS%\r
 \r
 ENDLOCAL\r
index 69c4dc791b41205fa2bd2854fd235c467fb1b9cb..7328fa62b1fb8ae34ff707bf64c0bf4dcfce715b 100644 (file)
Binary files a/lib/xmlgraphics-commons-1.4svn.jar and b/lib/xmlgraphics-commons-1.4svn.jar differ
index dd4a79535101e82e860d9509896cf09e2107f5bd..04d44ef6fc7a0e9a9334c08a63e9b69881d7c0f6 100644 (file)
@@ -48,7 +48,7 @@
         <p>
           By convention, FO extensions in FOP use the "fox" namespace prefix.
           To use any of the FO extensions, add a namespace entry for 
-          <code>http://xml.apache.org/fop/extensions</code> to the root element:
+          <code>http://xmlgraphics.apache.org/fop/extensions</code> to the root element:
         </p>
         <source><![CDATA[<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"
                xmlns:fox="http://xmlgraphics.apache.org/fop/extensions">]]></source>
index 483866e61d7895f12fa7ac485b0c76f90c047425..878494ecbdfd520da72229ed8944ca5fe996c5ab 100644 (file)
@@ -48,7 +48,7 @@
         <p>
           By convention, FO extensions in FOP use the "fox" namespace prefix.
           To use any of the FO extensions, add a namespace entry for 
-          <code>http://xml.apache.org/fop/extensions</code> to the root element:
+          <code>http://xmlgraphics.apache.org/fop/extensions</code> to the root element:
         </p>
         <source><![CDATA[<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"
                xmlns:fox="http://xmlgraphics.apache.org/fop/extensions">]]></source>
index 483866e61d7895f12fa7ac485b0c76f90c047425..878494ecbdfd520da72229ed8944ca5fe996c5ab 100644 (file)
@@ -48,7 +48,7 @@
         <p>
           By convention, FO extensions in FOP use the "fox" namespace prefix.
           To use any of the FO extensions, add a namespace entry for 
-          <code>http://xml.apache.org/fop/extensions</code> to the root element:
+          <code>http://xmlgraphics.apache.org/fop/extensions</code> to the root element:
         </p>
         <source><![CDATA[<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"
                xmlns:fox="http://xmlgraphics.apache.org/fop/extensions">]]></source>
index 13f9838414d87bb1e535214d7b5c768f6d1a1856..709c4303bfd8fe5606c5b6f09ccf3fe515236141 100644 (file)
@@ -370,8 +370,10 @@ public abstract class PropertyList {
 
         if (attributeValue != null) {
 
-            if (attributeName.startsWith("xmlns:")) {
-                //Ignore namespace declarations
+            if (attributeName.startsWith("xmlns:")
+                    || "xmlns".equals(attributeName)) {
+                //Ignore namespace declarations if the XML parser/XSLT processor
+                //reports them as 'regular' attributes
                 return;
             }
 
@@ -519,7 +521,7 @@ public abstract class PropertyList {
     }
 
     /**
-     * @param propID ID of property
+     * @param propId ID of property
      * @return new Property object
      * @throws PropertyException if there's a problem while processing the property
      */
@@ -638,7 +640,6 @@ public abstract class PropertyList {
         return new CommonAbsolutePosition(this);
     }
 
-
     /**
      * Constructs a CommonFont object.
      *
index 759cdaed96eb3252e3345b21864bd20c13989858..cad9fb729ae8800a83ace344e01ba6c6746d55ad 100644 (file)
@@ -228,6 +228,7 @@ public class XMLWhiteSpaceHandler {
                     nestedBlockStack.pop();
                 }
                 charIter = null;
+                firstWhiteSpaceInSeq = null;
             }
         }
     }
index eaa8c2491dcf17ae98783e6a730feb0a9aa3e051..7953731f172503333a79964f392fe19911457ca8 100644 (file)
@@ -94,61 +94,33 @@ public class ConditionalPageMasterReference extends FObj {
      * @param isFirstPage True if page is first page
      * @param isLastPage True if page is last page
      * @param isBlankPage True if page is blank
-     * @param isOnlyPage True if page is the only page
      * @return True if the conditions for this reference are met
      */
     protected boolean isValid(boolean isOddPage,
                               boolean isFirstPage,
                               boolean isLastPage,
-                              boolean isOnlyPage,
                               boolean isBlankPage) {
-        // page-position
-        if (isOnlyPage) {
-            if (pagePosition != EN_ONLY) {
-                return false;
-            }
-        } else if (isFirstPage) {
-            if (pagePosition == EN_REST) {
-                return false;
-            } else if (pagePosition == EN_LAST) {
-                return false;
-            }
-        } else if (isLastPage) {
-            if (pagePosition == EN_REST) {
-                return false;
-            } else if (pagePosition == EN_FIRST) {
-                return false;
-            }
-        } else {
-            if (pagePosition == EN_FIRST) {
-                return false;
-            } else if (pagePosition == EN_LAST) {
-                return false;
-            }
-        }
 
-        // odd-or-even
-        if (isOddPage) {
-            if (oddOrEven == EN_EVEN) {
-              return false;
-            }
-        } else {
-            if (oddOrEven == EN_ODD) {
-              return false;
-            }
-        }
+        return (
+            // page-position
+            (pagePosition == EN_ANY
+                || (pagePosition == EN_FIRST && isFirstPage)
+                || (pagePosition == EN_LAST && isLastPage)
+                || (pagePosition == EN_ONLY && (isFirstPage && isLastPage))
+                || (pagePosition == EN_REST && !(isFirstPage || isLastPage))
+                )
+            // odd-or-even
+            && (oddOrEven == EN_ANY
+                || (oddOrEven == EN_ODD && isOddPage)
+                || (oddOrEven == EN_EVEN && !isOddPage)
+                )
+            // blank-or-not-blank
+            && (blankOrNotBlank == EN_ANY
+                || (blankOrNotBlank == EN_BLANK && isBlankPage)
+                || (blankOrNotBlank == EN_NOT_BLANK && !isBlankPage)
+                ));
+
 
-        // blank-or-not-blank
-        if (isBlankPage) {
-            if (blankOrNotBlank == EN_NOT_BLANK) {
-                return false;
-            }
-        } else {
-            if (blankOrNotBlank == EN_BLANK) {
-                return false;
-            }
-        }
-        return true;
     }
 
     /**
index bdcb27198335a3cbca308698d8d561a9dbcd44f2..d41ac86ab5415992d05056536b760dead5e02f99 100644 (file)
@@ -127,19 +127,19 @@ public class PageSequence extends AbstractPageSequence {
     protected void validateChildNode(Locator loc, String nsURI, String localName)
                 throws ValidationException {
         if (FO_URI.equals(nsURI)) {
-            if (localName.equals("title")) {
+            if ("title".equals(localName)) {
                 if (titleFO != null) {
                     tooManyNodesError(loc, "fo:title");
-                } else if (flowMap.size() > 0) {
+                } else if (!flowMap.isEmpty()) {
                     nodesOutOfOrderError(loc, "fo:title", "fo:static-content");
                 } else if (mainFlow != null) {
                     nodesOutOfOrderError(loc, "fo:title", "fo:flow");
                 }
-            } else if (localName.equals("static-content")) {
+            } else if ("static-content".equals(localName)) {
                 if (mainFlow != null) {
                     nodesOutOfOrderError(loc, "fo:static-content", "fo:flow");
                 }
-            } else if (localName.equals("flow")) {
+            } else if ("flow".equals(localName)) {
                 if (mainFlow != null) {
                     tooManyNodesError(loc, "fo:flow");
                 }
@@ -157,15 +157,20 @@ public class PageSequence extends AbstractPageSequence {
     public void addChildNode(FONode child) throws FOPException {
         int childId = child.getNameId();
 
-        if (childId == FO_TITLE) {
-            this.titleFO = (Title) child;
-        } else if (childId == FO_FLOW) {
-            this.mainFlow = (Flow) child;
+        switch (childId) {
+        case FO_TITLE:
+            this.titleFO = (Title)child;
+            break;
+        case FO_FLOW:
+            this.mainFlow = (Flow)child;
             addFlow(mainFlow);
-        } else if (childId == FO_STATIC_CONTENT) {
-            addFlow((StaticContent) child);
-            String flowName = ((StaticContent) child).getFlowName();
-            flowMap.put(flowName, child);
+            break;
+        case FO_STATIC_CONTENT:
+            addFlow((StaticContent)child);
+            flowMap.put(((StaticContent)child).getFlowName(), child);
+            break;
+        default:
+            assert false;
         }
     }
 
@@ -245,17 +250,14 @@ public class PageSequence extends AbstractPageSequence {
      *      page sequence
      * @param isLastPage indicator whether this page is the last page of the
      *      page sequence
-     * @param isOnlyPage indicator whether this page is the only page of the
-     *      page sequence
      * @param isBlank indicator whether the page will be blank
      * @return the SimplePageMaster to use for this page
      * @throws PageProductionException if there's a problem determining the page master
      */
     public SimplePageMaster getNextSimplePageMaster(int page,
-            boolean isFirstPage,
-            boolean isLastPage,
-            boolean isOnlyPage,
-            boolean isBlank) throws PageProductionException {
+                                                    boolean isFirstPage,
+                                                    boolean isLastPage,
+                                                    boolean isBlank) throws PageProductionException {
 
         if (pageSequenceMaster == null) {
             return simplePageMaster;
@@ -266,11 +268,10 @@ public class PageSequence extends AbstractPageSequence {
                     + " isOdd=" + isOddPage
                     + " isFirst=" + isFirstPage
                     + " isLast=" + isLastPage
-                    + " isOnly=" + isOnlyPage
                     + " isBlank=" + isBlank + ")");
         }
         return pageSequenceMaster.getNextSimplePageMaster(isOddPage,
-            isFirstPage, isLastPage, isOnlyPage, isBlank);
+            isFirstPage, isLastPage, isBlank);
     }
 
     /**
@@ -278,29 +279,17 @@ public class PageSequence extends AbstractPageSequence {
      * @return true if there is a previous item, false if the current one was the first one.
      */
     public boolean goToPreviousSimplePageMaster() {
-        if (pageSequenceMaster == null) {
-            return true;
-        } else {
-            return pageSequenceMaster.goToPreviousSimplePageMaster();
-        }
+        return pageSequenceMaster == null || pageSequenceMaster.goToPreviousSimplePageMaster();
     }
 
     /** @return true if the page-sequence has a page-master with page-position="last" */
     public boolean hasPagePositionLast() {
-        if (pageSequenceMaster == null) {
-            return false;
-        } else {
-            return pageSequenceMaster.hasPagePositionLast();
-        }
+        return pageSequenceMaster != null && pageSequenceMaster.hasPagePositionLast();
     }
 
     /** @return true if the page-sequence has a page-master with page-position="only" */
     public boolean hasPagePositionOnly() {
-        if (pageSequenceMaster == null) {
-            return false;
-        } else {
-            return pageSequenceMaster.hasPagePositionOnly();
-        }
+        return pageSequenceMaster != null && pageSequenceMaster.hasPagePositionOnly();
     }
 
     /**
index b1d8d4055902a754a2eb7c01dd5057f9963d67b0..705b955e961f2eb5a0680291c1923164e8e370f4 100644 (file)
@@ -177,7 +177,6 @@ public class PageSequenceMaster extends FObj {
      * @param isOddPage True if the next page number is odd
      * @param isFirstPage True if the next page is the first
      * @param isLastPage True if the next page is the last
-     * @param isOnlyPage True if the next page is the only page
      * @param isBlankPage True if the next page is blank
      * @return the requested page master
      * @throws PageProductionException if there's a problem determining the next page master
@@ -185,7 +184,6 @@ public class PageSequenceMaster extends FObj {
     public SimplePageMaster getNextSimplePageMaster(boolean isOddPage,
                                                     boolean isFirstPage,
                                                     boolean isLastPage,
-                                                    boolean isOnlyPage,
                                                     boolean isBlankPage)
                                                       throws PageProductionException {
         if (currentSubSequence == null) {
@@ -198,7 +196,7 @@ public class PageSequenceMaster extends FObj {
             }
         }
         String pageMasterName = currentSubSequence
-            .getNextPageMasterName(isOddPage, isFirstPage, isLastPage, isOnlyPage, isBlankPage);
+            .getNextPageMasterName(isOddPage, isFirstPage, isLastPage, isBlankPage);
         boolean canRecover = true;
         while (pageMasterName == null) {
             SubSequenceSpecifier nextSubSequence = getNextSubSequence();
@@ -213,7 +211,7 @@ public class PageSequenceMaster extends FObj {
                 currentSubSequence = nextSubSequence;
             }
             pageMasterName = currentSubSequence
-                .getNextPageMasterName(isOddPage, isFirstPage, isLastPage, isOnlyPage, isBlankPage);
+                .getNextPageMasterName(isOddPage, isFirstPage, isLastPage, isBlankPage);
         }
         SimplePageMaster pageMaster = this.layoutMasterSet
             .getSimplePageMaster(pageMasterName);
index d1e710c892d248d6d2f25eff5f2a4ab879144c5e..9b4c6544f8283603f14c09652c48833f2528976a 100644 (file)
@@ -117,7 +117,6 @@ public class RepeatablePageMasterAlternatives extends FObj
     public String getNextPageMasterName(boolean isOddPage,
                                         boolean isFirstPage,
                                         boolean isLastPage,
-                                        boolean isOnlyPage,
                                         boolean isBlankPage) {
         if (getMaximumRepeats() != INFINITE) {
             if (numberConsumed < getMaximumRepeats()) {
@@ -132,7 +131,7 @@ public class RepeatablePageMasterAlternatives extends FObj
         for (int i = 0; i < conditionalPageMasterRefs.size(); i++) {
             ConditionalPageMasterReference cpmr
                 = (ConditionalPageMasterReference)conditionalPageMasterRefs.get(i);
-            if (cpmr.isValid(isOddPage, isFirstPage, isLastPage, isOnlyPage, isBlankPage)) {
+            if (cpmr.isValid(isOddPage, isFirstPage, isLastPage, isBlankPage)) {
                 return cpmr.getMasterReference();
             }
         }
index 60f8e0d6a70343588f538e38c44e65912c6b3aa4..9bbe559391e960755fa80cad7538de0161ccb3a6 100644 (file)
@@ -90,7 +90,6 @@ public class RepeatablePageMasterReference extends FObj
     public String getNextPageMasterName(boolean isOddPage,
                                         boolean isFirstPage,
                                         boolean isLastPage,
-                                        boolean isOnlyPage,
                                         boolean isEmptyPage) {
         if (getMaximumRepeats() != INFINITE) {
             if (numberConsumed < getMaximumRepeats()) {
index 89416a5343236c4e1ae11d0838c1d738f3c1fadc..be13455d7e1bf6da33493c40d675379e1f94b86f 100644 (file)
@@ -86,8 +86,7 @@ public class SinglePageMasterReference extends FObj
     public String getNextPageMasterName(boolean isOddPage,
                                         boolean isFirstPage,
                                         boolean isLastPage,
-                                        boolean isOnlyPage,
-                                        boolean isEmptyPage) {
+                                        boolean isBlankPage) {
         if (this.state == FIRST) {
             this.state = DONE;
             return masterReference;
@@ -101,8 +100,6 @@ public class SinglePageMasterReference extends FObj
         this.state = FIRST;
     }
 
-
-
     /** {@inheritDoc} */
     public boolean goToPrevious() {
         if (state == FIRST) {
index a8eddf5d333555401b13b3caf57db9b1a91d986e..aa2c2bb8b2e5e9d73c890abf874a47725431c9be 100644 (file)
@@ -31,7 +31,6 @@ public interface SubSequenceSpecifier {
      * @param isOddPage True if the next page number is odd
      * @param isFirstPage True if the next page is the first
      * @param isLastPage True if the next page is the last
-     * @param isOnlyPage True if the next page is the only page
      * @param isBlankPage True if the next page is blank
      * @return the page master name
      * @throws PageProductionException if there's a problem determining the next page master
@@ -39,7 +38,6 @@ public interface SubSequenceSpecifier {
     String getNextPageMasterName(boolean isOddPage,
                                  boolean isFirstPage,
                                  boolean isLastPage,
-                                 boolean isOnlyPage,
                                  boolean isBlankPage)
                                     throws PageProductionException;
 
index 18b40993d16367311a92b9bf9cb79311314c8557..90dd1fd280f401492b11b4092125c5347c35b21f 100644 (file)
@@ -26,12 +26,14 @@ import java.util.Map;
 
 import javax.xml.parsers.DocumentBuilderFactory;
 
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
 import org.apache.commons.logging.LogFactory;
+
 import org.apache.fop.Version;
 import org.apache.fop.fonts.type1.PFMFile;
 import org.apache.fop.util.CommandLineLogger;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
 
 /**
  * A tool which reads PFM files from Adobe Type 1 fonts and creates
@@ -256,7 +258,7 @@ public class PFMReader extends AbstractFontReader {
 
         el = doc.createElement("descender");
         root.appendChild(el);
-        value = new Integer(-pfm.getLowerCaseDescent());
+        value = new Integer(pfm.getLowerCaseDescent());
         el.appendChild(doc.createTextNode(value.toString()));
 
         Element bbox = doc.createElement("bbox");
index f6b9ac020d91159b8fc49ece415bef2034d73f08..409b3908ba54ee5e83e1481960252bfa6723af20 100644 (file)
@@ -983,10 +983,17 @@ public class TTFFile {
     /**
      * Read the "OS/2" table
      */
-    private final void readOS2(FontFileReader in) throws IOException {
+    private void readOS2(FontFileReader in) throws IOException {
         // Check if font is embeddable
-        if (dirTabs.get("OS/2") != null) {
-            seekTab(in, "OS/2", 2 * 2);
+        TTFDirTabEntry os2Entry = (TTFDirTabEntry)dirTabs.get("OS/2");
+        if (os2Entry != null) {
+            seekTab(in, "OS/2", 0);
+            int version = in.readTTFUShort();
+            if (log.isDebugEnabled()) {
+                log.debug("OS/2 table: version=" + version
+                        + ", offset=" + os2Entry.getOffset() + ", len=" + os2Entry.getLength());
+            }
+            in.skip(2); //xAvgCharWidth
             this.usWeightClass = in.readTTFUShort();
 
             // usWidthClass
@@ -1005,22 +1012,30 @@ public class TTFFile {
             in.skip(3 * 2);
             int v;
             os2Ascender = in.readTTFShort(); //sTypoAscender
-            log.debug("sTypoAscender: " + os2Ascender
-                        + " " + convertTTFUnit2PDFUnit(os2Ascender));
             os2Descender = in.readTTFShort(); //sTypoDescender
-            log.debug("sTypoDescender: " + os2Descender
-                        + " " + convertTTFUnit2PDFUnit(os2Descender));
             v = in.readTTFShort(); //sTypoLineGap
-            log.debug("sTypoLineGap: " + v);
             v = in.readTTFUShort(); //usWinAscent
-            log.debug("usWinAscent: " + v  + " " + convertTTFUnit2PDFUnit(v));
             v = in.readTTFUShort(); //usWinDescent
-            log.debug("usWinDescent: " + v + " " + convertTTFUnit2PDFUnit(v));
-            in.skip(2 * 4);
-            this.os2xHeight = in.readTTFShort(); //sxHeight
-            log.debug("sxHeight: " + this.os2xHeight);
-            this.os2CapHeight = in.readTTFShort(); //sCapHeight
-            log.debug("sCapHeight: " + this.os2CapHeight);
+            if (log.isDebugEnabled()) {
+                log.debug("sTypoAscender: " + os2Ascender
+                        + " " + convertTTFUnit2PDFUnit(os2Ascender));
+                log.debug("sTypoDescender: " + os2Descender
+                        + " " + convertTTFUnit2PDFUnit(os2Descender));
+                log.debug("sTypoLineGap: " + v);
+                log.debug("usWinAscent: " + v  + " " + convertTTFUnit2PDFUnit(v));
+                log.debug("usWinDescent: " + v + " " + convertTTFUnit2PDFUnit(v));
+            }
+
+            //version 1 OS/2 table might end here
+            if (os2Entry.getLength() >= 78 + (2 * 4) + (2 * 2)) {
+                in.skip(2 * 4);
+                this.os2xHeight = in.readTTFShort(); //sxHeight
+                this.os2CapHeight = in.readTTFShort(); //sCapHeight
+                if (log.isDebugEnabled()) {
+                    log.debug("sxHeight: " + this.os2xHeight);
+                    log.debug("sCapHeight: " + this.os2CapHeight);
+                }
+            }
 
         } else {
             isEmbeddable = true;
index 596bf69bd86bc10fdde82cfc7086323441144b2b..f563059c32684a9d7b5504b94c8a6270447a5cfa 100644 (file)
@@ -19,6 +19,7 @@
 
 package org.apache.fop.fonts.type1;
 
+import java.io.EOFException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.DataInputStream;
@@ -30,7 +31,7 @@ import java.io.InputStreamReader;
  */
 public class PFMInputStream extends java.io.FilterInputStream {
 
-    private DataInputStream datain;
+    private final DataInputStream datain;
 
     /**
      * Constructs a PFMInputStream based on an InputStream representing the
@@ -97,11 +98,15 @@ public class PFMInputStream extends java.io.FilterInputStream {
     public String readString() throws IOException {
         InputStreamReader reader = new InputStreamReader(in, "ISO-8859-1");
         StringBuffer buf = new StringBuffer();
+
         int ch = reader.read();
-        while (ch != 0) {
+        while (ch > 0) {
             buf.append((char)ch);
             ch = reader.read();
         }
+        if (ch == -1) {
+            throw new EOFException("Unexpected end of stream reached");
+        }
         return buf.toString();
     }
 
index 624d99fc0b9cd005163cb373dadba80d7e42038d..4d01e20fa7f6b383ae4d35610a17df8c27a454d4 100644 (file)
@@ -32,19 +32,18 @@ import org.apache.batik.dom.svg.SVGDOMImplementation;
 import org.apache.batik.gvt.GraphicsNode;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-
+import org.apache.fop.svg.SimpleSVGUserAgent;
 import org.apache.xmlgraphics.image.loader.Image;
 import org.apache.xmlgraphics.image.loader.ImageException;
 import org.apache.xmlgraphics.image.loader.ImageFlavor;
 import org.apache.xmlgraphics.image.loader.ImageProcessingHints;
+import org.apache.xmlgraphics.image.loader.XMLNamespaceEnabledImageFlavor;
 import org.apache.xmlgraphics.image.loader.impl.AbstractImageConverter;
 import org.apache.xmlgraphics.image.loader.impl.ImageGraphics2D;
 import org.apache.xmlgraphics.image.loader.impl.ImageXMLDOM;
 import org.apache.xmlgraphics.java2d.Graphics2DImagePainter;
 import org.apache.xmlgraphics.util.UnitConv;
 
-import org.apache.fop.svg.SimpleSVGUserAgent;
-
 /**
  * This ImageConverter converts SVG images to Java2D.
  * <p>
@@ -132,7 +131,7 @@ public class ImageConverterSVG2G2D extends AbstractImageConverter {
 
     /** {@inheritDoc} */
     public ImageFlavor getSourceFlavor() {
-        return ImageFlavor.XML_DOM;
+        return XMLNamespaceEnabledImageFlavor.SVG_DOM;
     }
 
     /** {@inheritDoc} */
index 9203bf7e87336fa741490b4ba5f29b4c246b6db3..b37ba925bf0057cca34e0b6418e2a08c51407a24 100644 (file)
@@ -20,6 +20,7 @@
 package org.apache.fop.image.loader.batik;
 
 import org.apache.xmlgraphics.image.loader.ImageFlavor;
+import org.apache.xmlgraphics.image.loader.XMLNamespaceEnabledImageFlavor;
 import org.apache.xmlgraphics.image.loader.impl.AbstractImageLoaderFactory;
 import org.apache.xmlgraphics.image.loader.spi.ImageLoader;
 import org.apache.xmlgraphics.util.MimeConstants;
@@ -30,7 +31,7 @@ import org.apache.xmlgraphics.util.MimeConstants;
 public class ImageLoaderFactorySVG extends AbstractImageLoaderFactory {
 
     private static final ImageFlavor[] FLAVORS = new ImageFlavor[] {
-        ImageFlavor.XML_DOM};
+        XMLNamespaceEnabledImageFlavor.SVG_DOM};
 
     private static final String[] MIMES = new String[] {
         MimeConstants.MIME_SVG};
index 483d6c502efee34dde0e3b4ffac7479c98ed9bba..c5c113b04be9f449db811eadb2cbda04bf0eb992 100644 (file)
@@ -23,12 +23,12 @@ import java.io.IOException;
 import java.util.Map;
 
 import org.apache.batik.dom.svg.SVGDOMImplementation;
-
 import org.apache.xmlgraphics.image.loader.Image;
 import org.apache.xmlgraphics.image.loader.ImageException;
 import org.apache.xmlgraphics.image.loader.ImageFlavor;
 import org.apache.xmlgraphics.image.loader.ImageInfo;
 import org.apache.xmlgraphics.image.loader.ImageSessionContext;
+import org.apache.xmlgraphics.image.loader.XMLNamespaceEnabledImageFlavor;
 import org.apache.xmlgraphics.image.loader.impl.AbstractImageLoader;
 import org.apache.xmlgraphics.image.loader.impl.ImageXMLDOM;
 import org.apache.xmlgraphics.util.MimeConstants;
@@ -45,7 +45,7 @@ public class ImageLoaderSVG extends AbstractImageLoader {
      * @param targetFlavor the target flavor
      */
     public ImageLoaderSVG(ImageFlavor targetFlavor) {
-        if (!(ImageFlavor.XML_DOM.equals(targetFlavor))) {
+        if (!(XMLNamespaceEnabledImageFlavor.SVG_DOM.equals(targetFlavor))) {
             throw new IllegalArgumentException("Unsupported target ImageFlavor: " + targetFlavor);
         }
         this.targetFlavor = targetFlavor;
index 55c78ba52a747514b0916587f5bbcb7897a8f322..9073c48bb4a4f5264f1952501bb32c5c921e1c9b 100644 (file)
@@ -234,13 +234,13 @@ public class PageProvider implements Constants {
             indexOfCachedLastPage = (isLastPage ? intIndex : -1);
         }
         if (replace) {
-            disardCacheStartingWith(intIndex);
+            discardCacheStartingWith(intIndex);
             page = cacheNextPage(index, isBlank, isLastPage);
         }
         return page;
     }
 
-    private void disardCacheStartingWith(int index) {
+    private void discardCacheStartingWith(int index) {
         while (index < cachedPages.size()) {
             this.cachedPages.remove(cachedPages.size() - 1);
             if (!pageSeq.goToPreviousSimplePageMaster()) {
@@ -251,8 +251,9 @@ public class PageProvider implements Constants {
 
     private Page cacheNextPage(int index, boolean isBlank, boolean isLastPage) {
         String pageNumberString = pageSeq.makeFormattedPageNumber(index);
+        boolean isFirstPage = (startPageOfPageSequence == index);
         SimplePageMaster spm = pageSeq.getNextSimplePageMaster(
-                index, (startPageOfPageSequence == index), isLastPage, false, isBlank);
+                index, isFirstPage, isLastPage, isBlank);
 
         Region body = spm.getRegion(FO_REGION_BODY);
         if (!pageSeq.getMainFlow().getFlowName().equals(body.getRegionName())) {
index ae39cadb7151cc085e16ffbd8981c2695ff05a05..bd31148be853e18a1081175cb60ebd7b3d701113 100644 (file)
@@ -48,6 +48,9 @@ public class AlphaRasterImage implements PDFImage {
      */
     public AlphaRasterImage(String k, Raster alpha) {
         this.key = k;
+        //Enable the commented line below if 16-bit alpha channels are desired.
+        //Otherwise, we compress the alpha channel to 8 bit which should be sufficient.
+        //this.bitsPerComponent = alpha.getSampleModel().getSampleSize(0);
         this.bitsPerComponent = 8;
         this.colorSpace = new PDFDeviceColorSpace(PDFDeviceColorSpace.DEVICE_GRAY);
         if (alpha == null) {
@@ -148,6 +151,18 @@ public class AlphaRasterImage implements PDFImage {
                 alpha.getDataElements(0, y, w, 1, line);
                 out.write(line);
             }
+        } else if (dataType == DataBuffer.TYPE_USHORT) {
+            short[] sline = new short[nbands * w];
+            byte[] line = new byte[nbands * w];
+            for (int y = 0; y < h; y++) {
+                alpha.getDataElements(0, y, w, 1, sline);
+                for (int i = 0; i < w; i++) {
+                    //this compresses a 16-bit alpha channel to 8 bits!
+                    //we probably don't ever need a 16-bit channel
+                    line[i] = (byte)(sline[i] >> 8);
+                }
+                out.write(line);
+            }
         } else if (dataType == DataBuffer.TYPE_INT) {
             //Is there an better way to get a 8bit raster from a TYPE_INT raster?
             int shift = 24;
index 5eab5c81a184f708bfcaccde05a31062c41b330d..3025b878890b3cc257b87c43b3630f9f65d3e10c 100644 (file)
@@ -163,6 +163,11 @@ public class PDFFilterList {
      * @param type which filter list to modify
      */
     public void addDefaultFilters(Map filters, String type) {
+        if (METADATA_FILTER.equals(type)) {
+            //XMP metadata should not be embedded in clear-text
+            addFilter(new NullFilter());
+            return;
+        }
         List filterset = null;
         if (filters != null) {
             filterset = (List)filters.get(type);
@@ -171,10 +176,7 @@ public class PDFFilterList {
             }
         }
         if (filterset == null || filterset.size() == 0) {
-            if (METADATA_FILTER.equals(type)) {
-                //XMP metadata should not be embedded in clear-text
-                addFilter(new NullFilter());
-            } else if (JPEG_FILTER.equals(type)) {
+            if (JPEG_FILTER.equals(type)) {
                 //JPEG is already well compressed
                 addFilter(new NullFilter());
             } else if (TIFF_FILTER.equals(type)) {
index 65c7bf6819853212995d99240f5f577b8ee01abd..d3762a436cbe1a4df48b70f7871661d2004129b1 100644 (file)
@@ -222,7 +222,7 @@ public class RTFHandler extends FOEventHandler {
                     PageSequenceMaster master
                         = pageSeq.getRoot().getLayoutMasterSet().getPageSequenceMaster(reference);
                     this.pagemaster = master.getNextSimplePageMaster(
-                            false, false, false, false, false);
+                            false, false, false, false);
                 }
             }
 
index 740ea36e594f69eeb279de0c7c97e6400e85f33b..09c39be12ee4386890bfb3b3b798b848c0f5dcbe 100644 (file)
@@ -26,8 +26,8 @@ package org.apache.fop.render.rtf.rtflib.rtfdoc;
  * the FOP project.
  */
 
-import java.io.Writer;
 import java.io.IOException;
+import java.io.Writer;
 import java.util.Iterator;
 
 /**  A cell in an RTF table, container for paragraphs, lists, etc.
@@ -237,12 +237,12 @@ public class RtfTableCell
             // Reach the column index in table context corresponding to the current column cell
             // id is the index of the current cell (it begins at 1)
             // getColumnIndex() is the index of the current column in table context (it begins at 0)
-            //  => so we must widthdraw 1 when comparing these two variables.
+            //  => so we must withdraw 1 when comparing these two variables.
             while ((this.id - 1) != tableColumnsInfo.getColumnIndex()) {
                tableColumnsInfo.selectNextColumn();
             }
 
-            // We widthdraw one cell because the first cell is already created
+            // We withdraw one cell because the first cell is already created
             // (it's the current cell) !
             int i = nbMergedCells - 1;
             while (i > 0) {
@@ -255,21 +255,18 @@ public class RtfTableCell
         final int xPos = offset + iCurrentWidth;
 
         //these lines added by Chris Scott, Westinghouse
-        //some attributes need to be writting before opening block
+        //some attributes need to be written before opening block
         if (setCenter) {
-            writeControlWord("qc");
+            writeControlWord("trqc");
         } else if (setRight) {
-            writeControlWord("qr");
+            writeControlWord("trqr");
         } else {
-            writeControlWord("ql");
+            writeControlWord("trql");
         }
         writeAttributes (attrib, ITableAttributes.CELL_VERT_ALIGN);
 
         writeControlWord("cellx" + xPos);
 
-        //TODO Why is this here, right after an alignment command is written (see above)?
-        writeControlWord("ql");
-
         return xPos;
 
     }
index 45ffdc71463be4e5e365f2a7fcaa0340e16e38ab..b017528fe8c301fefdcb1825bd4b95e4ef68e126 100644 (file)
 
   <changes>
     <release version="FOP Trunk" date="TBD">
+      <action context="Layout" dev="AD" type="fix" fixes-bug="40798">
+        Bugzilla 40798: A conditional-page-master-reference with page-position="last" qualifies
+        for a first page, if it is also the last. Additionally: also added support for
+        page-position="only".
+      </action>
+      <action context="Code" dev="AD" type="fix" fixes-bug="45842" due-to="Carsten Siedentop">
+        Make fop.bat and fop.cmd use the %FOP_OPTS% environment variable.
+      </action>
+      <action context="Renderers" dev="JM" type="add" fixes-bug="45795">
+        PDF Output: Added support for handling 16-bit alpha channel. They are currently
+        converted to 8 bits.
+      </action>
+      <action context="Renderers" dev="JM" type="fix">
+        PDF Output: Made sure the XMP Metadata stream is never compressed.
+      </action>
+      <action context="Fonts" dev="JM" type="fix" fixes-bug="45734" due-to="J. Frantzius">
+        Fix for PFMReader after bug #43089 changed the behavior of PFMFile. Fixes baseline
+        problems when Type 1 fonts are used in conjunction with XML font metric files.
+      </action>
+      <action context="Renderers" dev="JM" type="fix" fixes-bug="45616" due-to="Pavel Kysilka">
+        Fix for table handling in RTF output, so the output works with OpenOffice and AbiWord, too.
+      </action>
       <action context="Code" dev="AD" type="fix" fixes-bug="45667">
         Quick-fix to avoid a possible NullPointerException when using
         empty inlines and hyphenation.
index c2068391219b733394948ef774023a4d92fc8c39..290b290509a543bd5e6160b4ef77786abbddfa90 100644 (file)
@@ -23,6 +23,8 @@ import junit.framework.Test;
 import junit.framework.TestSuite;
 
 import org.apache.fop.fonts.TrueTypeAnsiTestCase;
+import org.apache.fop.image.loader.batik.ImageLoaderTestCase;
+import org.apache.fop.image.loader.batik.ImagePreloaderTestCase;
 import org.apache.fop.render.pdf.PDFAConformanceTestCase;
 import org.apache.fop.render.pdf.PDFCMapTestCase;
 import org.apache.fop.render.pdf.PDFEncodingTestCase;
@@ -50,6 +52,8 @@ public class StandardTestSuite {
         suite.addTest(new TestSuite(PDFsRGBSettingsTestCase.class));
         suite.addTest(new TestSuite(TrueTypeAnsiTestCase.class));
         suite.addTest(RichTextFormatTestSuite.suite());
+        suite.addTest(new TestSuite(ImageLoaderTestCase.class));
+        suite.addTest(new TestSuite(ImagePreloaderTestCase.class));
         //$JUnit-END$
         return suite;
     }
index 457aa91d46e689330767219e1eca27db99bdac30..97bfb4d5c5cd120a5f8e3ebac50699d914397a78 100644 (file)
 
 package org.apache.fop.image.loader.batik;
 
+import java.awt.image.Raster;
+import java.awt.image.RenderedImage;
 import java.io.File;
 
 import junit.framework.TestCase;
 
+import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.apps.FopFactory;
 import org.apache.xmlgraphics.image.loader.Image;
 import org.apache.xmlgraphics.image.loader.ImageFlavor;
 import org.apache.xmlgraphics.image.loader.ImageInfo;
 import org.apache.xmlgraphics.image.loader.ImageManager;
+import org.apache.xmlgraphics.image.loader.XMLNamespaceEnabledImageFlavor;
 import org.apache.xmlgraphics.image.loader.impl.ImageRendered;
 import org.apache.xmlgraphics.image.loader.impl.ImageXMLDOM;
 import org.apache.xmlgraphics.image.writer.ImageWriterUtil;
 
-import org.apache.fop.apps.FOUserAgent;
-import org.apache.fop.apps.FopFactory;
-
 /**
  * Tests for bundled ImageLoader implementations.
  */
@@ -59,10 +61,10 @@ public class ImageLoaderTestCase extends TestCase {
         ImageInfo info = manager.preloadImage(uri, userAgent.getImageSessionContext());
         assertNotNull("ImageInfo must not be null", info);
 
-        Image img = manager.getImage(info, ImageFlavor.XML_DOM,
+        Image img = manager.getImage(info, XMLNamespaceEnabledImageFlavor.SVG_DOM,
                 userAgent.getImageSessionContext());
         assertNotNull("Image must not be null", img);
-        assertEquals(ImageFlavor.XML_DOM, img.getFlavor());
+        assertEquals(XMLNamespaceEnabledImageFlavor.SVG_DOM, img.getFlavor());
         ImageXMLDOM imgDom = (ImageXMLDOM)img;
         assertNotNull(imgDom.getDocument());
         assertEquals("http://www.w3.org/2000/svg", imgDom.getRootNamespace());
@@ -101,10 +103,10 @@ public class ImageLoaderTestCase extends TestCase {
         ImageInfo info = manager.preloadImage(uri, userAgent.getImageSessionContext());
         assertNotNull("ImageInfo must not be null", info);
 
-        Image img = manager.getImage(info, ImageFlavor.XML_DOM,
+        Image img = manager.getImage(info, XMLNamespaceEnabledImageFlavor.SVG_DOM,
                 userAgent.getImageSessionContext());
         assertNotNull("Image must not be null", img);
-        assertEquals(ImageFlavor.XML_DOM, img.getFlavor());
+        assertEquals(XMLNamespaceEnabledImageFlavor.SVG_DOM, img.getFlavor());
         ImageXMLDOM imgDom = (ImageXMLDOM)img;
         assertNotNull(imgDom.getDocument());
         assertEquals("http://www.w3.org/2000/svg", imgDom.getRootNamespace());
@@ -160,4 +162,58 @@ public class ImageLoaderTestCase extends TestCase {
         assertEquals(612000, info.getSize().getHeightMpt());
     }
 
+    public void testSVGWithReferences() throws Exception {
+        String uri = "test/resources/fop/svg/images.svg";
+        FopFactory ff = FopFactory.newInstance();
+        FOUserAgent userAgent = ff.newFOUserAgent();
+
+        ImageManager manager = ff.getImageManager();
+        ImageInfo info = manager.preloadImage(uri, userAgent.getImageSessionContext());
+        assertNotNull("ImageInfo must not be null", info);
+
+        Image img = manager.getImage(info, XMLNamespaceEnabledImageFlavor.SVG_DOM,
+                userAgent.getImageSessionContext());
+        assertNotNull("Image must not be null", img);
+        assertEquals(XMLNamespaceEnabledImageFlavor.SVG_DOM, img.getFlavor());
+        ImageXMLDOM imgDom = (ImageXMLDOM)img;
+        assertNotNull(imgDom.getDocument());
+        assertEquals("http://www.w3.org/2000/svg", imgDom.getRootNamespace());
+        info = imgDom.getInfo(); //Switch to the ImageInfo returned by the image
+        assertEquals(400000, info.getSize().getWidthMpt());
+        assertEquals(400000, info.getSize().getHeightMpt());
+        assertEquals(400, info.getSize().getWidthPx());
+        assertEquals(400, info.getSize().getHeightPx());
+
+        img = manager.getImage(info, ImageFlavor.RENDERED_IMAGE,
+                    userAgent.getImageSessionContext());
+        assertNotNull("Image must not be null", img);
+        assertEquals(ImageFlavor.RENDERED_IMAGE, img.getFlavor());
+        ImageRendered imgRed = (ImageRendered)img;
+        RenderedImage renImg = imgRed.getRenderedImage();
+        assertNotNull(renImg);
+        if (DEBUG_TARGET_DIR != null) {
+            ImageWriterUtil.saveAsPNG(renImg,
+                    (int)userAgent.getTargetResolution(),
+                    new File(DEBUG_TARGET_DIR, "images.svg.png"));
+        }
+        assertEquals(400, renImg.getWidth());
+        assertEquals(400, renImg.getHeight());
+        info = imgRed.getInfo(); //Switch to the ImageInfo returned by the image
+        assertEquals(400000, info.getSize().getWidthMpt());
+        assertEquals(400000, info.getSize().getHeightMpt());
+        Raster raster = renImg.getData();
+        // This pixel is white
+        int[] pixel1 = raster.getPixel(1, 1, (int[] )null);
+        // This pixel is from the embedded JPG and is not white
+        int[] pixel80 = raster.getPixel(80, 80, (int[]) null);
+        assertEquals(pixel1.length, pixel80.length);
+        boolean same = true;
+        for (int i = 0; i < pixel1.length; i++) {
+            same &= (pixel1[i] == pixel80[i]);
+        }
+        assertFalse("Embedding JPG into SVG failed", same);
+    }
+
+
+    
 }
diff --git a/test/layoutengine/standard-testcases/page-position_last_bug40798.xml b/test/layoutengine/standard-testcases/page-position_last_bug40798.xml
new file mode 100644 (file)
index 0000000..3292b42
--- /dev/null
@@ -0,0 +1,118 @@
+<?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 for the use of a 'last' conditional-page-master-reference 
+      for a first/only page (see: https://issues.apache.org/bugzilla/show_bug.cgi?id=40798)
+    </p>
+  </info>
+  <fo>
+    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"
+           font-family="Times" font-size="20pt">
+    
+       <fo:layout-master-set>
+         <fo:simple-page-master master-name="only-page-layout"
+                             page-height="297mm" page-width="210mm"
+                             margin-top="15mm" margin-bottom="15mm"
+                             margin-left="15mm" margin-right="15mm">
+           <fo:region-body region-name="frame-body" margin-top="10mm"/>
+           <fo:region-before region-name="only-region" extent="10mm"/>
+         </fo:simple-page-master>
+         <fo:simple-page-master master-name="first-page-layout"
+                             page-height="297mm" page-width="210mm"
+                             margin-top="15mm" margin-bottom="15mm"
+                             margin-left="15mm" margin-right="15mm">
+           <fo:region-body region-name="frame-body" margin-top="10mm"/>
+           <fo:region-before region-name="first-region" extent="10mm"/>
+         </fo:simple-page-master>
+         <fo:simple-page-master master-name="last-page-layout"
+                             page-height="297mm" page-width="210mm"
+                             margin-top="15mm" margin-bottom="15mm"
+                             margin-left="15mm" margin-right="15mm">
+           <fo:region-body region-name="frame-body" margin-top="10mm"/>
+           <fo:region-before region-name="last-region" extent="10mm"/>
+         </fo:simple-page-master>
+         <fo:simple-page-master master-name="rest-page-layout"
+                             page-height="297mm" page-width="210mm"
+                             margin-top="15mm" margin-bottom="15mm"
+                             margin-left="15mm" margin-right="15mm">
+           <fo:region-body region-name="frame-body" margin-top="10mm"/>
+           <fo:region-before region-name="rest-region" extent="10mm"/>
+         </fo:simple-page-master>
+    
+       <fo:page-sequence-master master-name="whatever">
+         <fo:repeatable-page-master-alternatives maximum-repeats="1">
+           <fo:conditional-page-master-reference master-reference="only-page-layout"
+                                              page-position="last"/>
+           <fo:conditional-page-master-reference master-reference="first-page-layout"
+                                              page-position="first"/>
+         </fo:repeatable-page-master-alternatives>
+         <fo:repeatable-page-master-alternatives maximum-repeats="no-limit">
+           <fo:conditional-page-master-reference master-reference="last-page-layout"
+                                              page-position="last"/>
+           <fo:conditional-page-master-reference master-reference="rest-page-layout"
+                                              page-position="rest"/>
+         </fo:repeatable-page-master-alternatives>
+       </fo:page-sequence-master>
+    
+       </fo:layout-master-set>
+    
+       <fo:page-sequence master-reference="whatever">
+         <fo:static-content flow-name="first-region">
+           <fo:block id="header.first.1" text-align="center">first</fo:block>
+         </fo:static-content>
+         <fo:static-content flow-name="only-region">
+           <fo:block id="header.only.1" text-align="center">only</fo:block>
+         </fo:static-content>
+         <fo:flow flow-name="frame-body">
+           <fo:block>This is the only page</fo:block>
+         </fo:flow>
+       </fo:page-sequence>
+       <fo:page-sequence master-reference="whatever">
+         <fo:static-content flow-name="only-region">
+           <fo:block id="header.only.2" text-align="center">only</fo:block>
+         </fo:static-content>
+         <fo:static-content flow-name="first-region">
+           <fo:block id="header.first.2" text-align="center">first</fo:block>
+         </fo:static-content>
+         <fo:static-content flow-name="last-region">
+           <fo:block id="header.last.2" text-align="center">last</fo:block>
+         </fo:static-content>
+         <fo:static-content flow-name="rest-region">
+           <fo:block id="header.rest.2" text-align="center">rest</fo:block>
+         </fo:static-content>
+         <fo:flow flow-name="frame-body">
+           <fo:block>This is the first page</fo:block>
+           <fo:block break-before="page">This is a middle page</fo:block>
+           <fo:block break-before="page">This is a middle page</fo:block>
+           <fo:block break-before="page">This is the last page</fo:block>
+         </fo:flow>
+       </fo:page-sequence>
+      
+    </fo:root>
+  </fo>
+  <checks>
+    <eval expected="header.only.1" xpath="(/areaTree/pageSequence[1]//regionBefore)[1]/block[1]/@prod-id" />
+    <eval expected="header.first.2" xpath="(/areaTree/pageSequence[2]//regionBefore)[1]/block[1]/@prod-id" />
+    <eval expected="header.rest.2" xpath="(/areaTree/pageSequence[2]//regionBefore)[2]/block[1]/@prod-id" />
+    <eval expected="header.rest.2" xpath="(/areaTree/pageSequence[2]//regionBefore)[3]/block[1]/@prod-id" />
+    <eval expected="header.last.2" xpath="(/areaTree/pageSequence[2]//regionBefore)[4]/block[1]/@prod-id" />
+  </checks>
+</testcase>
diff --git a/test/layoutengine/standard-testcases/page-position_only.xml b/test/layoutengine/standard-testcases/page-position_only.xml
new file mode 100644 (file)
index 0000000..bcf05db
--- /dev/null
@@ -0,0 +1,115 @@
+<?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 for the use of an 'only' conditional-page-master-reference (XSL 1.1)
+    </p>
+  </info>
+  <fo>
+    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"
+           font-family="Times" font-size="20pt">
+    
+       <fo:layout-master-set>
+         <fo:simple-page-master master-name="only-page-layout"
+                             page-height="297mm" page-width="210mm"
+                             margin-top="15mm" margin-bottom="15mm"
+                             margin-left="15mm" margin-right="15mm">
+           <fo:region-body region-name="frame-body" margin-top="10mm"/>
+           <fo:region-before region-name="only-region" extent="10mm"/>
+         </fo:simple-page-master>
+         <fo:simple-page-master master-name="first-page-layout"
+                             page-height="297mm" page-width="210mm"
+                             margin-top="15mm" margin-bottom="15mm"
+                             margin-left="15mm" margin-right="15mm">
+           <fo:region-body region-name="frame-body" margin-top="10mm"/>
+           <fo:region-before region-name="first-region" extent="10mm"/>
+         </fo:simple-page-master>
+         <fo:simple-page-master master-name="last-page-layout"
+                             page-height="297mm" page-width="210mm"
+                             margin-top="15mm" margin-bottom="15mm"
+                             margin-left="15mm" margin-right="15mm">
+           <fo:region-body region-name="frame-body" margin-top="10mm"/>
+           <fo:region-before region-name="last-region" extent="10mm"/>
+         </fo:simple-page-master>
+         <fo:simple-page-master master-name="rest-page-layout"
+                             page-height="297mm" page-width="210mm"
+                             margin-top="15mm" margin-bottom="15mm"
+                             margin-left="15mm" margin-right="15mm">
+           <fo:region-body region-name="frame-body" margin-top="10mm"/>
+           <fo:region-before region-name="rest-region" extent="10mm"/>
+         </fo:simple-page-master>
+    
+       <fo:page-sequence-master master-name="whatever">
+         <fo:repeatable-page-master-alternatives maximum-repeats="no-limit">
+           <fo:conditional-page-master-reference master-reference="only-page-layout"
+                                              page-position="only"/>
+           <fo:conditional-page-master-reference master-reference="first-page-layout"
+                                              page-position="first"/>
+           <fo:conditional-page-master-reference master-reference="last-page-layout"
+                                              page-position="last"/>
+           <fo:conditional-page-master-reference master-reference="rest-page-layout"
+                                              page-position="rest"/>
+         </fo:repeatable-page-master-alternatives>
+       </fo:page-sequence-master>
+    
+       </fo:layout-master-set>
+    
+       <fo:page-sequence master-reference="whatever">
+         <fo:static-content flow-name="first-region">
+           <fo:block id="header.first.1" text-align="center">first</fo:block>
+         </fo:static-content>
+         <fo:static-content flow-name="only-region">
+           <fo:block id="header.only.1" text-align="center">only</fo:block>
+         </fo:static-content>
+         <fo:flow flow-name="frame-body">
+           <fo:block>This is the only page</fo:block>
+         </fo:flow>
+       </fo:page-sequence>
+       <fo:page-sequence master-reference="whatever">
+         <fo:static-content flow-name="only-region">
+           <fo:block id="header.only.2" text-align="center">only</fo:block>
+         </fo:static-content>
+         <fo:static-content flow-name="first-region">
+           <fo:block id="header.first.2" text-align="center">first</fo:block>
+         </fo:static-content>
+         <fo:static-content flow-name="last-region">
+           <fo:block id="header.last.2" text-align="center">last</fo:block>
+         </fo:static-content>
+         <fo:static-content flow-name="rest-region">
+           <fo:block id="header.rest.2" text-align="center">rest</fo:block>
+         </fo:static-content>
+         <fo:flow flow-name="frame-body">
+           <fo:block>This is the first page</fo:block>
+           <fo:block break-before="page">This is a middle page</fo:block>
+           <fo:block break-before="page">This is a middle page</fo:block>
+           <fo:block break-before="page">This is the last page</fo:block>
+         </fo:flow>
+       </fo:page-sequence>
+      
+    </fo:root>
+  </fo>
+  <checks>
+    <eval expected="header.only.1" xpath="(/areaTree/pageSequence[1]//regionBefore)[1]/block[1]/@prod-id" />
+    <eval expected="header.first.2" xpath="(/areaTree/pageSequence[2]//regionBefore)[1]/block[1]/@prod-id" />
+    <eval expected="header.rest.2" xpath="(/areaTree/pageSequence[2]//regionBefore)[2]/block[1]/@prod-id" />
+    <eval expected="header.rest.2" xpath="(/areaTree/pageSequence[2]//regionBefore)[3]/block[1]/@prod-id" />
+    <eval expected="header.last.2" xpath="(/areaTree/pageSequence[2]//regionBefore)[4]/block[1]/@prod-id" />
+  </checks>
+</testcase>