blob: 2790a6c26ab0062eab3cf7917c6b822cb0031c9f [file] [log] [blame]
reed@android.com8a1c16f2008-12-17 15:59:43 +00001/*
2** Copyright 2007, The Android Open Source Project
3**
4** Licensed under the Apache License, Version 2.0 (the "License");
5** you may not use this file except in compliance with the License.
6** You may obtain a copy of the License at
7**
8** http://www.apache.org/licenses/LICENSE-2.0
9**
10** Unless required by applicable law or agreed to in writing, software
11** distributed under the License is distributed on an "AS IS" BASIS,
12** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13** See the License for the specific language governing permissions and
14** limitations under the License.
15*/
16
17#ifndef SkBitmapProcState_DEFINED
18#define SkBitmapProcState_DEFINED
19
20#include "SkBitmap.h"
21#include "SkMatrix.h"
22
23class SkPaint;
24
25struct SkBitmapProcState {
26
reed@android.com7a99eb12009-07-16 01:13:14 +000027 typedef void (*ShaderProc32)(const SkBitmapProcState&, int x, int y,
28 SkPMColor[], int count);
29
30 typedef void (*ShaderProc16)(const SkBitmapProcState&, int x, int y,
31 uint16_t[], int count);
32
reed@android.com8a1c16f2008-12-17 15:59:43 +000033 typedef void (*MatrixProc)(const SkBitmapProcState&,
34 uint32_t bitmapXY[],
35 int count,
36 int x, int y);
37
38 typedef void (*SampleProc32)(const SkBitmapProcState&,
39 const uint32_t[],
40 int count,
41 SkPMColor colors[]);
42
43 typedef void (*SampleProc16)(const SkBitmapProcState&,
44 const uint32_t[],
45 int count,
46 uint16_t colors[]);
47
48 typedef U16CPU (*FixedTileProc)(SkFixed); // returns 0..0xFFFF
reed@android.com07d1f002009-08-13 19:35:48 +000049 typedef U16CPU (*IntTileProc)(int value, int count); // returns 0..count-1
reed@android.com7a99eb12009-07-16 01:13:14 +000050
51 // If a shader proc is present, then the corresponding matrix/sample procs
52 // are ignored
53 ShaderProc32 fShaderProc32; // chooseProcs
54 ShaderProc16 fShaderProc16; // chooseProcs
55 // These are used if the shaderproc is NULL
reed@android.com8a1c16f2008-12-17 15:59:43 +000056 MatrixProc fMatrixProc; // chooseProcs
57 SampleProc32 fSampleProc32; // chooseProcs
58 SampleProc16 fSampleProc16; // chooseProcs
59
reed@android.comeef375b2009-08-03 14:45:45 +000060 const SkBitmap* fBitmap; // chooseProcs - orig or mip
61 const SkMatrix* fInvMatrix; // chooseProcs
62 SkMatrix::MapXYProc fInvProc; // chooseProcs
63
reed@android.com8a1c16f2008-12-17 15:59:43 +000064 FixedTileProc fTileProcX; // chooseProcs
65 FixedTileProc fTileProcY; // chooseProcs
reed@android.com07d1f002009-08-13 19:35:48 +000066 IntTileProc fIntTileProcY; // chooseProcs
reed@android.com8a1c16f2008-12-17 15:59:43 +000067 SkFixed fFilterOneX;
68 SkFixed fFilterOneY;
69
reed@android.com8a1c16f2008-12-17 15:59:43 +000070 SkPMColor fPaintPMColor; // chooseProcs - A8 config
reed@android.comeef375b2009-08-03 14:45:45 +000071 SkFixed fInvSx; // chooseProcs
reed@android.com8a1c16f2008-12-17 15:59:43 +000072 SkFixed fInvKy; // chooseProcs
reed@android.com8a1c16f2008-12-17 15:59:43 +000073 uint16_t fAlphaScale; // chooseProcs
74 uint8_t fInvType; // chooseProcs
75 uint8_t fTileModeX; // CONSTRUCTOR
76 uint8_t fTileModeY; // CONSTRUCTOR
77 SkBool8 fDoFilter; // chooseProcs
reed@android.com8a1c16f2008-12-17 15:59:43 +000078
reed@android.comc9a1d4b2009-08-03 15:05:55 +000079 /** Platforms implement this, and can optionally overwrite only the
80 following fields:
81
82 fShaderProc32
83 fShaderProc16
84 fMatrixProc
85 fSampleProc32
86 fSampleProc32
87
88 They will already have valid function pointers, so a platform that does
89 not have an accelerated version can just leave that field as is. A valid
90 implementation can do nothing (see SkBitmapProcState_opts_none.cpp)
91 */
92 void platformProcs();
93
reed@android.com8a1c16f2008-12-17 15:59:43 +000094private:
reed@android.comeef375b2009-08-03 14:45:45 +000095 friend class SkBitmapProcShader;
96
97 SkMatrix fUnitInvMatrix; // chooseProcs
98 SkBitmap fOrigBitmap; // CONSTRUCTOR
99 SkBitmap fMipBitmap;
100
reed@android.com07d1f002009-08-13 19:35:48 +0000101 MatrixProc chooseMatrixProc(bool trivial_matrix);
reed@android.comeef375b2009-08-03 14:45:45 +0000102 bool chooseProcs(const SkMatrix& inv, const SkPaint&);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000103};
104
reed@android.com07d1f002009-08-13 19:35:48 +0000105/* Macros for packing and unpacking pairs of 16bit values in a 32bit uint.
106 Used to allow access to a stream of uint16_t either one at a time, or
107 2 at a time by unpacking a uint32_t
108 */
109#ifdef SK_CPU_BENDIAN
110 #define PACK_TWO_SHORTS(pri, sec) ((pri) << 16 | (sec))
111 #define UNPACK_PRIMARY_SHORT(packed) ((uint32_t)(packed) >> 16)
112 #define UNPACK_SECONDARY_SHORT(packed) ((packed) & 0xFFFF)
113#else
114 #define PACK_TWO_SHORTS(pri, sec) ((pri) | ((sec) << 16))
115 #define UNPACK_PRIMARY_SHORT(packed) ((packed) & 0xFFFF)
116 #define UNPACK_SECONDARY_SHORT(packed) ((uint32_t)(packed) >> 16)
117#endif
118
119#ifdef SK_DEBUG
120 static inline uint32_t pack_two_shorts(U16CPU pri, U16CPU sec) {
121 SkASSERT((uint16_t)pri == pri);
122 SkASSERT((uint16_t)sec == sec);
123 return PACK_TWO_SHORTS(pri, sec);
124 }
125#else
126 #define pack_two_shorts(pri, sec) PACK_TWO_SHORTS(pri, sec)
127#endif
128
reed@android.com8a1c16f2008-12-17 15:59:43 +0000129#endif