| Index: src/effects/gradients/SkRadialGradient.cpp
|
| diff --git a/src/effects/gradients/SkRadialGradient.cpp b/src/effects/gradients/SkRadialGradient.cpp
|
| index d734aa056a4ad6e96455d2c7692c727cd447c706..7e7ac7a4069b0ed7b438b64f0ebfdac2df227807 100644
|
| --- a/src/effects/gradients/SkRadialGradient.cpp
|
| +++ b/src/effects/gradients/SkRadialGradient.cpp
|
| @@ -7,46 +7,8 @@
|
| */
|
|
|
| #include "SkRadialGradient.h"
|
| -#include "SkRadialGradient_Table.h"
|
| #include "SkNx.h"
|
|
|
| -#define kSQRT_TABLE_BITS 11
|
| -#define kSQRT_TABLE_SIZE (1 << kSQRT_TABLE_BITS)
|
| -
|
| -static_assert(sizeof(gSqrt8Table) == kSQRT_TABLE_SIZE, "SqrtTableSizesMatch");
|
| -
|
| -#if 0
|
| -
|
| -#include <stdio.h>
|
| -
|
| -void SkRadialGradient_BuildTable() {
|
| - // build it 0..127 x 0..127, so we use 2^15 - 1 in the numerator for our "fixed" table
|
| -
|
| - FILE* file = ::fopen("SkRadialGradient_Table.h", "w");
|
| - SkASSERT(file);
|
| - ::fprintf(file, "static const uint8_t gSqrt8Table[] = {\n");
|
| -
|
| - for (int i = 0; i < kSQRT_TABLE_SIZE; i++) {
|
| - if ((i & 15) == 0) {
|
| - ::fprintf(file, "\t");
|
| - }
|
| -
|
| - uint8_t value = SkToU8(SkFixedSqrt(i * SK_Fixed1 / kSQRT_TABLE_SIZE) >> 8);
|
| -
|
| - ::fprintf(file, "0x%02X", value);
|
| - if (i < kSQRT_TABLE_SIZE-1) {
|
| - ::fprintf(file, ", ");
|
| - }
|
| - if ((i & 15) == 15) {
|
| - ::fprintf(file, "\n");
|
| - }
|
| - }
|
| - ::fprintf(file, "};\n");
|
| - ::fclose(file);
|
| -}
|
| -
|
| -#endif
|
| -
|
| namespace {
|
|
|
| // GCC doesn't like using static functions as template arguments. So force these to be non-static.
|
| @@ -67,83 +29,6 @@ SkMatrix rad_to_unit_matrix(const SkPoint& center, SkScalar radius) {
|
| return matrix;
|
| }
|
|
|
| -typedef void (* RadialShade16Proc)(SkScalar sfx, SkScalar sdx,
|
| - SkScalar sfy, SkScalar sdy,
|
| - uint16_t* dstC, const uint16_t* cache,
|
| - int toggle, int count);
|
| -
|
| -void shadeSpan16_radial_clamp(SkScalar sfx, SkScalar sdx,
|
| - SkScalar sfy, SkScalar sdy,
|
| - uint16_t* SK_RESTRICT dstC, const uint16_t* SK_RESTRICT cache,
|
| - int toggle, int count) {
|
| - const uint8_t* SK_RESTRICT sqrt_table = gSqrt8Table;
|
| -
|
| - /* knock these down so we can pin against +- 0x7FFF, which is an
|
| - immediate load, rather than 0xFFFF which is slower. This is a
|
| - compromise, since it reduces our precision, but that appears
|
| - to be visually OK. If we decide this is OK for all of our cases,
|
| - we could (it seems) put this scale-down into fDstToIndex,
|
| - to avoid having to do these extra shifts each time.
|
| - */
|
| - SkFixed fx = SkScalarToFixed(sfx) >> 1;
|
| - SkFixed dx = SkScalarToFixed(sdx) >> 1;
|
| - SkFixed fy = SkScalarToFixed(sfy) >> 1;
|
| - SkFixed dy = SkScalarToFixed(sdy) >> 1;
|
| - // might perform this check for the other modes,
|
| - // but the win will be a smaller % of the total
|
| - if (dy == 0) {
|
| - fy = SkTPin(fy, -0xFFFF >> 1, 0xFFFF >> 1);
|
| - fy *= fy;
|
| - do {
|
| - unsigned xx = SkTPin(fx, -0xFFFF >> 1, 0xFFFF >> 1);
|
| - unsigned fi = (xx * xx + fy) >> (14 + 16 - kSQRT_TABLE_BITS);
|
| - fi = SkFastMin32(fi, 0xFFFF >> (16 - kSQRT_TABLE_BITS));
|
| - fx += dx;
|
| - *dstC++ = cache[toggle +
|
| - (sqrt_table[fi] >> SkGradientShaderBase::kSqrt16Shift)];
|
| - toggle = next_dither_toggle16(toggle);
|
| - } while (--count != 0);
|
| - } else {
|
| - do {
|
| - unsigned xx = SkTPin(fx, -0xFFFF >> 1, 0xFFFF >> 1);
|
| - unsigned fi = SkTPin(fy, -0xFFFF >> 1, 0xFFFF >> 1);
|
| - fi = (xx * xx + fi * fi) >> (14 + 16 - kSQRT_TABLE_BITS);
|
| - fi = SkFastMin32(fi, 0xFFFF >> (16 - kSQRT_TABLE_BITS));
|
| - fx += dx;
|
| - fy += dy;
|
| - *dstC++ = cache[toggle +
|
| - (sqrt_table[fi] >> SkGradientShaderBase::kSqrt16Shift)];
|
| - toggle = next_dither_toggle16(toggle);
|
| - } while (--count != 0);
|
| - }
|
| -}
|
| -
|
| -template <SkFixed (*TileProc)(SkFixed)>
|
| -void shadeSpan16_radial(SkScalar fx, SkScalar dx, SkScalar fy, SkScalar dy,
|
| - uint16_t* SK_RESTRICT dstC, const uint16_t* SK_RESTRICT cache,
|
| - int toggle, int count) {
|
| - do {
|
| - const SkFixed dist = SkFloatToFixed(sk_float_sqrt(fx*fx + fy*fy));
|
| - const unsigned fi = TileProc(dist);
|
| - SkASSERT(fi <= 0xFFFF);
|
| - *dstC++ = cache[toggle + (fi >> SkGradientShaderBase::kCache16Shift)];
|
| - toggle = next_dither_toggle16(toggle);
|
| - fx += dx;
|
| - fy += dy;
|
| - } while (--count != 0);
|
| -}
|
| -
|
| -void shadeSpan16_radial_mirror(SkScalar fx, SkScalar dx, SkScalar fy, SkScalar dy,
|
| - uint16_t* SK_RESTRICT dstC, const uint16_t* SK_RESTRICT cache,
|
| - int toggle, int count) {
|
| - shadeSpan16_radial<mirror_tileproc_nonstatic>(fx, dx, fy, dy, dstC, cache, toggle, count);
|
| -}
|
| -
|
| -void shadeSpan16_radial_repeat(SkScalar fx, SkScalar dx, SkScalar fy, SkScalar dy,
|
| - uint16_t* SK_RESTRICT dstC, const uint16_t* SK_RESTRICT cache,
|
| - int toggle, int count) {
|
| - shadeSpan16_radial<repeat_tileproc_nonstatic>(fx, dx, fy, dy, dstC, cache, toggle, count);
|
| -}
|
|
|
| } // namespace
|
|
|
| @@ -167,64 +52,6 @@ SkRadialGradient::RadialGradientContext::RadialGradientContext(
|
| const SkRadialGradient& shader, const ContextRec& rec)
|
| : INHERITED(shader, rec) {}
|
|
|
| -void SkRadialGradient::RadialGradientContext::shadeSpan16(int x, int y, uint16_t* dstCParam,
|
| - int count) {
|
| - SkASSERT(count > 0);
|
| -
|
| - const SkRadialGradient& radialGradient = static_cast<const SkRadialGradient&>(fShader);
|
| -
|
| - uint16_t* SK_RESTRICT dstC = dstCParam;
|
| -
|
| - SkPoint srcPt;
|
| - SkMatrix::MapXYProc dstProc = fDstToIndexProc;
|
| - TileProc proc = radialGradient.fTileProc;
|
| - const uint16_t* SK_RESTRICT cache = fCache->getCache16();
|
| - int toggle = init_dither_toggle16(x, y);
|
| -
|
| - if (fDstToIndexClass != kPerspective_MatrixClass) {
|
| - dstProc(fDstToIndex, SkIntToScalar(x) + SK_ScalarHalf,
|
| - SkIntToScalar(y) + SK_ScalarHalf, &srcPt);
|
| -
|
| - SkScalar sdx = fDstToIndex.getScaleX();
|
| - SkScalar sdy = fDstToIndex.getSkewY();
|
| -
|
| - if (fDstToIndexClass == kFixedStepInX_MatrixClass) {
|
| - SkFixed storage[2];
|
| - (void)fDstToIndex.fixedStepInX(SkIntToScalar(y),
|
| - &storage[0], &storage[1]);
|
| - sdx = SkFixedToScalar(storage[0]);
|
| - sdy = SkFixedToScalar(storage[1]);
|
| - } else {
|
| - SkASSERT(fDstToIndexClass == kLinear_MatrixClass);
|
| - }
|
| -
|
| - RadialShade16Proc shadeProc = shadeSpan16_radial_repeat;
|
| - if (SkShader::kClamp_TileMode == radialGradient.fTileMode) {
|
| - shadeProc = shadeSpan16_radial_clamp;
|
| - } else if (SkShader::kMirror_TileMode == radialGradient.fTileMode) {
|
| - shadeProc = shadeSpan16_radial_mirror;
|
| - } else {
|
| - SkASSERT(SkShader::kRepeat_TileMode == radialGradient.fTileMode);
|
| - }
|
| - (*shadeProc)(srcPt.fX, sdx, srcPt.fY, sdy, dstC,
|
| - cache, toggle, count);
|
| - } else { // perspective case
|
| - SkScalar dstX = SkIntToScalar(x);
|
| - SkScalar dstY = SkIntToScalar(y);
|
| - do {
|
| - dstProc(fDstToIndex, dstX, dstY, &srcPt);
|
| - unsigned fi = proc(SkScalarToFixed(srcPt.length()));
|
| - SkASSERT(fi <= 0xFFFF);
|
| -
|
| - int index = fi >> (16 - kCache16Bits);
|
| - *dstC++ = cache[toggle + index];
|
| - toggle = next_dither_toggle16(toggle);
|
| -
|
| - dstX += SK_Scalar1;
|
| - } while (--count != 0);
|
| - }
|
| -}
|
| -
|
| SkShader::GradientType SkRadialGradient::asAGradient(GradientInfo* info) const {
|
| if (info) {
|
| commonAsAGradient(info);
|
|
|