diff options
author | Fabrice Di Meglio <fdimeglio@google.com> | 2011-03-08 12:02:59 -0800 |
---|---|---|
committer | Fabrice Di Meglio <fdimeglio@google.com> | 2011-03-22 19:36:30 -0700 |
commit | 9f82b580d744ce4baf057b061994394dcf239eed (patch) | |
tree | d4ca8d62a680a24b710ed7f44adbf783839b5702 /tests/BiDiTests | |
parent | d54952b451b2778629662cab100ac0a414c84583 (diff) | |
download | frameworks_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.mk | 27 | ||||
-rw-r--r-- | tests/BiDiTests/AndroidManifest.xml | 36 | ||||
-rw-r--r-- | tests/BiDiTests/proguard.flags | 0 | ||||
-rw-r--r-- | tests/BiDiTests/res/layout/biditest_main.xml | 58 | ||||
-rw-r--r-- | tests/BiDiTests/res/values/strings.xml | 26 | ||||
-rw-r--r-- | tests/BiDiTests/src/com/android/bidi/BiDiTestActivity.java | 43 | ||||
-rw-r--r-- | tests/BiDiTests/src/com/android/bidi/BiDiTestView.java | 190 |
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">لا</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]); + } + } +} |