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