diff options
author | Romain Guy <romainguy@google.com> | 2012-07-30 14:47:51 -0700 |
---|---|---|
committer | Romain Guy <romainguy@google.com> | 2012-07-31 18:55:16 -0700 |
commit | 42e1e0d482d774cf18a55773e434f02edb9e4462 (patch) | |
tree | 33ac1bca20382f2e8ccbf176c89b3476f2ae5c9b /core/jni/android | |
parent | 8ab8fbbf46d8779f53301e7f706f97608eed7117 (diff) | |
download | frameworks_base-42e1e0d482d774cf18a55773e434f02edb9e4462.zip frameworks_base-42e1e0d482d774cf18a55773e434f02edb9e4462.tar.gz frameworks_base-42e1e0d482d774cf18a55773e434f02edb9e4462.tar.bz2 |
Improve gradients
Avoid using textures for common gradients (two stops from 0.0 to 1.0)
Change-Id: Iff55d21b126c8cfc4cfb701669f2339c8f6b131a
Diffstat (limited to 'core/jni/android')
-rw-r--r-- | core/jni/android/graphics/Shader.cpp | 46 |
1 files changed, 38 insertions, 8 deletions
diff --git a/core/jni/android/graphics/Shader.cpp b/core/jni/android/graphics/Shader.cpp index f4cc9e4..6323ab3 100644 --- a/core/jni/android/graphics/Shader.cpp +++ b/core/jni/android/graphics/Shader.cpp @@ -150,19 +150,35 @@ static SkiaShader* LinearGradient_postCreate1(JNIEnv* env, jobject o, SkShader* jfloat* storedBounds = new jfloat[4]; storedBounds[0] = x0; storedBounds[1] = y0; storedBounds[2] = x1; storedBounds[3] = y1; - jfloat* storedPositions = new jfloat[count]; - uint32_t* storedColors = new uint32_t[count]; - for (size_t i = 0; i < count; i++) { - storedColors[i] = static_cast<uint32_t>(colorValues[i]); - } + + bool missFirst = false; + bool missLast = false; + size_t stopCount = count; + jfloat* storedPositions = NULL; if (posArray) { AutoJavaFloatArray autoPos(env, posArray, count); const float* posValues = autoPos.ptr(); - for (size_t i = 0; i < count; i++) { - storedPositions[i] = posValues[i]; + + missFirst = posValues[0] != 0.0f; + missLast = posValues[count - 1] != 1.0f; + + stopCount += missFirst + missLast; + storedPositions = new jfloat[stopCount]; + + if (missFirst) { + storedPositions[0] = 0.0f; + } + + for (size_t i = missFirst; i < count + missFirst; i++) { + storedPositions[i] = posValues[i - missFirst]; + } + + if (missLast) { + storedPositions[stopCount - 1] = 1.0f; } } else { + storedPositions = new jfloat[count]; storedPositions[0] = 0.0f; const jfloat step = 1.0f / (count - 1); for (size_t i = 1; i < count - 1; i++) { @@ -171,8 +187,22 @@ static SkiaShader* LinearGradient_postCreate1(JNIEnv* env, jobject o, SkShader* storedPositions[count - 1] = 1.0f; } + uint32_t* storedColors = new uint32_t[stopCount]; + + if (missFirst) { + storedColors[0] = static_cast<uint32_t>(colorValues[0]); + } + + for (size_t i = missFirst; i < count + missFirst; i++) { + storedColors[i] = static_cast<uint32_t>(colorValues[i - missFirst]); + } + + if (missLast) { + storedColors[stopCount - 1] = static_cast<uint32_t>(colorValues[count - 1]); + } + SkiaShader* skiaShader = new SkiaLinearGradientShader(storedBounds, storedColors, - storedPositions, count, shader, static_cast<SkShader::TileMode>(tileMode), NULL, + storedPositions, stopCount, shader, static_cast<SkShader::TileMode>(tileMode), NULL, (shader->getFlags() & SkShader::kOpaqueAlpha_Flag) == 0); env->ReleaseIntArrayElements(colorArray, const_cast<jint*>(colorValues), JNI_ABORT); |