169d05551332e61e22da4bd3b61fc6d065b461d4areed@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 769d05551332e61e22da4bd3b61fc6d065b461d4areed@google.com */ 869d05551332e61e22da4bd3b61fc6d065b461d4areed@google.com 94b163ed2c22facbe8891616874ae07ba7827d9c9reed@google.com#include "SkMathPriv.h" 10ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 11a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com#define SCALE_FILTER_NAME MAKENAME(_filter_DX_shaderproc) 12a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com 133ada0efdc8de8316df8113ec54ffd1a3f33ecd21digit@google.com// Can't be static in the general case because some of these implementations 143ada0efdc8de8316df8113ec54ffd1a3f33ecd21digit@google.com// will be defined and referenced in different object files. 153ada0efdc8de8316df8113ec54ffd1a3f33ecd21digit@google.comvoid SCALE_FILTER_NAME(const SkBitmapProcState& s, int x, int y, 16100abf49e10544bc4f436bf1f38e6929779621f4bsalomon@google.com DSTTYPE* SK_RESTRICT colors, int count); 17100abf49e10544bc4f436bf1f38e6929779621f4bsalomon@google.com 18100abf49e10544bc4f436bf1f38e6929779621f4bsalomon@google.comvoid SCALE_FILTER_NAME(const SkBitmapProcState& s, int x, int y, 193ada0efdc8de8316df8113ec54ffd1a3f33ecd21digit@google.com DSTTYPE* SK_RESTRICT colors, int count) { 20a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask | 21a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com SkMatrix::kScale_Mask)) == 0); 22a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com SkASSERT(s.fInvKy == 0); 23a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com SkASSERT(count > 0 && colors != NULL); 249cfc83cc8ac2ee50a7ce889e65a707941f48bdeareed@google.com SkASSERT(s.fFilterLevel != SkPaint::kNone_FilterLevel); 25a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com SkDEBUGCODE(CHECKSTATE(s);) 2648534f96b9ccb747cecbdf3818bfbd3523a4d034reed@android.com 27a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com const unsigned maxX = s.fBitmap->width() - 1; 28a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com const SkFixed oneX = s.fFilterOneX; 29a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com const SkFixed dx = s.fInvSx; 30a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com SkFixed fx; 31a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com const SRCTYPE* SK_RESTRICT row0; 32a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com const SRCTYPE* SK_RESTRICT row1; 33a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com unsigned subY; 34a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com 35a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com { 36a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com SkPoint pt; 379c96d4b5ffdbf8c82f55b2058a2fea7225fe11d6humper@google.com s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, 38a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com SkIntToScalar(y) + SK_ScalarHalf, &pt); 39a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com SkFixed fy = SkScalarToFixed(pt.fY) - (s.fFilterOneY >> 1); 40a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com const unsigned maxY = s.fBitmap->height() - 1; 41a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com // compute our two Y values up front 42a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com subY = TILEY_LOW_BITS(fy, maxY); 43a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com int y0 = TILEY_PROCF(fy, maxY); 44a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com int y1 = TILEY_PROCF((fy + s.fFilterOneY), maxY); 45a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com 46a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com const char* SK_RESTRICT srcAddr = (const char*)s.fBitmap->getPixels(); 47e5f48243bdbed2662be7a31be0888abc273b09e8scroggo@google.com size_t rb = s.fBitmap->rowBytes(); 48a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com row0 = (const SRCTYPE*)(srcAddr + y0 * rb); 49a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com row1 = (const SRCTYPE*)(srcAddr + y1 * rb); 50a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com // now initialize fx 51a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com fx = SkScalarToFixed(pt.fX) - (oneX >> 1); 52a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com } 5348534f96b9ccb747cecbdf3818bfbd3523a4d034reed@android.com 54b577b41c8ec26c21ae599e80a2707d42f03eaa60reed@android.com#ifdef PREAMBLE 55b577b41c8ec26c21ae599e80a2707d42f03eaa60reed@android.com PREAMBLE(s); 56b577b41c8ec26c21ae599e80a2707d42f03eaa60reed@android.com#endif 57fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 58a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com do { 59a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com unsigned subX = TILEX_LOW_BITS(fx, maxX); 60a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com unsigned x0 = TILEX_PROCF(fx, maxX); 61a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com unsigned x1 = TILEX_PROCF((fx + oneX), maxX); 62a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com 63152f748386143475daf9da31aceb424dc7c8a7e6reed@android.com FILTER_PROC(subX, subY, 64152f748386143475daf9da31aceb424dc7c8a7e6reed@android.com SRC_TO_FILTER(row0[x0]), 65152f748386143475daf9da31aceb424dc7c8a7e6reed@android.com SRC_TO_FILTER(row0[x1]), 66152f748386143475daf9da31aceb424dc7c8a7e6reed@android.com SRC_TO_FILTER(row1[x0]), 67152f748386143475daf9da31aceb424dc7c8a7e6reed@android.com SRC_TO_FILTER(row1[x1]), 68152f748386143475daf9da31aceb424dc7c8a7e6reed@android.com colors); 69152f748386143475daf9da31aceb424dc7c8a7e6reed@android.com colors += 1; 7048534f96b9ccb747cecbdf3818bfbd3523a4d034reed@android.com 71a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com fx += dx; 72a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com } while (--count != 0); 73b577b41c8ec26c21ae599e80a2707d42f03eaa60reed@android.com 74b577b41c8ec26c21ae599e80a2707d42f03eaa60reed@android.com#ifdef POSTAMBLE 75b577b41c8ec26c21ae599e80a2707d42f03eaa60reed@android.com POSTAMBLE(s); 76b577b41c8ec26c21ae599e80a2707d42f03eaa60reed@android.com#endif 77a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com} 78a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com 79a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com/////////////////////////////////////////////////////////////////////////////// 80a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com 81a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com#undef TILEX_PROCF 82a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com#undef TILEY_PROCF 83a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com#undef TILEX_LOW_BITS 84a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com#undef TILEY_LOW_BITS 8501f82da73b38cdaaebf8862b4cb0bc636a52f78areed@android.com#undef MAKENAME 8601f82da73b38cdaaebf8862b4cb0bc636a52f78areed@android.com#undef SRCTYPE 87aa9152abbca3a958a9379f4e5067a1c37486d677reed@android.com#undef DSTTYPE 8801f82da73b38cdaaebf8862b4cb0bc636a52f78areed@android.com#undef CHECKSTATE 8901f82da73b38cdaaebf8862b4cb0bc636a52f78areed@android.com#undef SRC_TO_FILTER 9001f82da73b38cdaaebf8862b4cb0bc636a52f78areed@android.com#undef FILTER_TO_DST 91b577b41c8ec26c21ae599e80a2707d42f03eaa60reed@android.com#undef PREAMBLE 92b577b41c8ec26c21ae599e80a2707d42f03eaa60reed@android.com#undef POSTAMBLE 93a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com 94a44b4cc7976b06caf3a3f6b7913c2af92eb32217reed@android.com#undef SCALE_FILTER_NAME 95