diff options
author | Fabrice Di Meglio <fdimeglio@google.com> | 2013-03-15 11:26:56 -0700 |
---|---|---|
committer | Fabrice Di Meglio <fdimeglio@google.com> | 2013-03-15 11:26:56 -0700 |
commit | da12f389eb4be0c08ca3fa9ca7663f4977858df5 (patch) | |
tree | b1bf0853765bb1bb4728073b8f08982131d1cc04 /tests | |
parent | 19f46b0d7a1cdba362bc3d6fc8e9251307e96bd4 (diff) | |
download | frameworks_base-da12f389eb4be0c08ca3fa9ca7663f4977858df5.zip frameworks_base-da12f389eb4be0c08ca3fa9ca7663f4977858df5.tar.gz frameworks_base-da12f389eb4be0c08ca3fa9ca7663f4977858df5.tar.bz2 |
Revert "Clean Paint.mBidiFlags as it is no longer used"
This reverts commit 6d9fe5bd22b531bfce69b146254a4791c76acddc.
Diffstat (limited to 'tests')
4 files changed, 320 insertions, 0 deletions
diff --git a/tests/BiDiTests/res/layout/canvas.xml b/tests/BiDiTests/res/layout/canvas.xml new file mode 100644 index 0000000..0319a83 --- /dev/null +++ b/tests/BiDiTests/res/layout/canvas.xml @@ -0,0 +1,40 @@ +<?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. +--> + +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/canvas" + android:layout_width="fill_parent" + android:layout_height="fill_parent"> + + <LinearLayout android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <SeekBar android:id="@+id/seekbar" + android:layout_height="wrap_content" + android:layout_width="match_parent" + /> + + <view class="com.android.bidi.BiDiTestView" + android:id="@+id/testview" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="#FF0000" + /> + + </LinearLayout> + +</FrameLayout>
\ 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 index b88a885..209597e 100644 --- a/tests/BiDiTests/src/com/android/bidi/BiDiTestActivity.java +++ b/tests/BiDiTests/src/com/android/bidi/BiDiTestActivity.java @@ -101,6 +101,7 @@ public class BiDiTestActivity extends Activity { addItem(result, "Basic", BiDiTestBasic.class, R.id.basic); + addItem(result, "Canvas", BiDiTestCanvas.class, R.id.canvas); addItem(result, "Canvas2", BiDiTestCanvas2.class, R.id.canvas2); addItem(result, "TextView LTR", BiDiTestTextViewLtr.class, R.id.textview_ltr); diff --git a/tests/BiDiTests/src/com/android/bidi/BiDiTestCanvas.java b/tests/BiDiTests/src/com/android/bidi/BiDiTestCanvas.java new file mode 100644 index 0000000..33ed731 --- /dev/null +++ b/tests/BiDiTests/src/com/android/bidi/BiDiTestCanvas.java @@ -0,0 +1,67 @@ +/* + * 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.Fragment; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.SeekBar; + +import static com.android.bidi.BiDiTestConstants.FONT_MAX_SIZE; +import static com.android.bidi.BiDiTestConstants.FONT_MIN_SIZE; + +public class BiDiTestCanvas extends Fragment { + + static final int INIT_TEXT_SIZE = (FONT_MAX_SIZE - FONT_MIN_SIZE) / 2; + + private BiDiTestView testView; + private SeekBar textSizeSeekBar; + private View currentView; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + currentView = inflater.inflate(R.layout.canvas, container, false); + return currentView; + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + testView = (BiDiTestView) currentView.findViewById(R.id.testview); + testView.setCurrentTextSize(INIT_TEXT_SIZE); + + textSizeSeekBar = (SeekBar) currentView.findViewById(R.id.seekbar); + textSizeSeekBar.setProgress(INIT_TEXT_SIZE); + textSizeSeekBar.setMax(FONT_MAX_SIZE - FONT_MIN_SIZE); + + textSizeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + testView.setCurrentTextSize(FONT_MIN_SIZE + progress); + } + + public void onStartTrackingTouch(SeekBar seekBar) { + } + + public void onStopTrackingTouch(SeekBar seekBar) { + } + }); + } +} 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..0b1974a --- /dev/null +++ b/tests/BiDiTests/src/com/android/bidi/BiDiTestView.java @@ -0,0 +1,212 @@ +/* + * 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.text.TextPaint; +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 = 16; + private static final int ORIGIN = 80; + + private static final float DEFAULT_ITALIC_SKEW_X = -0.25f; + + private Rect rect = new Rect(); + + private String NORMAL_TEXT; + private String NORMAL_LONG_TEXT; + private String NORMAL_LONG_TEXT_2; + private String NORMAL_LONG_TEXT_3; + private String ITALIC_TEXT; + private String BOLD_TEXT; + private String BOLD_ITALIC_TEXT; + private String ARABIC_TEXT; + private String CHINESE_TEXT; + private String MIXED_TEXT_1; + private String HEBREW_TEXT; + private String RTL_TEXT; + private String THAI_TEXT; + + private int currentTextSize; + + 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); + NORMAL_LONG_TEXT_2 = context.getString(R.string.normal_long_text_2); + NORMAL_LONG_TEXT_3 = context.getString(R.string.normal_long_text_3); + 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); + MIXED_TEXT_1 = context.getString(R.string.mixed_text_1); + HEBREW_TEXT = context.getString(R.string.hebrew_text); + RTL_TEXT = context.getString(R.string.rtl); + THAI_TEXT = context.getString(R.string.pointer_location); + } + + public void setCurrentTextSize(int size) { + currentTextSize = size; + invalidate(); + } + + @Override + public void onDraw(Canvas canvas) { + drawInsideRect(canvas, new Paint(), Color.BLACK); + + int deltaX = 0; + + deltaX = testString(canvas, NORMAL_TEXT, ORIGIN, ORIGIN, + false, false, Paint.DIRECTION_LTR, currentTextSize); + + deltaX += testString(canvas, ITALIC_TEXT, ORIGIN + deltaX, ORIGIN, + true, false, Paint.DIRECTION_LTR, currentTextSize); + + deltaX += testString(canvas, BOLD_TEXT, ORIGIN + deltaX, ORIGIN, + false, true, Paint.DIRECTION_LTR, currentTextSize); + + deltaX += testString(canvas, BOLD_ITALIC_TEXT, ORIGIN + deltaX, ORIGIN, + true, true, Paint.DIRECTION_LTR, currentTextSize); + + // Test with a long string + deltaX = testString(canvas, NORMAL_LONG_TEXT, ORIGIN, ORIGIN + 2 * currentTextSize, + false, false, Paint.DIRECTION_LTR, currentTextSize); + + // Test with a long string + deltaX = testString(canvas, NORMAL_LONG_TEXT_2, ORIGIN, ORIGIN + 4 * currentTextSize, + false, false, Paint.DIRECTION_LTR, currentTextSize); + + // Test with a long string + deltaX = testString(canvas, NORMAL_LONG_TEXT_3, ORIGIN, ORIGIN + 6 * currentTextSize, + false, false, Paint.DIRECTION_LTR, currentTextSize); + + // Test Arabic ligature + deltaX = testString(canvas, ARABIC_TEXT, ORIGIN, ORIGIN + 8 * currentTextSize, + false, false, Paint.DIRECTION_RTL, currentTextSize); + + // Test Chinese + deltaX = testString(canvas, CHINESE_TEXT, ORIGIN, ORIGIN + 10 * currentTextSize, + false, false, Paint.DIRECTION_LTR, currentTextSize); + + // Test Mixed (English and Arabic) + deltaX = testString(canvas, MIXED_TEXT_1, ORIGIN, ORIGIN + 12 * currentTextSize, + false, false, Paint.DIRECTION_LTR, currentTextSize); + + // Test Hebrew + deltaX = testString(canvas, RTL_TEXT, ORIGIN, ORIGIN + 14 * currentTextSize, + false, false, Paint.DIRECTION_RTL, currentTextSize); + + // Test Thai + deltaX = testString(canvas, THAI_TEXT, ORIGIN, ORIGIN + 16 * currentTextSize, + false, false, Paint.DIRECTION_LTR, currentTextSize); + } + + private int testString(Canvas canvas, String text, int x, int y, + boolean isItalic, boolean isBold, int dir, int textSize) { + + TextPaint paint = new TextPaint(); + paint.setAntiAlias(true); + + // Set paint properties + boolean oldFakeBold = paint.isFakeBoldText(); + paint.setFakeBoldText(isBold); + + float oldTextSkewX = paint.getTextSkewX(); + if (isItalic) { + paint.setTextSkewX(DEFAULT_ITALIC_SKEW_X); + } + + paint.setTextSize(textSize); + paint.setColor(Color.WHITE); + canvas.drawText(text, x, y, paint); + + int length = text.length(); + float[] advances = new float[length]; + float textWidthHB = paint.getTextRunAdvances(text, 0, length, 0, length, dir, advances, 0); + setPaintDir(paint, dir); + float textWidthICU = paint.getTextRunAdvances(text, 0, length, 0, length, dir, advances, 0, + 1 /* use ICU */); + + logAdvances(text, textWidthHB, textWidthICU, advances); + drawMetricsAroundText(canvas, x, y, textWidthHB, textWidthICU, textSize, Color.RED, Color.GREEN); + + // Restore old paint properties + paint.setFakeBoldText(oldFakeBold); + paint.setTextSkewX(oldTextSkewX); + + return (int) Math.ceil(textWidthHB) + TEXT_PADDING; + } + + private void setPaintDir(Paint paint, int dir) { + Log.v(TAG, "Setting Paint dir=" + dir); + paint.setBidiFlags(dir); + } + + private void drawInsideRect(Canvas canvas, Paint paint, 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 drawMetricsAroundText(Canvas canvas, int x, int y, float textWidthHB, + float textWidthICU, int textSize, int color, int colorICU) { + Paint paint = new Paint(); + paint.setColor(color); + canvas.drawLine(x, y - textSize, x, y + 8, paint); + canvas.drawLine(x, y + 8, x + textWidthHB, y + 8, paint); + canvas.drawLine(x + textWidthHB, y - textSize, x + textWidthHB, y + 8, paint); + paint.setColor(colorICU); + canvas.drawLine(x + textWidthICU, y - textSize, x + textWidthICU, y + 8, paint); + } + + private void logAdvances(String text, float textWidth, float textWidthICU, float[] advances) { + Log.v(TAG, "Advances for text: " + text + " total= " + textWidth + " - totalICU= " + textWidthICU); +// int length = advances.length; +// for(int n=0; n<length; n++){ +// Log.v(TAG, "adv[" + n + "]=" + advances[n]); +// } + } +} |