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