//--file: CIUPrimitive.java------------------------------------------ // package starwave.app.poll.imageutils; /** * * An IU primitive, capable of providing enough information to * be drawn, as well as the operations "translate", "rotate" and * "scale". * * "Translate" is implemented in this class while "rotate" and "scale" * must be provided by extended classes. * * Implementation is such that the usage can be: * * * CIUPrimitive p = new CIURectangle( 20, 10).translate(2, 15).scale( 2.0 ); * * * which will construct a 20x10 rectangle, translate this rectangle * to coordinates 2,15, and then scale it by a factor of 2. * * The primitive is constructed such that it's "handle" (for translating) * is the upper left hand corner of the primitive's bounding box, and this * is originally located at the coordinate (0,0) of the graphics context. * For example, the following calls: * * * CIUGraphicsContext gc = new CIUGraphicsContext( 12, 9 ); * CIUPrimitive p = new CIURectangle(6, 3).translate(1, 2); * gc.draw( p ); * * * will result in a rectangle positioned here ('0'=bg color, 'X'=rectangle color): * * * 000000000000 * 000000000000 * 0XXXXXX00000 * 0XXXXXX00000 * 0XXXXXX00000 * 000000000000 * * */ public abstract class CIUPrimitive { /** The width of the graphic */ protected int m_w; /** The height of the graphic */ protected int m_h; /** The x translation */ protected int m_xOffset; /** The y translation */ protected int m_yOffset; /** The primitive's rotation in degrees */ protected double m_rotation; /** Textured or solid color? */ protected boolean m_textured; /** ************************************************************* * * Construct a IUPrimitive * * @param w The width of the primitive * @param h The height of the primitive * */ public CIUPrimitive( int w, int h ) { this.m_w = w; this.m_h = h; this.m_xOffset = 0; this.m_yOffset = 0; this.m_rotation = 0.0; this.m_textured = false; } /** ************************************************************* * * Accessors required for drawing * */ public int height() { return m_h; } public int width() { return m_w; } public int transX() { return m_xOffset; } public int transY() { return m_yOffset; } public boolean textured() { return m_textured; } /** ************************************************************ * * Takes any angle in (in degrees) and returns a positive * angle in the range [0..360]. * * @param degree The angle in degrees * @returns double The angle in range [0..360] * */ protected double getAngle( double degree ) { degree = ( degree % 360.0 ); return ( (degree>=0)?(degree):(360.0+degree) ); } /** ************************************************************* * * Is a particular pixel on? Given a valid X/Y coordinate, * return an indicator indicating whether the pixel is on. * * @param x The x-coordinate of interest * @param x The y-coordinate of interest * @returns boolean indicating pixel on/off status * * @throws Exception If invalid pixel request is made. * @exception Exception If invalid pixel request is made. * */ public abstract boolean pixelOn( int x, int y ) throws Exception; /** ************************************************************* * * Color accessor - given an X/Y pair, return a IUColor. * This works well for solid primitives, but will involve * many LUT lookups for textured primitives. The IUColor * returned for each coordinate needs to be looked up in the * color cube to get a valid index. * * @param x The x-coordinate of interest * @param x The y-coordinate of interest * @returns byte The index into the LUT for the color * * @throws Exception If invalid pixel request is made. * @exception Exception If invalid pixel request is made. * */ public abstract byte color( int x, int y ) throws Exception; /** ************************************************************* * * Translate the child relative to where it was before. * Return a CIUPrimitive. * * @param x The x-coordinate of interest * @param x The y-coordinate of interest * @returns CIUPrimitive this * */ public CIUPrimitive translate( int x, int y ) { m_xOffset += x; m_yOffset += y; return this; } /** ************************************************************* * * Zero out the translation of the primitive * * @returns CIUPrimitive this * */ public CIUPrimitive zero() { m_xOffset = 0; m_yOffset = 0; return this; } /** ************************************************************* * * Rotate - return a CIUPrimitive * * @param angle The angle to rotate through (in degrees) * @returns CIUPrimitive this * */ public abstract CIUPrimitive rotate( double angle ); /** ************************************************************* * * Scale - return a CIUPrimitive * * @param scalar The scalar * @returns CIUPrimitive this * */ public abstract CIUPrimitive scale( double scalar ); /** ************************************************************* * * toString: Convert the primitive to some sort of appropriate * string representation. * * @returns String The string representation of the primitive * */ public abstract String toString(); /** ************************************************************* * * Free up any system resources associated with this primitive * */ public abstract void dispose(); }