org.jpedal.render.ImageDisplay Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of OpenViewerFX Show documentation
Show all versions of OpenViewerFX Show documentation
Open Source (LGPL) JavaFX PDF Viewer for NetBeans plugin
/*
* ===========================================
* 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
*
@LICENSE@
*
* ---------------
* ImageDisplay.java
* ---------------
*/
package org.jpedal.render;
import java.awt.Shape;
import java.awt.Stroke;
import java.awt.geom.AffineTransform;
import java.awt.geom.Area;
import java.awt.image.BufferedImage;
import org.jpedal.color.PdfPaint;
import org.jpedal.fonts.PdfFont;
import org.jpedal.fonts.glyph.PdfGlyph;
import org.jpedal.io.ObjectStore;
import org.jpedal.objects.GraphicsState;
import org.jpedal.objects.PdfShape;
import org.jpedal.parser.Cmd;
import org.jpedal.utils.repositories.generic.Vector_Rectangle_Int;
public class ImageDisplay extends G2Display {
public ImageDisplay(final int pageNumber, final boolean addBackground, final int defaultSize, final ObjectStore newObjectRef) {
type = DynamicVectorRenderer.DISPLAY_IMAGE;
this.rawPageNumber = pageNumber;
this.objectStoreRef = newObjectRef;
this.addBackground = addBackground;
//setupArrays(defaultSize);
areas = new Vector_Rectangle_Int(defaultSize);
}
// save image in array to draw
@Override
public final int drawImage(final int pageNumber, final BufferedImage image, final GraphicsState gs, final boolean alreadyCached, final String name, final int previousUse) {
//track objects
int iw = (int) gs.CTM[0][0];
if (iw < 0) {
iw = -iw;
} else if (iw == 0) {
iw = (int) gs.CTM[0][1];
if (iw < 0) {
iw = -iw;
}
}
int ih = (int) gs.CTM[1][1];
if (ih < 0) {
ih = -ih;
} else if (ih == 0) {
ih = (int) gs.CTM[1][0];
if (ih < 0) {
ih = -ih;
}
}
final int[] rectParams = {(int) gs.CTM[2][0], (int) gs.CTM[2][1], iw, ih};
areas.addElement(rectParams);
blendMode = gs.getBMValue();
renderImage(null, image, gs.getAlpha(GraphicsState.FILL), gs, gs.x, gs.y);
return -1;
}
/*save clip in array to draw*/
@Override
public void drawClip(final GraphicsState currentGraphicsState, final Shape defaultClip, final boolean canBeCached) {
final Area clip = currentGraphicsState.getClippingShape();
if (canBeCached && hasClips && lastClip == null && clip == null) {
} else if (!canBeCached || lastClip == null || clip == null || !clip.equals(lastClip)) {
RenderUtils.renderClip(currentGraphicsState.getClippingShape(), null, defaultClip, g2);
lastClip = clip;
hasClips = true;
}
}
@Override
public void drawEmbeddedText(final float[][] Trm, final int fontSize, final PdfGlyph embeddedGlyph,
final Object javaGlyph, final int type, final GraphicsState gs, final double[] textTransform, final String glyf, final PdfFont currentFontData, final float glyfWidth) {
blendMode = gs.getBMValue();
AffineTransform at = null;
if (textTransform != null) //can actually be null at line 199
{
at = new AffineTransform(textTransform);
}
if (type == TEXT) {
PdfPaint currentCol = null, fillCol = null;
final int text_fill_type = gs.getTextRenderType();
//for a fill
if ((text_fill_type & GraphicsState.FILL) == GraphicsState.FILL) {
fillCol = gs.getNonstrokeColor();
}
//and/or do a stroke
if ((text_fill_type & GraphicsState.STROKE) == GraphicsState.STROKE) {
currentCol = gs.getStrokeColor();
}
//set the stroke to current value
final Stroke newStroke = gs.getStroke();
g2.setStroke(newStroke);
final AffineTransform def = g2.getTransform();
g2.translate(Trm[2][0], Trm[2][1]);
if (at != null) {
g2.transform(at);
}
renderText(Trm[2][0], Trm[2][1], text_fill_type, (Area) javaGlyph, null, currentCol, fillCol, gs.getAlpha(GraphicsState.STROKE),
gs.getAlpha(GraphicsState.FILL));
g2.setTransform(def);
} else {
PdfPaint strokeCol = null, fillCol = null;
final int text_fill_type = gs.getTextRenderType();
//for a fill
if ((text_fill_type & GraphicsState.FILL) == GraphicsState.FILL) {
fillCol = gs.getNonstrokeColor();
}
//and/or do a stroke
if ((text_fill_type & GraphicsState.STROKE) == GraphicsState.STROKE) {
strokeCol = gs.getStrokeColor();
}
//set the stroke to current value
final Stroke newStroke = gs.getStroke();
final Stroke currentStroke = g2.getStroke();
//avoid if stroke/fill
if (text_fill_type == GraphicsState.STROKE) {
g2.setStroke(newStroke);
}
//track objects so we can work out if anything behind
int fontSize2 = (int) gs.CTM[1][1];
if (fontSize2 < 0) {
fontSize2 = -fontSize2;
}
if (fontSize2 == 0) {
fontSize2 = (int) gs.CTM[0][1];
}
if (fontSize2 < 0) {
fontSize2 = -fontSize2;
}
// System.out.println(">>"+CTM[2][0]+" "+CTM[2][1]+" "+CTM[0][0]+" "+" "+CTM[0][1]+" "+" "+CTM[1][0]+" "+" "+CTM[1][1]+" "+this);
final int[] rectParams = {(int) gs.CTM[2][0], (int) gs.CTM[2][1], fontSize2, fontSize2};
areas.addElement(rectParams);
renderEmbeddedText(text_fill_type, embeddedGlyph, type, at, null, strokeCol, fillCol,
gs.getAlpha(GraphicsState.STROKE), gs.getAlpha(GraphicsState.FILL), (int) gs.getLineWidth());
g2.setStroke(currentStroke);
}
}
/*save shape in array to draw*/
@Override
public final void drawShape(final PdfShape pdfShape, final GraphicsState gs, final int cmd) {
final Shape currentShape = pdfShape.getShape();
if ((cmd == Cmd.F || cmd == Cmd.B) && gs.CTM[0][1] == 0 && gs.CTM[1][0] == 0) {
final int x = currentShape.getBounds().x;
final int y = currentShape.getBounds().y;
final int w = currentShape.getBounds().width;
final int h = currentShape.getBounds().height;
final int[] rectParams = {x, y, w, h};
areas.addElement(rectParams);
} else {
areas.addElement(null);
}
blendMode = gs.getBMValue();
renderShape(null, gs.getFillType(), gs.getStrokeColor(), gs.getNonstrokeColor(), gs.getStroke(),
currentShape, gs.getAlpha(GraphicsState.STROKE), gs.getAlpha(GraphicsState.FILL));
}
@Override
public void drawShape(final Object currentShape, final GraphicsState currentGraphicsState) {
// Stub method to supress BaseDisplay message
}
}