package org.jacorb.demo.notification.whiteboard;
import java.awt.Color;
import java.awt.image.MemoryImageSource;
import java.awt.image.ImageProducer;
/**
* PixelImage.java
* A pixel-based image.
*
*
* @author Nicolas Noffke, Torsten Fink
*/
public class PixelImage {
private static final int ALPHA = 255 << 24;
protected int[] m_pixels;
private int width;
private int height;
/**
The constructor. Set up buffer.
@param height the images height.
@param width the images width.
*/
public PixelImage(int width, int height) {
m_pixels = new int[width * height];
this.width=width;
this.height=height;
clearAll();
}
/**
* sets a pixel to a specific color.
*
* @param x the pixels x value.
* @param y the pixels y value.
* @param red the pixels red value.
* @param green the pixels green value.
* @param blue the pixels blue value.
*/
public void setPixel(int x, int y, int red, int green, int blue) {
//ALPHA is needed, otherwise, if left 0, the pixel gets transparent.
m_pixels[width * y + x] = ALPHA | (red << 16) | (green << 8) | blue;
}
/**
* sets a pixel to a specific color.
*
* @param x the pixels x value.
* @param y the pixels y value.
* @param color the pixels color.
*/
public void setPixel(int x, int y, Color color) {
m_pixels[width * y + x] = color.getRGB();
}
/**
* gets the ImageProducer for this image.
*
* @return the ImageProducer for this image.
*/
public ImageProducer getProducer() {
return new MemoryImageSource(width, height, m_pixels, 0, width);
}
/**
* gets the pixel buffer of this image.
*
* @return the pixel buffer.
*/
public int[] getPixelBuffer() {
return m_pixels;
}
public void setPixelBuffer(int[] data) {
m_pixels = data;
}
/**
draws a line in the image. The incremental line scan-conversion
algorithm is used (see "Computer Graphics"; Foley, vanDam,Feiner,Hughes).
(x0,y0) is the starting point, (x1,y1) the ending point.
*/
public void drawLine(int x0,int y0, int x1, int y1,
int red,int green, int blue) {
//System.out.println("Draw: ("+x0+","+y0+") ("+x1+","+y1+")");
// do some clipping
if ((x0<0)||(x1<0)||(y1<0)||(y0<0)||
(x0>=width)||(x1>=width)||(y0>=height)||(y1>=height)) {
return;
}
// parameters are ok
if ( (x0==x1) && (y0==y1) ) {
setPixel(x0,y0,red,green,blue);
} else {
float grad = // cast is necessary
((float) (y1-y0))/
((float) (x1-x0));
if ((grad >= -1.0)&&(grad <= 1.0)) { // loop over x
if (x0>x1) { // change points
int change = x1;
x1 = x0;
x0 = change;
change = y1;
y1 = y0 ;
y0=change;
}
for(float y= (float)y0;
x0<=x1;
x0++) {
setPixel(x0,(int) (y+0.5),
red,green,blue);
y+= grad;
}
} else { // loop over y
grad = ((float) 1.0)/grad;
if (y0>y1) { // change points
int change = x1;
x1 = x0;
x0 = change;
change = y1;
y1 = y0 ;
y0=change;
}
for(float x= (float)x0;
y0<=y1;
y0++,x+=grad) {
setPixel((int) (x+0.5),y0,
red,green,blue);
}
}
}
}
public void clearAll() {
for(int x=0;x<width;x++)
for(int y=0;y<height;y++)
setPixel(x,y,0,0,0);
}
} // PixelImage