/**
  * Create the image for the specified AnnotationStamp
  *
  * @param stamp the stamp to render
  * @param height the height of the stamp image
  * @param parser the PDFParser to use to convert
  * @since 2.1.19
  */
 public BufferedImage getStampImage(AnnotationStamp stamp, int height, PDFParser parser) {
   float rw = stamp.getRecommendedWidth();
   float rh = stamp.getRecommendedHeight();
   PDFPage page = new PDFPage((int) rw, (int) rh);
   stamp.setPage(page);
   stamp.setRectangle(0, 0, page.getWidth(), page.getHeight());
   PagePainter painter = parser.getPagePainter(page);
   painter.setBackground(null);
   float dpi = height / rh * 72;
   return painter.getImage(dpi, PDFParser.RGBA);
 }
 void setPage(PDFPage page, boolean forcevalidate) {
   currentPage = page;
   if (leftPage != null && leftPage == page) {
     currentPagePanel = leftPagePanel;
     if (!forcevalidate) {
       return;
     }
   }
   if (rightPage != null && rightPage == page) {
     currentPagePanel = rightPagePanel;
     if (!forcevalidate) {
       return;
     }
   }
   pagenumber = page.getPageNumber() - 1;
   int pagecount = pdf.getNumberOfPages();
   boolean isOdd = (pagenumber % 2) == 0; // even pages have odd numbers :)
   boolean onRight = handedness == ODD_PAGES_ON_RIGHT ? isOdd : !isOdd;
   if (onRight) {
     setLeftPage((pagenumber > 0) ? pdf.getPage(pagenumber - 1) : null);
     setRightPage(page);
     currentPagePanel = rightPagePanel;
   } else {
     setLeftPage(page);
     setRightPage((pagenumber < (pagecount - 1)) ? pdf.getPage(pagenumber + 1) : null);
     currentPagePanel = leftPagePanel;
   }
   revalidate();
   repaint();
 }
 public void setPage(PDFPage page, double x, double y, double zoom) {
   if (page.getPDF() != pdf) {
     throw new IllegalArgumentException("Page is from a different PDF");
   }
   setZoom((float) zoom);
   Rectangle2D crop = PagePanel.getFullPageView(page);
   ensureVisible(page, crop.getMinX() + x, crop.getMaxY() - y, false);
 }
 public int getPreviousSelectablePageIndex(PDFPage page) {
   if (page != null) {
     List<PDFPage> pages = page.getPDF().getPages();
     int ix = pages.indexOf(page);
     if (ix > 0) {
       return Math.max(0, ix - (((ix & 1) == 0) == (handedness == ODD_PAGES_ON_LEFT) ? 1 : 2));
     }
   }
   return -1;
 }
 public int getNextSelectablePageIndex(PDFPage page) {
   if (page != null) {
     List<PDFPage> pages = page.getPDF().getPages();
     int ix = pages.indexOf(page);
     if (ix >= 0 && ix < pages.size() - 1) {
       return Math.min(
           pages.size() - 1, ix + (((ix & 1) == 0) == (handedness == ODD_PAGES_ON_LEFT) ? 2 : 1));
     }
   }
   return -1;
 }
  public float getTargetZoom(int zoommode, PDFPage page) {
    float outzoom = zoom;
    if (page != null) {
      int pagenumber = page.getPageNumber() - 1;
      int pagecount = pdf.getNumberOfPages();
      boolean isOdd = (pagenumber % 2) == 0; // even pages have odd numbers :)
      boolean onRight = handedness == ODD_PAGES_ON_RIGHT ? isOdd : !isOdd;
      PDFPage leftPage, rightPage;
      Rectangle2D.Float leftPageRect = null, rightPageRect = null;
      if (onRight) {
        leftPage = (pagenumber > 0) ? pdf.getPage(pagenumber - 1) : null;
        rightPage = page;
      } else {
        leftPage = page;
        rightPage = (pagenumber < (pagecount - 1)) ? pdf.getPage(pagenumber + 1) : null;
      }
      if (leftPage != null) {
        leftPageRect = (Rectangle2D.Float) PagePanel.getFullPageView(leftPage);
      }
      if (rightPage != null) {
        rightPageRect = (Rectangle2D.Float) PagePanel.getFullPageView(rightPage);
      }
      if (leftPageRect == null) {
        leftPageRect = (Rectangle2D.Float) rightPageRect.clone();
      }
      if (rightPageRect == null) {
        rightPageRect = (Rectangle2D.Float) leftPageRect.clone();
      }
      JScrollBar hsb = scrollPane.getHorizontalScrollBar();
      JScrollBar vsb = scrollPane.getVerticalScrollBar();
      float prw = leftPageRect.width + rightPageRect.width;
      float prh = Math.max(leftPageRect.height, rightPageRect.height);

      Dimension size = getSize();
      float w =
          (float) Math.ceil(prw * Util.getScreenResolution(this) / 72)
              + (margin * 4)
              + interpagemargin
              + vsb.getWidth();
      float h =
          (float) Math.ceil(prh * Util.getScreenResolution(this) / 72)
              + (margin * 2)
              + hsb.getHeight();
      switch (zoommode) {
        case ZOOM_FITWIDTH:
          outzoom = (float) size.width / w;
          break;
        case ZOOM_FITHEIGHT:
          outzoom = (float) size.height / h;
          break;
        case ZOOM_FIT:
          float zw = (float) size.width / w;
          float zh = (float) size.height / h;
          outzoom = zw < zh ? zw : zh;
          break;
        default:
          outzoom = zoom == 0 ? 1 : zoom;
      }
    }
    return outzoom;
  }