[prev in list] [next in list] [prev in thread] [next in thread] 

List:       fop-dev
Subject:    [jira] [Commented] (FOP-2731) Position:fixed uses a bad reference area
From:       "Dan Caprioara (JIRA)" <jira () apache ! org>
Date:       2017-07-26 12:10:00
Message-ID: JIRA.13090172.1501067813000.17495.1501071000286 () Atlassian ! JIRA
[Download RAW message or body]


    [ https://issues.apache.org/jira/browse/FOP-2731?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16101599#comment-16101599 \
] 

Dan Caprioara commented on FOP-2731:
------------------------------------

Possible fix:

{code}
Index: BlockContainerLayoutManager.java
===================================================================
--- BlockContainerLayoutManager.java	(revision 161373)
+++ BlockContainerLayoutManager.java	(working copy)
@@ -744,7 +744,57 @@
         }
         return new Point(x, y);
     }
+    
+    // PATCH START -  FOP-2731 Using the page as reference for fixed positioning  
+    
+    /**
+     * Gets the offset of the box, when having a position: fixed.
+     * The reference area is the page. 
+     * 
+     * @return The coordinate in the page.
+     */
+    private Point getFixedOffset() {
+        int x = 0;
+        int y = 0;
+        
+        if (abProps.left.getEnum() != EN_AUTO) {
+            x = abProps.left.getValue(this);
+        } else if (abProps.right.getEnum() != EN_AUTO
+                && width.getEnum() != EN_AUTO) {
+            x = getPageWidth()
+                - abProps.right.getValue(this) - width.getValue(this);
+        }
+        if (abProps.top.getEnum() != EN_AUTO) {
+            y = abProps.top.getValue(this);
+        } else if (abProps.bottom.getEnum() != EN_AUTO
+                && height.getEnum() != EN_AUTO) {
+            y = getReferenceAreaForFixedBPD()
+                - abProps.bottom.getValue(this) - height.getValue(this);
+        }
+        return new Point(x, y);
+    }
 
