summaryrefslogtreecommitdiffstats
path: root/core/jni/android/graphics
diff options
context:
space:
mode:
authorRomain Guy <romainguy@google.com>2012-07-30 14:47:51 -0700
committerRomain Guy <romainguy@google.com>2012-07-31 18:55:16 -0700
commit42e1e0d482d774cf18a55773e434f02edb9e4462 (patch)
tree33ac1bca20382f2e8ccbf176c89b3476f2ae5c9b /core/jni/android/graphics
parent8ab8fbbf46d8779f53301e7f706f97608eed7117 (diff)
downloadframeworks_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/graphics')
-rw-r--r--core/jni/android/graphics/Shader.cpp46
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);