michael@0: michael@0: #include michael@0: michael@0: michael@0: #define SCALE_NOFILTER_NAME MAKENAME(_nofilter_scale) michael@0: #define SCALE_FILTER_NAME MAKENAME(_filter_scale) michael@0: #define AFFINE_NOFILTER_NAME MAKENAME(_nofilter_affine) michael@0: #define AFFINE_FILTER_NAME MAKENAME(_filter_affine) michael@0: #define PERSP_NOFILTER_NAME MAKENAME(_nofilter_persp) michael@0: #define PERSP_FILTER_NAME MAKENAME(_filter_persp) michael@0: michael@0: #define PACK_FILTER_X_NAME MAKENAME(_pack_filter_x) michael@0: #define PACK_FILTER_Y_NAME MAKENAME(_pack_filter_y) michael@0: #define PACK_FILTER_X4_NAME MAKENAME(_pack_filter_x4) michael@0: #define PACK_FILTER_Y4_NAME MAKENAME(_pack_filter_y4) michael@0: michael@0: #ifndef PREAMBLE michael@0: #define PREAMBLE(state) michael@0: #define PREAMBLE_PARAM_X michael@0: #define PREAMBLE_PARAM_Y michael@0: #define PREAMBLE_ARG_X michael@0: #define PREAMBLE_ARG_Y michael@0: #endif michael@0: michael@0: static void SCALE_NOFILTER_NAME(const SkBitmapProcState& s, michael@0: uint32_t xy[], int count, int x, int y) { michael@0: SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask | michael@0: SkMatrix::kScale_Mask)) == 0); michael@0: michael@0: PREAMBLE(s); michael@0: michael@0: // we store y, x, x, x, x, x michael@0: const unsigned maxX = s.fBitmap->width() - 1; michael@0: SkFractionalInt fx; michael@0: { michael@0: SkPoint pt; michael@0: s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, michael@0: SkIntToScalar(y) + SK_ScalarHalf, &pt); michael@0: fx = SkScalarToFractionalInt(pt.fY); michael@0: const unsigned maxY = s.fBitmap->height() - 1; michael@0: *xy++ = TILEY_PROCF(SkFractionalIntToFixed(fx), maxY); michael@0: fx = SkScalarToFractionalInt(pt.fX); michael@0: } michael@0: michael@0: if (0 == maxX) { michael@0: // all of the following X values must be 0 michael@0: memset(xy, 0, count * sizeof(uint16_t)); michael@0: return; michael@0: } michael@0: michael@0: const SkFractionalInt dx = s.fInvSxFractionalInt; michael@0: michael@0: #ifdef CHECK_FOR_DECAL michael@0: // test if we don't need to apply the tile proc michael@0: if (can_truncate_to_fixed_for_decal(fx, dx, count, maxX)) { michael@0: decal_nofilter_scale_neon(xy, SkFractionalIntToFixed(fx), michael@0: SkFractionalIntToFixed(dx), count); michael@0: return; michael@0: } michael@0: #endif michael@0: michael@0: if (count >= 8) { michael@0: SkFractionalInt dx2 = dx+dx; michael@0: SkFractionalInt dx4 = dx2+dx2; michael@0: SkFractionalInt dx8 = dx4+dx4; michael@0: michael@0: // now build fx/fx+dx/fx+2dx/fx+3dx michael@0: SkFractionalInt fx1, fx2, fx3; michael@0: int32x4_t lbase, hbase; michael@0: int16_t *dst16 = (int16_t *)xy; michael@0: michael@0: fx1 = fx+dx; michael@0: fx2 = fx1+dx; michael@0: fx3 = fx2+dx; michael@0: michael@0: lbase = vdupq_n_s32(SkFractionalIntToFixed(fx)); michael@0: lbase = vsetq_lane_s32(SkFractionalIntToFixed(fx1), lbase, 1); michael@0: lbase = vsetq_lane_s32(SkFractionalIntToFixed(fx2), lbase, 2); michael@0: lbase = vsetq_lane_s32(SkFractionalIntToFixed(fx3), lbase, 3); michael@0: hbase = vaddq_s32(lbase, vdupq_n_s32(SkFractionalIntToFixed(dx4))); michael@0: michael@0: // store & bump michael@0: while (count >= 8) { michael@0: michael@0: int16x8_t fx8; michael@0: michael@0: fx8 = TILEX_PROCF_NEON8(lbase, hbase, maxX); michael@0: michael@0: vst1q_s16(dst16, fx8); michael@0: michael@0: // but preserving base & on to the next michael@0: lbase = vaddq_s32 (lbase, vdupq_n_s32(SkFractionalIntToFixed(dx8))); michael@0: hbase = vaddq_s32 (hbase, vdupq_n_s32(SkFractionalIntToFixed(dx8))); michael@0: dst16 += 8; michael@0: count -= 8; michael@0: fx += dx8; michael@0: }; michael@0: xy = (uint32_t *) dst16; michael@0: } michael@0: michael@0: uint16_t* xx = (uint16_t*)xy; michael@0: for (int i = count; i > 0; --i) { michael@0: *xx++ = TILEX_PROCF(SkFractionalIntToFixed(fx), maxX); michael@0: fx += dx; michael@0: } michael@0: } michael@0: michael@0: static void AFFINE_NOFILTER_NAME(const SkBitmapProcState& s, michael@0: uint32_t xy[], int count, int x, int y) { michael@0: SkASSERT(s.fInvType & SkMatrix::kAffine_Mask); michael@0: SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask | michael@0: SkMatrix::kScale_Mask | michael@0: SkMatrix::kAffine_Mask)) == 0); michael@0: michael@0: PREAMBLE(s); michael@0: SkPoint srcPt; michael@0: s.fInvProc(s.fInvMatrix, michael@0: SkIntToScalar(x) + SK_ScalarHalf, michael@0: SkIntToScalar(y) + SK_ScalarHalf, &srcPt); michael@0: michael@0: SkFractionalInt fx = SkScalarToFractionalInt(srcPt.fX); michael@0: SkFractionalInt fy = SkScalarToFractionalInt(srcPt.fY); michael@0: SkFractionalInt dx = s.fInvSxFractionalInt; michael@0: SkFractionalInt dy = s.fInvKyFractionalInt; michael@0: int maxX = s.fBitmap->width() - 1; michael@0: int maxY = s.fBitmap->height() - 1; michael@0: michael@0: if (count >= 8) { michael@0: SkFractionalInt dx4 = dx * 4; michael@0: SkFractionalInt dy4 = dy * 4; michael@0: SkFractionalInt dx8 = dx * 8; michael@0: SkFractionalInt dy8 = dy * 8; michael@0: michael@0: int32x4_t xbase, ybase; michael@0: int32x4_t x2base, y2base; michael@0: int16_t *dst16 = (int16_t *) xy; michael@0: michael@0: // now build fx, fx+dx, fx+2dx, fx+3dx michael@0: xbase = vdupq_n_s32(SkFractionalIntToFixed(fx)); michael@0: xbase = vsetq_lane_s32(SkFractionalIntToFixed(fx+dx), xbase, 1); michael@0: xbase = vsetq_lane_s32(SkFractionalIntToFixed(fx+dx+dx), xbase, 2); michael@0: xbase = vsetq_lane_s32(SkFractionalIntToFixed(fx+dx+dx+dx), xbase, 3); michael@0: michael@0: // same for fy michael@0: ybase = vdupq_n_s32(SkFractionalIntToFixed(fy)); michael@0: ybase = vsetq_lane_s32(SkFractionalIntToFixed(fy+dy), ybase, 1); michael@0: ybase = vsetq_lane_s32(SkFractionalIntToFixed(fy+dy+dy), ybase, 2); michael@0: ybase = vsetq_lane_s32(SkFractionalIntToFixed(fy+dy+dy+dy), ybase, 3); michael@0: michael@0: x2base = vaddq_s32(xbase, vdupq_n_s32(SkFractionalIntToFixed(dx4))); michael@0: y2base = vaddq_s32(ybase, vdupq_n_s32(SkFractionalIntToFixed(dy4))); michael@0: michael@0: // store & bump michael@0: do { michael@0: int16x8x2_t hi16; michael@0: michael@0: hi16.val[0] = TILEX_PROCF_NEON8(xbase, x2base, maxX); michael@0: hi16.val[1] = TILEY_PROCF_NEON8(ybase, y2base, maxY); michael@0: michael@0: vst2q_s16(dst16, hi16); michael@0: michael@0: // moving base and on to the next michael@0: xbase = vaddq_s32(xbase, vdupq_n_s32(SkFractionalIntToFixed(dx8))); michael@0: ybase = vaddq_s32(ybase, vdupq_n_s32(SkFractionalIntToFixed(dy8))); michael@0: x2base = vaddq_s32(x2base, vdupq_n_s32(SkFractionalIntToFixed(dx8))); michael@0: y2base = vaddq_s32(y2base, vdupq_n_s32(SkFractionalIntToFixed(dy8))); michael@0: michael@0: dst16 += 16; // 8x32 aka 16x16 michael@0: count -= 8; michael@0: fx += dx8; michael@0: fy += dy8; michael@0: } while (count >= 8); michael@0: xy = (uint32_t *) dst16; michael@0: } michael@0: michael@0: for (int i = count; i > 0; --i) { michael@0: *xy++ = (TILEY_PROCF(SkFractionalIntToFixed(fy), maxY) << 16) | michael@0: TILEX_PROCF(SkFractionalIntToFixed(fx), maxX); michael@0: fx += dx; fy += dy; michael@0: } michael@0: } michael@0: michael@0: static void PERSP_NOFILTER_NAME(const SkBitmapProcState& s, michael@0: uint32_t* SK_RESTRICT xy, michael@0: int count, int x, int y) { michael@0: SkASSERT(s.fInvType & SkMatrix::kPerspective_Mask); michael@0: michael@0: PREAMBLE(s); michael@0: // max{X,Y} are int here, but later shown/assumed to fit in 16 bits michael@0: int maxX = s.fBitmap->width() - 1; michael@0: int maxY = s.fBitmap->height() - 1; michael@0: michael@0: SkPerspIter iter(s.fInvMatrix, michael@0: SkIntToScalar(x) + SK_ScalarHalf, michael@0: SkIntToScalar(y) + SK_ScalarHalf, count); michael@0: michael@0: while ((count = iter.next()) != 0) { michael@0: const SkFixed* SK_RESTRICT srcXY = iter.getXY(); michael@0: michael@0: if (count >= 8) { michael@0: int32_t *mysrc = (int32_t *) srcXY; michael@0: int16_t *mydst = (int16_t *) xy; michael@0: do { michael@0: int16x8x2_t hi16; michael@0: int32x4x2_t xy1, xy2; michael@0: michael@0: xy1 = vld2q_s32(mysrc); michael@0: xy2 = vld2q_s32(mysrc+8); michael@0: michael@0: hi16.val[0] = TILEX_PROCF_NEON8(xy1.val[0], xy2.val[0], maxX); michael@0: hi16.val[1] = TILEY_PROCF_NEON8(xy1.val[1], xy2.val[1], maxY); michael@0: michael@0: vst2q_s16(mydst, hi16); michael@0: michael@0: count -= 8; // 8 iterations michael@0: mysrc += 16; // 16 longs michael@0: mydst += 16; // 16 shorts, aka 8 longs michael@0: } while (count >= 8); michael@0: // get xy and srcXY fixed up michael@0: srcXY = (const SkFixed *) mysrc; michael@0: xy = (uint32_t *) mydst; michael@0: } michael@0: michael@0: while (--count >= 0) { michael@0: *xy++ = (TILEY_PROCF(srcXY[1], maxY) << 16) | michael@0: TILEX_PROCF(srcXY[0], maxX); michael@0: srcXY += 2; michael@0: } michael@0: } michael@0: } michael@0: michael@0: static inline uint32_t PACK_FILTER_Y_NAME(SkFixed f, unsigned max, michael@0: SkFixed one PREAMBLE_PARAM_Y) { michael@0: unsigned i = TILEY_PROCF(f, max); michael@0: i = (i << 4) | TILEY_LOW_BITS(f, max); michael@0: return (i << 14) | (TILEY_PROCF((f + one), max)); michael@0: } michael@0: michael@0: static inline uint32_t PACK_FILTER_X_NAME(SkFixed f, unsigned max, michael@0: SkFixed one PREAMBLE_PARAM_X) { michael@0: unsigned i = TILEX_PROCF(f, max); michael@0: i = (i << 4) | TILEX_LOW_BITS(f, max); michael@0: return (i << 14) | (TILEX_PROCF((f + one), max)); michael@0: } michael@0: michael@0: static inline int32x4_t PACK_FILTER_X4_NAME(int32x4_t f, unsigned max, michael@0: SkFixed one PREAMBLE_PARAM_X) { michael@0: int32x4_t ret, res, wide_one; michael@0: michael@0: // Prepare constants michael@0: wide_one = vdupq_n_s32(one); michael@0: michael@0: // Step 1 michael@0: res = TILEX_PROCF_NEON4(f, max); michael@0: michael@0: // Step 2 michael@0: ret = TILEX_LOW_BITS_NEON4(f, max); michael@0: ret = vsliq_n_s32(ret, res, 4); michael@0: michael@0: // Step 3 michael@0: res = TILEX_PROCF_NEON4(f + wide_one, max); michael@0: ret = vorrq_s32(vshlq_n_s32(ret, 14), res); michael@0: michael@0: return ret; michael@0: } michael@0: michael@0: static inline int32x4_t PACK_FILTER_Y4_NAME(int32x4_t f, unsigned max, michael@0: SkFixed one PREAMBLE_PARAM_X) { michael@0: int32x4_t ret, res, wide_one; michael@0: michael@0: // Prepare constants michael@0: wide_one = vdupq_n_s32(one); michael@0: michael@0: // Step 1 michael@0: res = TILEY_PROCF_NEON4(f, max); michael@0: michael@0: // Step 2 michael@0: ret = TILEY_LOW_BITS_NEON4(f, max); michael@0: ret = vsliq_n_s32(ret, res, 4); michael@0: michael@0: // Step 3 michael@0: res = TILEY_PROCF_NEON4(f + wide_one, max); michael@0: ret = vorrq_s32(vshlq_n_s32(ret, 14), res); michael@0: michael@0: return ret; michael@0: } michael@0: michael@0: static void SCALE_FILTER_NAME(const SkBitmapProcState& s, michael@0: uint32_t xy[], int count, int x, int y) { michael@0: SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask | michael@0: SkMatrix::kScale_Mask)) == 0); michael@0: SkASSERT(s.fInvKy == 0); michael@0: michael@0: PREAMBLE(s); michael@0: michael@0: const unsigned maxX = s.fBitmap->width() - 1; michael@0: const SkFixed one = s.fFilterOneX; michael@0: const SkFractionalInt dx = s.fInvSxFractionalInt; michael@0: SkFractionalInt fx; michael@0: michael@0: { michael@0: SkPoint pt; michael@0: s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, michael@0: SkIntToScalar(y) + SK_ScalarHalf, &pt); michael@0: const SkFixed fy = SkScalarToFixed(pt.fY) - (s.fFilterOneY >> 1); michael@0: const unsigned maxY = s.fBitmap->height() - 1; michael@0: // compute our two Y values up front michael@0: *xy++ = PACK_FILTER_Y_NAME(fy, maxY, s.fFilterOneY PREAMBLE_ARG_Y); michael@0: // now initialize fx michael@0: fx = SkScalarToFractionalInt(pt.fX) - (SkFixedToFractionalInt(one) >> 1); michael@0: } michael@0: michael@0: #ifdef CHECK_FOR_DECAL michael@0: // test if we don't need to apply the tile proc michael@0: if (can_truncate_to_fixed_for_decal(fx, dx, count, maxX)) { michael@0: decal_filter_scale_neon(xy, SkFractionalIntToFixed(fx), michael@0: SkFractionalIntToFixed(dx), count); michael@0: return; michael@0: } michael@0: #endif michael@0: { michael@0: michael@0: if (count >= 4) { michael@0: int32x4_t wide_fx; michael@0: michael@0: wide_fx = vdupq_n_s32(SkFractionalIntToFixed(fx)); michael@0: wide_fx = vsetq_lane_s32(SkFractionalIntToFixed(fx+dx), wide_fx, 1); michael@0: wide_fx = vsetq_lane_s32(SkFractionalIntToFixed(fx+dx+dx), wide_fx, 2); michael@0: wide_fx = vsetq_lane_s32(SkFractionalIntToFixed(fx+dx+dx+dx), wide_fx, 3); michael@0: michael@0: while (count >= 4) { michael@0: int32x4_t res; michael@0: michael@0: res = PACK_FILTER_X4_NAME(wide_fx, maxX, one PREAMBLE_ARG_X); michael@0: michael@0: vst1q_u32(xy, vreinterpretq_u32_s32(res)); michael@0: michael@0: wide_fx += vdupq_n_s32(SkFractionalIntToFixed(dx+dx+dx+dx)); michael@0: fx += dx+dx+dx+dx; michael@0: xy += 4; michael@0: count -= 4; michael@0: } michael@0: } michael@0: michael@0: while (--count >= 0) { michael@0: *xy++ = PACK_FILTER_X_NAME(SkFractionalIntToFixed(fx), maxX, one PREAMBLE_ARG_X); michael@0: fx += dx; michael@0: } michael@0: michael@0: } michael@0: } michael@0: michael@0: static void AFFINE_FILTER_NAME(const SkBitmapProcState& s, michael@0: uint32_t xy[], int count, int x, int y) { michael@0: SkASSERT(s.fInvType & SkMatrix::kAffine_Mask); michael@0: SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask | michael@0: SkMatrix::kScale_Mask | michael@0: SkMatrix::kAffine_Mask)) == 0); michael@0: michael@0: PREAMBLE(s); michael@0: SkPoint srcPt; michael@0: s.fInvProc(s.fInvMatrix, michael@0: SkIntToScalar(x) + SK_ScalarHalf, michael@0: SkIntToScalar(y) + SK_ScalarHalf, &srcPt); michael@0: michael@0: SkFixed oneX = s.fFilterOneX; michael@0: SkFixed oneY = s.fFilterOneY; michael@0: SkFixed fx = SkScalarToFixed(srcPt.fX) - (oneX >> 1); michael@0: SkFixed fy = SkScalarToFixed(srcPt.fY) - (oneY >> 1); michael@0: SkFixed dx = s.fInvSx; michael@0: SkFixed dy = s.fInvKy; michael@0: unsigned maxX = s.fBitmap->width() - 1; michael@0: unsigned maxY = s.fBitmap->height() - 1; michael@0: michael@0: if (count >= 4) { michael@0: int32x4_t wide_fy, wide_fx; michael@0: michael@0: wide_fx = vdupq_n_s32(fx); michael@0: wide_fx = vsetq_lane_s32(fx+dx, wide_fx, 1); michael@0: wide_fx = vsetq_lane_s32(fx+dx+dx, wide_fx, 2); michael@0: wide_fx = vsetq_lane_s32(fx+dx+dx+dx, wide_fx, 3); michael@0: michael@0: wide_fy = vdupq_n_s32(fy); michael@0: wide_fy = vsetq_lane_s32(fy+dy, wide_fy, 1); michael@0: wide_fy = vsetq_lane_s32(fy+dy+dy, wide_fy, 2); michael@0: wide_fy = vsetq_lane_s32(fy+dy+dy+dy, wide_fy, 3); michael@0: michael@0: while (count >= 4) { michael@0: int32x4x2_t vxy; michael@0: michael@0: // do the X side, then the Y side, then interleave them michael@0: vxy.val[0] = PACK_FILTER_Y4_NAME(wide_fy, maxY, oneY PREAMBLE_ARG_Y); michael@0: vxy.val[1] = PACK_FILTER_X4_NAME(wide_fx, maxX, oneX PREAMBLE_ARG_X); michael@0: michael@0: // interleave as YXYXYXYX as part of the storing michael@0: vst2q_s32((int32_t*)xy, vxy); michael@0: michael@0: // prepare next iteration michael@0: wide_fx += vdupq_n_s32(dx+dx+dx+dx); michael@0: fx += dx + dx + dx + dx; michael@0: wide_fy += vdupq_n_s32(dy+dy+dy+dy); michael@0: fy += dy+dy+dy+dy; michael@0: xy += 8; // 4 x's, 4 y's michael@0: count -= 4; michael@0: } michael@0: } michael@0: michael@0: while (--count >= 0) { michael@0: // NB: writing Y/X michael@0: *xy++ = PACK_FILTER_Y_NAME(fy, maxY, oneY PREAMBLE_ARG_Y); michael@0: fy += dy; michael@0: *xy++ = PACK_FILTER_X_NAME(fx, maxX, oneX PREAMBLE_ARG_X); michael@0: fx += dx; michael@0: } michael@0: } michael@0: michael@0: static void PERSP_FILTER_NAME(const SkBitmapProcState& s, michael@0: uint32_t* SK_RESTRICT xy, int count, michael@0: int x, int y) { michael@0: SkASSERT(s.fInvType & SkMatrix::kPerspective_Mask); michael@0: michael@0: PREAMBLE(s); michael@0: unsigned maxX = s.fBitmap->width() - 1; michael@0: unsigned maxY = s.fBitmap->height() - 1; michael@0: SkFixed oneX = s.fFilterOneX; michael@0: SkFixed oneY = s.fFilterOneY; michael@0: michael@0: SkPerspIter iter(s.fInvMatrix, michael@0: SkIntToScalar(x) + SK_ScalarHalf, michael@0: SkIntToScalar(y) + SK_ScalarHalf, count); michael@0: michael@0: while ((count = iter.next()) != 0) { michael@0: const SkFixed* SK_RESTRICT srcXY = iter.getXY(); michael@0: michael@0: while (count >= 4) { michael@0: int32x4_t wide_x, wide_y; michael@0: int32x4x2_t vxy, vresyx; michael@0: michael@0: // load src: x-y-x-y-x-y-x-y michael@0: vxy = vld2q_s32(srcXY); michael@0: michael@0: // do the X side, then the Y side, then interleave them michael@0: wide_x = vsubq_s32(vxy.val[0], vdupq_n_s32(oneX>>1)); michael@0: wide_y = vsubq_s32(vxy.val[1], vdupq_n_s32(oneY>>1)); michael@0: michael@0: vresyx.val[0] = PACK_FILTER_Y4_NAME(wide_y, maxY, oneY PREAMBLE_ARG_Y); michael@0: vresyx.val[1] = PACK_FILTER_X4_NAME(wide_x, maxX, oneX PREAMBLE_ARG_X); michael@0: michael@0: // store interleaved as y-x-y-x-y-x-y-x (NB != read order) michael@0: vst2q_s32((int32_t*)xy, vresyx); michael@0: michael@0: // on to the next iteration michael@0: srcXY += 2*4; michael@0: count -= 4; michael@0: xy += 2*4; michael@0: } michael@0: michael@0: while (--count >= 0) { michael@0: // NB: we read x/y, we write y/x michael@0: *xy++ = PACK_FILTER_Y_NAME(srcXY[1] - (oneY >> 1), maxY, michael@0: oneY PREAMBLE_ARG_Y); michael@0: *xy++ = PACK_FILTER_X_NAME(srcXY[0] - (oneX >> 1), maxX, michael@0: oneX PREAMBLE_ARG_X); michael@0: srcXY += 2; michael@0: } michael@0: } michael@0: } michael@0: michael@0: const SkBitmapProcState::MatrixProc MAKENAME(_Procs)[] = { michael@0: SCALE_NOFILTER_NAME, michael@0: SCALE_FILTER_NAME, michael@0: AFFINE_NOFILTER_NAME, michael@0: AFFINE_FILTER_NAME, michael@0: PERSP_NOFILTER_NAME, michael@0: PERSP_FILTER_NAME michael@0: }; michael@0: michael@0: #undef TILEX_PROCF_NEON8 michael@0: #undef TILEY_PROCF_NEON8 michael@0: #undef TILEX_PROCF_NEON4 michael@0: #undef TILEY_PROCF_NEON4 michael@0: #undef TILEX_LOW_BITS_NEON4 michael@0: #undef TILEY_LOW_BITS_NEON4 michael@0: michael@0: #undef MAKENAME michael@0: #undef TILEX_PROCF michael@0: #undef TILEY_PROCF michael@0: #ifdef CHECK_FOR_DECAL michael@0: #undef CHECK_FOR_DECAL michael@0: #endif michael@0: michael@0: #undef SCALE_NOFILTER_NAME michael@0: #undef SCALE_FILTER_NAME michael@0: #undef AFFINE_NOFILTER_NAME michael@0: #undef AFFINE_FILTER_NAME michael@0: #undef PERSP_NOFILTER_NAME michael@0: #undef PERSP_FILTER_NAME michael@0: michael@0: #undef PREAMBLE michael@0: #undef PREAMBLE_PARAM_X michael@0: #undef PREAMBLE_PARAM_Y michael@0: #undef PREAMBLE_ARG_X michael@0: #undef PREAMBLE_ARG_Y michael@0: michael@0: #undef TILEX_LOW_BITS michael@0: #undef TILEY_LOW_BITS