blob: 0903a79613ab883e5317ee4490d0279937944918 [file] [log] [blame] [raw]
package li.cil.oc.api.component;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import li.cil.oc.api.Persistable;
import li.cil.oc.api.network.ManagedEnvironment;
import net.minecraft.entity.player.EntityPlayer;
/**
* This interface implements functionality for displaying and manipulating
* text, like screens and robots. An implementation can be obtained via the
* screens' item driver.
* <p/>
* This allows re-using the built-in screen logic in third-party code without
* access to the internals of OC.
* <p/>
* To get an instance of the buffer component, use its item driver, e.g.:
* <pre>
* final ItemStack stack = li.cil.oc.api.Items.get("screen1").createItemStack(1);
* final TextBuffer buffer = (TextBuffer) li.cil.oc.api.Driver.driverFor(stack).createEnvironment(stack, this);
* </pre>
*/
public interface TextBuffer extends ManagedEnvironment, Persistable {
/**
* Controls how much energy the buffer will consume per tick.
* <p/>
* This is <em>not</em> necessarily the actual amount consumed per tick,
* instead it is a base value that cost is based on, incorporating a few
* other factors. This is the cost a tier one screen will consume if every
* character is lit (non-black). Larger buffers (i.e. buffers with a higher
* maximum resolution) cost proportionally more.
* <p/>
* Note that this amount of energy is not necessarily subtracted each tick,
* instead every n ticks, n times the amount of energy it costs to run the
* buffer will be consumed, where n is configurable in the OC config.
* <p/>
* This defaults to OC's built-in default value.
*
* @param value the base energy cost per tick.
* @see #getEnergyCostPerTick()
*/
void setEnergyCostPerTick(double value);
/**
* Get the energy cost per tick.
*
* @return the base energy cost per tick.
* @see #setEnergyCostPerTick(double)
*/
double getEnergyCostPerTick();
/**
* Set whether the buffer is powered on.
* <p/>
* For example, screens can be powered on and off by sending a redstone
* pulse into them, in addition to their component API.
*
* @param value whether the buffer should be on or not.
* @see #getPowerState()
*/
void setPowerState(boolean value);
/**
* Get the current power state.
*
* @return whether the buffer is powered on.
* @see #setPowerState(boolean)
*/
boolean getPowerState();
/**
* Sets the maximum resolution supported by this buffer.
*
* @param width the maximum horizontal resolution, in characters.
* @param height the maximum vertical resolution, in characters.
*/
void setMaximumResolution(int width, int height);
/**
* Get the maximum horizontal size of the buffer.
*/
int getMaximumWidth();
/**
* Get the maximum vertical size of the buffer.
*/
int getMaximumHeight();
/**
* Set the 'aspect ratio' of the buffer.
* <p/>
* Not to be confused with the maximum resolution of the buffer, this
* refers to the 'physical' size of the buffer's container. For multi-
* block screens, for example, this is the number of horizontal and
* vertical blocks.
*
* @param width the horizontal size of the physical representation.
* @param height the vertical size of the physical representation.
*/
void setAspectRatio(double width, double height);
/**
* Get the aspect ratio of the buffer.
* <p/>
* Note that this is in fact <tt>width / height</tt>.
*
* @see #setAspectRatio(double, double)
*/
double getAspectRatio();
/**
* Set the buffer's active resolution.
*
* @param width the horizontal resolution.
* @param height the vertical resolution.
* @return <tt>true</tt> if the resolution changed.
*/
boolean setResolution(int width, int height);
/**
* Get the current horizontal resolution.
*
* @see #setResolution(int, int)
*/
int getWidth();
/**
* Get the current vertical resolution.
*
* @see #setResolution(int, int)
*/
int getHeight();
/**
* Sets the maximum color depth supported by this buffer.
* <p/>
* Note that this is the <em>maximum</em> supported depth, lower depths
* will be supported, too. So when setting this to four bit, one bit will
* be supported, too. When setting this to eight bit, four and one bit
* will be supported, also.
*
* @param depth the maximum color depth of the buffer.
*/
void setMaximumColorDepth(ColorDepth depth);
/**
* Get the maximum color depth supported.
*/
ColorDepth getMaximumColorDepth();
/**
* Set the active color depth for this buffer.
*
* @param depth the new color depth.
* @return <tt>true</tt> if the color depth changed.
*/
boolean setColorDepth(ColorDepth depth);
/**
* Get the active color depth of this buffer.
*/
ColorDepth getColorDepth();
/**
* Set the color of the active color palette at the specified index.
* <p/>
* This will error if the current depth does not have a palette (one bit).
*
* @param index the index at which to set the color.
* @param color the color to set for the specified index.
*/
void setPaletteColor(int index, int color);
/**
* Get the color in the active color palette at the specified index.
* <p/>
* This will error if the current depth does not have a palette (one bit).
*
* @param index the index at which to get the color.
* @return the color in the active palette at the specified index.
*/
int getPaletteColor(int index);
/**
* Set the active foreground color, not using a palette.
*
* @param color the new foreground color.
* @see #setForegroundColor(int, boolean)
*/
void setForegroundColor(int color);
/**
* Set the active foreground color.
* <p/>
* If the value is not from the palette, the actually stored value may
* differ from the specified one, as it is converted to the buffer's
* current color depth.
* <p/>
* For palette-only color formats (four bit) the best fit from the palette
* is chosen, if the value is not from the palette.
*
* @param color the color or palette index.
* @param isFromPalette <tt>true</tt>if <tt>color</tt> specifies a palette index.
*/
void setForegroundColor(int color, boolean isFromPalette);
/**
* The active foreground color.
*/
int getForegroundColor();
/**
* <tt>true</tt> if the foreground color is from the color palette, meaning
* the value returned from {@link #getForegroundColor()} is the color
* palette index.
*/
boolean isForegroundFromPalette();
/**
* Set the active background color, not using a palette.
*
* @param color the new background color.
* @see #setBackgroundColor(int, boolean)
*/
void setBackgroundColor(int color);
/**
* Set the active background color.
* <p/>
* If the value is not from the palette, the actually stored value may
* differ from the specified one, as it is converted to the buffer's
* current color depth.
* <p/>
* For palette-only color formats (four bit) the best fit from the palette
* is chosen, if the value is not from the palette.
*
* @param color the color or palette index.
* @param isFromPalette <tt>true</tt>if <tt>color</tt> specifies a palette index.
*/
void setBackgroundColor(int color, boolean isFromPalette);
/**
* The active background color.
*/
int getBackgroundColor();
/**
* <tt>true</tt> if the background color is from the color palette, meaning
* the value returned from {@link #getBackgroundColor()} is the color
* palette index.
*/
boolean isBackgroundFromPalette();
/**
* Copy a portion of the text buffer.
* <p/>
* This will copy the area's text and colors.
*
* @param column the starting horizontal index of the area to copy.
* @param row the starting vertical index of the area to copy.
* @param width the width of the area to copy.
* @param height the height of the area to copy.
* @param horizontalTranslation the horizontal offset, relative to the starting column to copy the are to.
* @param verticalTranslation the vertical offset, relative to the starting row to copy the are to.
*/
void copy(int column, int row, int width, int height, int horizontalTranslation, int verticalTranslation);
/**
* Fill a portion of the text buffer.
* <p/>
* This will set the area's colors to the currently active ones.
*
* @param column the starting horizontal index of the area to fill.
* @param row the starting vertical index of the area to fill.
* @param width the width of the area to fill.
* @param height the height of the area to fill.
* @param value the character to fill the area with.
*/
void fill(int column, int row, int width, int height, char value);
/**
* Write a string into the text buffer.
* <p/>
* This will apply the currently active colors to the changed area.
*
* @param column the starting horizontal index to write at.
* @param row the starting vertical index to write at.
* @param value the string to write.
* @param vertical <tt>true</tt> if the string should be written vertically instead of horizontally.
*/
void set(int column, int row, String value, boolean vertical);
/**
* Get the character in the text buffer at the specified location.
*
* @param column the horizontal index.
* @param row the vertical index.
* @return the character at that index.
*/
char get(int column, int row);
/**
* Get the foreground color of the text buffer at the specified location.
* <p/>
* <em>Important</em>: this may be a palette index.
*
* @param column the horizontal index.
* @param row the vertical index.
* @return the foreground color at that index.
*/
int getForegroundColor(int column, int row);
/**
* Whether the foreground color of the text buffer at the specified
* location if from the color palette.
*
* @param column the horizontal index.
* @param row the vertical index.
* @return whether the foreground at that index is from the palette.
*/
boolean isForegroundFromPalette(int column, int row);
/**
* Get the background color of the text buffer at the specified location.
* <p/>
* <em>Important</em>: this may be a palette index.
*
* @param column the horizontal index.
* @param row the vertical index.
* @return the background color at that index.
*/
int getBackgroundColor(int column, int row);
/**
* Whether the background color of the text buffer at the specified
* location if from the color palette.
*
* @param column the horizontal index.
* @param row the vertical index.
* @return whether the background at that index is from the palette.
*/
boolean isBackgroundFromPalette(int column, int row);
/**
* Overwrites a portion of the text in raw mode.
* <p/>
* This will copy the given char array into the buffer, starting at the
* specified column and row. The array is expected to be indexed row-
* first, i.e. the first dimension is the vertical axis, the second
* the horizontal.
* <p/>
* <em>Important</em>: this performs no checks as to whether something
* actually changed. It will always send the changed patch to clients.
* It will also not crop the specified array to the actually used range.
* In other words, this is not intended to be exposed as-is to user code,
* it should always be called with validated, and, as necessary, cropped
* values.
*
* @param column the horizontal index.
* @param row the vertical index.
* @param text the text to write.
*/
void rawSetText(int column, int row, char[][] text);
/**
* Overwrites a portion of the foreground color information in raw mode.
* <p/>
* This will convert the specified RGB data (in <tt>0xRRGGBB</tt> format)
* to the internal, packed representation and copy it into the buffer,
* starting at the specified column and row. The array is expected to be
* indexed row-first, i.e. the first dimension is the vertical axis, the
* second the horizontal.
* <p/>
* <em>Important</em>: this performs no checks as to whether something
* actually changed. It will always send the changed patch to clients.
* It will also not crop the specified array to the actually used range.
* In other words, this is not intended to be exposed as-is to user code,
* it should always be called with validated, and, as necessary, cropped
* values.
*
* @param column the horizontal index.
* @param row the vertical index.
* @param color the foreground color data to write.
*/
void rawSetForeground(int column, int row, int[][] color);
/**
* Overwrites a portion of the background color information in raw mode.
* <p/>
* This will convert the specified RGB data (in <tt>0xRRGGBB</tt> format)
* to the internal, packed representation and copy it into the buffer,
* starting at the specified column and row. The array is expected to be
* indexed row-first, i.e. the first dimension is the vertical axis, the
* second the horizontal.
* <p/>
* <em>Important</em>: this performs no checks as to whether something
* actually changed. It will always send the changed patch to clients.
* It will also not crop the specified array to the actually used range.
* In other words, this is not intended to be exposed as-is to user code,
* it should always be called with validated, and, as necessary, cropped
* values.
*
* @param column the horizontal index.
* @param row the vertical index.
* @param color the background color data to write.
*/
void rawSetBackground(int column, int row, int[][] color);
// ----------------------------------------------------------------------- //
/**
* Renders the <em>text</em> displayed on the buffer.
* <p/>
* You are responsible for setting up the actual context and applying any
* transformations necessary to properly position and scale the text before
* calling this. The text should be rendered on a black background.
* <p/>
* You can use this to either render the text in a GUI or in the world.
*
* @return <tt>true</tt> if the displayed content changed since the last
* call to this method.
*/
@SideOnly(Side.CLIENT)
boolean renderText();
/**
* The natural width of the rendered text.
* <p/>
* This is the width of the complete text buffer, in pixels. In other
* words, this is the width of the buffer in chars times the actual width
* of a single char in pixels.
*
* @return the total width of the rendered buffer, in pixels.
*/
@SideOnly(Side.CLIENT)
int renderWidth();
/**
* The natural height of the rendered text.
* <p/>
* This is the height of the complete text buffer, in pixels. In other
* words, this is the height of the buffer in chars times the actual height
* of a single char in pixels.
*
* @return the total height of the rendered buffer, in pixels.
*/
@SideOnly(Side.CLIENT)
int renderHeight();
/**
* Set whether the contents of the buffer should currently be rendered.
* <p/>
* Note that this is automatically overwritten when the buffer's power
* state changes, i.e. when it runs out of power or gets back power.
*
* @param enabled whether the text buffer should be rendered.
*/
@SideOnly(Side.CLIENT)
void setRenderingEnabled(boolean enabled);
/**
* Gets whether the contents of the buffer should currently be rendered.
*
* @see #setRenderingEnabled(boolean)
*/
@SideOnly(Side.CLIENT)
boolean isRenderingEnabled();
// ----------------------------------------------------------------------- //
/**
* Signals a key down event for the buffer.
* <p/>
* On the client side this causes a packet to be sent to the server. On the
* server side this will trigger a message that will be picked up by
* keyboards, which will then cause a signal in attached machines.
*
* @param character the character of the pressed key.
* @param code the key code of the pressed key.
* @param player the player that pressed the key. Pass <tt>null</tt> on the client side.
*/
void keyDown(char character, int code, EntityPlayer player);
/**
* Signals a key up event for the buffer.
* <p/>
* On the client side this causes a packet to be sent to the server. On the
* server side this will trigger a message that will be picked up by
* keyboards, which will then cause a signal in attached machines.
*
* @param character the character of the released key.
* @param code the key code of the released key.
* @param player the player that released the key. Pass <tt>null</tt> on the client side.
*/
void keyUp(char character, int code, EntityPlayer player);
/**
* Signals a clipboard paste event for the buffer.
* <p/>
* On the client side this causes a packet to be sent to the server. On the
* server side this will trigger a message that will be picked up by
* keyboards, which will then cause a signal in attached machines.
*
* @param value the text that was pasted.
* @param player the player that pasted the text. Pass <tt>null</tt> on the client side.
*/
void clipboard(String value, EntityPlayer player);
/**
* Signals a mouse button down event for the buffer.
* <p/>
* On the client side this causes a packet to be sent to the server. On the
* server side this will cause a signal in attached machines.
*
* @param x the horizontal coordinate of the mouse, in characters.
* @param y the vertical coordinate of the mouse, in characters.
* @param button the button of the mouse that was pressed.
* @param player the player that pressed the mouse button. Pass <tt>null</tt> on the client side.
*/
void mouseDown(double x, double y, int button, EntityPlayer player);
/**
* Signals a mouse drag event for the buffer.
* <p/>
* On the client side this causes a packet to be sent to the server. On the
* server side this will cause a signal in attached machines.
*
* @param x the horizontal coordinate of the mouse, in characters.
* @param y the vertical coordinate of the mouse, in characters.
* @param button the button of the mouse that is pressed.
* @param player the player that moved the mouse. Pass <tt>null</tt> on the client side.
*/
void mouseDrag(double x, double y, int button, EntityPlayer player);
/**
* Signals a mouse button release event for the buffer.
* <p/>
* On the client side this causes a packet to be sent to the server. On the
* server side this will cause a signal in attached machines.
*
* @param x the horizontal coordinate of the mouse, in characters.
* @param y the vertical coordinate of the mouse, in characters.
* @param button the button of the mouse that was released.
* @param player the player that released the mouse button. Pass <tt>null</tt> on the client side.
*/
void mouseUp(double x, double y, int button, EntityPlayer player);
/**
* Signals a mouse wheel scroll event for the buffer.
* <p/>
* On the client side this causes a packet to be sent to the server. On the
* server side this will cause a signal in attached machines.
*
* @param x the horizontal coordinate of the mouse, in characters.
* @param y the vertical coordinate of the mouse, in characters.
* @param delta indicates the direction of the mouse scroll.
* @param player the player that scrolled the mouse wheel. Pass <tt>null</tt> on the client side.
*/
void mouseScroll(double x, double y, int delta, EntityPlayer player);
// ----------------------------------------------------------------------- //
/**
* Used when setting a buffer's maximum color depth.
*/
public static enum ColorDepth {
/**
* Monochrome color, black and white.
*/
OneBit,
/**
* 16 color palette, defaults to Minecraft colors.
*/
FourBit,
/**
* 240 colors, 16 color palette, defaults to grayscale.
*/
EightBit
}
}