| 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;
|
|
|