SkBitmapProcState.h revision 7866228f06e402d37f8fcab70a688e1f34c1d27b
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 28a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2007 The Android Open Source Project 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. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkBitmapProcState_DEFINED 118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkBitmapProcState_DEFINED 128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkBitmap.h" 148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkMatrix.h" 158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1677613a5038ee73afa1ba245effea05c1cc9db1d4reed@google.com#define FractionalInt_IS_64BIT 174bc0a9db18d58698057b8f38a6f21537aca4ddcfreed@google.com 184bc0a9db18d58698057b8f38a6f21537aca4ddcfreed@google.com#ifdef FractionalInt_IS_64BIT 194bc0a9db18d58698057b8f38a6f21537aca4ddcfreed@google.com typedef SkFixed48 SkFractionalInt; 204bc0a9db18d58698057b8f38a6f21537aca4ddcfreed@google.com #define SkScalarToFractionalInt(x) SkScalarToFixed48(x) 214bc0a9db18d58698057b8f38a6f21537aca4ddcfreed@google.com #define SkFractionalIntToFixed(x) SkFixed48ToFixed(x) 22411215ae2b9a36ff6e262f77d7fb5071cc084f00reed@google.com #define SkFixedToFractionalInt(x) SkFixedToFixed48(x) 234bc0a9db18d58698057b8f38a6f21537aca4ddcfreed@google.com #define SkFractionalIntToInt(x) SkFixed48ToInt(x) 244bc0a9db18d58698057b8f38a6f21537aca4ddcfreed@google.com#else 254bc0a9db18d58698057b8f38a6f21537aca4ddcfreed@google.com typedef SkFixed SkFractionalInt; 264bc0a9db18d58698057b8f38a6f21537aca4ddcfreed@google.com #define SkScalarToFractionalInt(x) SkScalarToFixed(x) 274bc0a9db18d58698057b8f38a6f21537aca4ddcfreed@google.com #define SkFractionalIntToFixed(x) (x) 28411215ae2b9a36ff6e262f77d7fb5071cc084f00reed@google.com #define SkFixedToFractionalInt(x) (x) 294bc0a9db18d58698057b8f38a6f21537aca4ddcfreed@google.com #define SkFractionalIntToInt(x) ((x) >> 16) 304bc0a9db18d58698057b8f38a6f21537aca4ddcfreed@google.com#endif 314bc0a9db18d58698057b8f38a6f21537aca4ddcfreed@google.com 328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkPaint; 338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstruct SkBitmapProcState { 358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 367a99eb1c63d4327d352af09ea59f039f014e4028reed@android.com typedef void (*ShaderProc32)(const SkBitmapProcState&, int x, int y, 377a99eb1c63d4327d352af09ea59f039f014e4028reed@android.com SkPMColor[], int count); 387a99eb1c63d4327d352af09ea59f039f014e4028reed@android.com 397a99eb1c63d4327d352af09ea59f039f014e4028reed@android.com typedef void (*ShaderProc16)(const SkBitmapProcState&, int x, int y, 407a99eb1c63d4327d352af09ea59f039f014e4028reed@android.com uint16_t[], int count); 417a99eb1c63d4327d352af09ea59f039f014e4028reed@android.com 428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com typedef void (*MatrixProc)(const SkBitmapProcState&, 438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com uint32_t bitmapXY[], 448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int count, 458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int x, int y); 468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com typedef void (*SampleProc32)(const SkBitmapProcState&, 488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const uint32_t[], 498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int count, 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPMColor colors[]); 518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com typedef void (*SampleProc16)(const SkBitmapProcState&, 538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const uint32_t[], 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int count, 558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com uint16_t colors[]); 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com typedef U16CPU (*FixedTileProc)(SkFixed); // returns 0..0xFFFF 58f444e8ccda8905a8ce16bac368e09f205786db31reed@google.com typedef U16CPU (*FixedTileLowBitsProc)(SkFixed, int); // returns 0..0xF 5907d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com typedef U16CPU (*IntTileProc)(int value, int count); // returns 0..count-1 607a99eb1c63d4327d352af09ea59f039f014e4028reed@android.com 61eef375bcd602adb065c4eccc07bd811b83a71de8reed@android.com const SkBitmap* fBitmap; // chooseProcs - orig or mip 62eef375bcd602adb065c4eccc07bd811b83a71de8reed@android.com const SkMatrix* fInvMatrix; // chooseProcs 63eef375bcd602adb065c4eccc07bd811b83a71de8reed@android.com SkMatrix::MapXYProc fInvProc; // chooseProcs 64eef375bcd602adb065c4eccc07bd811b83a71de8reed@android.com 654bc0a9db18d58698057b8f38a6f21537aca4ddcfreed@google.com SkFractionalInt fInvSxFractionalInt; 66411215ae2b9a36ff6e262f77d7fb5071cc084f00reed@google.com SkFractionalInt fInvKyFractionalInt; 674bc0a9db18d58698057b8f38a6f21537aca4ddcfreed@google.com 688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com FixedTileProc fTileProcX; // chooseProcs 698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com FixedTileProc fTileProcY; // chooseProcs 70f444e8ccda8905a8ce16bac368e09f205786db31reed@google.com FixedTileLowBitsProc fTileLowBitsProcX; // chooseProcs 71f444e8ccda8905a8ce16bac368e09f205786db31reed@google.com FixedTileLowBitsProc fTileLowBitsProcY; // chooseProcs 7207d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com IntTileProc fIntTileProcY; // chooseProcs 738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkFixed fFilterOneX; 748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkFixed fFilterOneY; 758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPMColor fPaintPMColor; // chooseProcs - A8 config 77eef375bcd602adb065c4eccc07bd811b83a71de8reed@android.com SkFixed fInvSx; // chooseProcs 788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkFixed fInvKy; // chooseProcs 798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com uint16_t fAlphaScale; // chooseProcs 808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com uint8_t fInvType; // chooseProcs 818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com uint8_t fTileModeX; // CONSTRUCTOR 828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com uint8_t fTileModeY; // CONSTRUCTOR 838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkBool8 fDoFilter; // chooseProcs 848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 85c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com /** Platforms implement this, and can optionally overwrite only the 86c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com following fields: 87c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com 88c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com fShaderProc32 89c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com fShaderProc16 90c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com fMatrixProc 91c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com fSampleProc32 92c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com fSampleProc32 93c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com 94c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com They will already have valid function pointers, so a platform that does 95c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com not have an accelerated version can just leave that field as is. A valid 96c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com implementation can do nothing (see SkBitmapProcState_opts_none.cpp) 97c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com */ 98c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com void platformProcs(); 99c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com 100258cb228c636282a3e4f4ce87b1017498e207f33reed@android.com /** Given the byte size of the index buffer to be passed to the matrix proc, 101258cb228c636282a3e4f4ce87b1017498e207f33reed@android.com return the maximum number of resulting pixels that can be computed 102258cb228c636282a3e4f4ce87b1017498e207f33reed@android.com (i.e. the number of SkPMColor values to be written by the sample proc). 103258cb228c636282a3e4f4ce87b1017498e207f33reed@android.com This routine takes into account that filtering and scale-vs-affine 104258cb228c636282a3e4f4ce87b1017498e207f33reed@android.com affect the amount of buffer space needed. 1054c128c4917acf25c2cc5d1bd22282a4e1bb53d96reed@android.com 1064c128c4917acf25c2cc5d1bd22282a4e1bb53d96reed@android.com Only valid to call after chooseProcs (setContext) has been called. It is 1074c128c4917acf25c2cc5d1bd22282a4e1bb53d96reed@android.com safe to call this inside the shader's shadeSpan() method. 1084c128c4917acf25c2cc5d1bd22282a4e1bb53d96reed@android.com */ 1094c128c4917acf25c2cc5d1bd22282a4e1bb53d96reed@android.com int maxCountForBufferSize(size_t bufferSize) const; 1104c128c4917acf25c2cc5d1bd22282a4e1bb53d96reed@android.com 1119fe287bd07baa6d9e890b627c102bba562954f7dreed@google.com // If a shader proc is present, then the corresponding matrix/sample procs 1129fe287bd07baa6d9e890b627c102bba562954f7dreed@google.com // are ignored 1139fe287bd07baa6d9e890b627c102bba562954f7dreed@google.com ShaderProc32 getShaderProc32() const { return fShaderProc32; } 1149fe287bd07baa6d9e890b627c102bba562954f7dreed@google.com ShaderProc16 getShaderProc16() const { return fShaderProc16; } 1159fe287bd07baa6d9e890b627c102bba562954f7dreed@google.com 1169fe287bd07baa6d9e890b627c102bba562954f7dreed@google.com#ifdef SK_DEBUG 1179fe287bd07baa6d9e890b627c102bba562954f7dreed@google.com MatrixProc getMatrixProc() const; 1189fe287bd07baa6d9e890b627c102bba562954f7dreed@google.com#else 1199fe287bd07baa6d9e890b627c102bba562954f7dreed@google.com MatrixProc getMatrixProc() const { return fMatrixProc; } 1209fe287bd07baa6d9e890b627c102bba562954f7dreed@google.com#endif 1219fe287bd07baa6d9e890b627c102bba562954f7dreed@google.com SampleProc32 getSampleProc32() const { return fSampleProc32; } 1229fe287bd07baa6d9e890b627c102bba562954f7dreed@google.com SampleProc16 getSampleProc16() const { return fSampleProc16; } 1239fe287bd07baa6d9e890b627c102bba562954f7dreed@google.com 1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 125eef375bcd602adb065c4eccc07bd811b83a71de8reed@android.com friend class SkBitmapProcShader; 126eef375bcd602adb065c4eccc07bd811b83a71de8reed@android.com 1279fe287bd07baa6d9e890b627c102bba562954f7dreed@google.com ShaderProc32 fShaderProc32; // chooseProcs 1289fe287bd07baa6d9e890b627c102bba562954f7dreed@google.com ShaderProc16 fShaderProc16; // chooseProcs 1299fe287bd07baa6d9e890b627c102bba562954f7dreed@google.com // These are used if the shaderproc is NULL 1309fe287bd07baa6d9e890b627c102bba562954f7dreed@google.com MatrixProc fMatrixProc; // chooseProcs 1319fe287bd07baa6d9e890b627c102bba562954f7dreed@google.com SampleProc32 fSampleProc32; // chooseProcs 1329fe287bd07baa6d9e890b627c102bba562954f7dreed@google.com SampleProc16 fSampleProc16; // chooseProcs 1339fe287bd07baa6d9e890b627c102bba562954f7dreed@google.com 134eef375bcd602adb065c4eccc07bd811b83a71de8reed@android.com SkMatrix fUnitInvMatrix; // chooseProcs 135eef375bcd602adb065c4eccc07bd811b83a71de8reed@android.com SkBitmap fOrigBitmap; // CONSTRUCTOR 136eef375bcd602adb065c4eccc07bd811b83a71de8reed@android.com SkBitmap fMipBitmap; 137eef375bcd602adb065c4eccc07bd811b83a71de8reed@android.com 13807d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com MatrixProc chooseMatrixProc(bool trivial_matrix); 139eef375bcd602adb065c4eccc07bd811b83a71de8reed@android.com bool chooseProcs(const SkMatrix& inv, const SkPaint&); 1409fe287bd07baa6d9e890b627c102bba562954f7dreed@google.com 1419fe287bd07baa6d9e890b627c102bba562954f7dreed@google.com#ifdef SK_DEBUG 1429fe287bd07baa6d9e890b627c102bba562954f7dreed@google.com static void DebugMatrixProc(const SkBitmapProcState&, 1439fe287bd07baa6d9e890b627c102bba562954f7dreed@google.com uint32_t[], int count, int x, int y); 1449fe287bd07baa6d9e890b627c102bba562954f7dreed@google.com#endif 1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 14707d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com/* Macros for packing and unpacking pairs of 16bit values in a 32bit uint. 14807d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com Used to allow access to a stream of uint16_t either one at a time, or 14907d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com 2 at a time by unpacking a uint32_t 15007d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com */ 15107d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com#ifdef SK_CPU_BENDIAN 15207d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com #define PACK_TWO_SHORTS(pri, sec) ((pri) << 16 | (sec)) 15307d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com #define UNPACK_PRIMARY_SHORT(packed) ((uint32_t)(packed) >> 16) 15407d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com #define UNPACK_SECONDARY_SHORT(packed) ((packed) & 0xFFFF) 15507d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com#else 15607d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com #define PACK_TWO_SHORTS(pri, sec) ((pri) | ((sec) << 16)) 15707d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com #define UNPACK_PRIMARY_SHORT(packed) ((packed) & 0xFFFF) 15807d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com #define UNPACK_SECONDARY_SHORT(packed) ((uint32_t)(packed) >> 16) 15907d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com#endif 16007d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com 16107d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com#ifdef SK_DEBUG 16207d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com static inline uint32_t pack_two_shorts(U16CPU pri, U16CPU sec) { 16307d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com SkASSERT((uint16_t)pri == pri); 16407d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com SkASSERT((uint16_t)sec == sec); 16507d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com return PACK_TWO_SHORTS(pri, sec); 16607d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com } 16707d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com#else 16807d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com #define pack_two_shorts(pri, sec) PACK_TWO_SHORTS(pri, sec) 16907d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com#endif 17007d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com 171dc7de745dd142cdc00ffed7963ebb030a0506f72senorblanco@chromium.org// These functions are generated via macros, but are exposed here so that 172dc7de745dd142cdc00ffed7963ebb030a0506f72senorblanco@chromium.org// platformProcs may test for them by name. 173dc7de745dd142cdc00ffed7963ebb030a0506f72senorblanco@chromium.orgvoid S32_opaque_D32_filter_DX(const SkBitmapProcState& s, const uint32_t xy[], 174dc7de745dd142cdc00ffed7963ebb030a0506f72senorblanco@chromium.org int count, SkPMColor colors[]); 175f3f0bd71b81097f6c640e7f60805de7eacbc98c6senorblanco@chromium.orgvoid S32_alpha_D32_filter_DX(const SkBitmapProcState& s, const uint32_t xy[], 176f3f0bd71b81097f6c640e7f60805de7eacbc98c6senorblanco@chromium.org int count, SkPMColor colors[]); 177ae29b88deff836d0768f26c5cd76744f39dc5887tomhudson@google.comvoid S32_opaque_D32_filter_DXDY(const SkBitmapProcState& s, 178ae29b88deff836d0768f26c5cd76744f39dc5887tomhudson@google.com const uint32_t xy[], int count, SkPMColor colors[]); 179ae29b88deff836d0768f26c5cd76744f39dc5887tomhudson@google.comvoid S32_alpha_D32_filter_DXDY(const SkBitmapProcState& s, 180ae29b88deff836d0768f26c5cd76744f39dc5887tomhudson@google.com const uint32_t xy[], int count, SkPMColor colors[]); 18106a7313430728b18f2ed92f14b189f3320fb8d13tomhudson@google.comvoid ClampX_ClampY_filter_scale(const SkBitmapProcState& s, uint32_t xy[], 18206a7313430728b18f2ed92f14b189f3320fb8d13tomhudson@google.com int count, int x, int y); 18306a7313430728b18f2ed92f14b189f3320fb8d13tomhudson@google.comvoid ClampX_ClampY_nofilter_scale(const SkBitmapProcState& s, uint32_t xy[], 18406a7313430728b18f2ed92f14b189f3320fb8d13tomhudson@google.com int count, int x, int y); 1855efaf268931d01498f4f1af63c556d811e5d5797tomhudson@google.comvoid ClampX_ClampY_filter_affine(const SkBitmapProcState& s, 1865efaf268931d01498f4f1af63c556d811e5d5797tomhudson@google.com uint32_t xy[], int count, int x, int y); 1875efaf268931d01498f4f1af63c556d811e5d5797tomhudson@google.comvoid ClampX_ClampY_nofilter_affine(const SkBitmapProcState& s, 1885efaf268931d01498f4f1af63c556d811e5d5797tomhudson@google.com uint32_t xy[], int count, int x, int y); 1897866228f06e402d37f8fcab70a688e1f34c1d27breed@google.comvoid S32_D16_filter_DX(const SkBitmapProcState& s, 1907866228f06e402d37f8fcab70a688e1f34c1d27breed@google.com const uint32_t* xy, int count, uint16_t* colors); 191dc7de745dd142cdc00ffed7963ebb030a0506f72senorblanco@chromium.org 1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 193