Get gradient information for gpu effect directly from SkGradientShader instead of calling asAGradient
BUG=skia:
R=bsalomon@google.com
Author: egdaniel@google.com
Review URL: https://codereview.chromium.org/241173005
git-svn-id: http://skia.googlecode.com/svn/trunk@14254 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/effects/gradients/SkGradientShader.cpp b/src/effects/gradients/SkGradientShader.cpp
index 2ebb9c7..504855a 100644
--- a/src/effects/gradients/SkGradientShader.cpp
+++ b/src/effects/gradients/SkGradientShader.cpp
@@ -220,6 +220,23 @@
buffer.writeMatrix(fPtsToUnit);
}
+SkGradientShaderBase::GpuColorType SkGradientShaderBase::getGpuColorType(SkColor colors[3]) const {
+ if (fColorCount <= 3) {
+ memcpy(colors, fOrigColors, fColorCount * sizeof(SkColor));
+ }
+
+ if (SkShader::kClamp_TileMode == fTileMode) {
+ if (2 == fColorCount) {
+ return kTwo_GpuColorType;
+ } else if (3 == fColorCount &&
+ (SkScalarAbs(
+ SkFixedToScalar(fRecs[1].fPos) - SK_ScalarHalf) < SK_Scalar1 / 1000)) {
+ return kThree_GpuColorType;
+ }
+ }
+ return kTexture_GpuColorType;
+}
+
bool SkGradientShaderBase::isOpaque() const {
return fColorsAreOpaque;
}
@@ -832,13 +849,13 @@
void GrGLGradientEffect::emitUniforms(GrGLShaderBuilder* builder, EffectKey key) {
- if (GrGradientEffect::kTwo_ColorType == ColorTypeFromKey(key)) { // 2 Color case
+ if (SkGradientShaderBase::kTwo_GpuColorType == ColorTypeFromKey(key)) { // 2 Color case
fColorStartUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility,
kVec4f_GrSLType, "GradientStartColor");
fColorEndUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility,
kVec4f_GrSLType, "GradientEndColor");
- } else if (GrGradientEffect::kThree_ColorType == ColorTypeFromKey(key)){ // 3 Color Case
+ } else if (SkGradientShaderBase::kThree_GpuColorType == ColorTypeFromKey(key)){ // 3 Color Case
fColorStartUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility,
kVec4f_GrSLType, "GradientStartColor");
fColorMidUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility,
@@ -880,7 +897,7 @@
const GrGradientEffect& e = drawEffect.castEffect<GrGradientEffect>();
- if (GrGradientEffect::kTwo_ColorType == e.getColorType()){
+ if (SkGradientShaderBase::kTwo_GpuColorType == e.getColorType()){
if (GrGradientEffect::kBeforeInterp_PremulType == e.getPremulType()) {
set_mul_color_uni(uman, fColorStartUni, e.getColors(0));
@@ -890,7 +907,7 @@
set_color_uni(uman, fColorEndUni, e.getColors(1));
}
- } else if (GrGradientEffect::kThree_ColorType == e.getColorType()){
+ } else if (SkGradientShaderBase::kThree_GpuColorType == e.getColorType()){
if (GrGradientEffect::kBeforeInterp_PremulType == e.getPremulType()) {
set_mul_color_uni(uman, fColorStartUni, e.getColors(0));
@@ -917,9 +934,9 @@
EffectKey key = 0;
- if (GrGradientEffect::kTwo_ColorType == e.getColorType()) {
+ if (SkGradientShaderBase::kTwo_GpuColorType == e.getColorType()) {
key |= kTwoColorKey;
- } else if (GrGradientEffect::kThree_ColorType == e.getColorType()){
+ } else if (SkGradientShaderBase::kThree_GpuColorType == e.getColorType()){
key |= kThreeColorKey;
}
@@ -936,7 +953,7 @@
const char* outputColor,
const char* inputColor,
const TextureSamplerArray& samplers) {
- if (GrGradientEffect::kTwo_ColorType == ColorTypeFromKey(key)){
+ if (SkGradientShaderBase::kTwo_GpuColorType == ColorTypeFromKey(key)){
builder->fsCodeAppendf("\tvec4 colorTemp = mix(%s, %s, clamp(%s, 0.0, 1.0));\n",
builder->getUniformVariable(fColorStartUni).c_str(),
builder->getUniformVariable(fColorEndUni).c_str(),
@@ -952,7 +969,7 @@
builder->fsCodeAppendf("\t%s = %s;\n", outputColor,
(GrGLSLExpr4(inputColor) * GrGLSLExpr4("colorTemp")).c_str());
- } else if (GrGradientEffect::kThree_ColorType == ColorTypeFromKey(key)){
+ } else if (SkGradientShaderBase::kThree_GpuColorType == ColorTypeFromKey(key)){
builder->fsCodeAppendf("\tfloat oneMinus2t = 1.0 - (2.0 * (%s));\n",
gradientTValue);
builder->fsCodeAppendf("\tvec4 colorTemp = clamp(oneMinus2t, 0.0, 1.0) * %s;\n",
@@ -997,30 +1014,14 @@
fIsOpaque = shader.isOpaque();
- SkShader::GradientInfo info;
- SkScalar pos[3] = {0};
-
- info.fColorCount = 3;
- info.fColors = &fColors[0];
- info.fColorOffsets = &pos[0];
- shader.asAGradient(&info);
+ fColorType = shader.getGpuColorType(&fColors[0]);
// The two and three color specializations do not currently support tiling.
- bool foundSpecialCase = false;
- if (SkShader::kClamp_TileMode == info.fTileMode) {
- if (2 == info.fColorCount) {
- fRow = -1; // flag for no atlas
- fColorType = kTwo_ColorType;
- foundSpecialCase = true;
- } else if (3 == info.fColorCount &&
- (SkScalarAbs(pos[1] - SK_ScalarHalf) < SK_Scalar1 / 1000)) { // 3 color symmetric
- fRow = -1; // flag for no atlas
- fColorType = kThree_ColorType;
- foundSpecialCase = true;
- }
- }
- if (foundSpecialCase) {
- if (SkGradientShader::kInterpolateColorsInPremul_Flag & info.fGradientFlags) {
+ if (SkGradientShaderBase::kTwo_GpuColorType == fColorType ||
+ SkGradientShaderBase::kThree_GpuColorType == fColorType) {
+ fRow = -1;
+
+ if (SkGradientShader::kInterpolateColorsInPremul_Flag & shader.getFlags()) {
fPremulType = kBeforeInterp_PremulType;
} else {
fPremulType = kAfterInterp_PremulType;
@@ -1031,7 +1032,6 @@
fPremulType = kBeforeInterp_PremulType;
SkBitmap bitmap;
shader.getGradientTableBitmap(&bitmap);
- fColorType = kTexture_ColorType;
GrTextureStripAtlas::Desc desc;
desc.fWidth = bitmap.width();
@@ -1080,12 +1080,12 @@
if (this->fColorType == s.getColorType()){
- if (kTwo_ColorType == fColorType) {
+ if (SkGradientShaderBase::kTwo_GpuColorType == fColorType) {
if (*this->getColors(0) != *s.getColors(0) ||
*this->getColors(1) != *s.getColors(1)) {
return false;
}
- } else if (kThree_ColorType == fColorType) {
+ } else if (SkGradientShaderBase::kThree_GpuColorType == fColorType) {
if (*this->getColors(0) != *s.getColors(0) ||
*this->getColors(1) != *s.getColors(1) ||
*this->getColors(2) != *s.getColors(2)) {