* @param y row position
*/
private void invertCell(final int x, final int y) {
+ invertCell(x, y, false);
+ }
+
+ /**
+ * Invert the cell color at a position. This is used to track the mouse.
+ *
+ * @param x column position
+ * @param y row position
+ * @param onlyThisCell if true, only invert this cell
+ */
+ private void invertCell(final int x, final int y,
+ final boolean onlyThisCell) {
+
if (debugThreads) {
System.err.printf("%d %s invertCell() %d %d\n",
System.currentTimeMillis(), Thread.currentThread(), x, y);
}
}
getScreen().putCharXY(x, y, cell);
+ if ((onlyThisCell == true) || (cell.getWidth() == Cell.Width.SINGLE)) {
+ return;
+ }
+
+ // This cell is one half of a fullwidth glyph. Invert the other
+ // half.
+ if (cell.getWidth() == Cell.Width.LEFT) {
+ if (x < getScreen().getWidth() - 1) {
+ Cell rightHalf = getScreen().getCharXY(x + 1, y);
+ if (rightHalf.getWidth() == Cell.Width.RIGHT) {
+ invertCell(x + 1, y, true);
+ return;
+ }
+ }
+ }
+ assert (cell.getWidth() == Cell.Width.RIGHT);
+
+ if (x > 0) {
+ Cell leftHalf = getScreen().getCharXY(x - 1, y);
+ if (leftHalf.getWidth() == Cell.Width.LEFT) {
+ invertCell(x - 1, y, true);
+ }
+ }
}
/**
*/
package jexer.backend;
+import java.awt.image.BufferedImage;
+
+import jexer.backend.GlyphMaker;
import jexer.bits.Cell;
import jexer.bits.CellAttributes;
import jexer.bits.GraphicsChars;
+import jexer.bits.StringUtils;
/**
* A logical screen composed of a 2D array of Cells.
*/
protected int cursorY;
+ /**
+ * The last used height of a character cell in pixels, only used for
+ * full-width chars.
+ */
+ private int lastTextHeight = -1;
+
+ /**
+ * The glyph drawer for full-width chars.
+ */
+ private GlyphMaker glyphMaker = null;
+
// ------------------------------------------------------------------------
// Constructors -----------------------------------------------------------
// ------------------------------------------------------------------------
return;
}
+ if ((StringUtils.width(ch.getChar()) == 2) && (!ch.isImage())) {
+ putFullwidthCharXY(x, y, ch);
+ return;
+ }
+
int X = x + offsetX;
int Y = y + offsetY;
return;
}
+ if (StringUtils.width(ch) == 2) {
+ putFullwidthCharXY(x, y, ch, attr);
+ return;
+ }
+
int X = x + offsetX;
int Y = y + offsetY;
return;
}
+ if (StringUtils.width(ch) == 2) {
+ putFullwidthCharXY(x, y, ch);
+ return;
+ }
+
int X = x + offsetX;
int Y = y + offsetY;
}
}
+ /**
+ * Render one fullwidth cell.
+ *
+ * @param x column coordinate. 0 is the left-most column.
+ * @param y row coordinate. 0 is the top-most row.
+ * @param cell the cell to draw
+ */
+ public final void putFullwidthCharXY(final int x, final int y,
+ final Cell cell) {
+
+ if (lastTextHeight != getTextHeight()) {
+ glyphMaker = GlyphMaker.getInstance(getTextHeight());
+ lastTextHeight = getTextHeight();
+ }
+ BufferedImage image = glyphMaker.getImage(cell, getTextWidth() * 2,
+ getTextHeight());
+ BufferedImage leftImage = image.getSubimage(0, 0, getTextWidth(),
+ getTextHeight());
+ BufferedImage rightImage = image.getSubimage(getTextWidth(), 0,
+ getTextWidth(), getTextHeight());
+
+ Cell left = new Cell();
+ left.setTo(cell);
+ left.setImage(leftImage);
+ left.setWidth(Cell.Width.LEFT);
+ // Blank out the char itself, so that shadows do not leave artifacts.
+ left.setChar(' ');
+ putCharXY(x, y, left);
+
+ Cell right = new Cell();
+ right.setTo(cell);
+ right.setImage(rightImage);
+ right.setWidth(Cell.Width.RIGHT);
+ // Blank out the char itself, so that shadows do not leave artifacts.
+ right.setChar(' ');
+ putCharXY(x + 1, y, right);
+ }
+
+ /**
+ * Render one fullwidth character with attributes.
+ *
+ * @param x column coordinate. 0 is the left-most column.
+ * @param y row coordinate. 0 is the top-most row.
+ * @param ch character to draw
+ * @param attr attributes to use (bold, foreColor, backColor)
+ */
+ public final void putFullwidthCharXY(final int x, final int y,
+ final char ch, final CellAttributes attr) {
+
+ Cell cell = new Cell(ch);
+ cell.setAttr(attr);
+ putFullwidthCharXY(x, y, cell);
+ }
+
+ /**
+ * Render one fullwidth character with attributes.
+ *
+ * @param x column coordinate. 0 is the left-most column.
+ * @param y row coordinate. 0 is the top-most row.
+ * @param ch character to draw
+ */
+ public final void putFullwidthCharXY(final int x, final int y,
+ final char ch) {
+
+ Cell cell = new Cell(ch);
+ cell.setAttr(getAttrXY(x, y));
+ putFullwidthCharXY(x, y, cell);
+ }
+
}