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