SkBitmapProcState.h revision 411215ae2b9a36ff6e262f77d7fb5071cc084f00
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 164bc0a9db18d58698057b8f38a6f21537aca4ddcfreed@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 5807d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com typedef U16CPU (*IntTileProc)(int value, int count); // returns 0..count-1 597a99eb1c63d4327d352af09ea59f039f014e4028reed@android.com 607a99eb1c63d4327d352af09ea59f039f014e4028reed@android.com // If a shader proc is present, then the corresponding matrix/sample procs 617a99eb1c63d4327d352af09ea59f039f014e4028reed@android.com // are ignored 627a99eb1c63d4327d352af09ea59f039f014e4028reed@android.com ShaderProc32 fShaderProc32; // chooseProcs 637a99eb1c63d4327d352af09ea59f039f014e4028reed@android.com ShaderProc16 fShaderProc16; // chooseProcs 647a99eb1c63d4327d352af09ea59f039f014e4028reed@android.com // These are used if the shaderproc is NULL 658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com MatrixProc fMatrixProc; // chooseProcs 668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SampleProc32 fSampleProc32; // chooseProcs 678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SampleProc16 fSampleProc16; // chooseProcs 688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 69eef375bcd602adb065c4eccc07bd811b83a71de8reed@android.com const SkBitmap* fBitmap; // chooseProcs - orig or mip 70eef375bcd602adb065c4eccc07bd811b83a71de8reed@android.com const SkMatrix* fInvMatrix; // chooseProcs 71eef375bcd602adb065c4eccc07bd811b83a71de8reed@android.com SkMatrix::MapXYProc fInvProc; // chooseProcs 72eef375bcd602adb065c4eccc07bd811b83a71de8reed@android.com 734bc0a9db18d58698057b8f38a6f21537aca4ddcfreed@google.com SkFractionalInt fInvSxFractionalInt; 74411215ae2b9a36ff6e262f77d7fb5071cc084f00reed@google.com SkFractionalInt fInvKyFractionalInt; 754bc0a9db18d58698057b8f38a6f21537aca4ddcfreed@google.com 768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com FixedTileProc fTileProcX; // chooseProcs 778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com FixedTileProc fTileProcY; // chooseProcs 7807d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com IntTileProc fIntTileProcY; // chooseProcs 798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkFixed fFilterOneX; 808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkFixed fFilterOneY; 818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPMColor fPaintPMColor; // chooseProcs - A8 config 83eef375bcd602adb065c4eccc07bd811b83a71de8reed@android.com SkFixed fInvSx; // chooseProcs 848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkFixed fInvKy; // chooseProcs 858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com uint16_t fAlphaScale; // chooseProcs 868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com uint8_t fInvType; // chooseProcs 878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com uint8_t fTileModeX; // CONSTRUCTOR 888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com uint8_t fTileModeY; // CONSTRUCTOR 898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkBool8 fDoFilter; // chooseProcs 908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 91c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com /** Platforms implement this, and can optionally overwrite only the 92c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com following fields: 93c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com 94c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com fShaderProc32 95c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com fShaderProc16 96c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com fMatrixProc 97c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com fSampleProc32 98c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com fSampleProc32 99c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com 100c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com They will already have valid function pointers, so a platform that does 101c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com not have an accelerated version can just leave that field as is. A valid 102c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com implementation can do nothing (see SkBitmapProcState_opts_none.cpp) 103c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com */ 104c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com void platformProcs(); 105c9a1d4b519c2db8e43e54fef068c46462d2f8a4breed@android.com 106258cb228c636282a3e4f4ce87b1017498e207f33reed@android.com /** Given the byte size of the index buffer to be passed to the matrix proc, 107258cb228c636282a3e4f4ce87b1017498e207f33reed@android.com return the maximum number of resulting pixels that can be computed 108258cb228c636282a3e4f4ce87b1017498e207f33reed@android.com (i.e. the number of SkPMColor values to be written by the sample proc). 109258cb228c636282a3e4f4ce87b1017498e207f33reed@android.com This routine takes into account that filtering and scale-vs-affine 110258cb228c636282a3e4f4ce87b1017498e207f33reed@android.com affect the amount of buffer space needed. 1114c128c4917acf25c2cc5d1bd22282a4e1bb53d96reed@android.com 1124c128c4917acf25c2cc5d1bd22282a4e1bb53d96reed@android.com Only valid to call after chooseProcs (setContext) has been called. It is 1134c128c4917acf25c2cc5d1bd22282a4e1bb53d96reed@android.com safe to call this inside the shader's shadeSpan() method. 1144c128c4917acf25c2cc5d1bd22282a4e1bb53d96reed@android.com */ 1154c128c4917acf25c2cc5d1bd22282a4e1bb53d96reed@android.com int maxCountForBufferSize(size_t bufferSize) const; 1164c128c4917acf25c2cc5d1bd22282a4e1bb53d96reed@android.com 1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 118eef375bcd602adb065c4eccc07bd811b83a71de8reed@android.com friend class SkBitmapProcShader; 119eef375bcd602adb065c4eccc07bd811b83a71de8reed@android.com 120eef375bcd602adb065c4eccc07bd811b83a71de8reed@android.com SkMatrix fUnitInvMatrix; // chooseProcs 121eef375bcd602adb065c4eccc07bd811b83a71de8reed@android.com SkBitmap fOrigBitmap; // CONSTRUCTOR 122eef375bcd602adb065c4eccc07bd811b83a71de8reed@android.com SkBitmap fMipBitmap; 123eef375bcd602adb065c4eccc07bd811b83a71de8reed@android.com 12407d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com MatrixProc chooseMatrixProc(bool trivial_matrix); 125eef375bcd602adb065c4eccc07bd811b83a71de8reed@android.com bool chooseProcs(const SkMatrix& inv, const SkPaint&); 1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 12807d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com/* Macros for packing and unpacking pairs of 16bit values in a 32bit uint. 12907d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com Used to allow access to a stream of uint16_t either one at a time, or 13007d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com 2 at a time by unpacking a uint32_t 13107d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com */ 13207d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com#ifdef SK_CPU_BENDIAN 13307d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com #define PACK_TWO_SHORTS(pri, sec) ((pri) << 16 | (sec)) 13407d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com #define UNPACK_PRIMARY_SHORT(packed) ((uint32_t)(packed) >> 16) 13507d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com #define UNPACK_SECONDARY_SHORT(packed) ((packed) & 0xFFFF) 13607d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com#else 13707d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com #define PACK_TWO_SHORTS(pri, sec) ((pri) | ((sec) << 16)) 13807d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com #define UNPACK_PRIMARY_SHORT(packed) ((packed) & 0xFFFF) 13907d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com #define UNPACK_SECONDARY_SHORT(packed) ((uint32_t)(packed) >> 16) 14007d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com#endif 14107d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com 14207d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com#ifdef SK_DEBUG 14307d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com static inline uint32_t pack_two_shorts(U16CPU pri, U16CPU sec) { 14407d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com SkASSERT((uint16_t)pri == pri); 14507d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com SkASSERT((uint16_t)sec == sec); 14607d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com return PACK_TWO_SHORTS(pri, sec); 14707d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com } 14807d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com#else 14907d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com #define pack_two_shorts(pri, sec) PACK_TWO_SHORTS(pri, sec) 15007d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com#endif 15107d1f008b365e94ef7c7347be19a03d00bd36805reed@android.com 152dc7de745dd142cdc00ffed7963ebb030a0506f72senorblanco@chromium.org// These functions are generated via macros, but are exposed here so that 153dc7de745dd142cdc00ffed7963ebb030a0506f72senorblanco@chromium.org// platformProcs may test for them by name. 154dc7de745dd142cdc00ffed7963ebb030a0506f72senorblanco@chromium.orgvoid S32_opaque_D32_filter_DX(const SkBitmapProcState& s, const uint32_t xy[], 155dc7de745dd142cdc00ffed7963ebb030a0506f72senorblanco@chromium.org int count, SkPMColor colors[]); 156f3f0bd71b81097f6c640e7f60805de7eacbc98c6senorblanco@chromium.orgvoid S32_alpha_D32_filter_DX(const SkBitmapProcState& s, const uint32_t xy[], 157f3f0bd71b81097f6c640e7f60805de7eacbc98c6senorblanco@chromium.org int count, SkPMColor colors[]); 158ae29b88deff836d0768f26c5cd76744f39dc5887tomhudson@google.comvoid S32_opaque_D32_filter_DXDY(const SkBitmapProcState& s, 159ae29b88deff836d0768f26c5cd76744f39dc5887tomhudson@google.com const uint32_t xy[], int count, SkPMColor colors[]); 160ae29b88deff836d0768f26c5cd76744f39dc5887tomhudson@google.comvoid S32_alpha_D32_filter_DXDY(const SkBitmapProcState& s, 161ae29b88deff836d0768f26c5cd76744f39dc5887tomhudson@google.com const uint32_t xy[], int count, SkPMColor colors[]); 16206a7313430728b18f2ed92f14b189f3320fb8d13tomhudson@google.comvoid ClampX_ClampY_filter_scale(const SkBitmapProcState& s, uint32_t xy[], 16306a7313430728b18f2ed92f14b189f3320fb8d13tomhudson@google.com int count, int x, int y); 16406a7313430728b18f2ed92f14b189f3320fb8d13tomhudson@google.comvoid ClampX_ClampY_nofilter_scale(const SkBitmapProcState& s, uint32_t xy[], 16506a7313430728b18f2ed92f14b189f3320fb8d13tomhudson@google.com int count, int x, int y); 1665efaf268931d01498f4f1af63c556d811e5d5797tomhudson@google.comvoid ClampX_ClampY_filter_affine(const SkBitmapProcState& s, 1675efaf268931d01498f4f1af63c556d811e5d5797tomhudson@google.com uint32_t xy[], int count, int x, int y); 1685efaf268931d01498f4f1af63c556d811e5d5797tomhudson@google.comvoid ClampX_ClampY_nofilter_affine(const SkBitmapProcState& s, 1695efaf268931d01498f4f1af63c556d811e5d5797tomhudson@google.com uint32_t xy[], int count, int x, int y); 170dc7de745dd142cdc00ffed7963ebb030a0506f72senorblanco@chromium.org 1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 172