+
+    /**
+     * Gets the width of the page.
+     * 
+     * @return the width of the page.
+     */
+    public int getPageWidth() {
+      return (int) getCurrentPV().getViewArea().getWidth(); 
+    }
+
+    /**
+     * Gets the height of the page.
+     * 
+     * @return the height of the page.
+     */
+    protected int getReferenceAreaForFixedBPD() {
+      return (int) getCurrentPV().getViewArea().getHeight(); 
+    }
+    
+    // PATCH END
+
     /** {@inheritDoc} */
     @Override
     public void addAreas(PositionIterator parentIter, LayoutContext layoutContext) {
@@ -884,14 +934,29 @@
             viewportBlockArea.setCTM(absoluteCTM);
             viewportBlockArea.setClip(needClip());
 
-            if (abProps.absolutePosition == EN_ABSOLUTE
-                    || abProps.absolutePosition == EN_FIXED) {
+            
+            // PATCH START - FOP-2731 Using the page as reference for fixed \
positioning   +
+//            if (abProps.absolutePosition == EN_ABSOLUTE
+//                    || abProps.absolutePosition == EN_FIXED) {
+//                Point offset = getAbsOffset();
+//                viewportBlockArea.setXOffset(offset.x);
+//                viewportBlockArea.setYOffset(offset.y);
+//            } else {
+//                //nop
+//            }
+            if (abProps.absolutePosition == EN_ABSOLUTE) {
                 Point offset = getAbsOffset();
                 viewportBlockArea.setXOffset(offset.x);
                 viewportBlockArea.setYOffset(offset.y);
+            } else if (abProps.absolutePosition == EN_FIXED) {
+                Point offset = getFixedOffset();
+                viewportBlockArea.setXOffset(offset.x);
+                viewportBlockArea.setYOffset(offset.y);
             } else {
                 //nop
             }
+            // PATCH END  
 
             referenceArea = new Block();
             referenceArea.addTrait(Trait.IS_REFERENCE_AREA, Boolean.TRUE);

{code}

> Position:fixed uses a bad reference area
> ----------------------------------------
> 
> Key: FOP-2731
> URL: https://issues.apache.org/jira/browse/FOP-2731
> Project: FOP
> Issue Type: Bug
> Components: layout/block
> Affects Versions: 2.2
> Reporter: Dan Caprioara
> Attachments: position-fixed-bad-reference-area.png
> 
> 
> When trying to place some elements to the corners of the page, it seems that FOP \
> uses some wrong dimensions. Take a look at the attached screenshot, showing the \
> difference between FOP and AntennaHouse. {code}
> <?xml version="1.0" encoding="UTF-8"?>
> <fo:root
> xml:lang="dflt"
> xmlns:css="http://www.w3.org/1998/CSS"
> xmlns:fo="http://www.w3.org/1999/XSL/Format">
> <fo:layout-master-set>
> <!-- Page: css2fo-default-->
> <fo:page-sequence-master
> master-name="css2fo-default">
> <fo:repeatable-page-master-alternatives>
> <fo:conditional-page-master-reference
> blank-or-not-blank="any"
> master-reference="spm-css2fo-default"
> odd-or-even="any"
> page-position="any"/>
> </fo:repeatable-page-master-alternatives>
> </fo:page-sequence-master>
> <fo:simple-page-master
> master-name="spm-css2fo-default"
> page-height="8.27in"
> page-width="5.83in">
> <fo:region-body
> border-bottom-color="orange"
> border-bottom-style="solid"
> border-bottom-width="2pt"
> border-left-color="orange"
> border-left-style="solid"
> border-left-width="2pt"
> border-right-color="orange"
> border-right-style="solid"
> border-right-width="2pt"
> border-top-color="orange"
> border-top-style="solid"
> border-top-width="2pt"
> margin-bottom="1in"
> margin-left="1in"
> margin-right="1in"
> margin-top="1in"/>
> <fo:region-before
> extent="1in"
> region-name="sc-before"/>
> <fo:region-after
> extent="1in"
> region-name="sc-after"/>
> <fo:region-start
> extent="1in"
> region-name="sc-start"/>
> <fo:region-end
> extent="1in"
> region-name="sc-end"/>
> </fo:simple-page-master>
> </fo:layout-master-set>
> <fo:declarations>
> <x:xmpmeta
> xmlns:x="adobe:ns:meta/">
> <rdf:RDF
> xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
> <rdf:Description>
> <xmp:CreatorTool
> xmlns:xmp="http://ns.adobe.com/xap/1.0/">oXygen PDF Chemistry</xmp:CreatorTool>
> </rdf:Description>
> </rdf:RDF>
> </x:xmpmeta>
> </fo:declarations>
> <fo:page-sequence
> force-page-count="no-force"
> id="last-page-sequence"
> line-height-shift-adjustment="disregard-shifts"
> master-reference="css2fo-default">
> <fo:flow
> flow-name="xsl-region-body">
> <fo:block
> font-family="serif"
> font-size="12pt">
> <fo:block
> font-size="larger"
> font-style="oblique">An element with position: fixed is positioned relative to its
> page.</fo:block>
> <fo:block>1. Normal div.</fo:block>
> <fo:block-container
> border-bottom-color="red"
> border-bottom-style="solid"
> border-bottom-width="3pt"
> border-left-color="red"
> border-left-style="solid"
> border-left-width="3pt"
> border-right-color="red"
> border-right-style="solid"
> border-right-width="3pt"
> border-top-color="red"
> border-top-style="solid"
> border-top-width="3pt"
> height="100pt"
> left="10pt"
> position="fixed"
> top="10pt"
> width="100pt">
> <fo:block
> end-indent="0"
> start-indent="0">Fixed top left.</fo:block>
> </fo:block-container>
> <fo:block-container
> border-bottom-color="red"
> border-bottom-style="solid"
> border-bottom-width="3pt"
> border-left-color="red"
> border-left-style="solid"
> border-left-width="3pt"
> border-right-color="red"
> border-right-style="solid"
> border-right-width="3pt"
> border-top-color="red"
> border-top-style="solid"
> border-top-width="3pt"
> height="100pt"
> position="fixed"
> right="10pt"
> top="10pt"
> width="100pt">
> <fo:block
> end-indent="0"
> start-indent="0">Fixed top right.</fo:block>
> </fo:block-container>
> <fo:block-container
> border-bottom-color="red"
> border-bottom-style="solid"
> border-bottom-width="3pt"
> border-left-color="red"
> border-left-style="solid"
> border-left-width="3pt"
> border-right-color="red"
> border-right-style="solid"
> border-right-width="3pt"
> border-top-color="red"
> border-top-style="solid"
> border-top-width="3pt"
> bottom="10pt"
> height="100pt"
> left="10pt"
> position="fixed"
> width="100pt">
> <fo:block
> end-indent="0"
> start-indent="0">Fixed bottom left.</fo:block>
> </fo:block-container>
> <fo:block-container
> border-bottom-color="red"
> border-bottom-style="solid"
> border-bottom-width="3pt"
> border-left-color="red"
> border-left-style="solid"
> border-left-width="3pt"
> border-right-color="red"
> border-right-style="solid"
> border-right-width="3pt"
> border-top-color="red"
> border-top-style="solid"
> border-top-width="3pt"
> bottom="10pt"
> height="100pt"
> position="fixed"
> right="10pt"
> width="100pt">
> <fo:block
> end-indent="0"
> start-indent="0">Fixed bottom right.</fo:block>
> </fo:block-container>
> <fo:block>2. Normal div.</fo:block>
> <fo:block>3. Normal div.</fo:block>
> </fo:block>
> </fo:flow>
> </fo:page-sequence>
> </fo:root>
> {code}



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic