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

Commit ad93c2bb authored by Chet Haase's avatar Chet Haase
Browse files

Optimizing ColorFilter in display lists

Change-Id: Ie4d5e5b0bc45e0ce47bba144049303c270762e54
parent 78098341
Loading
Loading
Loading
Loading
+21 −11
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@
#include "SkPorterDuff.h"

#include <SkiaColorFilter.h>
#include <Caches.h>

namespace android {

@@ -32,28 +33,37 @@ using namespace uirenderer;
class SkColorFilterGlue {
public:
    static void finalizer(JNIEnv* env, jobject clazz, SkColorFilter* obj, SkiaColorFilter* f) {
        delete f;
        obj->safeUnref();
        // f == NULL when not !USE_OPENGL_RENDERER, so no need to delete outside the ifdef
#ifdef USE_OPENGL_RENDERER
        if (android::uirenderer::Caches::hasInstance()) {
            android::uirenderer::Caches::getInstance().resourceCache.destructor(f);
        } else {
            delete f;
        }
#endif
    }

    static SkiaColorFilter* glCreatePorterDuffFilter(JNIEnv* env, jobject, jint srcColor,
            SkPorterDuff::Mode mode) {
    static SkiaColorFilter* glCreatePorterDuffFilter(JNIEnv* env, jobject, SkColorFilter *skFilter,
            jint srcColor, SkPorterDuff::Mode mode) {
#ifdef USE_OPENGL_RENDERER
        return new SkiaBlendFilter(srcColor, SkPorterDuff::ToXfermodeMode(mode));
        return new SkiaBlendFilter(skFilter, srcColor, SkPorterDuff::ToXfermodeMode(mode));
#else
        return NULL;
#endif
    }

    static SkiaColorFilter* glCreateLightingFilter(JNIEnv* env, jobject, jint mul, jint add) {
    static SkiaColorFilter* glCreateLightingFilter(JNIEnv* env, jobject, SkColorFilter *skFilter,
            jint mul, jint add) {
#ifdef USE_OPENGL_RENDERER
        return new SkiaLightingFilter(mul, add);
        return new SkiaLightingFilter(skFilter, mul, add);
#else
        return NULL;
#endif
    }

    static SkiaColorFilter* glCreateColorMatrixFilter(JNIEnv* env, jobject, jfloatArray jarray) {
    static SkiaColorFilter* glCreateColorMatrixFilter(JNIEnv* env, jobject, SkColorFilter *skFilter,
            jfloatArray jarray) {
#ifdef USE_OPENGL_RENDERER
        AutoJavaFloatArray autoArray(env, jarray, 20);
        const float* src = autoArray.ptr();
@@ -70,7 +80,7 @@ public:
        colorVector[2] = src[14];
        colorVector[3] = src[19];

        return new SkiaColorMatrixFilter(colorMatrix, colorVector);
        return new SkiaColorMatrixFilter(skFilter, colorMatrix, colorVector);
#else
        return NULL;
#endif
@@ -107,17 +117,17 @@ static JNINativeMethod colorfilter_methods[] = {

static JNINativeMethod porterduff_methods[] = {
    { "native_CreatePorterDuffFilter", "(II)I", (void*) SkColorFilterGlue::CreatePorterDuffFilter   },
    { "nCreatePorterDuffFilter",       "(II)I", (void*) SkColorFilterGlue::glCreatePorterDuffFilter }
    { "nCreatePorterDuffFilter",       "(III)I", (void*) SkColorFilterGlue::glCreatePorterDuffFilter }
};

static JNINativeMethod lighting_methods[] = {
    { "native_CreateLightingFilter", "(II)I", (void*) SkColorFilterGlue::CreateLightingFilter   },
    { "nCreateLightingFilter",       "(II)I", (void*) SkColorFilterGlue::glCreateLightingFilter },
    { "nCreateLightingFilter",       "(III)I", (void*) SkColorFilterGlue::glCreateLightingFilter },
};

static JNINativeMethod colormatrix_methods[] = {
    { "nativeColorMatrixFilter", "([F)I", (void*) SkColorFilterGlue::CreateColorMatrixFilter   },
    { "nColorMatrixFilter",      "([F)I", (void*) SkColorFilterGlue::glCreateColorMatrixFilter }
    { "nColorMatrixFilter",      "(I[F)I", (void*) SkColorFilterGlue::glCreateColorMatrixFilter }
};

#define REG(env, name, array) \
+2 −0
Original line number Diff line number Diff line
@@ -58,6 +58,8 @@ static void Shader_destructor(JNIEnv* env, jobject o, SkShader* shader, SkiaShad
#ifdef USE_OPENGL_RENDERER
    if (android::uirenderer::Caches::hasInstance()) {
        android::uirenderer::Caches::getInstance().resourceCache.destructor(skiaShader);
    } else {
        delete skiaShader;
    }
#endif
}
+3 −3
Original line number Diff line number Diff line
@@ -27,7 +27,7 @@ public class ColorMatrixColorFilter extends ColorFilter {
    public ColorMatrixColorFilter(ColorMatrix matrix) {
        final float[] colorMatrix = matrix.getArray();
        native_instance = nativeColorMatrixFilter(colorMatrix);
        nativeColorFilter = nColorMatrixFilter(colorMatrix);
        nativeColorFilter = nColorMatrixFilter(native_instance, colorMatrix);
    }

    /**
@@ -42,9 +42,9 @@ public class ColorMatrixColorFilter extends ColorFilter {
            throw new ArrayIndexOutOfBoundsException();
        }
        native_instance = nativeColorMatrixFilter(array);
        nativeColorFilter = nColorMatrixFilter(array);
        nativeColorFilter = nColorMatrixFilter(native_instance, array);
    }

    private static native int nativeColorMatrixFilter(float[] array);
    private static native int nColorMatrixFilter(float[] array);
    private static native int nColorMatrixFilter(int nativeFilter, float[] array);
}
+2 −2
Original line number Diff line number Diff line
@@ -30,9 +30,9 @@ public class LightingColorFilter extends ColorFilter {
     */
    public LightingColorFilter(int mul, int add) {
        native_instance = native_CreateLightingFilter(mul, add);
        nativeColorFilter = nCreateLightingFilter(mul, add);
        nativeColorFilter = nCreateLightingFilter(native_instance, mul, add);
    }

    private static native int native_CreateLightingFilter(int mul, int add);
    private static native int nCreateLightingFilter(int mul, int add);
    private static native int nCreateLightingFilter(int nativeFilter, int mul, int add);
}
+3 −2
Original line number Diff line number Diff line
@@ -26,9 +26,10 @@ public class PorterDuffColorFilter extends ColorFilter {
     */
    public PorterDuffColorFilter(int srcColor, PorterDuff.Mode mode) {
        native_instance = native_CreatePorterDuffFilter(srcColor, mode.nativeInt);
        nativeColorFilter = nCreatePorterDuffFilter(srcColor, mode.nativeInt);
        nativeColorFilter = nCreatePorterDuffFilter(native_instance, srcColor, mode.nativeInt);
    }

    private static native int native_CreatePorterDuffFilter(int srcColor, int porterDuffMode);
    private static native int nCreatePorterDuffFilter(int srcColor, int porterDuffMode);
    private static native int nCreatePorterDuffFilter(int nativeFilter, int srcColor,
            int porterDuffMode);
}
Loading