/*
* Created on 2004-09-23
*
*/
package org.getopt.pcl5.PCL5Interpreter;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
/**
* Support for printer-specific graphics
*/
public class PrinterImage extends BufferedImage {
WritableRaster raster;
Graphics2D graphics;
int x;
final int width;
final int height;
static final int[] SET_PIXEL = { 127, 127, 127, 0 };
static final int[] EMPTY_PIXEL = { 200, 200, 200, 255 };
Color _printColor = Color.BLACK; // new Color(0, 0, 0, 255);
public static final Color EMPTY_COLOR = new Color(255, 255, 255, 0);
/**
* Creates BufferedImage
*
* @param w
* width
* @param h
* height
*/
public PrinterImage(int w, int h) {
super(w, h, BufferedImage.TYPE_INT_ARGB);
// Raster r = getData();
// raster = r.createCompatibleWritableRaster();
height = h;
width = w;
graphics = createGraphics();
graphics.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION,
RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
// Clear image with transparent alpha by drawing a rectangle
graphics.setComposite(AlphaComposite
.getInstance(AlphaComposite.CLEAR, 0.0f));
Rectangle2D.Double rect = new Rectangle2D.Double(0, 0, w, h);
graphics.fill(rect);
graphics.setComposite(AlphaComposite.SrcOver);
graphics.setColor(_printColor);
}
/**
* Set pixel at location
*
* @param bit
* bit to test
* @param offY
* coordination offset
* @param offset
* bit offset
*/
private void px(int bit, int offY, int offset) {
if (bit != 0)
graphics.fillRect(x, offset + offY, 1, 1);
}
/**
* Set pixel at location
*
* @param bit
* bit to test
* @param offY
* coordination offset
* @param offset
* bit offset
*/
private void pxH(int bit, int offY, int offset) {
if (bit != 0)
graphics.fillRect(x + offset, offY, 1, 1);
}
/**
* Interpret 8 bit data as print data
*
* @param data
* data to interpret
* @param offset
* coordintion offset
*/
private void print8bit(byte data, int offset) {
px(data & 0x01, 7, offset);
px(data & 0x02, 6, offset);
px(data & 0x04, 5, offset);
px(data & 0x08, 4, offset);
px(data & 0x10, 3, offset);
px(data & 0x20, 2, offset);
px(data & 0x40, 1, offset);
px(data & 0x80, 0, offset);
}
private void print9bit(byte data) {
if ((data & 0x01) == 0x01)
graphics.fillRect(x, 8, 1, 1);
}
private void print(byte data, int repeat, int offset) {
for (int i = 0; i < repeat; i++) {
print8bit(data, offset);
x++;
}
}
/**
* Print array of 8bit graphics data
*
* @param data
* data to print
*/
public void print8bit(byte[] data) {
for (int i = 0; i < data.length; i++) {
print8bit(data[i], 0);
x++;
}
}
/**
* Print array of 9bit graphics data
*
* @param data
* data to print
*/
public void print9bit(byte[] data) {
for (int i = 0; i < data.length; i += 2) {
print8bit(data[i], 0);
print9bit(data[i + 1]);
x++;
}
}
/**
* Print array of 24bit graphics data (3 rows)
*
* @param data
* data to print
*/
public void print24bit(byte[] data) {
for (int i = 0; i < data.length; i += 3) {
print8bit(data[i], 0);
print8bit(data[i + 1], 8);
print8bit(data[i + 2], 16);
x++;
}
}
/**
* Print array of 48bit graphics data (6 rows)
*
* @param data
* data to print
*/
public void print48bit(byte[] data) {
for (int i = 0; i < data.length; i += 6) {
print8bit(data[i], 0);
print8bit(data[i + 1], 8);
print8bit(data[i + 2], 16);
print8bit(data[i + 3], 24);
print8bit(data[i + 4], 32);
print8bit(data[i + 5], 40);
x++;
}
}
int y;
int rows;
/**
* Interpret 8 bit data as print data
*
* @param data
* data to interpret
* @param offset
* coordintion offset
*/
private void print8bitH(byte data, int offset) {
pxH(data & 0x01, offset, 7);
pxH(data & 0x02, offset, 6);
pxH(data & 0x04, offset, 5);
pxH(data & 0x08, offset, 4);
pxH(data & 0x10, offset, 3);
pxH(data & 0x20, offset, 2);
pxH(data & 0x40, offset, 1);
pxH(data & 0x80, offset, 0);
}
boolean printRLE(byte data) {
print8bitH(data, y);
x += 8;
if (x >= width) {
x = 0;
y++;
}
return y < rows;
}
public void startRLE(int rows) {
y = 0;
x = 0;
this.rows = rows;
}
/**
* Print array of RLE encoded graphics data
*
* @param data
* data to print
* @param rows
* number of 8 bit rows to print
*/
public boolean printRLE(byte[] data) {
int i;
int n;
if (data[0] > 0) {
n = data[0] + 1;
for (i = 0; i < n; i++)
printRLE(data[i + 1]);
} else {
n = 1 - data[0]; // 257-data[pos] but data[pos] is < 0
for (i = 0; i < n; i++)
printRLE(data[1]);
}
return y < rows;
}
/**
* Print array of TIFF encoded graphics data
*
* @param data
* data to print
*/
public void printTIFF(byte[] data) {
}
/**
* @return Returns the height.
*/
public int getHeight() {
return height;
}
/**
* @return Returns the width.
*/
public int getWidth() {
return width;
}
/**
* @return Returns the printColor.
*/
public Color getPrintColor() {
return _printColor;
}
/**
* @param printColor
* The printColor to set.
*/
public void setPrintColor(Color printColor) {
_printColor = printColor;
}
}