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