summaryrefslogtreecommitdiffstats
path: root/tests/BiDiTests
diff options
context:
space:
mode:
authorFabrice Di Meglio <fdimeglio@google.com>2011-03-08 12:02:59 -0800
committerFabrice Di Meglio <fdimeglio@google.com>2011-03-22 19:36:30 -0700
commit9f82b580d744ce4baf057b061994394dcf239eed (patch)
treed4ca8d62a680a24b710ed7f44adbf783839b5702 /tests/BiDiTests
parentd54952b451b2778629662cab100ac0a414c84583 (diff)
downloadframeworks_base-9f82b580d744ce4baf057b061994394dcf239eed.zip
frameworks_base-9f82b580d744ce4baf057b061994394dcf239eed.tar.gz
frameworks_base-9f82b580d744ce4baf057b061994394dcf239eed.tar.bz2
Use Harfbuzz instead of ICU4C for computing advances
- use Harfbuzz shaper for shaping and getting glyphs - add test app for showing result of drawText() and drawGlyphs() - add private API in Canvas and Paint for test app Change-Id: Ia15be216f8636d2d864066e9b7de2f53008c30f6
Diffstat (limited to 'tests/BiDiTests')
-rw-r--r--tests/BiDiTests/Android.mk27
-rw-r--r--tests/BiDiTests/AndroidManifest.xml36
-rw-r--r--tests/BiDiTests/proguard.flags0
-rw-r--r--tests/BiDiTests/res/layout/biditest_main.xml58
-rw-r--r--tests/BiDiTests/res/values/strings.xml26
-rw-r--r--tests/BiDiTests/src/com/android/bidi/BiDiTestActivity.java43
-rw-r--r--tests/BiDiTests/src/com/android/bidi/BiDiTestView.java190
7 files changed, 380 insertions, 0 deletions
diff --git a/tests/BiDiTests/Android.mk b/tests/BiDiTests/Android.mk
new file mode 100644
index 0000000..ae29fc2
--- /dev/null
+++ b/tests/BiDiTests/Android.mk
@@ -0,0 +1,27 @@
+# Copyright (C) 2011 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+# Only compile source java files in this apk.
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := BiDiTests
+
+LOCAL_PROGUARD_FLAG_FILES := proguard.flags
+
+include $(BUILD_PACKAGE) \ No newline at end of file
diff --git a/tests/BiDiTests/AndroidManifest.xml b/tests/BiDiTests/AndroidManifest.xml
new file mode 100644
index 0000000..346ace8
--- /dev/null
+++ b/tests/BiDiTests/AndroidManifest.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- Declare the contents of this Android application. The namespace
+ attribute brings in the Android platform namespace, and the package
+ supplies a unique name for the application. When writing your
+ own application, the package name must be changed from "com.example.*"
+ to come from a domain that you own or have control over. -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.bidi"
+ android:versionCode="1"
+ android:versionName="1.0">
+
+ <application android:label="BiDiTests">
+ <activity android:name="BiDiTestActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+
+ </application>
+</manifest> \ No newline at end of file
diff --git a/tests/BiDiTests/proguard.flags b/tests/BiDiTests/proguard.flags
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/BiDiTests/proguard.flags
diff --git a/tests/BiDiTests/res/layout/biditest_main.xml b/tests/BiDiTests/res/layout/biditest_main.xml
new file mode 100644
index 0000000..9f77ad2
--- /dev/null
+++ b/tests/BiDiTests/res/layout/biditest_main.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <Button android:id="@+id/button"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:onClick="onButtonClick"
+ android:text="@string/button_text"
+ android:textSize="32dip"
+ />
+
+ <TextView android:id="@+id/textview"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:textSize="32dip"
+ android:text="@string/textview_text"
+ />
+
+ <EditText android:id="@+id/textview"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:textSize="32dip"
+ android:text="@string/edittext_text"
+ />
+
+ </LinearLayout>
+
+ <view class="com.android.bidi.BiDiTestView"
+ android:id="@+id/main"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="#FF0000"
+ />
+
+</LinearLayout> \ No newline at end of file
diff --git a/tests/BiDiTests/res/values/strings.xml b/tests/BiDiTests/res/values/strings.xml
new file mode 100644
index 0000000..ecff76e
--- /dev/null
+++ b/tests/BiDiTests/res/values/strings.xml
@@ -0,0 +1,26 @@
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources>
+ <string name="button_text">Button</string>
+ <string name="textview_text">This is a text for a TextView</string>
+ <string name="edittext_text">mmmmmmmmmmmmmmmmmmmmmmmm</string>
+ <string name="normal_text">Normal String</string>
+ <string name="normal_long_text">mmmmmmmmmmmmmmmmmmmmmmmm</string>
+ <string name="arabic_text">&#x0644;&#x0627;</string>
+ <string name="chinese_text">利比亚局势或影响美俄关系发展</string>
+ <string name="italic_text">Italic String</string>
+ <string name="bold_text">Bold String</string>
+ <string name="bold_italic_text">Bold Italic String</string>
+</resources> \ No newline at end of file
diff --git a/tests/BiDiTests/src/com/android/bidi/BiDiTestActivity.java b/tests/BiDiTests/src/com/android/bidi/BiDiTestActivity.java
new file mode 100644
index 0000000..3d7dd81
--- /dev/null
+++ b/tests/BiDiTests/src/com/android/bidi/BiDiTestActivity.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.bidi;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+
+public class BiDiTestActivity extends Activity {
+
+ static final String TAG = "BiDiTestActivity";
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ setContentView(R.layout.biditest_main);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ }
+
+ public void onButtonClick(View v) {
+ Log.v(TAG, "onButtonClick");
+ }
+} \ No newline at end of file
diff --git a/tests/BiDiTests/src/com/android/bidi/BiDiTestView.java b/tests/BiDiTests/src/com/android/bidi/BiDiTestView.java
new file mode 100644
index 0000000..e9b6fa6
--- /dev/null
+++ b/tests/BiDiTests/src/com/android/bidi/BiDiTestView.java
@@ -0,0 +1,190 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.bidi;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.Typeface;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.View;
+
+public class BiDiTestView extends View {
+
+ private static final String TAG = "BiDiTestView";
+
+ private static final int BORDER_PADDING = 4;
+ private static final int TEXT_PADDING = 16;
+ private static final int TEXT_SIZE = 32;
+ private static final int ORIGIN = 48;
+ private static final int DELTA_Y = TEXT_SIZE;
+
+ private static final float DEFAULT_ITALIC_SKEW_X = -0.25f;
+
+ private Paint paint = new Paint();
+ private Rect rect = new Rect();
+
+ private String NORMAL_TEXT;
+ private String NORMAL_LONG_TEXT;
+ private String ITALIC_TEXT;
+ private String BOLD_TEXT;
+ private String BOLD_ITALIC_TEXT;
+ private String ARABIC_TEXT;
+ private String CHINESE_TEXT;
+
+ private Typeface typeface;
+
+ public BiDiTestView(Context context) {
+ super(context);
+ init(context);
+ }
+
+ public BiDiTestView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init(context);
+ }
+
+ public BiDiTestView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ init(context);
+ }
+
+ private void init(Context context) {
+ NORMAL_TEXT = context.getString(R.string.normal_text);
+ NORMAL_LONG_TEXT = context.getString(R.string.normal_long_text);
+ ITALIC_TEXT = context.getString(R.string.italic_text);
+ BOLD_TEXT = context.getString(R.string.bold_text);
+ BOLD_ITALIC_TEXT = context.getString(R.string.bold_italic_text);
+ ARABIC_TEXT = context.getString(R.string.arabic_text);
+ CHINESE_TEXT = context.getString(R.string.chinese_text);
+
+ typeface = paint.getTypeface();
+ paint.setAntiAlias(true);
+ }
+
+ @Override
+ public void onDraw(Canvas canvas) {
+ drawInsideRect(canvas, Color.BLACK);
+
+ int deltaX = testString(canvas, NORMAL_TEXT, ORIGIN, ORIGIN, paint, typeface,
+ false, false, Paint.DIRECTION_LTR);
+ deltaX += testString(canvas, ITALIC_TEXT, ORIGIN + deltaX, ORIGIN, paint, typeface,
+ true, false, Paint.DIRECTION_LTR);
+ deltaX += testString(canvas, BOLD_TEXT, ORIGIN + deltaX, ORIGIN, paint, typeface,
+ false, true, Paint.DIRECTION_LTR);
+ deltaX += testString(canvas, BOLD_ITALIC_TEXT, ORIGIN + deltaX, ORIGIN, paint, typeface,
+ true, true, Paint.DIRECTION_LTR);
+
+ // Test with a long string
+ deltaX = testString(canvas, NORMAL_LONG_TEXT, ORIGIN, ORIGIN + 2 * DELTA_Y, paint, typeface,
+ false, false, Paint.DIRECTION_LTR);
+
+ // Test Arabic ligature
+ deltaX = testString(canvas, ARABIC_TEXT, ORIGIN, ORIGIN + 4 * DELTA_Y, paint, typeface,
+ false, false, Paint.DIRECTION_RTL);
+
+ // Test Chinese
+ deltaX = testString(canvas, CHINESE_TEXT, ORIGIN, ORIGIN + 6 * DELTA_Y, paint, typeface,
+ false, false, Paint.DIRECTION_LTR);
+ }
+
+ private int testString(Canvas canvas, String text, int x, int y, Paint paint, Typeface typeface,
+ boolean isItalic, boolean isBold, int dir) {
+ paint.setTypeface(typeface);
+
+ // Set paint properties
+ boolean oldFakeBold = paint.isFakeBoldText();
+ paint.setFakeBoldText(isBold);
+
+ float oldTextSkewX = paint.getTextSkewX();
+ if (isItalic) {
+ paint.setTextSkewX(DEFAULT_ITALIC_SKEW_X);
+ }
+
+ drawTextWithCanvasDrawText(text, canvas, x, y, TEXT_SIZE, Color.WHITE);
+
+ int length = text.length();
+ float[] advances = new float[length];
+ float textWidth = paint.getTextRunAdvances(text, 0, length, 0, length, 0, advances, 0);
+
+ logAdvances(text, textWidth, advances);
+ drawBoxAroundText(canvas, x, y, textWidth, TEXT_SIZE, Color.RED);
+
+ paint.setColor(Color.WHITE);
+ char[] glyphs = new char[2*length];
+ int count = getGlyphs(text, glyphs, dir);
+
+ logGlypths(glyphs, count);
+ drawTextWithDrawGlyph(canvas, glyphs, count, x, y + DELTA_Y);
+
+ // Restore old paint properties
+ paint.setFakeBoldText(oldFakeBold);
+ paint.setTextSkewX(oldTextSkewX);
+
+ return (int) Math.ceil(textWidth) + TEXT_PADDING;
+ }
+
+ private void drawTextWithDrawGlyph(Canvas canvas, char[] glyphs, int count, int x, int y) {
+ canvas.drawGlyphs(glyphs, 0, count, x, y, paint);
+ }
+
+ private void logGlypths(char[] glyphs, int count) {
+ Log.v(TAG, "GlyphIds - count=" + count);
+ for (int n = 0; n < count; n++) {
+ Log.v(TAG, "GlyphIds - Id[" + n + "]="+ (int)glyphs[n]);
+ }
+ }
+
+ private int getGlyphs(String text, char[] glyphs, int dir) {
+// int dir = 1; // Paint.DIRECTION_LTR;
+ return paint.getTextGlypths(text, 0, text.length(), 0, text.length(), dir, glyphs);
+ }
+
+ private void drawInsideRect(Canvas canvas, int color) {
+ paint.setColor(color);
+ int width = getWidth();
+ int height = getHeight();
+ rect.set(BORDER_PADDING, BORDER_PADDING, width - BORDER_PADDING, height - BORDER_PADDING);
+ canvas.drawRect(rect, paint);
+ }
+
+ private void drawTextWithCanvasDrawText(String text, Canvas canvas,
+ float x, float y, float textSize, int color) {
+ paint.setColor(color);
+ paint.setTextSize(textSize);
+ canvas.drawText(text, x, y, paint);
+ }
+
+ private void drawBoxAroundText(Canvas canvas, int x, int y, float textWidth, int textSize,
+ int color) {
+ paint.setColor(color);
+ canvas.drawLine(x, y - textSize, x, y + 8, paint);
+ canvas.drawLine(x, y + 8, x + textWidth, y + 8, paint);
+ canvas.drawLine(x + textWidth, y - textSize, x + textWidth, y + 8, paint);
+ }
+
+ private void logAdvances(String text, float textWidth, float[] advances) {
+ Log.v(TAG, "Advances for text: " + text + " total=" + textWidth);
+ int length = advances.length;
+ for(int n=0; n<length; n++){
+ Log.v(TAG, "adv[" + n + "]=" + advances[n]);
+ }
+ }
+}