X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2Fio%2FScreen.java;h=720f8a9789f5222182bab77ec5b50fd3f74f318d;hb=e16dda65585466c8987bd1efd718431450a96605;hp=eab9650d14aac19735f732b78036e3fcf7d28d2d;hpb=fca67db090dc7e6476b98b800ce225c2bf60425c;p=nikiroo-utils.git diff --git a/src/jexer/io/Screen.java b/src/jexer/io/Screen.java index eab9650..720f8a9 100644 --- a/src/jexer/io/Screen.java +++ b/src/jexer/io/Screen.java @@ -1,29 +1,27 @@ -/** +/* * Jexer - Java Text User Interface * - * License: LGPLv3 or later - * - * This module is licensed under the GNU Lesser General Public License - * Version 3. Please see the file "COPYING" in this directory for more - * information about the GNU Lesser General Public License Version 3. + * The MIT License (MIT) * - * Copyright (C) 2015 Kevin Lamonte + * Copyright (C) 2016 Kevin Lamonte * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see - * http://www.gnu.org/licenses/, or write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA - * 02110-1301 USA + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. * * @author Kevin Lamonte [kevin.lamonte@gmail.com] * @version 1 @@ -183,7 +181,17 @@ public abstract class Screen { /** * When true, logical != physical. */ - protected boolean dirty; + protected volatile boolean dirty; + + /** + * Get dirty flag. + * + * @return if true, the logical screen is not in sync with the physical + * screen + */ + public final boolean isDirty() { + return dirty; + } /** * Set if the user explicitly wants to redraw everything starting with a @@ -216,7 +224,9 @@ public abstract class Screen { */ public final CellAttributes getAttrXY(final int x, final int y) { CellAttributes attr = new CellAttributes(); - attr.setTo(logical[x][y]); + if ((x >= 0) && (x < width) && (y >= 0) && (y < height)) { + attr.setTo(logical[x][y]); + } return attr; } @@ -241,8 +251,8 @@ public abstract class Screen { * @param attr attributes to use (bold, foreColor, backColor) * @param clip if true, honor clipping/offset */ - public final void putAttrXY(final int x, final int y, - final CellAttributes attr, final boolean clip) { + public final void putAttrXY(final int x, final int y + , final CellAttributes attr, final boolean clip) { int X = x; int Y = y; @@ -263,11 +273,11 @@ public abstract class Screen { dirty = true; logical[X][Y].setForeColor(attr.getForeColor()); logical[X][Y].setBackColor(attr.getBackColor()); - logical[X][Y].setBold(attr.getBold()); - logical[X][Y].setBlink(attr.getBlink()); - logical[X][Y].setReverse(attr.getReverse()); - logical[X][Y].setUnderline(attr.getUnderline()); - logical[X][Y].setProtect(attr.getProtect()); + logical[X][Y].setBold(attr.isBold()); + logical[X][Y].setBlink(attr.isBlink()); + logical[X][Y].setReverse(attr.isReverse()); + logical[X][Y].setUnderline(attr.isUnderline()); + logical[X][Y].setProtect(attr.isProtect()); } } @@ -278,6 +288,7 @@ public abstract class Screen { * @param attr attributes to use (bold, foreColor, backColor) */ public final void putAll(final char ch, final CellAttributes attr) { + for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { putCharXY(x, y, ch, attr); @@ -330,11 +341,11 @@ public abstract class Screen { logical[X][Y].setChar(ch); logical[X][Y].setForeColor(attr.getForeColor()); logical[X][Y].setBackColor(attr.getBackColor()); - logical[X][Y].setBold(attr.getBold()); - logical[X][Y].setBlink(attr.getBlink()); - logical[X][Y].setReverse(attr.getReverse()); - logical[X][Y].setUnderline(attr.getUnderline()); - logical[X][Y].setProtect(attr.getProtect()); + logical[X][Y].setBold(attr.isBold()); + logical[X][Y].setBlink(attr.isBlink()); + logical[X][Y].setReverse(attr.isReverse()); + logical[X][Y].setUnderline(attr.isUnderline()); + logical[X][Y].setProtect(attr.isProtect()); } } @@ -346,6 +357,7 @@ public abstract class Screen { * @param ch character to draw */ public final void putCharXY(final int x, final int y, final char ch) { + if ((x < clipLeft) || (x >= clipRight) || (y < clipTop) @@ -373,7 +385,7 @@ public abstract class Screen { * @param str string to draw * @param attr attributes to use (bold, foreColor, backColor) */ - public final void putStrXY(final int x, final int y, final String str, + public final void putStringXY(final int x, final int y, final String str, final CellAttributes attr) { int i = x; @@ -395,7 +407,8 @@ public abstract class Screen { * @param y row coordinate. 0 is the top-most row. * @param str string to draw */ - public final void putStrXY(final int x, final int y, final String str) { + public final void putStringXY(final int x, final int y, final String str) { + int i = x; for (int j = 0; j < str.length(); j++) { char ch = str.charAt(j); @@ -447,7 +460,7 @@ public abstract class Screen { * @param width new width * @param height new height */ - private void reallocate(final int width, final int height) { + private synchronized void reallocate(final int width, final int height) { if (logical != null) { for (int row = 0; row < this.height; row++) { for (int col = 0; col < this.width; col++) { @@ -492,7 +505,7 @@ public abstract class Screen { * * @param width new screen width */ - public final void setWidth(final int width) { + public final synchronized void setWidth(final int width) { reallocate(width, this.height); } @@ -502,7 +515,7 @@ public abstract class Screen { * * @param height new screen height */ - public final void setHeight(final int height) { + public final synchronized void setHeight(final int height) { reallocate(this.width, height); } @@ -522,7 +535,7 @@ public abstract class Screen { * * @return current screen height */ - public final int getHeight() { + public final synchronized int getHeight() { return this.height; } @@ -531,7 +544,7 @@ public abstract class Screen { * * @return current screen width */ - public final int getWidth() { + public final synchronized int getWidth() { return this.width; } @@ -552,7 +565,7 @@ public abstract class Screen { * Reset screen to not-bold, white-on-black. Also flushes the offset and * clip variables. */ - public final void reset() { + public final synchronized void reset() { dirty = true; for (int row = 0; row < height; row++) { for (int col = 0; col < width; col++) { @@ -575,12 +588,24 @@ public abstract class Screen { } /** - * Force the screen to be fully cleared and redrawn on the next flush(). + * Clear the logical screen. */ public final void clear() { reset(); } + /** + * Clear the physical screen. + */ + public final void clearPhysical() { + dirty = true; + for (int row = 0; row < height; row++) { + for (int col = 0; col < width; col++) { + physical[col][row].reset(); + } + } + } + /** * Draw a box with a border and empty background. * @@ -617,8 +642,6 @@ public abstract class Screen { final CellAttributes border, final CellAttributes background, final int borderType, final boolean shadow) { - int boxTop = top; - int boxLeft = left; int boxWidth = right - left; int boxHeight = bottom - top; @@ -727,7 +750,7 @@ public abstract class Screen { * Subclasses must provide an implementation to push the logical screen * to the physical device. */ - abstract public void flushPhysical(); + public abstract void flushPhysical(); /** * Put the cursor at (x,y). @@ -736,8 +759,7 @@ public abstract class Screen { * @param x column coordinate to put the cursor on * @param y row coordinate to put the cursor on */ - public final void putCursor(final boolean visible, - final int x, final int y) { + public void putCursor(final boolean visible, final int x, final int y) { cursorVisible = visible; cursorX = x;