X-Git-Url: http://www2.svjatoslav.eu/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Fsixth%2Fe3d%2Frenderer%2Fraster%2Fshapes%2Fcomposite%2Ftextcanvas%2FCanvasCharacter.java;h=a616daeb79f4fac71e7e63d2b07748e5708de5d8;hb=HEAD;hp=c66d5b5b4592f87188b31ca2a147a35ebd28cd9b;hpb=cb6addfdf93ef3cf64038c4de41ebbd30fe6afcd;p=sixth-3d.git diff --git a/src/main/java/eu/svjatoslav/sixth/e3d/renderer/raster/shapes/composite/textcanvas/CanvasCharacter.java b/src/main/java/eu/svjatoslav/sixth/e3d/renderer/raster/shapes/composite/textcanvas/CanvasCharacter.java index c66d5b5..a616dae 100644 --- a/src/main/java/eu/svjatoslav/sixth/e3d/renderer/raster/shapes/composite/textcanvas/CanvasCharacter.java +++ b/src/main/java/eu/svjatoslav/sixth/e3d/renderer/raster/shapes/composite/textcanvas/CanvasCharacter.java @@ -1,5 +1,5 @@ /* - * Sixth 3D engine. Author: Svjatoslav Agejenko. + * Sixth 3D engine. Author: Svjatoslav Agejenko. * This project is released under Creative Commons Zero (CC0) license. */ package eu.svjatoslav.sixth.e3d.renderer.raster.shapes.composite.textcanvas; @@ -12,55 +12,81 @@ import eu.svjatoslav.sixth.e3d.renderer.raster.shapes.basic.solidpolygon.SolidPo import java.awt.*; +import static eu.svjatoslav.sixth.e3d.renderer.raster.shapes.basic.solidpolygon.SolidPolygon.drawPolygon; +import static eu.svjatoslav.sixth.e3d.renderer.raster.shapes.composite.textcanvas.TextCanvas.FONT_CHAR_HEIGHT; +import static eu.svjatoslav.sixth.e3d.renderer.raster.shapes.composite.textcanvas.TextCanvas.FONT_CHAR_WIDTH; +import static java.lang.String.valueOf; + +/** + * Represents a single character on the text canvas. + */ public class CanvasCharacter extends AbstractCoordinateShape { private static final int MAX_FONT_SIZE = 500; + + /** + * Cached fonts. + */ private static final Font[] fonts = new Font[MAX_FONT_SIZE]; - private String value; + /** + * The character to be rendered. + */ + private char value; + + /** + * The foreground color of the character. + */ private eu.svjatoslav.sixth.e3d.renderer.raster.Color foregroundColor; - private Color foregroundAwtColor; + /** + * The background color of the character. + */ private eu.svjatoslav.sixth.e3d.renderer.raster.Color backgroundColor; - public CanvasCharacter(final Point3D point, final char character, + public CanvasCharacter(final Point3D centerLocation, final char character, final eu.svjatoslav.sixth.e3d.renderer.raster.Color foregroundColor, final eu.svjatoslav.sixth.e3d.renderer.raster.Color backgroundColor) { + // There are 5 coordinates: center, upper left, upper right, lower right, lower left super(5); - coordinates[0].coordinate = point; - - value = String.valueOf(character); + value = character; this.foregroundColor = foregroundColor; - foregroundAwtColor = foregroundColor.toAwtColor(); - this.backgroundColor = backgroundColor; - // set corner coordinates (for drawing background) - { - final double widthHalf = TextCanvas.FONT_CHAR_WIDTH / 2d; - final double heightHalf = TextCanvas.FONT_CHAR_HEIGHT / 2d; - // upper left - coordinates[1].coordinate = point.clone().translateX(-widthHalf) - .translateY(-heightHalf); + coordinates[0].coordinate = centerLocation; - // upper right - coordinates[2].coordinate = point.clone().translateX(widthHalf) - .translateY(-heightHalf); + final double halfWidth = FONT_CHAR_WIDTH / 2d; + final double halfHeight = FONT_CHAR_HEIGHT / 2d; - // lower right - coordinates[3].coordinate = point.clone().translateX(widthHalf) - .translateY(heightHalf); + // upper left + coordinates[1].coordinate = centerLocation.clone().translateX(-halfWidth) + .translateY(-halfHeight); - // lower left - coordinates[4].coordinate = point.clone().translateX(-widthHalf) - .translateY(heightHalf); + // upper right + coordinates[2].coordinate = centerLocation.clone().translateX(halfWidth) + .translateY(-halfHeight); - } + // lower right + coordinates[3].coordinate = centerLocation.clone().translateX(halfWidth) + .translateY(halfHeight); + + // lower left + coordinates[4].coordinate = centerLocation.clone().translateX(-halfWidth) + .translateY(halfHeight); } + /** + * Returns a font of the specified size. + *

