Hi,
I'm having trouble with LookupOp on Java 1.3 and hope someone will be
able to help. I'm trying to fill an image of TYPE_INT_ARGB with a
given color while leaving the alpha channel intact and this should be
easy to do with LookupOp. If I create a ByteLookupOp like this:
byte[] rt = new byte[256];
byte[] gt = new byte[256];
byte[] bt = new byte[256];
for (int i = 0; i < 255; i++) {
rt[i] = r;
gt[i] = g;
bt[i] = b;
}
byte[][] table = { rt, gt, bt };
LookupTable lookup = new ByteLookupTable(0, table);
op = new LookupOp(lookup, null);
image = op.filter(image, null);
The Java VM crashes when I call op.filter(). This happens on both
Solaris and Windows. If I replace the ByteLookupOp with a
ShortLookupOp I get an exception saying that the destination image
has only two bands whereas the source has 4 bands. I got this code
from the "Java 2D Graphics book" by the way.
I decided to go my own way and write a class:
class ColorLookupTable extends LookupTable {
private byte r, g, b;
public ColorLookupTable(Color color) {
super(0, 4);
r = (byte)color.getRed();
g = (byte)color.getGreen();
b = (byte)color.getBlue();
}
public int[] lookupPixel(int[] src, int[] dst){
if (dst == null)
dst = new int[src.length];
dst[0] = r;
dst[1] = g;
dst[2] = b;
dst[3] = src[3];
return dst;
}
}
This works fine, but I have three questions: Why do I have to make my
array have the order RGBA (by experiment) when my image is
TYPE_INT_ARGB? Is using my own class slower as it seems that
ByteLookupTable is treated as a special case and performed in native
code (hence the VM crash)? Am I going about things in completely the
wrong way?
Thanks
Jerry
Jerry Huxtable
http://www.jhlabs.com
===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA2D-INTEREST". For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".