10b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc. 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 70b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger */ 80b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkMath.h" 101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SCALE_NOFILTER_NAME MAKENAME(_nofilter_scale) 130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SCALE_FILTER_NAME MAKENAME(_filter_scale) 140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define AFFINE_NOFILTER_NAME MAKENAME(_nofilter_affine) 150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define AFFINE_FILTER_NAME MAKENAME(_filter_affine) 160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define PERSP_NOFILTER_NAME MAKENAME(_nofilter_persp) 170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define PERSP_FILTER_NAME MAKENAME(_filter_persp) 180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define PACK_FILTER_X_NAME MAKENAME(_pack_filter_x) 200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define PACK_FILTER_Y_NAME MAKENAME(_pack_filter_y) 210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef PREAMBLE 230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project #define PREAMBLE(state) 240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project #define PREAMBLE_PARAM_X 250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project #define PREAMBLE_PARAM_Y 260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project #define PREAMBLE_ARG_X 270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project #define PREAMBLE_ARG_Y 280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 30030ffe05175291b1d91ec6808e1a32e862ee90cdMike Reedvoid SCALE_NOFILTER_NAME(const SkBitmapProcState& s, 310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint32_t xy[], int count, int x, int y) { 320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask | 330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkMatrix::kScale_Mask)) == 0); 340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project PREAMBLE(s); 360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // we store y, x, x, x, x, x 370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const unsigned maxX = s.fBitmap->width() - 1; 390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed fx; 400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPoint pt; 420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project s.fInvProc(*s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, 430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkIntToScalar(y) + SK_ScalarHalf, &pt); 440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fx = SkScalarToFixed(pt.fY); 450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const unsigned maxY = s.fBitmap->height() - 1; 460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *xy++ = TILEY_PROCF(fx, maxY); 470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fx = SkScalarToFixed(pt.fX); 480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (0 == maxX) { 510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // all of the following X values must be 0 520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project memset(xy, 0, count * sizeof(uint16_t)); 530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return; 540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkFixed dx = s.fInvSx; 570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef CHECK_FOR_DECAL 590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // test if we don't need to apply the tile proc 600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if ((unsigned)(fx >> 16) <= maxX && 610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project (unsigned)((fx + dx * (count - 1)) >> 16) <= maxX) { 620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project decal_nofilter_scale(xy, fx, dx, count); 630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } else 640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int i; 670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project for (i = (count >> 2); i > 0; --i) { 680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned a, b; 690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project a = TILEX_PROCF(fx, maxX); fx += dx; 700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project b = TILEX_PROCF(fx, maxX); fx += dx; 710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_CPU_BENDIAN 720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *xy++ = (a << 16) | b; 730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else 740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *xy++ = (b << 16) | a; 750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project a = TILEX_PROCF(fx, maxX); fx += dx; 770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project b = TILEX_PROCF(fx, maxX); fx += dx; 780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_CPU_BENDIAN 790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *xy++ = (a << 16) | b; 800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else 810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *xy++ = (b << 16) | a; 820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint16_t* xx = (uint16_t*)xy; 850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project for (i = (count & 3); i > 0; --i) { 860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *xx++ = TILEX_PROCF(fx, maxX); fx += dx; 870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// note: we could special-case on a matrix which is skewed in X but not Y. 920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// this would require a more general setup thatn SCALE does, but could use 930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// SCALE's inner loop that only looks at dx 940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 95030ffe05175291b1d91ec6808e1a32e862ee90cdMike Reedvoid AFFINE_NOFILTER_NAME(const SkBitmapProcState& s, 960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint32_t xy[], int count, int x, int y) { 970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(s.fInvType & SkMatrix::kAffine_Mask); 980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask | 990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkMatrix::kScale_Mask | 1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkMatrix::kAffine_Mask)) == 0); 1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project PREAMBLE(s); 1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPoint srcPt; 1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project s.fInvProc(*s.fInvMatrix, 1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkIntToScalar(x) + SK_ScalarHalf, 1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkIntToScalar(y) + SK_ScalarHalf, &srcPt); 1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed fx = SkScalarToFixed(srcPt.fX); 1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed fy = SkScalarToFixed(srcPt.fY); 1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed dx = s.fInvSx; 1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed dy = s.fInvKy; 1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int maxX = s.fBitmap->width() - 1; 1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int maxY = s.fBitmap->height() - 1; 1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project for (int i = count; i > 0; --i) { 1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *xy++ = (TILEY_PROCF(fy, maxY) << 16) | TILEX_PROCF(fx, maxX); 1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fx += dx; fy += dy; 1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 121030ffe05175291b1d91ec6808e1a32e862ee90cdMike Reedvoid PERSP_NOFILTER_NAME(const SkBitmapProcState& s, 1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint32_t* SK_RESTRICT xy, 1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int count, int x, int y) { 1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(s.fInvType & SkMatrix::kPerspective_Mask); 1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project PREAMBLE(s); 1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int maxX = s.fBitmap->width() - 1; 1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int maxY = s.fBitmap->height() - 1; 1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPerspIter iter(*s.fInvMatrix, 1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkIntToScalar(x) + SK_ScalarHalf, 1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkIntToScalar(y) + SK_ScalarHalf, count); 1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project while ((count = iter.next()) != 0) { 1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkFixed* SK_RESTRICT srcXY = iter.getXY(); 1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project while (--count >= 0) { 1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *xy++ = (TILEY_PROCF(srcXY[1], maxY) << 16) | 1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project TILEX_PROCF(srcXY[0], maxX); 1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project srcXY += 2; 1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project////////////////////////////////////////////////////////////////////////////// 1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic inline uint32_t PACK_FILTER_Y_NAME(SkFixed f, unsigned max, 1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed one PREAMBLE_PARAM_Y) { 1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned i = TILEY_PROCF(f, max); 1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project i = (i << 4) | TILEY_LOW_BITS(f, max); 1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return (i << 14) | (TILEY_PROCF((f + one), max)); 1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic inline uint32_t PACK_FILTER_X_NAME(SkFixed f, unsigned max, 1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed one PREAMBLE_PARAM_X) { 1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned i = TILEX_PROCF(f, max); 1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project i = (i << 4) | TILEX_LOW_BITS(f, max); 1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return (i << 14) | (TILEX_PROCF((f + one), max)); 1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 160030ffe05175291b1d91ec6808e1a32e862ee90cdMike Reedvoid SCALE_FILTER_NAME(const SkBitmapProcState& s, 1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint32_t xy[], int count, int x, int y) { 1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask | 1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkMatrix::kScale_Mask)) == 0); 1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(s.fInvKy == 0); 1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project PREAMBLE(s); 1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const unsigned maxX = s.fBitmap->width() - 1; 1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkFixed one = s.fFilterOneX; 1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkFixed dx = s.fInvSx; 1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed fx; 1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPoint pt; 1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project s.fInvProc(*s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, 1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkIntToScalar(y) + SK_ScalarHalf, &pt); 1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkFixed fy = SkScalarToFixed(pt.fY) - (s.fFilterOneY >> 1); 1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const unsigned maxY = s.fBitmap->height() - 1; 1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // compute our two Y values up front 1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *xy++ = PACK_FILTER_Y_NAME(fy, maxY, s.fFilterOneY PREAMBLE_ARG_Y); 1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // now initialize fx 1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fx = SkScalarToFixed(pt.fX) - (one >> 1); 1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef CHECK_FOR_DECAL 1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // test if we don't need to apply the tile proc 1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (dx > 0 && 1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project (unsigned)(fx >> 16) <= maxX && 1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project (unsigned)((fx + dx * (count - 1)) >> 16) < maxX) { 1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project decal_filter_scale(xy, fx, dx, count); 1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } else 1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project { 1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project do { 1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *xy++ = PACK_FILTER_X_NAME(fx, maxX, one PREAMBLE_ARG_X); 1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fx += dx; 1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } while (--count != 0); 1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 201030ffe05175291b1d91ec6808e1a32e862ee90cdMike Reedvoid AFFINE_FILTER_NAME(const SkBitmapProcState& s, 2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint32_t xy[], int count, int x, int y) { 2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(s.fInvType & SkMatrix::kAffine_Mask); 2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask | 2050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkMatrix::kScale_Mask | 2060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkMatrix::kAffine_Mask)) == 0); 2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project PREAMBLE(s); 2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPoint srcPt; 2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project s.fInvProc(*s.fInvMatrix, 2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkIntToScalar(x) + SK_ScalarHalf, 2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkIntToScalar(y) + SK_ScalarHalf, &srcPt); 2130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed oneX = s.fFilterOneX; 2150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed oneY = s.fFilterOneY; 2160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed fx = SkScalarToFixed(srcPt.fX) - (oneX >> 1); 2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed fy = SkScalarToFixed(srcPt.fY) - (oneY >> 1); 2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed dx = s.fInvSx; 2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed dy = s.fInvKy; 2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned maxX = s.fBitmap->width() - 1; 2210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned maxY = s.fBitmap->height() - 1; 2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project do { 2240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *xy++ = PACK_FILTER_Y_NAME(fy, maxY, oneY PREAMBLE_ARG_Y); 2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fy += dy; 2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *xy++ = PACK_FILTER_X_NAME(fx, maxX, oneX PREAMBLE_ARG_X); 2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fx += dx; 2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } while (--count != 0); 2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 231030ffe05175291b1d91ec6808e1a32e862ee90cdMike Reedvoid PERSP_FILTER_NAME(const SkBitmapProcState& s, 2320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project uint32_t* SK_RESTRICT xy, int count, 2330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int x, int y) { 2340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(s.fInvType & SkMatrix::kPerspective_Mask); 2350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project PREAMBLE(s); 2370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned maxX = s.fBitmap->width() - 1; 2380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned maxY = s.fBitmap->height() - 1; 2390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed oneX = s.fFilterOneX; 2400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFixed oneY = s.fFilterOneY; 2410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkPerspIter iter(*s.fInvMatrix, 2430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkIntToScalar(x) + SK_ScalarHalf, 2440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkIntToScalar(y) + SK_ScalarHalf, count); 2450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project while ((count = iter.next()) != 0) { 2470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkFixed* SK_RESTRICT srcXY = iter.getXY(); 2480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project do { 2490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *xy++ = PACK_FILTER_Y_NAME(srcXY[1] - (oneY >> 1), maxY, 2500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project oneY PREAMBLE_ARG_Y); 2510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *xy++ = PACK_FILTER_X_NAME(srcXY[0] - (oneX >> 1), maxX, 2520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project oneX PREAMBLE_ARG_X); 2530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project srcXY += 2; 2540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } while (--count != 0); 2550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 2560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic SkBitmapProcState::MatrixProc MAKENAME(_Procs)[] = { 2590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SCALE_NOFILTER_NAME, 2600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SCALE_FILTER_NAME, 2610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project AFFINE_NOFILTER_NAME, 2620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project AFFINE_FILTER_NAME, 2630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project PERSP_NOFILTER_NAME, 2640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project PERSP_FILTER_NAME 2650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 2660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef MAKENAME 2680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef TILEX_PROCF 2690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef TILEY_PROCF 2700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef CHECK_FOR_DECAL 2710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project #undef CHECK_FOR_DECAL 2720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 2730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef SCALE_NOFILTER_NAME 2750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef SCALE_FILTER_NAME 2760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef AFFINE_NOFILTER_NAME 2770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef AFFINE_FILTER_NAME 2780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef PERSP_NOFILTER_NAME 2790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef PERSP_FILTER_NAME 2800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef PREAMBLE 2820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef PREAMBLE_PARAM_X 2830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef PREAMBLE_PARAM_Y 2840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef PREAMBLE_ARG_X 2850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef PREAMBLE_ARG_Y 2860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef TILEX_LOW_BITS 2880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#undef TILEY_LOW_BITS 289