diff options
author | Tenghui Zhu <ztenghui@google.com> | 2017-04-05 20:44:28 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2017-04-05 20:44:36 +0000 |
commit | 399dba4ab0328c0c83015398e949ec40a673e978 (patch) | |
tree | 45d8a9897adfc93baddff97692d983e9f0ab8342 | |
parent | 0283544c498bbc8293207ffb47662e285bf42384 (diff) | |
parent | b244fb528bd19e60b7c3d671df07d2d64c41fdda (diff) |
Merge "Make sure we handle the matrix separately for non-invertable matrix" into oc-dev
-rw-r--r-- | core/jni/android/graphics/Shader.cpp | 93 |
1 files changed, 73 insertions, 20 deletions
diff --git a/core/jni/android/graphics/Shader.cpp b/core/jni/android/graphics/Shader.cpp index 1a353302d7d8..214d97c213e4 100644 --- a/core/jni/android/graphics/Shader.cpp +++ b/core/jni/android/graphics/Shader.cpp @@ -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<SkShader> shader = image->makeShader( - (SkShader::TileMode)tileModeX, (SkShader::TileMode)tileModeY, matrix); + sk_sp<SkShader> baseShader = image->makeShader( + (SkShader::TileMode)tileModeX, (SkShader::TileMode)tileModeY); - ThrowIAE_IfNull(env, shader.get()); - return reinterpret_cast<jlong>(shader.release()); + SkShader* shader; + 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. #endif - SkShader* shader = SkGradientShader::MakeLinear(pts, + sk_sp<SkShader> baseShader(SkGradientShader::MakeLinear(pts, 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); ThrowIAE_IfNull(env, shader); @@ -116,8 +130,15 @@ static jlong LinearGradient_create2(JNIEnv* env, jobject o, jlong matrixPtr, colors[0] = color0; colors[1] = color1; - SkShader* s = SkGradientShader::MakeLinear(pts, colors, NULL, 2, - static_cast<SkShader::TileMode>(tileMode), sGradientShaderFlags, matrix).release(); + sk_sp<SkShader> baseShader(SkGradientShader::MakeLinear(pts, colors, NULL, 2, + static_cast<SkShader::TileMode>(tileMode), sGradientShaderFlags, NULL)); + + SkShader* s; + if (matrix) { + s = baseShader->makeWithLocalMatrix(*matrix).release(); + } else { + s = baseShader.release(); + } ThrowIAE_IfNull(env, 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. #endif - SkShader* shader = SkGradientShader::MakeRadial(center, radius, + sk_sp<SkShader> baseShader = SkGradientShader::MakeRadial(center, radius, 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); @@ -161,10 +190,17 @@ static jlong RadialGradient_create2(JNIEnv* env, jobject, jlong matrixPtr, jfloa colors[0] = color0; colors[1] = color1; - SkShader* s = SkGradientShader::MakeRadial(center, radius, colors, NULL, 2, - static_cast<SkShader::TileMode>(tileMode), sGradientShaderFlags, matrix).release(); - ThrowIAE_IfNull(env, s); - return reinterpret_cast<jlong>(s); + sk_sp<SkShader> baseShader = SkGradientShader::MakeRadial(center, radius, colors, NULL, 2, + static_cast<SkShader::TileMode>(tileMode), sGradientShaderFlags, NULL); + + 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. #endif - SkShader* shader = SkGradientShader::MakeSweep(x, y, reinterpret_cast<const SkColor*>(colors), - pos, count, sGradientShaderFlags, matrix).release(); + sk_sp<SkShader> baseShader = SkGradientShader::MakeSweep(x, y, + 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), JNI_ABORT); ThrowIAE_IfNull(env, shader); @@ -196,10 +241,18 @@ static jlong SweepGradient_create2(JNIEnv* env, jobject, jlong matrixPtr, jfloat SkColor colors[2]; colors[0] = color0; colors[1] = color1; - SkShader* s = SkGradientShader::MakeSweep(x, y, colors, NULL, 2, - sGradientShaderFlags, matrix).release(); - ThrowIAE_IfNull(env, s); - return reinterpret_cast<jlong>(s); + + sk_sp<SkShader> baseShader = SkGradientShader::MakeSweep(x, y, colors, + NULL, 2, sGradientShaderFlags, NULL); + + SkShader* shader; + if (matrix) { + shader = baseShader->makeWithLocalMatrix(*matrix).release(); + } else { + shader = baseShader.release(); + } + ThrowIAE_IfNull(env, shader); + return reinterpret_cast<jlong>(shader); } /////////////////////////////////////////////////////////////////////////////////////////////// |