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

Commit 2a0a4789 authored by Romain Guy's avatar Romain Guy Committed by Android (Google) Code Review
Browse files

Merge "Add preliminary support for text rendering."

parents af8976e5 a1db5740
Loading
Loading
Loading
Loading
+33 −4
Original line number Diff line number Diff line
@@ -32,6 +32,11 @@ import android.graphics.RectF;
import android.graphics.Region;
import android.graphics.Shader;
import android.graphics.SweepGradient;
import android.graphics.TemporaryBuffer;
import android.text.GraphicsOperations;
import android.text.SpannableString;
import android.text.SpannedString;
import android.text.TextUtils;

import javax.microedition.khronos.opengles.GL;

@@ -574,22 +579,46 @@ class GLES20Canvas extends Canvas {

    @Override
    public void drawText(char[] text, int index, int count, float x, float y, Paint paint) {
        // TODO: Implement
        if ((index | count | (index + count) | (text.length - index - count)) < 0) {
            throw new IndexOutOfBoundsException();
        }
        nDrawText(mRenderer, text, index, count, x, y, paint.mBidiFlags, paint.mNativePaint);
    }
    
    private native void nDrawText(int renderer, char[] text, int index, int count, float x, float y,
            int bidiFlags, int paint);

    @Override
    public void drawText(CharSequence text, int start, int end, float x, float y, Paint paint) {
        // TODO: Implement
        if (text instanceof String || text instanceof SpannedString ||
                text instanceof SpannableString) {
            nDrawText(mRenderer, text.toString(), start, end, x, y, paint.mBidiFlags,
                    paint.mNativePaint);
        } else if (text instanceof GraphicsOperations) {
            ((GraphicsOperations) text).drawText(this, start, end, x, y,
                                                     paint);
        } else {
            char[] buf = TemporaryBuffer.obtain(end - start);
            TextUtils.getChars(text, start, end, buf, 0);
            nDrawText(mRenderer, buf, 0, end - start, x, y, paint.mBidiFlags, paint.mNativePaint);
            TemporaryBuffer.recycle(buf);
        }
    }

    @Override
    public void drawText(String text, int start, int end, float x, float y, Paint paint) {
        // TODO: Implement
        if ((start | end | (end - start) | (text.length() - end)) < 0) {
            throw new IndexOutOfBoundsException();
        }
        nDrawText(mRenderer, text, start, end, x, y, paint.mBidiFlags, paint.mNativePaint);
    }

    private native void nDrawText(int renderer, String text, int start, int end, float x, float y,
            int bidiFlags, int paint);

    @Override
    public void drawText(String text, float x, float y, Paint paint) {
        drawText(text, 0, text.length(), x, y, paint);
        nDrawText(mRenderer, text, 0, text.length(), x, y, paint.mBidiFlags, paint.mNativePaint);
    }

    @Override
+7 −1
Original line number Diff line number Diff line
@@ -130,7 +130,13 @@ static SkTypeface* Typeface_createFromAsset(JNIEnv* env, jobject,
        return NULL;
    }
    
    return SkTypeface::CreateFromStream(new AssetStream(asset, true));
    SkStream* stream = new AssetStream(asset, true);
    SkTypeface* face = SkTypeface::CreateFromStream(stream);
    // SkTypeFace::CreateFromStream calls ref() on the stream, so we
    // need to unref it here or it won't be freed later on
    stream->unref();

    return face;
}

static SkTypeface* Typeface_createFromFile(JNIEnv* env, jobject, jstring jpath) {
+27 −1
Original line number Diff line number Diff line
@@ -14,6 +14,8 @@
 * limitations under the License.
 */

#define LOG_TAG "OpenGLRenderer"

#include "jni.h"
#include <nativehelper/JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
@@ -24,6 +26,7 @@
#include <SkMatrix.h>
#include <SkPaint.h>
#include <SkRegion.h>
#include <SkScalerContext.h>
#include <SkXfermode.h>

#include <OpenGLRenderer.h>
@@ -207,7 +210,6 @@ static void android_view_GLES20Canvas_drawPatch(JNIEnv* env, jobject canvas,

    renderer->drawPatch(bitmap, patch, left, top, right, bottom, paint);

    // TODO: make sure that 0 is correct for the flags
    env->ReleaseByteArrayElements(chunks, storage, 0);
}

@@ -245,6 +247,26 @@ static void android_view_GLES20Canvas_setupLinearShader(JNIEnv* env, jobject can
            tileMode, matrix, (shader->getFlags() & SkShader::kOpaqueAlpha_Flag) == 0);
}

// ----------------------------------------------------------------------------
// Text
// ----------------------------------------------------------------------------

static void android_view_GLES20Canvas_drawTextArray(JNIEnv* env, jobject canvas,
        OpenGLRenderer* renderer, jcharArray text, int index, int count,
        jfloat x, jfloat y, int flags, SkPaint* paint) {
    jchar* textArray = env->GetCharArrayElements(text, NULL);
    // TODO: draw from textArray + index
    env->ReleaseCharArrayElements(text, textArray, JNI_ABORT);
}

static void android_view_GLES20Canvas_drawText(JNIEnv* env, jobject canvas,
        OpenGLRenderer* renderer, jstring text, int start, int end,
        jfloat x, jfloat y, int flags, SkPaint* paint) {
    const jchar* textArray = env->GetStringChars(text, NULL);
    // TODO: draw from textArray + start
    env->ReleaseStringChars(text, textArray);
}

// ----------------------------------------------------------------------------
// JNI Glue
// ----------------------------------------------------------------------------
@@ -288,6 +310,10 @@ static JNINativeMethod gMethods[] = {
    {   "nSetupBitmapShader", "(IIIIII)V",       (void*) android_view_GLES20Canvas_setupBitmapShader },
    {   "nSetupLinearShader", "(IIIIIIII)V",     (void*) android_view_GLES20Canvas_setupLinearShader },

    {   "nDrawText",          "(I[CIIFFII)V",    (void*) android_view_GLES20Canvas_drawTextArray },
    {   "nDrawText",          "(ILjava/lang/String;IIFFII)V",
            (void*) android_view_GLES20Canvas_drawText },

    {   "nGetClipBounds",     "(ILandroid/graphics/Rect;)Z",
            (void*) android_view_GLES20Canvas_getClipBounds },
};
+2 −4
Original line number Diff line number Diff line
@@ -34,13 +34,11 @@ static void android_view_HardwareRenderer_abandonGlCaches(JNIEnv* env, jobject)
const char* const kClassPathName = "android/view/HardwareRenderer";

static JNINativeMethod gMethods[] = {
    {   "nativeAbandonGlCaches", "()V", 
                                (void*)android_view_HardwareRenderer_abandonGlCaches },
    {   "nativeAbandonGlCaches", "()V", (void*)android_view_HardwareRenderer_abandonGlCaches },
};

int register_android_view_HardwareRenderer(JNIEnv* env) {
    return AndroidRuntime::registerNativeMethods(env,
            kClassPathName, gMethods, NELEM(gMethods));
    return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
}

};
+4 −1
Original line number Diff line number Diff line
@@ -43,7 +43,10 @@ public class Paint {
    private boolean     mHasCompatScaling;
    private float       mCompatScaling;
    private float       mInvCompatScaling;
    /* package */ int   mBidiFlags = BIDI_DEFAULT_LTR;
    /**
     * @hide
     */
    public  int         mBidiFlags = BIDI_DEFAULT_LTR;
    
    private static final Style[] sStyleArray = {
        Style.FILL, Style.STROKE, Style.FILL_AND_STROKE
Loading