Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* ===========================================
* 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@
*
* ---------------
* AxialContext.java
* ---------------
*/
package com.idrsolutions.pdf.color.shading;
import java.awt.Color;
import java.awt.PaintContext;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
import org.jpedal.color.GenericColorSpace;
import org.jpedal.function.PDFFunction;
public class AxialContext implements PaintContext {
private float maxPDFX = -9999, maxPDFY = -9999, minPDFX = 9999, minPDFY = 9999;
final GenericColorSpace shadingColorSpace;
private float scaling = 1f;
private final boolean[] isExtended;
private final float x0, x1, y0, y1, t0;
private float t1 = 1.0f;
private final PDFFunction[] function;
private final boolean isPrinting;
//private static Object[][] cachedXY=new Object[1000][1000];
private final int pageHeight;
private final boolean colorsReversed;
private final int minX;
private final float[] background;
private final float offX, offY;
int pageRotation;
//private float printScale=4;
//private static float lastScaling=-1;
//private float[][] matrix=null;
//@printIssue - this is where we pass values through
AxialContext(final AffineTransform xform, final boolean isPrinting, final int offX, final int offY, final int minX, final int pHeight, final float scaling, final boolean[] isExtended, final float[] domain,
final float[] coords, final GenericColorSpace shadingColorSpace, final boolean colorsReversed, final float[] background, final PDFFunction[] function) {
final double[] aff = new double[6];
xform.getMatrix(aff);
if (aff[0] == 0 && aff[1] > 0 && aff[2] > 0 && aff[3] == 0) {
pageRotation = 90;
}
//currently bit o hack but fits 18992
//isInverted=aff[4]<0 && aff[5]<0 && renderingType==DynamicVectorRenderer.CREATE_SH;
//this.isInverted= aff[0]>0 && aff[1]==0 && aff[2]==0 && aff[3]>0 && renderingType==DynamicVectorRenderer.CREATE_SH;
this.isPrinting = isPrinting;
this.offX = offX;
this.offY = offY;
this.colorsReversed = colorsReversed;
this.pageHeight = pHeight;
this.isExtended = isExtended;
this.t0 = domain[0];
this.t1 = domain[1];
this.background = background;
x0 = coords[0];
x1 = coords[2];
y0 = coords[1];
y1 = coords[3];
this.shadingColorSpace = shadingColorSpace;
this.function = function;
this.scaling = scaling;
this.minX = minX;
}
@Override
public void dispose() {
}
@Override
public ColorModel getColorModel() {
return ColorModel.getRGBdefault();
}
@Override
public Raster getRaster(int xstart, int ystart, final int w, final int h) {
//swap over if rotated
if (pageRotation == 90) {
final int tmp = xstart;
xstart = ystart;
ystart = tmp;
}
//just average if tiny and not visible (note we cannot use this in HTML so first test to avoid)
final boolean isTooSmall = (w / scaling <= 1f || h / scaling <= 1f); //
////@mark
//create buffer to hold all this data
final int rastSize = (w * h * 4);
final int[] data = new int[rastSize];
//System.out.println("Area="+xstart+" ystart="+ystart+" w="+w+" h="+h+" "+data.length);
float xx;
float t;
float lastT = -1f;
final float dx = x1 - x0;
final float dy = y1 - y0;
//workout outside loop as constant
final float divisor = ((dx * dx) + (dy * dy));
//workout color range
final Color col0;
if (colorsReversed) {
col0 = calculateColor(t1);
} else {
col0 = calculateColor(t0);
}
//set current calues to default
int cr = col0.getRed(), cg = col0.getGreen(), cb = col0.getBlue();
if (background != null) {
shadingColorSpace.setColor(background, 4);
final Color c = (Color) shadingColorSpace.getColor();
//y co-ordinates
for (int y = 0; y < h; y++) {
//x co-ordinates
for (int x = 0; x < w; x++) {
//set color for the pixel with values
final int base = (y * w + x) * 4;
data[base] = c.getRed();
data[base + 1] = c.getGreen();
data[base + 2] = c.getBlue();
data[base + 3] = 255;
}
}
}
float pdfX;
float pdfY;
//y co-ordinates
for (int y = 0; y < h; y++) {
//x co-ordinates
for (int x = 0; x < w; x++) {
//cache what is quite a slow operation
final float[] xy;
if (pageRotation != 90) {
xy = PixelFactory.convertPhysicalToPDF(isPrinting, x, y, offX, offY, scaling, xstart, ystart, minX, pageHeight);
} else {
// Fix for debug2/StampsProblems and 13jun/A380PDP-pg1
xy = PixelFactory.convertPhysicalToPDF(isPrinting, y, x, offX, offY, scaling, xstart, ystart, minX, pageHeight);
}
pdfX = xy[0];
pdfY = xy[1];
if (isTooSmall) {
xx = 0.5f;
} else {
xx = ((dx * (pdfX - x0)) + (dy * ((pdfY) - y0))) / divisor;
}
//invert for print as wrong way round
final float yDiff = y0 - y1;
if (isPrinting && yDiff < 0) {
xx = 1 - xx;
}
if (pdfX > maxPDFX) {
maxPDFX = pdfX;
}
if (pdfX < minPDFX) {
minPDFX = pdfX;
}
if (pdfY > maxPDFY) {
maxPDFY = pdfY;
}
if (pdfY < minPDFY) {
minPDFY = pdfY;
}
if (xx < 0 && isExtended[0]) {
t = t0;
} else if (xx > 1 && isExtended[1]) {
t = t1;
} else {
t = t0 + ((t1 - t0) * xx);
}
if (isTooSmall) {
t = 0.5f;
}
if (t >= t0 && t <= t1) {
if (colorsReversed) {
t = 1 - t;
}
if (t != lastT) { //cache unchanging values
lastT = t;
final Color c = calculateColor(t);
cr = c.getRed();
cg = c.getGreen();
cb = c.getBlue();
}
//set color for the pixel with values
final int base = (y * w + x) * 4;
data[base] = cr;
data[base + 1] = cg;
data[base + 2] = cb;
data[base + 3] = 255; //(int)(col.getAlpha());
}
}
}
//set values
//we have to get the raster this way for java me to use the raster as me does not have createCompatableWritableRaster
final WritableRaster raster = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB).getRaster();
raster.setPixels(0, 0, w, h, data);
return raster;
}
/**
* workout rgb color
*/
private Color calculateColor(final float val) {
final Color col;
final float[] colValues = ShadingFactory.applyFunctions(function, new float[]{val});
shadingColorSpace.setColor(colValues, colValues.length);
col = (Color) shadingColorSpace.getColor();
return col;
}
}