+ * If the font of the specified size is already cached, it will be + * returned. Otherwise, a new font will be created, cached and returned. + * + * @param size the size of the font + * @return the font + */ public static Font getFont(final int size) { if (fonts[size] != null) return fonts[size]; @@ -70,44 +96,66 @@ public class CanvasCharacter extends AbstractCoordinateShape { return font; } + /** + * Returns color of the background. + */ public eu.svjatoslav.sixth.e3d.renderer.raster.Color getBackgroundColor() { return backgroundColor; } + /** + * Sets color of the background. + */ public void setBackgroundColor( final eu.svjatoslav.sixth.e3d.renderer.raster.Color backgroundColor) { this.backgroundColor = backgroundColor; } + /** + * Returns color of the foreground. + * + * @return the color + */ public eu.svjatoslav.sixth.e3d.renderer.raster.Color getForegroundColor() { return foregroundColor; } + /** + * Sets color of the foreground. + * + * @param foregroundColor the color + */ public void setForegroundColor( final eu.svjatoslav.sixth.e3d.renderer.raster.Color foregroundColor) { this.foregroundColor = foregroundColor; - foregroundAwtColor = foregroundColor.toAwtColor(); } + /** + * Paints the character on the screen. + * @param renderingContext the rendering context + */ @Override public void paint(final RenderingContext renderingContext) { - SolidPolygon.drawPolygon(renderingContext, + // Draw background rectangle first. It is composed of two triangles. + drawPolygon(renderingContext, coordinates[1].onScreenCoordinate, coordinates[2].onScreenCoordinate, - coordinates[3].onScreenCoordinate, mouseInteractionController, + coordinates[3].onScreenCoordinate, + mouseInteractionController, backgroundColor); - SolidPolygon.drawPolygon(renderingContext, + drawPolygon(renderingContext, coordinates[1].onScreenCoordinate, coordinates[3].onScreenCoordinate, - coordinates[4].onScreenCoordinate, mouseInteractionController, + coordinates[4].onScreenCoordinate, + mouseInteractionController, backgroundColor); - final int size = (int) ((renderingContext.width * 4.5) / onScreenZ); + final int desiredFontSize = (int) ((renderingContext.width * 4.5) / onScreenZ); // do not render too large characters - if (size >= MAX_FONT_SIZE) + if (desiredFontSize >= MAX_FONT_SIZE) return; final Point2D onScreenLocation = coordinates[0].onScreenCoordinate; @@ -123,17 +171,18 @@ public class CanvasCharacter extends AbstractCoordinateShape { if (onScreenLocation.y > renderingContext.height) return; - renderingContext.graphics.setFont(getFont(size)); - renderingContext.graphics.setColor(foregroundAwtColor); + // draw the character + renderingContext.graphics.setFont(getFont(desiredFontSize)); + renderingContext.graphics.setColor(foregroundColor.toAwtColor()); renderingContext.graphics.drawString( - value, - (int) onScreenLocation.x - (int) (size / 3.2), - (int) onScreenLocation.y + (int) (size / 2.5)); + valueOf(value), + (int) onScreenLocation.x - (int) (desiredFontSize / 3.2), + (int) onScreenLocation.y + (int) (desiredFontSize / 2.5)); } public void setValue(final char value) { - this.value = String.valueOf(value); + this.value = value; } }