/*
* @(#)MultiShow.java 1.1 2006-12-25
*
* Copyright (c) 1999 Werner Randelshofer, Goldau, Switzerland.
* All rights reserved.
*
* You may not use, copy or modify this file, except in compliance with the
* license agreement you entered into with Werner Randelshofer.
* For details see accompanying license terms.
*/
package org.monte.media.ilbm;
import java.awt.image.DirectColorModel;
/**
* ColorModel for HAM compressed images.
*
* @author Werner Randelshofer, Hausmatt 10, CH-6405 Goldau, Switzerland
* @version 1.1 2006-12-25 New constructor added.
* <br>1.0 1999-10-19
*/
public class HAMColorModel extends DirectColorModel {
//insert class definition here
public final static int
HAM6 = 6,
HAM8 = 8;
protected int HAMType;
protected int map_size;
protected boolean opaque;
protected int[] rgb;
/**
* Creates a new HAM Color model using the specified base colors.
*
* @param aHAMType Type, must be HAM6 or HAM 8.
* @param size The size of the color palette.
* @param r The red colors as 8 bit or as 4 bit values.
* @param g The green colors as 8 bit or as 4 bit values.
* @param b The blue colors as 8 bit or as 4 bit values.
* @param isOCS Set this to true if the colors are 4 bit values.
*/
public HAMColorModel(int aHAMType,int size,byte r[],byte g[],byte b[], boolean isOCS) {
super(24,0x00ff0000,0x0000ff00,0x000000ff);
if (aHAMType != HAM6 && aHAMType != HAM8) {
throw new IllegalArgumentException("Unknown HAM Type: " + aHAMType);
}
HAMType = aHAMType;
if (isOCS) {
byte[] r8 = new byte[size];
byte[] g8 = new byte[size];
byte[] b8 = new byte[size];
for (int i=0; i < size; i++) {
r8[i] = (byte) (((r[i] & 0xf) << 4) | (r[i] & 0xf));
g8[i] = (byte) (((g[i] & 0xf) << 4) | (g[i] & 0xf));
b8[i] = (byte) (((b[i] & 0xf) << 4) | (b[i] & 0xf));
}
setRGBs(size,r8,g8,b8,null);
} else {
setRGBs(size,r,g,b,null);
}
}
/**
* Creates a new HAM Color model using the specified base colors.
*
* @param aHAMType Type, must be HAM6 or HAM 8.
* @param size The size of the color palette.
* @param rgb The rgb colors.
* @param isOCS Set this to true if the colors are 12 bit precision only.
*/
public HAMColorModel(int aHAMType,int size,int rgb[], boolean isOCS) {
super(24,0x00ff0000,0x0000ff00,0x000000ff);
if (aHAMType != HAM6 && aHAMType != HAM8) {
throw new IllegalArgumentException("Unknown HAM Type: " + aHAMType);
}
HAMType = aHAMType;
if (isOCS) {
byte[] r = new byte[rgb.length];
byte[] g = new byte[rgb.length];
byte[] b = new byte[rgb.length];
for (int i=0; i < rgb.length; i++) {
r[i] = (byte) (((rgb[i] & 0xf00) >>> 8) |
(rgb[i] & 0xf00) >>> 4);
g[i] = (byte) (((rgb[i] & 0xf0) >>> 4) |
(rgb[i] & 0xf0));
b[i] = (byte) (((rgb[i] & 0xf) ) |
(rgb[i] & 0xf) << 4);
}
setRGBs(size,r,g,b,null);
} else {
byte[] r = new byte[size];
byte[] g = new byte[size];
byte[] b = new byte[size];
for (int i=0; i < size; i++) {
r[i] = (byte) ((rgb[i] & 0xff0000) >>> 16);
g[i] = (byte) ((rgb[i] & 0xff00) >>> 8);
b[i] = (byte) (rgb[i] & 0xff);
}
setRGBs(size,r,g,b,null);
}
}
/**
* Returns the HAM Type of this HAMColorModel: HAM8 or HAM6.
*/
public int getHAMType() {
return HAMType;
}
/**
* Returns the number of planes required to represent
* this HAMColorModel in a Bitmap.
*/
public int getDepth() {
return HAMType;
}
/**
* Sets the HAM base colors.
* @param size The size of the color palette.
* @param r The red colors as 8 bit values.
* @param g The green colors as 8 bit values.
* @param b The blue colors as 8 bit values.
* @param a The alpha channels as 8 bit values.
*/
protected void setRGBs(int size, byte r[], byte g[], byte b[], byte a[]) {
if (size > 256) {
throw new ArrayIndexOutOfBoundsException();
}
map_size = size;
rgb = new int[256];
int alpha = 0xff;
opaque = true;
for (int i = 0; i < size; i++) {
if (a != null) {
alpha = (a[i] & 0xff);
if (alpha != 0xff) {
opaque = false;
}
}
rgb[i] = (alpha << 24)
| ((r[i] & 0xff) << 16)
| ((g[i] & 0xff) << 8)
| (b[i] & 0xff);
}
}
/**
* Copies the array of red color components into the given array. Only
* the initial entries of the array as specified by getMapSize() are
* written.
*/
final public void getReds(byte r[]) {
for (int i = 0; i < map_size; i++) {
r[i] = (byte) (rgb[i] >> 16);
}
}
/**
* Copies the array of green color components into the given array. Only
* the initial entries of the array as specified by getMapSize() are
* written.
*/
final public void getGreens(byte g[]) {
for (int i = 0; i < map_size; i++) {
g[i] = (byte) (rgb[i] >> 8);
}
}
/**
* Copies the array of blue color components into the given array. Only
* the initial entries of the array as specified by getMapSize() will
* be written.
*/
final public void getBlues(byte b[]) {
for (int i = 0; i < map_size; i++) {
b[i] = (byte) rgb[i];
}
}
/**
* Copies the array of color components into the given array. Only
* the initial entries of the array as specified by getMapSize() will
* be written.
*/
final public void getRGBs(int rgbs[]) {
for (int i = 0; i < map_size; i++) {
rgbs[i] = rgb[i];
}
}
/**
* Returns the size of the color component arrays in this IndexColorModel.
*/
final public int getMapSize() {
return map_size;
}
}