/*
* JavaXYQ Engine
*
* javaxyq@2008 all rights.
* http://www.javaxyq.com
*/
package com.javaxyq.util;
/**
* Ⱦɫ����
*
* @author ����ΰ
* @history 2008-7-12 ����ΰ �½�
*/
public class ColorationScheme {
private short[][] colors = new short[3][3];
public ColorationScheme(String[] schemes) {
for (int r = 0; r < schemes.length; r++) {
String[] colorArray = schemes[r].split(" ");
for (int c = 0; c < colorArray.length; c++) {
colors[r][c] = Short.parseShort(colorArray[c]);
}
}
}
/*
�������ڱ任��ɫ��IJ���������
C11 C12 C13
C21 C22 C23
C31 C32 C33
��ɫ��Ϲ�ʽ
R2=R*C11+G*C12+B*C13
G2=R*C21+G*C22+B*C23
B2=R*C31+G*C32+B*C33
R2=R2>>8
G2=G2>>8
B2=B2>>8
*/
public byte[] mix(byte r,byte g,byte b) {
int r2 = ((r * colors[0][0] + g * colors[0][1] + b * colors[0][2]) >>> 8) ;
int g2 = ((r * colors[1][0] + g * colors[1][1] + b * colors[1][2]) >>> 8);
int b2 = ((r * colors[2][0] + g * colors[2][1] + b * colors[2][2]) >>> 8) ;
r2 = Math.min(r2, 0x1f);
g2 = Math.min(g2, 0x3f);
b2 = Math.min(b2, 0x1f);
byte[] comps = new byte[3];
comps[0] = (byte) r2;
comps[1] = (byte) g2;
comps[2] = (byte) b2;
return comps;
}
public short mix(short color) {
byte[] rgbs = new byte[3];
//red
byte r = (byte) (((color >>> 11) & 0x1F));
//green
byte g = (byte) (((color >>> 5) & 0x3f));
//blue
byte b = (byte) ((color & 0x1F));
//mix
rgbs = this.mix(r,g,b);
color = (short) ((rgbs[0] << 11) | (rgbs[1] << 5) | rgbs[2]);
return color;
}
}