diff options
author | Kenny Root <kenny@the-b.org> | 2009-08-02 12:35:57 +0000 |
---|---|---|
committer | Kenny Root <kenny@the-b.org> | 2009-08-02 12:35:57 +0000 |
commit | 4738e1afc28356df2100a145c6226732ccee365a (patch) | |
tree | 7b26db408f5961e6703cebc50711543ced1ddd8a /src/org | |
parent | 1afdbb9858fbc300261afc8187634ba15082acf3 (diff) | |
download | connectbot-4738e1afc28356df2100a145c6226732ccee365a.tar.gz connectbot-4738e1afc28356df2100a145c6226732ccee365a.tar.bz2 connectbot-4738e1afc28356df2100a145c6226732ccee365a.zip |
Support wide characters in drawing and emulation
git-svn-id: https://connectbot.googlecode.com/svn/trunk/connectbot@381 df292f66-193f-0410-a5fc-6d59da041ff2
Diffstat (limited to 'src/org')
-rw-r--r-- | src/org/connectbot/TerminalView.java | 10 | ||||
-rw-r--r-- | src/org/connectbot/service/Relay.java | 12 | ||||
-rw-r--r-- | src/org/connectbot/service/TerminalBridge.java | 28 |
3 files changed, 44 insertions, 6 deletions
diff --git a/src/org/connectbot/TerminalView.java b/src/org/connectbot/TerminalView.java index de74f7e..5eb7e24 100644 --- a/src/org/connectbot/TerminalView.java +++ b/src/org/connectbot/TerminalView.java @@ -36,6 +36,7 @@ import android.view.inputmethod.BaseInputConnection; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; import android.widget.Toast; +import de.mud.terminal.VDUBuffer; /** * User interface {@link View} for showing a TerminalBridge in an @@ -148,6 +149,11 @@ public class TerminalView extends View implements FontSizeChangedListener { // also draw cursor if visible if(bridge.buffer.isCursorVisible()) { + int currentAttribute = bridge.buffer.getAttributes( + bridge.buffer.getCursorColumn(), + bridge.buffer.getCursorRow()); + boolean onWideCharacter = (currentAttribute & VDUBuffer.FULLWIDTH) != 0; + int x = bridge.buffer.getCursorColumn() * bridge.charWidth; int y = (bridge.buffer.getCursorRow() + bridge.buffer.screenBase - bridge.buffer.windowBase) @@ -157,7 +163,9 @@ public class TerminalView extends View implements FontSizeChangedListener { canvas.save(); canvas.translate(x, y); - canvas.clipRect(0, 0, bridge.charWidth, bridge.charHeight); + canvas.clipRect(0, 0, + bridge.charWidth * (onWideCharacter ? 2 : 1), + bridge.charHeight); canvas.drawPaint(cursorPaint); // Make sure we scale our decorations to the correct size. diff --git a/src/org/connectbot/service/Relay.java b/src/org/connectbot/service/Relay.java index 746a915..22b8299 100644 --- a/src/org/connectbot/service/Relay.java +++ b/src/org/connectbot/service/Relay.java @@ -92,6 +92,9 @@ public class Relay implements Runnable { byteBuffer = ByteBuffer.allocate(BUFFER_SIZE); charBuffer = CharBuffer.allocate(BUFFER_SIZE); + float[] widths = new float[BUFFER_SIZE]; + boolean[] fullwidths = new boolean[BUFFER_SIZE]; + byteArray = byteBuffer.array(); charArray = charBuffer.array(); @@ -101,9 +104,11 @@ public class Relay implements Runnable { byteBuffer.limit(0); int bytesToRead; int offset; + int charWidth; try { while (true) { + charWidth = bridge.charWidth; bytesToRead = byteBuffer.capacity() - byteBuffer.limit(); offset = byteBuffer.arrayOffset() + byteBuffer.limit(); bytesRead = transport.read(byteArray, offset, bytesToRead); @@ -122,7 +127,12 @@ public class Relay implements Runnable { byteBuffer.position(0); } - buffer.putString(charArray, 0, charBuffer.position()); + offset = charBuffer.position(); + bridge.defaultPaint.getTextWidths(charArray, 0, offset, widths); + for (int i = 0; i < offset; i++) + fullwidths[i] = (int)widths[i] != charWidth; + + buffer.putString(charArray, fullwidths, 0, charBuffer.position()); charBuffer.clear(); bridge.redraw(); } diff --git a/src/org/connectbot/service/TerminalBridge.java b/src/org/connectbot/service/TerminalBridge.java index 500a821..5cb9613 100644 --- a/src/org/connectbot/service/TerminalBridge.java +++ b/src/org/connectbot/service/TerminalBridge.java @@ -80,7 +80,7 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener { private AbsTransport transport; - private final Paint defaultPaint; + final Paint defaultPaint; private Relay relay; @@ -1037,6 +1037,7 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener { int fg, bg; synchronized (buffer) { boolean entireDirty = buffer.update[0] || fullRedraw; + boolean isWideCharacter = false; // walk through all lines in the buffer for(int l = 0; l < buffer.height; l++) { @@ -1080,9 +1081,16 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener { // set underlined attributes if requested defaultPaint.setUnderlineText((currAttr & VDUBuffer.UNDERLINE) != 0); - // determine the amount of continuous characters with the same settings and print them all at once - while(c + addr < buffer.width && buffer.charAttributes[buffer.windowBase + l][c + addr] == currAttr) { + isWideCharacter = (currAttr & VDUBuffer.FULLWIDTH) != 0; + + if (isWideCharacter) addr++; + else { + // determine the amount of continuous characters with the same settings and print them all at once + while(c + addr < buffer.width + && buffer.charAttributes[buffer.windowBase + l][c + addr] == currAttr) { + addr++; + } } // Save the current clip region @@ -1090,7 +1098,17 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener { // clear this dirty area with background color defaultPaint.setColor(bg); - canvas.clipRect(c * charWidth, l * charHeight, (c + addr) * charWidth, (l + 1) * charHeight); + if (isWideCharacter) { + canvas.clipRect(c * charWidth, + l * charHeight, + (c + 2) * charWidth, + (l + 1) * charHeight); + } else { + canvas.clipRect(c * charWidth, + l * charHeight, + (c + addr) * charWidth, + (l + 1) * charHeight); + } canvas.drawPaint(defaultPaint); // write the text string starting at 'c' for 'addr' number of characters @@ -1105,6 +1123,8 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener { // advance to the next text block with different characteristics c += addr - 1; + if (isWideCharacter) + c++; } } |