Index: src/effects/gradients/SkGradientShader.cpp |
diff --git a/src/effects/gradients/SkGradientShader.cpp b/src/effects/gradients/SkGradientShader.cpp |
index 3547fbec94f4e372c5ee3dc70e7c0bd4a03effdd..58c4a511784c7a58371a04377fe528f6470430c1 100644 |
--- a/src/effects/gradients/SkGradientShader.cpp |
+++ b/src/effects/gradients/SkGradientShader.cpp |
@@ -203,6 +203,18 @@ void SkGradientShaderBase::flatten(SkWriteBuffer& buffer) const { |
buffer.writeMatrix(fPtsToUnit); |
} |
+void SkGradientShaderBase::getGradientDescriptorGpu(DescriptorGpu* desc) const { |
+ desc->fCount = fColorCount; |
+ if (fColorCount <= 3) { |
+ memcpy(desc->fColors, fOrigColors, fColorCount * sizeof(SkColor)); |
+ } |
+ if (3 == fColorCount){ |
+ desc->fMidPos = SkFixedToScalar(fRecs[1].fPos); |
+ } |
+ desc->fTileMode = fTileMode; |
+ desc->fFlags = fGradFlags; |
+} |
+ |
bool SkGradientShaderBase::isOpaque() const { |
return fColorsAreOpaque; |
} |
@@ -1005,31 +1017,27 @@ GrGradientEffect::GrGradientEffect(GrContext* ctx, |
SkShader::TileMode tileMode) { |
fIsOpaque = shader.isOpaque(); |
+ SkGradientShaderBase::DescriptorGpu gradDesc; |
- SkShader::GradientInfo info; |
- SkScalar pos[3] = {0}; |
- |
- info.fColorCount = 3; |
- info.fColors = &fColors[0]; |
- info.fColorOffsets = &pos[0]; |
- shader.asAGradient(&info); |
+ gradDesc.fColors = &fColors[0]; |
+ shader.getGradientDescriptorGpu(&gradDesc); |
// The two and three color specializations do not currently support tiling. |
bool foundSpecialCase = false; |
- if (SkShader::kClamp_TileMode == info.fTileMode) { |
- if (2 == info.fColorCount) { |
+ if (SkShader::kClamp_TileMode == gradDesc.fTileMode) { |
+ if (2 == gradDesc.fCount) { |
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 |
+ } else if (3 == gradDesc.fCount && |
+ (SkScalarAbs(gradDesc.fMidPos - 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 (SkGradientShader::kInterpolateColorsInPremul_Flag & gradDesc.fFlags) { |
fPremulType = kBeforeInterp_PremulType; |
} else { |
fPremulType = kAfterInterp_PremulType; |