| Index: src/effects/gradients/SkGradientShader.cpp
|
| diff --git a/src/effects/gradients/SkGradientShader.cpp b/src/effects/gradients/SkGradientShader.cpp
|
| index 666204e0aed451ad0f236c4cb72c26a7fa7945be..4963baa16b856b5b315111e812345736157683c1 100644
|
| --- a/src/effects/gradients/SkGradientShader.cpp
|
| +++ b/src/effects/gradients/SkGradientShader.cpp
|
| @@ -203,6 +203,19 @@ void SkGradientShaderBase::flatten(SkWriteBuffer& buffer) const {
|
| buffer.writeMatrix(fPtsToUnit);
|
| }
|
|
|
| +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 +806,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];
|
| + 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,
|
|
|