All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jpedal.display.PageOffsets Maven / Gradle / Ivy

There is a newer version: 20151002
Show newest version
/*
 * ===========================================
 * Java Pdf Extraction Decoding Access Library
 * ===========================================
 *
 * Project Info:  http://www.idrsolutions.com
 * Help section for developers at http://www.idrsolutions.com/support/
 *
 * (C) Copyright 1997-2017 IDRsolutions and Contributors.
 *
 * This file is part of JPedal/JPDF2HTML5
 *
     This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA


 *
 * ---------------
 * PageOffsets.java
 * ---------------
 */
package org.jpedal.display;

import static org.jpedal.display.Display.CONTINUOUS;
import static org.jpedal.display.Display.CONTINUOUS_FACING;
import static org.jpedal.display.Display.FACING;
import org.jpedal.objects.PdfPageData;


/**
 * holds offsets for all multiple pages
 */
public class PageOffsets {

    private int width,height;
    
    /**width of all pages*/
    private int totalSingleWidth,totalDoubleWidth,gaps,doubleGaps;

    /**height of all pages*/
    private int totalSingleHeight,totalDoubleHeight;

    protected int maxW, maxH;

    /**gap between pages*/
    public static final int pageGap=10;

    /**max widths and heights for facing and continuous pages*/
    private int doublePageWidth,doublePageHeight,biggestWidth,biggestHeight,widestPageNR,widestPageR;

    public PageOffsets(final int pageCount, final PdfPageData pageData) {


        /* calulate sizes for continuous and facing page modes */
        int pageH, pageW, rotation;
        int greatestW = 0, greatestH = 0;
        totalSingleHeight = 0;
        totalSingleWidth = 0;

        int widestLeftPage = 0, widestRightPage = 0, highestLeftPage = 0, highestRightPage = 0;

        widestPageR = 0;
        widestPageNR = 0;

        totalDoubleWidth = 0;
        totalDoubleHeight = 0;
        gaps = 0;
        doubleGaps = 0;

        biggestWidth = 0;
        biggestHeight = 0;

        for (int i = 1; i < pageCount + 1; i++) {

            //get page sizes
            pageW = pageData.getCropBoxWidth(i);
            pageH = pageData.getCropBoxHeight(i);
            rotation = pageData.getRotation(i);

            //swap if this page rotated and flag
            if ((rotation == 90 || rotation == 270)) {
                final int tmp = pageW;
                pageW = pageH;
                pageH = tmp;
            }

            if (pageW > maxW) {
                maxW = pageW;
            }

            if (pageH > maxH) {
                maxH = pageH;
            }

            gaps += pageGap;

            totalSingleWidth += pageW;
            totalSingleHeight += pageH;

            //track page sizes
            if ((i & 1) == 1) {//odd
                if (widestRightPage < pageW) {
                    widestRightPage = pageW;
                }
                if (highestRightPage < pageH) {
                    highestRightPage = pageH;
                }
            } else {
                if (widestLeftPage < pageW) {
                    widestLeftPage = pageW;
                }
                if (highestLeftPage < pageH) {
                    highestLeftPage = pageH;
                }
            }

            if (widestPageNR < pageW) {
                widestPageNR = pageW;
            }

            if (widestPageR < pageH) {
                widestPageR = pageH;
            }

            if (pageW > biggestWidth) {
                biggestWidth = pageW;
            }
            if (pageH > biggestHeight) {
                biggestHeight = pageH;
            }

            // track widest and highest combination of facing pages
            if ((i & 1) == 1) {

                if (greatestW < pageW) {
                    greatestW = pageW;
                }
                if (greatestH < pageH) {
                    greatestH = pageH;
                }

                if (i == 1) {// first page special case
                    totalDoubleWidth = pageW;
                    totalDoubleHeight = pageH;
                } else {
                    totalDoubleWidth += greatestW;
                    totalDoubleHeight += greatestH;
                }

                doubleGaps += pageGap;

            } else {

                greatestW = pageW;
                greatestH = pageH;

                if (i == pageCount) { // allow for even number of pages
                    totalDoubleWidth = totalDoubleWidth + greatestW + pageGap;
                    totalDoubleHeight = totalDoubleHeight + greatestH + pageGap;
                }
            }

            //choose largest (to allow for rotation on specific pages)
            //int max=facingW;
            //if(max pageCount || (pageNumber==1 && pageCount!=2) ) {
                    secondW = firstW;
                }else {
                    if ((displayRotation + pageData.getRotation(pageNumber+1))%180==90) {
                        secondW = pageData.getCropBoxHeight(pageNumber + 1);
                    } else {
                        secondW = pageData.getCropBoxWidth(pageNumber + 1);
                    }
                }
                
                //get total width
                final int totalW = firstW + secondW;
                
                width=(int)(totalW*scaling)+ PageOffsets.pageGap;
                height=(biggestFacingHeight);	//NOTE scaled already!
                break;
                
                
            case CONTINUOUS:
                
                if((displayRotation==90)|(displayRotation==270)){
                    width=(int)(biggestHeight *scaling);
                    height=(int)((totalSingleWidth)*scaling)+gaps+insetH;
                }else{
                    width=(int)(biggestWidth *scaling);
                    height=(int)((totalSingleHeight)*scaling)+gaps+insetH;
                }
                break;
                
                
            case CONTINUOUS_FACING:
                
                if((displayRotation==90)|(displayRotation==270)){
                    width=(int)((doublePageHeight)*scaling)+(insetW*2)+doubleGaps;
                    height=(int)((totalDoubleWidth)*scaling)+doubleGaps+insetH;
                }else{
                    width=(int)((doublePageWidth)*scaling)+(insetW*2);
                    height=(int)((totalDoubleHeight)*scaling)+doubleGaps+insetH;
                }
                break;
                
        }
    }

    public int getPageWidth() {
        return width;
    }
    
    public int getPageHeight() {
        return height;
    }
}





© 2015 - 2024 Weber Informatics LLC | Privacy Policy