Chromium Code Reviews| Index: src/effects/gradients/SkGradientShader.cpp |
| diff --git a/src/effects/gradients/SkGradientShader.cpp b/src/effects/gradients/SkGradientShader.cpp |
| index 3547fbec94f4e372c5ee3dc70e7c0bd4a03effdd..b54971954e11a6ce97083878a49e46f613c9997f 100644 |
| --- a/src/effects/gradients/SkGradientShader.cpp |
| +++ b/src/effects/gradients/SkGradientShader.cpp |
| @@ -203,6 +203,20 @@ void SkGradientShaderBase::flatten(SkWriteBuffer& buffer) const { |
| buffer.writeMatrix(fPtsToUnit); |
| } |
| +// V23_COMPATIBILITY_CODE |
| +void SkGradientShaderBase::flipGradientColors() { |
| + SkColor colorsTemp[fColorCount]; |
| + Rec recsTemp[fColorCount]; |
| + for (int i = 0; i < fColorCount; ++i) { |
| + int offset = fColorCount - i - 1; |
| + colorsTemp[i] = fOrigColors[offset]; |
| + recsTemp[i].fPos = 1 - fRecs[offset].fPos; |
| + recsTemp[i].fScale = fRecs[offset].fScale; |
| + } |
| + memcpy(fOrigColors, colorsTemp, fColorCount * sizeof(SkColor)); |
| + memcpy(fRecs, recsTemp, fColorCount * sizeof(Rec)); |
| +} |
| + |
| bool SkGradientShaderBase::isOpaque() const { |
| return fColorsAreOpaque; |
| } |
| @@ -793,12 +807,36 @@ SkShader* SkGradientShader::CreateTwoPointConical(const SkPoint& start, |
| if (start == end && startRadius == endRadius) { |
| return SkNEW(SkEmptyShader); |
| } |
| + |
| EXPAND_1_COLOR(colorCount); |
| + bool flipGradient = startRadius > endRadius; |
| + |
| SkGradientShaderBase::Descriptor desc; |
| - desc_init(&desc, colors, pos, colorCount, mode, mapper, flags); |
| - return SkNEW_ARGS(SkTwoPointConicalGradient, |
| - (start, startRadius, end, endRadius, desc)); |
| + |
| + if (!flipGradient) { |
| + desc_init(&desc, colors, pos, colorCount, mode, mapper, flags); |
| + return SkNEW_ARGS(SkTwoPointConicalGradient, |
| + (start, startRadius, end, endRadius, flipGradient, desc)); |
| + } else { |
| + SkColor colorsNew[colorCount]; |
|
bsalomon
2014/04/16 19:12:56
woah.. this looks like a compiler extension. color
mtklein
2014/04/16 19:20:50
Yeah, this will be more or less supported dependin
|
| + SkScalar posNew[colorCount]; |
| + for (int i = 0; i < colorCount; ++i) { |
| + colorsNew[i] = colors[colorCount - i - 1]; |
| + } |
| + |
| + if (pos) { |
| + for (int i = 0; i < colorCount; ++i) { |
| + posNew[i] = 1 - pos[colorCount - i - 1]; |
| + } |
| + desc_init(&desc, colorsNew, posNew, colorCount, mode, mapper, flags); |
| + } else { |
| + desc_init(&desc, colorsNew, NULL, colorCount, mode, mapper, flags); |
| + } |
| + |
| + return SkNEW_ARGS(SkTwoPointConicalGradient, |
| + (end, endRadius, start, startRadius, flipGradient, desc)); |
| + } |
| } |
| SkShader* SkGradientShader::CreateSweep(SkScalar cx, SkScalar cy, |