diff options
author | Kenny Root <kenny@the-b.org> | 2010-10-08 01:08:02 -0500 |
---|---|---|
committer | Kenny Root <kenny@the-b.org> | 2010-10-08 01:08:02 -0500 |
commit | 409d414dc5b943ae3992fe2a6e161af18b212c94 (patch) | |
tree | 0730ad36c3f4414532e6094c74c96d588c8976df /src | |
parent | ddb146dda845fd2a17c304df69b616465f5f4350 (diff) | |
download | connectbot-409d414dc5b943ae3992fe2a6e161af18b212c94.tar.gz connectbot-409d414dc5b943ae3992fe2a6e161af18b212c94.tar.bz2 connectbot-409d414dc5b943ae3992fe2a6e161af18b212c94.zip |
Use Froyo East Asian width measurement and drop JNI lib
Diffstat (limited to 'src')
-rw-r--r-- | src/org/connectbot/service/Relay.java | 27 | ||||
-rw-r--r-- | src/org/connectbot/util/EastAsianWidth.java | 65 |
2 files changed, 45 insertions, 47 deletions
diff --git a/src/org/connectbot/service/Relay.java b/src/org/connectbot/service/Relay.java index 18bf896..d91cce8 100644 --- a/src/org/connectbot/service/Relay.java +++ b/src/org/connectbot/service/Relay.java @@ -41,8 +41,6 @@ public class Relay implements Runnable { private static final int BUFFER_SIZE = 4096; - private static boolean useJNI = true; - private TerminalBridge bridge; private Charset currentCharset; @@ -59,10 +57,6 @@ public class Relay implements Runnable { private byte[] byteArray; private char[] charArray; - static { - useJNI = EastAsianWidth.useJNI; - } - public Relay(TerminalBridge bridge, AbsTransport transport, vt320 buffer, String encoding) { setCharset(encoding); this.bridge = bridge; @@ -100,16 +94,9 @@ public class Relay implements Runnable { byteBuffer = ByteBuffer.allocate(BUFFER_SIZE); charBuffer = CharBuffer.allocate(BUFFER_SIZE); - /* for both JNI and non-JNI method */ + /* for East Asian character widths */ byte[] wideAttribute = new byte[BUFFER_SIZE]; - /* non-JNI fallback method */ - float[] widths = null; - - if (!useJNI) { - widths = new float[BUFFER_SIZE]; - } - byteArray = byteBuffer.array(); charArray = charBuffer.array(); @@ -121,6 +108,8 @@ public class Relay implements Runnable { int offset; int charWidth; + EastAsianWidth measurer = EastAsianWidth.getInstance(); + try { while (true) { charWidth = bridge.charWidth; @@ -144,15 +133,7 @@ public class Relay implements Runnable { offset = charBuffer.position(); - if (!useJNI) { - bridge.defaultPaint.getTextWidths(charArray, 0, offset, widths); - for (int i = 0; i < offset; i++) - wideAttribute[i] = - (byte) (((int)widths[i] != charWidth) ? 1 : 0); - } else { - EastAsianWidth.measure(charArray, 0, charBuffer.position(), - wideAttribute, isLegacyEastAsian); - } + measurer.measure(charArray, 0, offset, wideAttribute, bridge.defaultPaint, charWidth); buffer.putString(charArray, wideAttribute, 0, charBuffer.position()); charBuffer.clear(); bridge.redraw(); diff --git a/src/org/connectbot/util/EastAsianWidth.java b/src/org/connectbot/util/EastAsianWidth.java index b27cd48..0e274b5 100644 --- a/src/org/connectbot/util/EastAsianWidth.java +++ b/src/org/connectbot/util/EastAsianWidth.java @@ -17,42 +17,59 @@ package org.connectbot.util; -import android.util.Log; +import android.graphics.Paint; +import android.text.AndroidCharacter; /** * @author Kenny Root * */ -public class EastAsianWidth { - public static boolean useJNI = false; - private static final String TAG = "ConnectBot.EastAsianWidth"; +public abstract class EastAsianWidth { + public static EastAsianWidth getInstance() { + if (PreferenceConstants.PRE_FROYO) + return PreFroyo.Holder.sInstance; + else + return FroyoAndBeyond.Holder.sInstance; + } /** * @param charArray * @param i * @param position * @param wideAttribute - * @param isLegacyEastAsian */ - public native static void measure(char[] charArray, int start, int end, - byte[] wideAttribute, boolean isLegacyEastAsian); - - static { - try { - System.loadLibrary("org_connectbot_util_EastAsianWidth"); - - char[] testInput = {(char)0x4EBA}; - byte[] testResult = new byte[1]; - measure(testInput, 0, 1, testResult, true); - - if (testResult[0] == 1) - useJNI = true; - else - Log.d(TAG, "EastAsianWidth JNI measuring not available"); - } catch (Exception e) { - // Failure - } catch (UnsatisfiedLinkError e1) { - // Failure + public abstract void measure(char[] charArray, int start, int end, + byte[] wideAttribute, Paint paint, int charWidth); + + private static class PreFroyo extends EastAsianWidth { + private static final int BUFFER_SIZE = 4096; + private float[] mWidths = new float[BUFFER_SIZE]; + + private static class Holder { + private static final PreFroyo sInstance = new PreFroyo(); + } + + @Override + public void measure(char[] charArray, int start, int end, + byte[] wideAttribute, Paint paint, int charWidth) { + paint.getTextWidths(charArray, start, end, mWidths); + final int N = end - start; + for (int i = 0; i < N; i++) + wideAttribute[i] = (byte) (((int)mWidths[i] != charWidth) ? + AndroidCharacter.EAST_ASIAN_WIDTH_WIDE : + AndroidCharacter.EAST_ASIAN_WIDTH_NARROW); + } + } + + private static class FroyoAndBeyond extends EastAsianWidth { + private static class Holder { + private static final FroyoAndBeyond sInstance = new FroyoAndBeyond(); + } + + @Override + public void measure(char[] charArray, int start, int end, + byte[] wideAttribute, Paint paint, int charWidth) { + AndroidCharacter.getEastAsianWidths(charArray, start, end - start, wideAttribute); } } } |