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

Commit b244fb52 authored by ztenghui's avatar ztenghui
Browse files

Make sure we handle the matrix separately for non-invertable matrix

b/36895991
Test: added CTS tests and Run spotify

Change-Id: I2786e612494530405dad5c3edb2bc53915a1c2dc
parent c01dd791
Loading
Loading
Loading
Loading
+73 −20
Original line number Original line Diff line number Diff line
@@ -68,11 +68,18 @@ static jlong BitmapShader_constructor(JNIEnv* env, jobject o, jlong matrixPtr, j
    }
    }


    sk_sp<SkImage> image = SkMakeImageFromRasterBitmap(bitmap, kNever_SkCopyPixelsMode);
    sk_sp<SkImage> image = SkMakeImageFromRasterBitmap(bitmap, kNever_SkCopyPixelsMode);
    sk_sp<SkShader> shader = image->makeShader(
    sk_sp<SkShader> baseShader = image->makeShader(
            (SkShader::TileMode)tileModeX, (SkShader::TileMode)tileModeY, matrix);
            (SkShader::TileMode)tileModeX, (SkShader::TileMode)tileModeY);


    ThrowIAE_IfNull(env, shader.get());
    SkShader* shader;
    return reinterpret_cast<jlong>(shader.release());
    if (matrix) {
        shader = baseShader->makeWithLocalMatrix(*matrix).release();
    } else {
        shader = baseShader.release();
    }

    ThrowIAE_IfNull(env, shader);
    return reinterpret_cast<jlong>(shader);
}
}


