/*
* ICOImage.java
*
* Created on February 19, 2007, 8:11 AM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package com.inet.gradle.setup.image.image4j.codec.ico;
import com.inet.gradle.setup.image.image4j.codec.bmp.InfoHeader;
/**
* Contains a decoded ICO image, as well as information about the source encoded ICO image.
* @since 0.7
* @author Ian McDonagh
*/
public class ICOImage extends com.inet.gradle.setup.image.image4j.codec.bmp.BMPImage {
protected IconEntry iconEntry;
protected boolean pngCompressed = false;
protected int iconIndex = -1;
/**
* Creates a new instance of ICOImage
* @param image the BufferedImage decoded from the source ICO image
* @param infoHeader the BMP InfoHeader structure for the BMP encoded ICO image
* @param iconEntry the IconEntry structure describing the ICO image
*/
public ICOImage(java.awt.image.BufferedImage image, com.inet.gradle.setup.image.image4j.codec.bmp.InfoHeader infoHeader,
IconEntry iconEntry) {
super(image, infoHeader);
this.iconEntry = iconEntry;
}
/**
* The IconEntry associated with this <tt>ICOImage</tt>, which provides information
* about the image format and encoding.
* @return the IconEntry structure
*/
public IconEntry getIconEntry() {
return iconEntry;
}
/**
* Sets the IconEntry associated with this <tt>ICOImage</tt>.
* @param iconEntry the new IconEntry structure to set
*/
public void setIconEntry(IconEntry iconEntry) {
this.iconEntry = iconEntry;
}
/**
* Specifies whether the encoded image is PNG compressed.
* @return <tt>true</tt> if the encoded image is PNG compressed, <tt>false</tt> if it is plain BMP encoded
*/
public boolean isPngCompressed() {
return pngCompressed;
}
/**
* Sets whether the encoded image is PNG compressed.
* @param pngCompressed <tt>true</tt> if the encoded image is PNG compressed, <tt>false</tt> if it is plain BMP encoded
*/
public void setPngCompressed(boolean pngCompressed) {
this.pngCompressed = pngCompressed;
}
/**
* The InfoHeader structure representing the encoded ICO image.
* @return the InfoHeader structure, or <tt>null</tt> if there is no InfoHeader structure, which is possible for PNG compressed icons.
*/
public InfoHeader getInfoHeader() {
return super.getInfoHeader();
}
/**
* The zero-based index for this <tt>ICOImage</tt> in the source ICO file or resource.
* @return the index in the source, or <tt>-1</tt> if it is unknown.
*/
public int getIconIndex() {
return iconIndex;
}
/**
* Sets the icon index, which is zero-based.
* @param iconIndex the zero-based icon index, or <tt>-1</tt> if unknown.
*/
public void setIconIndex(int iconIndex) {
this.iconIndex = iconIndex;
}
/**
* The width of the ICO image in pixels.
* @return the width of the ICO image, or <tt>-1</tt> if unknown
* @since 0.7alpha2
*/
public int getWidth() {
return iconEntry == null ? -1 : (iconEntry.bWidth == 0 ? 256 : iconEntry.bWidth);
}
/**
* The height of the ICO image in pixels.
* @return the height of the ICO image, or <tt>-1</tt> if unknown.
* @since 0.7alpha2
*/
public int getHeight() {
return iconEntry == null ? -1 : (iconEntry.bHeight == 0 ? 256 : iconEntry.bHeight);
}
/**
* The colour depth of the ICO image (bits per pixel).
* @return the colour depth, or <tt>-1</tt> if unknown.
* @since 0.7alpha2
*/
public int getColourDepth() {
return iconEntry == null ? -1 : iconEntry.sBitCount;
}
/**
* The number of possible colours for the ICO image.
* @return the number of colours, or <tt>-1</tt> if unknown.
* @since 0.7alpha2
*/
public int getColourCount() {
int bpp = iconEntry.sBitCount == 32 ? 24 : iconEntry.sBitCount;
return bpp == -1 ? -1 : (int) (1 << bpp);
}
/**
* Specifies whether this ICO image is indexed, that is, the encoded bitmap uses a colour table.
* If <tt>getColourDepth()</tt> returns <tt>-1</tt>, the return value has no meaning.
* @return <tt>true</tt> if indexed, <tt>false</tt> if not.
* @since 0.7alpha2
*/
public boolean isIndexed() {
return iconEntry == null ? false : iconEntry.sBitCount <= 8;
}
}