Index: src/effects/gradients/SkGradientShader.cpp |
diff --git a/src/effects/gradients/SkGradientShader.cpp b/src/effects/gradients/SkGradientShader.cpp |
index 684355d5dff81a23230fbcb9883442e76af3bc19..d1ab539c076a716279cb888857e75ee4850686ad 100644 |
--- a/src/effects/gradients/SkGradientShader.cpp |
+++ b/src/effects/gradients/SkGradientShader.cpp |
@@ -12,19 +12,18 @@ |
#include "SkTwoPointConicalGradient.h" |
#include "SkSweepGradient.h" |
-SkGradientShaderBase::SkGradientShaderBase(const SkColor colors[], const SkScalar pos[], |
- int colorCount, SkShader::TileMode mode, SkUnitMapper* mapper) { |
- SkASSERT(colorCount > 1); |
+SkGradientShaderBase::SkGradientShaderBase(const Descriptor& desc) { |
+ SkASSERT(desc.fCount > 1); |
fCacheAlpha = 256; // init to a value that paint.getAlpha() can't return |
- fMapper = mapper; |
- SkSafeRef(mapper); |
+ fMapper = desc.fMapper; |
+ SkSafeRef(fMapper); |
- SkASSERT((unsigned)mode < SkShader::kTileModeCount); |
+ SkASSERT((unsigned)desc.fTileMode < SkShader::kTileModeCount); |
SkASSERT(SkShader::kTileModeCount == SK_ARRAY_COUNT(gTileProcs)); |
- fTileMode = mode; |
- fTileProc = gTileProcs[mode]; |
+ fTileMode = desc.fTileMode; |
+ fTileProc = gTileProcs[desc.fTileMode]; |
fCache16 = fCache16Storage = NULL; |
fCache32 = NULL; |
@@ -41,13 +40,13 @@ SkGradientShaderBase::SkGradientShaderBase(const SkColor colors[], const SkScala |
colorCount = 2 |
fColorCount = 4 |
*/ |
- fColorCount = colorCount; |
+ fColorCount = desc.fCount; |
// check if we need to add in dummy start and/or end position/colors |
bool dummyFirst = false; |
bool dummyLast = false; |
- if (pos) { |
- dummyFirst = pos[0] != 0; |
- dummyLast = pos[colorCount - 1] != SK_Scalar1; |
+ if (desc.fPos) { |
+ dummyFirst = desc.fPos[0] != 0; |
+ dummyLast = desc.fPos[desc.fCount - 1] != SK_Scalar1; |
fColorCount += dummyFirst + dummyLast; |
} |
@@ -64,12 +63,12 @@ SkGradientShaderBase::SkGradientShaderBase(const SkColor colors[], const SkScala |
{ |
SkColor* origColors = fOrigColors; |
if (dummyFirst) { |
- *origColors++ = colors[0]; |
+ *origColors++ = desc.fColors[0]; |
} |
- memcpy(origColors, colors, colorCount * sizeof(SkColor)); |
+ memcpy(origColors, desc.fColors, desc.fCount * sizeof(SkColor)); |
if (dummyLast) { |
- origColors += colorCount; |
- *origColors = colors[colorCount - 1]; |
+ origColors += desc.fCount; |
+ *origColors = desc.fColors[desc.fCount - 1]; |
} |
} |
@@ -79,7 +78,7 @@ SkGradientShaderBase::SkGradientShaderBase(const SkColor colors[], const SkScala |
recs->fPos = 0; |
// recs->fScale = 0; // unused; |
recs += 1; |
- if (pos) { |
+ if (desc.fPos) { |
/* We need to convert the user's array of relative positions into |
fixed-point positions and scale factors. We need these results |
to be strictly monotonic (no two values equal or out of order). |
@@ -89,14 +88,14 @@ SkGradientShaderBase::SkGradientShaderBase(const SkColor colors[], const SkScala |
*/ |
SkFixed prev = 0; |
int startIndex = dummyFirst ? 0 : 1; |
- int count = colorCount + dummyLast; |
+ int count = desc.fCount + dummyLast; |
for (int i = startIndex; i < count; i++) { |
// force the last value to be 1.0 |
SkFixed curr; |
- if (i == colorCount) { // we're really at the dummyLast |
+ if (i == desc.fCount) { // we're really at the dummyLast |
curr = SK_Fixed1; |
} else { |
- curr = SkScalarToFixed(pos[i]); |
+ curr = SkScalarToFixed(desc.fPos[i]); |
} |
// pin curr withing range |
if (curr < 0) { |
@@ -115,10 +114,10 @@ SkGradientShaderBase::SkGradientShaderBase(const SkColor colors[], const SkScala |
recs += 1; |
} |
} else { // assume even distribution |
- SkFixed dp = SK_Fixed1 / (colorCount - 1); |
+ SkFixed dp = SK_Fixed1 / (desc.fCount - 1); |
SkFixed p = dp; |
- SkFixed scale = (colorCount - 1) << 8; // (1 << 24) / dp |
- for (int i = 1; i < colorCount; i++) { |
+ SkFixed scale = (desc.fCount - 1) << 8; // (1 << 24) / dp |
+ for (int i = 1; i < desc.fCount; i++) { |
recs->fPos = p; |
recs->fScale = scale; |
recs += 1; |
@@ -640,6 +639,18 @@ void SkGradientShaderBase::toString(SkString* str) const { |
} \ |
} while (0) |
+static void desc_init(SkGradientShaderBase::Descriptor* desc, |
+ const SkColor colors[], |
+ const SkScalar pos[], int colorCount, |
+ SkShader::TileMode mode, |
+ SkUnitMapper* mapper) { |
+ desc->fColors = colors; |
+ desc->fPos = pos; |
+ desc->fCount = colorCount; |
+ desc->fTileMode = mode; |
+ desc->fMapper = mapper; |
+} |
+ |
SkShader* SkGradientShader::CreateLinear(const SkPoint pts[2], |
const SkColor colors[], |
const SkScalar pos[], int colorCount, |
@@ -650,8 +661,9 @@ SkShader* SkGradientShader::CreateLinear(const SkPoint pts[2], |
} |
EXPAND_1_COLOR(colorCount); |
- return SkNEW_ARGS(SkLinearGradient, |
- (pts, colors, pos, colorCount, mode, mapper)); |
+ SkGradientShaderBase::Descriptor desc; |
+ desc_init(&desc, colors, pos, colorCount, mode, mapper); |
+ return SkNEW_ARGS(SkLinearGradient, (pts, desc)); |
} |
SkShader* SkGradientShader::CreateRadial(const SkPoint& center, SkScalar radius, |
@@ -664,8 +676,9 @@ SkShader* SkGradientShader::CreateRadial(const SkPoint& center, SkScalar radius, |
} |
EXPAND_1_COLOR(colorCount); |
- return SkNEW_ARGS(SkRadialGradient, |
- (center, radius, colors, pos, colorCount, mode, mapper)); |
+ SkGradientShaderBase::Descriptor desc; |
+ desc_init(&desc, colors, pos, colorCount, mode, mapper); |
+ return SkNEW_ARGS(SkRadialGradient, (center, radius, desc)); |
} |
SkShader* SkGradientShader::CreateTwoPointRadial(const SkPoint& start, |
@@ -682,9 +695,10 @@ SkShader* SkGradientShader::CreateTwoPointRadial(const SkPoint& start, |
} |
EXPAND_1_COLOR(colorCount); |
+ SkGradientShaderBase::Descriptor desc; |
+ desc_init(&desc, colors, pos, colorCount, mode, mapper); |
return SkNEW_ARGS(SkTwoPointRadialGradient, |
- (start, startRadius, end, endRadius, colors, pos, |
- colorCount, mode, mapper)); |
+ (start, startRadius, end, endRadius, desc)); |
} |
SkShader* SkGradientShader::CreateTwoPointConical(const SkPoint& start, |
@@ -704,21 +718,24 @@ SkShader* SkGradientShader::CreateTwoPointConical(const SkPoint& start, |
} |
EXPAND_1_COLOR(colorCount); |
+ SkGradientShaderBase::Descriptor desc; |
+ desc_init(&desc, colors, pos, colorCount, mode, mapper); |
return SkNEW_ARGS(SkTwoPointConicalGradient, |
- (start, startRadius, end, endRadius, colors, pos, |
- colorCount, mode, mapper)); |
+ (start, startRadius, end, endRadius, desc)); |
} |
SkShader* SkGradientShader::CreateSweep(SkScalar cx, SkScalar cy, |
const SkColor colors[], |
const SkScalar pos[], |
- int count, SkUnitMapper* mapper) { |
- if (NULL == colors || count < 1) { |
+ int colorCount, SkUnitMapper* mapper) { |
+ if (NULL == colors || colorCount < 1) { |
return NULL; |
} |
- EXPAND_1_COLOR(count); |
+ EXPAND_1_COLOR(colorCount); |
- return SkNEW_ARGS(SkSweepGradient, (cx, cy, colors, pos, count, mapper)); |
+ SkGradientShaderBase::Descriptor desc; |
+ desc_init(&desc, colors, pos, colorCount, SkShader::kClamp_TileMode, mapper); |
+ return SkNEW_ARGS(SkSweepGradient, (cx, cy, desc)); |
} |
SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkGradientShader) |