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