Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bf0adf3b authored by Diego Perez's avatar Diego Perez Committed by Android (Google) Code Review
Browse files

Merge "More layoutlib delegate native methods to do text rendering."

parents 6a38e43b 6386b8da
Loading
Loading
Loading
Loading
+57 −6
Original line number Diff line number Diff line
@@ -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;
    }
}