///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
@@ -95,9 +102,16 @@ static jlong LinearGradient_create1(JNIEnv* env, jobject o, jlong matrixPtr,
    #error Need to convert float array to SkScalar array before calling the following function.
    #error Need to convert float array to SkScalar array before calling the following function.
#endif
#endif


    SkShader* shader = SkGradientShader::MakeLinear(pts,
    sk_sp<SkShader> baseShader(SkGradientShader::MakeLinear(pts,
            reinterpret_cast<const SkColor*>(colorValues), pos, count,
            reinterpret_cast<const SkColor*>(colorValues), pos, count,
            static_cast<SkShader::TileMode>(tileMode), sGradientShaderFlags, matrix).release();
            static_cast<SkShader::TileMode>(tileMode), sGradientShaderFlags, NULL));

    SkShader* shader;
    if (matrix) {
        shader = baseShader->makeWithLocalMatrix(*matrix).release();
    } else {
        shader = baseShader.release();
    }


    env->ReleaseIntArrayElements(colorArray, const_cast<jint*>(colorValues), JNI_ABORT);
    env->ReleaseIntArrayElements(colorArray, const_cast<jint*>(colorValues), JNI_ABORT);
    ThrowIAE_IfNull(env, shader);
    ThrowIAE_IfNull(env, shader);
@@ -116,8 +130,15 @@ static jlong LinearGradient_create2(JNIEnv* env, jobject o, jlong matrixPtr,
    colors[0] = color0;
    colors[0] = color0;
    colors[1] = color1;
    colors[1] = color1;


    SkShader* s = SkGradientShader::MakeLinear(pts, colors, NULL, 2,
    sk_sp<SkShader> baseShader(SkGradientShader::MakeLinear(pts, colors, NULL, 2,
            static_cast<SkShader::TileMode>(tileMode), sGradientShaderFlags, matrix).release();
            static_cast<SkShader::TileMode>(tileMode), sGradientShaderFlags, NULL));

    SkShader* s;
    if (matrix) {
        s = baseShader->makeWithLocalMatrix(*matrix).release();
    } else {
        s = baseShader.release();
    }


    ThrowIAE_IfNull(env, s);
    ThrowIAE_IfNull(env, s);
    return reinterpret_cast<jlong>(s);
    return reinterpret_cast<jlong>(s);
@@ -141,9 +162,17 @@ static jlong RadialGradient_create1(JNIEnv* env, jobject, jlong matrixPtr, jfloa
    #error Need to convert float array to SkScalar array before calling the following function.
    #error Need to convert float array to SkScalar array before calling the following function.
#endif
#endif


    SkShader* shader = SkGradientShader::MakeRadial(center, radius,
    sk_sp<SkShader> baseShader = SkGradientShader::MakeRadial(center, radius,
            reinterpret_cast<const SkColor*>(colorValues), pos, count,
            reinterpret_cast<const SkColor*>(colorValues), pos, count,
            static_cast<SkShader::TileMode>(tileMode), sGradientShaderFlags, matrix).release();
            static_cast<SkShader::TileMode>(tileMode), sGradientShaderFlags, NULL);

    SkShader* shader;
    if (matrix) {
        shader = baseShader->makeWithLocalMatrix(*matrix).release();
    } else {
        shader = baseShader.release();
    }

    env->ReleaseIntArrayElements(colorArray, const_cast<jint*>(colorValues),
    env->ReleaseIntArrayElements(colorArray, const_cast<jint*>(colorValues),
                                 JNI_ABORT);
                                 JNI_ABORT);


@@ -161,10 +190,17 @@ static jlong RadialGradient_create2(JNIEnv* env, jobject, jlong matrixPtr, jfloa
    colors[0] = color0;
    colors[0] = color0;
    colors[1] = color1;
    colors[1] = color1;


    SkShader* s = SkGradientShader::MakeRadial(center, radius, colors, NULL, 2,
    sk_sp<SkShader> baseShader = SkGradientShader::MakeRadial(center, radius, colors, NULL, 2,
            static_cast<SkShader::TileMode>(tileMode), sGradientShaderFlags, matrix).release();
            static_cast<SkShader::TileMode>(tileMode), sGradientShaderFlags, NULL);
    ThrowIAE_IfNull(env, s);

    return reinterpret_cast<jlong>(s);
    SkShader* shader;
    if (matrix) {
        shader = baseShader->makeWithLocalMatrix(*matrix).release();
    } else {
        shader = baseShader.release();
    }
    ThrowIAE_IfNull(env, shader);
    return reinterpret_cast<jlong>(shader);
}
}


///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
@@ -182,8 +218,17 @@ static jlong SweepGradient_create1(JNIEnv* env, jobject, jlong matrixPtr, jfloat
    #error Need to convert float array to SkScalar array before calling the following function.
    #error Need to convert float array to SkScalar array before calling the following function.
#endif
#endif


    SkShader* shader = SkGradientShader::MakeSweep(x, y, reinterpret_cast<const SkColor*>(colors),
    sk_sp<SkShader> baseShader = SkGradientShader::MakeSweep(x, y,
            pos, count, sGradientShaderFlags, matrix).release();
            reinterpret_cast<const SkColor*>(colors), pos, count,
            sGradientShaderFlags, NULL);

    SkShader* shader;
    if (matrix) {
        shader = baseShader->makeWithLocalMatrix(*matrix).release();
    } else {
        shader = baseShader.release();
    }

    env->ReleaseIntArrayElements(jcolors, const_cast<jint*>(colors),
    env->ReleaseIntArrayElements(jcolors, const_cast<jint*>(colors),
                                 JNI_ABORT);
                                 JNI_ABORT);
    ThrowIAE_IfNull(env, shader);
    ThrowIAE_IfNull(env, shader);
@@ -196,10 +241,18 @@ static jlong SweepGradient_create2(JNIEnv* env, jobject, jlong matrixPtr, jfloat
    SkColor colors[2];
    SkColor colors[2];
    colors[0] = color0;
    colors[0] = color0;
    colors[1] = color1;
    colors[1] = color1;
    SkShader* s = SkGradientShader::MakeSweep(x, y, colors, NULL, 2,

            sGradientShaderFlags, matrix).release();
    sk_sp<SkShader> baseShader = SkGradientShader::MakeSweep(x, y, colors,
    ThrowIAE_IfNull(env, s);
            NULL, 2, sGradientShaderFlags, NULL);
    return reinterpret_cast<jlong>(s);

    SkShader* shader;
    if (matrix) {
        shader = baseShader->makeWithLocalMatrix(*matrix).release();
    } else {
        shader = baseShader.release();
    }
    ThrowIAE_IfNull(env, shader);
    return reinterpret_cast<jlong>(shader);
}
}


///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////