| Index: src/opts/SkBitmapProcState_matrix_neon.h
|
| diff --git a/src/opts/SkBitmapProcState_matrix_neon.h b/src/opts/SkBitmapProcState_matrix_neon.h
|
| index aab9dbc61e363b45e5217b4d51de468ec297a936..72bf1bce3365842c535e79160f1c0c5c4c6422ad 100644
|
| --- a/src/opts/SkBitmapProcState_matrix_neon.h
|
| +++ b/src/opts/SkBitmapProcState_matrix_neon.h
|
| @@ -31,15 +31,15 @@ static void SCALE_NOFILTER_NAME(const SkBitmapProcState& s,
|
|
|
| // we store y, x, x, x, x, x
|
| const unsigned maxX = s.fBitmap->width() - 1;
|
| - SkFixed fx;
|
| + SkFractionalInt fx;
|
| {
|
| SkPoint pt;
|
| s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf,
|
| SkIntToScalar(y) + SK_ScalarHalf, &pt);
|
| - fx = SkScalarToFixed(pt.fY);
|
| + fx = SkScalarToFractionalInt(pt.fY);
|
| const unsigned maxY = s.fBitmap->height() - 1;
|
| - *xy++ = TILEY_PROCF(fx, maxY);
|
| - fx = SkScalarToFixed(pt.fX);
|
| + *xy++ = TILEY_PROCF(SkFractionalIntToFixed(fx), maxY);
|
| + fx = SkScalarToFractionalInt(pt.fX);
|
| }
|
|
|
| if (0 == maxX) {
|
| @@ -48,23 +48,24 @@ static void SCALE_NOFILTER_NAME(const SkBitmapProcState& s,
|
| return;
|
| }
|
|
|
| - const SkFixed dx = s.fInvSx;
|
| + const SkFractionalInt dx = s.fInvSxFractionalInt;
|
|
|
| #ifdef CHECK_FOR_DECAL
|
| // test if we don't need to apply the tile proc
|
| if (can_truncate_to_fixed_for_decal(fx, dx, count, maxX)) {
|
| - decal_nofilter_scale_neon(xy, fx, dx, count);
|
| + decal_nofilter_scale_neon(xy, SkFractionalIntToFixed(fx),
|
| + SkFractionalIntToFixed(dx), count);
|
| return;
|
| }
|
| #endif
|
|
|
| if (count >= 8) {
|
| - SkFixed dx2 = dx+dx;
|
| - SkFixed dx4 = dx2+dx2;
|
| - SkFixed dx8 = dx4+dx4;
|
| + SkFractionalInt dx2 = dx+dx;
|
| + SkFractionalInt dx4 = dx2+dx2;
|
| + SkFractionalInt dx8 = dx4+dx4;
|
|
|
| // now build fx/fx+dx/fx+2dx/fx+3dx
|
| - SkFixed fx1, fx2, fx3;
|
| + SkFractionalInt fx1, fx2, fx3;
|
| int32x4_t lbase, hbase;
|
| int16_t *dst16 = (int16_t *)xy;
|
|
|
| @@ -72,11 +73,11 @@ static void SCALE_NOFILTER_NAME(const SkBitmapProcState& s,
|
| fx2 = fx1+dx;
|
| fx3 = fx2+dx;
|
|
|
| - lbase = vdupq_n_s32(fx);
|
| - lbase = vsetq_lane_s32(fx1, lbase, 1);
|
| - lbase = vsetq_lane_s32(fx2, lbase, 2);
|
| - lbase = vsetq_lane_s32(fx3, lbase, 3);
|
| - hbase = vaddq_s32(lbase, vdupq_n_s32(dx4));
|
| + lbase = vdupq_n_s32(SkFractionalIntToFixed(fx));
|
| + lbase = vsetq_lane_s32(SkFractionalIntToFixed(fx1), lbase, 1);
|
| + lbase = vsetq_lane_s32(SkFractionalIntToFixed(fx2), lbase, 2);
|
| + lbase = vsetq_lane_s32(SkFractionalIntToFixed(fx3), lbase, 3);
|
| + hbase = vaddq_s32(lbase, vdupq_n_s32(SkFractionalIntToFixed(dx4)));
|
|
|
| // store & bump
|
| while (count >= 8) {
|
| @@ -88,8 +89,8 @@ static void SCALE_NOFILTER_NAME(const SkBitmapProcState& s,
|
| vst1q_s16(dst16, fx8);
|
|
|
| // but preserving base & on to the next
|
| - lbase = vaddq_s32 (lbase, vdupq_n_s32(dx8));
|
| - hbase = vaddq_s32 (hbase, vdupq_n_s32(dx8));
|
| + lbase = vaddq_s32 (lbase, vdupq_n_s32(SkFractionalIntToFixed(dx8)));
|
| + hbase = vaddq_s32 (hbase, vdupq_n_s32(SkFractionalIntToFixed(dx8)));
|
| dst16 += 8;
|
| count -= 8;
|
| fx += dx8;
|
| @@ -99,7 +100,7 @@ static void SCALE_NOFILTER_NAME(const SkBitmapProcState& s,
|
|
|
| uint16_t* xx = (uint16_t*)xy;
|
| for (int i = count; i > 0; --i) {
|
| - *xx++ = TILEX_PROCF(fx, maxX);
|
| + *xx++ = TILEX_PROCF(SkFractionalIntToFixed(fx), maxX);
|
| fx += dx;
|
| }
|
| }
|
| @@ -117,37 +118,37 @@ static void AFFINE_NOFILTER_NAME(const SkBitmapProcState& s,
|
| SkIntToScalar(x) + SK_ScalarHalf,
|
| SkIntToScalar(y) + SK_ScalarHalf, &srcPt);
|
|
|
| - SkFixed fx = SkScalarToFixed(srcPt.fX);
|
| - SkFixed fy = SkScalarToFixed(srcPt.fY);
|
| - SkFixed dx = s.fInvSx;
|
| - SkFixed dy = s.fInvKy;
|
| + SkFractionalInt fx = SkScalarToFractionalInt(srcPt.fX);
|
| + SkFractionalInt fy = SkScalarToFractionalInt(srcPt.fY);
|
| + SkFractionalInt dx = s.fInvSxFractionalInt;
|
| + SkFractionalInt dy = s.fInvKyFractionalInt;
|
| int maxX = s.fBitmap->width() - 1;
|
| int maxY = s.fBitmap->height() - 1;
|
|
|
| if (count >= 8) {
|
| - SkFixed dx4 = dx * 4;
|
| - SkFixed dy4 = dy * 4;
|
| - SkFixed dx8 = dx * 8;
|
| - SkFixed dy8 = dy * 8;
|
| + SkFractionalInt dx4 = dx * 4;
|
| + SkFractionalInt dy4 = dy * 4;
|
| + SkFractionalInt dx8 = dx * 8;
|
| + SkFractionalInt dy8 = dy * 8;
|
|
|
| int32x4_t xbase, ybase;
|
| int32x4_t x2base, y2base;
|
| int16_t *dst16 = (int16_t *) xy;
|
|
|
| // now build fx, fx+dx, fx+2dx, fx+3dx
|
| - xbase = vdupq_n_s32(fx);
|
| - xbase = vsetq_lane_s32(fx+dx, xbase, 1);
|
| - xbase = vsetq_lane_s32(fx+dx+dx, xbase, 2);
|
| - xbase = vsetq_lane_s32(fx+dx+dx+dx, xbase, 3);
|
| + xbase = vdupq_n_s32(SkFractionalIntToFixed(fx));
|
| + xbase = vsetq_lane_s32(SkFractionalIntToFixed(fx+dx), xbase, 1);
|
| + xbase = vsetq_lane_s32(SkFractionalIntToFixed(fx+dx+dx), xbase, 2);
|
| + xbase = vsetq_lane_s32(SkFractionalIntToFixed(fx+dx+dx+dx), xbase, 3);
|
|
|
| // same for fy
|
| - ybase = vdupq_n_s32(fy);
|
| - ybase = vsetq_lane_s32(fy+dy, ybase, 1);
|
| - ybase = vsetq_lane_s32(fy+dy+dy, ybase, 2);
|
| - ybase = vsetq_lane_s32(fy+dy+dy+dy, ybase, 3);
|
| + ybase = vdupq_n_s32(SkFractionalIntToFixed(fy));
|
| + ybase = vsetq_lane_s32(SkFractionalIntToFixed(fy+dy), ybase, 1);
|
| + ybase = vsetq_lane_s32(SkFractionalIntToFixed(fy+dy+dy), ybase, 2);
|
| + ybase = vsetq_lane_s32(SkFractionalIntToFixed(fy+dy+dy+dy), ybase, 3);
|
|
|
| - x2base = vaddq_s32(xbase, vdupq_n_s32(dx4));
|
| - y2base = vaddq_s32(ybase, vdupq_n_s32(dy4));
|
| + x2base = vaddq_s32(xbase, vdupq_n_s32(SkFractionalIntToFixed(dx4)));
|
| + y2base = vaddq_s32(ybase, vdupq_n_s32(SkFractionalIntToFixed(dy4)));
|
|
|
| // store & bump
|
| do {
|
| @@ -159,10 +160,10 @@ static void AFFINE_NOFILTER_NAME(const SkBitmapProcState& s,
|
| vst2q_s16(dst16, hi16);
|
|
|
| // moving base and on to the next
|
| - xbase = vaddq_s32(xbase, vdupq_n_s32(dx8));
|
| - ybase = vaddq_s32(ybase, vdupq_n_s32(dy8));
|
| - x2base = vaddq_s32(x2base, vdupq_n_s32(dx8));
|
| - y2base = vaddq_s32(y2base, vdupq_n_s32(dy8));
|
| + xbase = vaddq_s32(xbase, vdupq_n_s32(SkFractionalIntToFixed(dx8)));
|
| + ybase = vaddq_s32(ybase, vdupq_n_s32(SkFractionalIntToFixed(dy8)));
|
| + x2base = vaddq_s32(x2base, vdupq_n_s32(SkFractionalIntToFixed(dx8)));
|
| + y2base = vaddq_s32(y2base, vdupq_n_s32(SkFractionalIntToFixed(dy8)));
|
|
|
| dst16 += 16; // 8x32 aka 16x16
|
| count -= 8;
|
| @@ -173,7 +174,8 @@ static void AFFINE_NOFILTER_NAME(const SkBitmapProcState& s,
|
| }
|
|
|
| for (int i = count; i > 0; --i) {
|
| - *xy++ = (TILEY_PROCF(fy, maxY) << 16) | TILEX_PROCF(fx, maxX);
|
| + *xy++ = (TILEY_PROCF(SkFractionalIntToFixed(fy), maxY) << 16) |
|
| + TILEX_PROCF(SkFractionalIntToFixed(fx), maxX);
|
| fx += dx; fy += dy;
|
| }
|
| }
|
| @@ -293,8 +295,8 @@ static void SCALE_FILTER_NAME(const SkBitmapProcState& s,
|
|
|
| const unsigned maxX = s.fBitmap->width() - 1;
|
| const SkFixed one = s.fFilterOneX;
|
| - const SkFixed dx = s.fInvSx;
|
| - SkFixed fx;
|
| + const SkFractionalInt dx = s.fInvSxFractionalInt;
|
| + SkFractionalInt fx;
|
|
|
| {
|
| SkPoint pt;
|
| @@ -305,13 +307,14 @@ static void SCALE_FILTER_NAME(const SkBitmapProcState& s,
|
| // compute our two Y values up front
|
| *xy++ = PACK_FILTER_Y_NAME(fy, maxY, s.fFilterOneY PREAMBLE_ARG_Y);
|
| // now initialize fx
|
| - fx = SkScalarToFixed(pt.fX) - (one >> 1);
|
| + fx = SkScalarToFractionalInt(pt.fX) - (SkFixedToFractionalInt(one) >> 1);
|
| }
|
|
|
| #ifdef CHECK_FOR_DECAL
|
| // test if we don't need to apply the tile proc
|
| if (can_truncate_to_fixed_for_decal(fx, dx, count, maxX)) {
|
| - decal_filter_scale_neon(xy, fx, dx, count);
|
| + decal_filter_scale_neon(xy, SkFractionalIntToFixed(fx),
|
| + SkFractionalIntToFixed(dx), count);
|
| return;
|
| }
|
| #endif
|
| @@ -320,10 +323,10 @@ static void SCALE_FILTER_NAME(const SkBitmapProcState& s,
|
| if (count >= 4) {
|
| int32x4_t wide_fx;
|
|
|
| - wide_fx = vdupq_n_s32(fx);
|
| - wide_fx = vsetq_lane_s32(fx+dx, wide_fx, 1);
|
| - wide_fx = vsetq_lane_s32(fx+dx+dx, wide_fx, 2);
|
| - wide_fx = vsetq_lane_s32(fx+dx+dx+dx, wide_fx, 3);
|
| + wide_fx = vdupq_n_s32(SkFractionalIntToFixed(fx));
|
| + wide_fx = vsetq_lane_s32(SkFractionalIntToFixed(fx+dx), wide_fx, 1);
|
| + wide_fx = vsetq_lane_s32(SkFractionalIntToFixed(fx+dx+dx), wide_fx, 2);
|
| + wide_fx = vsetq_lane_s32(SkFractionalIntToFixed(fx+dx+dx+dx), wide_fx, 3);
|
|
|
| while (count >= 4) {
|
| int32x4_t res;
|
| @@ -332,7 +335,7 @@ static void SCALE_FILTER_NAME(const SkBitmapProcState& s,
|
|
|
| vst1q_u32(xy, vreinterpretq_u32_s32(res));
|
|
|
| - wide_fx += vdupq_n_s32(dx+dx+dx+dx);
|
| + wide_fx += vdupq_n_s32(SkFractionalIntToFixed(dx+dx+dx+dx));
|
| fx += dx+dx+dx+dx;
|
| xy += 4;
|
| count -= 4;
|
| @@ -340,7 +343,7 @@ static void SCALE_FILTER_NAME(const SkBitmapProcState& s,
|
| }
|
|
|
| while (--count >= 0) {
|
| - *xy++ = PACK_FILTER_X_NAME(fx, maxX, one PREAMBLE_ARG_X);
|
| + *xy++ = PACK_FILTER_X_NAME(SkFractionalIntToFixed(fx), maxX, one PREAMBLE_ARG_X);
|
| fx += dx;
|
| }
|
|
|
|
|