package com.inet.gradle.setup.image.image4j.codec.ico;
import java.io.IOException;
import com.inet.gradle.setup.image.image4j.io.LittleEndianInputStream;
/**
* Represents an <tt>IconEntry</tt> structure, which contains information about an ICO image.
* @author Ian McDonagh
*/
public class IconEntry {
/**
* The width of the icon image in pixels.
* <tt>0</tt> specifies a width of 256 pixels.
*/
public int bWidth;
/**
* The height of the icon image in pixels.
* <tt>0</tt> specifies a height of 256 pixels.
*/
public int bHeight;
/**
* The number of colours, calculated from {@link #sBitCount sBitCount}.
* <tt>0</tt> specifies a colour count of >= 256.
*/
public int bColorCount;
/**
* Unused. Should always be <tt>0</tt>.
*/
public byte bReserved;
/**
* Number of planes, which should always be <tt>1</tt>.
*/
public short sPlanes;
/**
* Colour depth in bits per pixel.
*/
public short sBitCount;
/**
* Size of ICO data, which should be the size of (InfoHeader + AND bitmap + XOR bitmap).
*/
public int iSizeInBytes;
/**
* Position in file where the InfoHeader starts.
*/
public int iFileOffset;
/**
* Creates an <tt>IconEntry</tt> structure from the source input
* @param in the source input
* @throws java.io.IOException if an error occurs
*/
public IconEntry(LittleEndianInputStream in) throws IOException {
//Width 1 byte Cursor Width (16, 32, 64, 0 = 256)
bWidth = in.readUnsignedByte();
//Height 1 byte Cursor Height (16, 32, 64, 0 = 256 , most commonly = Width)
bHeight = in.readUnsignedByte();
//ColorCount 1 byte Number of Colors (2,16, 0=256)
bColorCount = in.readUnsignedByte();
//Reserved 1 byte =0
bReserved = in.readByte();
//Planes 2 byte =1
sPlanes = in.readShortLE();
//BitCount 2 byte bits per pixel (1, 4, 8)
sBitCount = in.readShortLE();
//SizeInBytes 4 byte Size of (InfoHeader + ANDbitmap + XORbitmap)
iSizeInBytes = in.readIntLE();
//FileOffset 4 byte FilePos, where InfoHeader starts
iFileOffset = in.readIntLE();
}
/**
* Creates and <tt>IconEntry</tt> structure with default values.
*/
public IconEntry() {
bWidth = 0;
bHeight = 0;
bColorCount = 0;
sPlanes = 1;
bReserved = 0;
sBitCount = 0;
iSizeInBytes = 0;
iFileOffset = 0;
}
/**
* A string representation of this <tt>IconEntry</tt> structure.
*/
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("width=");
sb.append(bWidth);
sb.append(",height=");
sb.append(bHeight);
sb.append(",bitCount=");
sb.append(sBitCount);
sb.append(",colorCount="+bColorCount);
return sb.toString();
}
/**
* Writes the <tt>IconEntry</tt> structure to output
* @param out the output
* @throws java.io.IOException if an error occurs
*/
public void write(com.inet.gradle.setup.image.image4j.io.LittleEndianOutputStream out) throws IOException {
//Width 1 byte Cursor Width (16, 32 or 64)
out.writeByte(bWidth);
//Height 1 byte Cursor Height (16, 32 or 64 , most commonly = Width)
out.writeByte(bHeight);
//ColorCount 1 byte Number of Colors (2,16, 0=256)
out.writeByte(bColorCount);
//Reserved 1 byte =0
out.writeByte(bReserved);
//Planes 2 byte =1
out.writeShortLE(sPlanes);
//BitCount 2 byte bits per pixel (1, 4, 8)
out.writeShortLE(sBitCount);
//SizeInBytes 4 byte Size of (InfoHeader + ANDbitmap + XORbitmap)
out.writeIntLE(iSizeInBytes);
//FileOffset 4 byte FilePos, where InfoHeader starts
out.writeIntLE(iFileOffset);
}
}