diff options
author | Diego Perez <diegoperez@google.com> | 2015-03-23 16:22:59 +0000 |
---|---|---|
committer | Diego Perez <diegoperez@google.com> | 2015-03-26 14:39:12 +0000 |
commit | 6386b8dae77dc264513e6da2e48a6abaa3eed8b2 (patch) | |
tree | 2291c9be9cafc0b8ec704ce4ccc0c8233c8c931a | |
parent | a55c27a79b01a7903c765618a174c2273804a249 (diff) | |
download | frameworks_base-6386b8dae77dc264513e6da2e48a6abaa3eed8b2.zip frameworks_base-6386b8dae77dc264513e6da2e48a6abaa3eed8b2.tar.gz frameworks_base-6386b8dae77dc264513e6da2e48a6abaa3eed8b2.tar.bz2 |
More layoutlib delegate native methods to do text rendering.
Moving some more methods to measure the text and compute the line
breaks.
The missing methods were causing crashes when running layoutlib from
master.
Change-Id: I910e1509836186fcff5cdd40c1dc38466b44c434
-rw-r--r-- | tools/layoutlib/bridge/src/android/text/StaticLayout_Delegate.java | 63 |
1 files changed, 57 insertions, 6 deletions
diff --git a/tools/layoutlib/bridge/src/android/text/StaticLayout_Delegate.java b/tools/layoutlib/bridge/src/android/text/StaticLayout_Delegate.java index e24b3d5..86d8da3 100644 --- a/tools/layoutlib/bridge/src/android/text/StaticLayout_Delegate.java +++ b/tools/layoutlib/bridge/src/android/text/StaticLayout_Delegate.java @@ -4,10 +4,15 @@ import com.android.annotations.NonNull; import com.android.layoutlib.bridge.impl.DelegateManager; import com.android.tools.layoutlib.annotations.LayoutlibDelegate; +import android.graphics.BidiRenderer; +import android.graphics.Paint; +import android.graphics.Paint_Delegate; +import android.graphics.RectF; import android.text.StaticLayout.LineBreaks; import android.text.Primitive.PrimitiveType; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import com.ibm.icu.text.BreakIterator; @@ -33,7 +38,7 @@ public class StaticLayout_Delegate { new DelegateManager<Builder>(Builder.class); @LayoutlibDelegate - /*package*/ static int nComputeLineBreaks(long nativeBuilder, char[] inputText, float[] widths, + /*package*/ static int nComputeLineBreaks(long nativeBuilder, int length, float firstWidth, int firstWidthLineCount, float restWidth, int[] variableTabStops, int defaultTabStop, boolean optimize, LineBreaks recycle, int[] recycleBreaks, float[] recycleWidths, boolean[] recycleFlags, int recycleLength) { @@ -41,7 +46,7 @@ public class StaticLayout_Delegate { Builder builder = sBuilderManager.getDelegate(nativeBuilder); // compute all possible breakpoints. BreakIterator it = BreakIterator.getLineInstance(new ULocale(builder.mLocale)); - it.setText(new Segment(inputText, 0, length)); + it.setText(new Segment(builder.mText, 0, length)); // average word length in english is 5. So, initialize the possible breaks with a guess. List<Integer> breaks = new ArrayList<Integer>((int) Math.ceil(length / 5d)); int loc; @@ -52,7 +57,7 @@ public class StaticLayout_Delegate { LineWidth lineWidth = new LineWidth(firstWidth, firstWidthLineCount, restWidth); TabStops tabStopCalculator = new TabStops(variableTabStops, defaultTabStop); - List<Primitive> primitives = computePrimitives(inputText, widths, length, breaks); + List<Primitive> primitives = computePrimitives(builder.mText, builder.mWidths, length, breaks); LineBreaker lineBreaker; if (optimize) { lineBreaker = new OptimizingLineBreaker(primitives, lineWidth, tabStopCalculator); @@ -119,16 +124,62 @@ public class StaticLayout_Delegate { } @LayoutlibDelegate - /*package*/ static void nBuilderSetLocale(long nativeBuilder, String locale) { + /*package*/ static void nSetLocale(long nativeBuilder, String locale) { Builder builder = sBuilderManager.getDelegate(nativeBuilder); builder.mLocale = locale; } + @LayoutlibDelegate + /*package*/ static void nSetText(long nativeBuilder, char[] text, int length) { + Builder builder = sBuilderManager.getDelegate(nativeBuilder); + builder.mText = text; + builder.mWidths = new float[length]; + } + + + @LayoutlibDelegate + /*package*/ static float nAddStyleRun(long nativeBuilder, long nativePaint, long nativeTypeface, + int start, int end, boolean isRtl) { + Builder builder = sBuilderManager.getDelegate(nativeBuilder); + + int bidiFlags = isRtl ? Paint.BIDI_FORCE_RTL : Paint.BIDI_FORCE_LTR; + return measureText(nativePaint, builder.mText, start, end - start, builder.mWidths, bidiFlags); + } + + + @LayoutlibDelegate + /*package*/ static void nAddMeasuredRun(long nativeBuilder, int start, int end, float[] widths) { + Builder builder = sBuilderManager.getDelegate(nativeBuilder); + System.arraycopy(widths, start, builder.mWidths, start, end - start); + } + + @LayoutlibDelegate + /*package*/ static void nAddReplacementRun(long nativeBuilder, int start, int end, float width) { + Builder builder = sBuilderManager.getDelegate(nativeBuilder); + builder.mWidths[start] = width; + Arrays.fill(builder.mWidths, start + 1, end, 0.0f); + } + + @LayoutlibDelegate + /*package*/ static void nGetWidths(long nativeBuilder, float[] floatsArray) { + Builder builder = sBuilderManager.getDelegate(nativeBuilder); + System.arraycopy(builder.mWidths, 0, floatsArray, 0, builder.mWidths.length); + } + + private static float measureText(long nativePaint, char []text, int index, int count, + float[] widths, int bidiFlags) { + Paint_Delegate paint = Paint_Delegate.getDelegate(nativePaint); + RectF bounds = new BidiRenderer(null, paint, text) + .renderText(index, index + count, bidiFlags, widths, 0, false); + return bounds.right - bounds.left; + } + /** - * Java representation of the native Builder class. It currently only stores the locale - * set by nBuilderSetLocale. + * Java representation of the native Builder class. */ static class Builder { String mLocale; + char[] mText; + float[] mWidths; } } |