- private void flushLine(int y, StringBuilder sb, CellAttributes lastAttr) {
-
- int lastX = -1;
- int textEnd = 0;
- for (int x = 0; x < width; x++) {
- Cell lCell = logical[x][y];
- if (!lCell.isBlank()) {
- textEnd = x;
- }
- }
- // Push textEnd to first column beyond the text area
- textEnd++;
-
- // DEBUG
- // reallyCleared = true;
-
- for (int x = 0; x < width; x++) {
- Cell lCell = logical[x][y];
- Cell pCell = physical[x][y];
-
- if ((lCell != pCell) || (reallyCleared == true)) {
-
- if (debugToStderr) {
- System.err.printf("\n--\n");
- System.err.printf(" Y: %d X: %d\n", y, x);
- System.err.printf(" lCell: %s\n", lCell);
- System.err.printf(" pCell: %s\n", pCell);
- System.err.printf(" ==== \n");
- }
-
- if (lastAttr == null) {
- lastAttr = new CellAttributes();
- sb.append(terminal.normal());
- }
-
- // Place the cell
- if ((lastX != (x - 1)) || (lastX == -1)) {
- // Advancing at least one cell, or the first gotoXY
- sb.append(terminal.gotoXY(x, y));
- }
-
- assert(lastAttr != null);
-
- if ((x == textEnd) && (textEnd < width - 1)) {
- assert(lCell.isBlank());
-
- for (int i = x; i < width; i++) {
- assert(logical[i][y].isBlank());
- // Physical is always updatesd
- physical[i][y].reset();
- }
-
- // Clear remaining line
- sb.append(terminal.clearRemainingLine());
- lastAttr.reset();
- return;
- }
-
- // Now emit only the modified attributes
- if ((lCell.foreColor != lastAttr.foreColor) &&
- (lCell.backColor != lastAttr.backColor) &&
- (lCell.bold == lastAttr.bold) &&
- (lCell.reverse == lastAttr.reverse) &&
- (lCell.underline == lastAttr.underline) &&
- (lCell.blink == lastAttr.blink)) {
-
- // Both colors changed, attributes the same
- sb.append(terminal.color(lCell.foreColor,
- lCell.backColor));
-
- if (debugToStderr) {
- System.err.printf("1 Change only fore/back colors\n");
- }
- } else if ((lCell.foreColor != lastAttr.foreColor) &&
- (lCell.backColor != lastAttr.backColor) &&
- (lCell.bold != lastAttr.bold) &&
- (lCell.reverse != lastAttr.reverse) &&
- (lCell.underline != lastAttr.underline) &&
- (lCell.blink != lastAttr.blink)) {
-
- if (debugToStderr) {
- System.err.printf("2 Set all attributes\n");
- }
-
- // Everything is different
- sb.append(terminal.color(lCell.foreColor,
- lCell.backColor,
- lCell.bold, lCell.reverse, lCell.blink,
- lCell.underline));
-
- } else if ((lCell.foreColor != lastAttr.foreColor) &&
- (lCell.backColor == lastAttr.backColor) &&
- (lCell.bold == lastAttr.bold) &&
- (lCell.reverse == lastAttr.reverse) &&
- (lCell.underline == lastAttr.underline) &&
- (lCell.blink == lastAttr.blink)) {
-
- // Attributes same, foreColor different
- sb.append(terminal.color(lCell.foreColor, true));
-
- if (debugToStderr) {
- System.err.printf("3 Change foreColor\n");
- }
-
- } else if ((lCell.foreColor == lastAttr.foreColor) &&
- (lCell.backColor != lastAttr.backColor) &&
- (lCell.bold == lastAttr.bold) &&
- (lCell.reverse == lastAttr.reverse) &&
- (lCell.underline == lastAttr.underline) &&
- (lCell.blink == lastAttr.blink)) {
-
- // Attributes same, backColor different
- sb.append(terminal.color(lCell.backColor, false));
-
- if (debugToStderr) {
- System.err.printf("4 Change backColor\n");
- }
-
- } else if ((lCell.foreColor == lastAttr.foreColor) &&
- (lCell.backColor == lastAttr.backColor) &&
- (lCell.bold == lastAttr.bold) &&
- (lCell.reverse == lastAttr.reverse) &&
- (lCell.underline == lastAttr.underline) &&
- (lCell.blink == lastAttr.blink)) {
-
- // All attributes the same, just print the char
- // NOP
-
- if (debugToStderr) {
- System.err.printf("5 Only emit character\n");
- }
- } else {
- // Just reset everything again
- sb.append(terminal.color(lCell.foreColor, lCell.backColor,
- lCell.bold, lCell.reverse, lCell.blink,
- lCell.underline));
-
- if (debugToStderr) {
- System.err.printf("6 Change all attributes\n");
- }
- }
- // Emit the character
- sb.append(lCell.ch);
-
- // Save the last rendered cell
- lastX = x;
- lastAttr.setTo(lCell);
-
- // Physical is always updatesd
- physical[x][y].setTo(lCell);
-
- } // if ((lCell != pCell) || (reallyCleared == true))
-
- } // for (int x = 0; x < width; x++)
+ private void flushLine(final int y, final StringBuilder sb,
+ CellAttributes lastAttr) {
+
+ int lastX = -1;
+ int textEnd = 0;
+ for (int x = 0; x < width; x++) {
+ Cell lCell = logical[x][y];
+ if (!lCell.isBlank()) {
+ textEnd = x;
+ }
+ }
+ // Push textEnd to first column beyond the text area
+ textEnd++;
+
+ // DEBUG
+ // reallyCleared = true;
+
+ for (int x = 0; x < width; x++) {
+ Cell lCell = logical[x][y];
+ Cell pCell = physical[x][y];
+
+ if (!lCell.equals(pCell) || reallyCleared) {
+
+ if (debugToStderr) {
+ System.err.printf("\n--\n");
+ System.err.printf(" Y: %d X: %d\n", y, x);
+ System.err.printf(" lCell: %s\n", lCell);
+ System.err.printf(" pCell: %s\n", pCell);
+ System.err.printf(" ==== \n");
+ }
+
+ if (lastAttr == null) {
+ lastAttr = new CellAttributes();
+ sb.append(terminal.normal());
+ }
+
+ // Place the cell
+ if ((lastX != (x - 1)) || (lastX == -1)) {
+ // Advancing at least one cell, or the first gotoXY
+ sb.append(terminal.gotoXY(x, y));
+ }
+
+ assert (lastAttr != null);
+
+ if ((x == textEnd) && (textEnd < width - 1)) {
+ assert (lCell.isBlank());
+
+ for (int i = x; i < width; i++) {
+ assert (logical[i][y].isBlank());
+ // Physical is always updatesd
+ physical[i][y].reset();
+ }
+
+ // Clear remaining line
+ sb.append(terminal.clearRemainingLine());
+ lastAttr.reset();
+ return;
+ }
+
+ // Now emit only the modified attributes
+ if ((lCell.getForeColor() != lastAttr.getForeColor())
+ && (lCell.getBackColor() != lastAttr.getBackColor())
+ && (lCell.isBold() == lastAttr.isBold())
+ && (lCell.isReverse() == lastAttr.isReverse())
+ && (lCell.isUnderline() == lastAttr.isUnderline())
+ && (lCell.isBlink() == lastAttr.isBlink())
+ ) {
+ // Both colors changed, attributes the same
+ sb.append(terminal.color(lCell.getForeColor(),
+ lCell.getBackColor()));
+
+ if (debugToStderr) {
+ System.err.printf("1 Change only fore/back colors\n");
+ }
+ } else if ((lCell.getForeColor() != lastAttr.getForeColor())
+ && (lCell.getBackColor() != lastAttr.getBackColor())
+ && (lCell.isBold() != lastAttr.isBold())
+ && (lCell.isReverse() != lastAttr.isReverse())
+ && (lCell.isUnderline() != lastAttr.isUnderline())
+ && (lCell.isBlink() != lastAttr.isBlink())
+ ) {
+ // Everything is different
+ sb.append(terminal.color(lCell.getForeColor(),
+ lCell.getBackColor(),
+ lCell.isBold(), lCell.isReverse(),
+ lCell.isBlink(),
+ lCell.isUnderline()));
+
+ if (debugToStderr) {
+ System.err.printf("2 Set all attributes\n");
+ }
+ } else if ((lCell.getForeColor() != lastAttr.getForeColor())
+ && (lCell.getBackColor() == lastAttr.getBackColor())
+ && (lCell.isBold() == lastAttr.isBold())
+ && (lCell.isReverse() == lastAttr.isReverse())
+ && (lCell.isUnderline() == lastAttr.isUnderline())
+ && (lCell.isBlink() == lastAttr.isBlink())
+ ) {
+
+ // Attributes same, foreColor different
+ sb.append(terminal.color(lCell.getForeColor(), true));
+
+ if (debugToStderr) {
+ System.err.printf("3 Change foreColor\n");
+ }
+ } else if ((lCell.getForeColor() == lastAttr.getForeColor())
+ && (lCell.getBackColor() != lastAttr.getBackColor())
+ && (lCell.isBold() == lastAttr.isBold())
+ && (lCell.isReverse() == lastAttr.isReverse())
+ && (lCell.isUnderline() == lastAttr.isUnderline())
+ && (lCell.isBlink() == lastAttr.isBlink())
+ ) {
+ // Attributes same, backColor different
+ sb.append(terminal.color(lCell.getBackColor(), false));
+
+ if (debugToStderr) {
+ System.err.printf("4 Change backColor\n");
+ }
+ } else if ((lCell.getForeColor() == lastAttr.getForeColor())
+ && (lCell.getBackColor() == lastAttr.getBackColor())
+ && (lCell.isBold() == lastAttr.isBold())
+ && (lCell.isReverse() == lastAttr.isReverse())
+ && (lCell.isUnderline() == lastAttr.isUnderline())
+ && (lCell.isBlink() == lastAttr.isBlink())
+ ) {
+
+ // All attributes the same, just print the char
+ // NOP
+
+ if (debugToStderr) {
+ System.err.printf("5 Only emit character\n");
+ }
+ } else {
+ // Just reset everything again
+ sb.append(terminal.color(lCell.getForeColor(),
+ lCell.getBackColor(),
+ lCell.isBold(),
+ lCell.isReverse(),
+ lCell.isBlink(),
+ lCell.isUnderline()));
+
+ if (debugToStderr) {
+ System.err.printf("6 Change all attributes\n");
+ }
+ }
+ // Emit the character
+ sb.append(lCell.getChar());
+
+ // Save the last rendered cell
+ lastX = x;
+ lastAttr.setTo(lCell);
+
+ // Physical is always updated
+ physical[x][y].setTo(lCell);
+
+ } // if (!lCell.equals(pCell) || (reallyCleared == true))
+
+ } // for (int x = 0; x < width; x++)