blob: 69de2ca86a7563c62ea24b6cd1df222f0887e9c0 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
reed@android.com8a1c16f2008-12-17 15:59:43 +00002/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00003 * Copyright 2007 The Android Open Source Project
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
reed@android.com8a1c16f2008-12-17 15:59:43 +00009
10#ifndef SkBitmapProcState_DEFINED
11#define SkBitmapProcState_DEFINED
12
13#include "SkBitmap.h"
humper@google.comb0889472013-07-09 21:37:14 +000014#include "SkBitmapFilter.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000015#include "SkMatrix.h"
16
reed@google.com77613a52012-03-14 12:21:17 +000017#define FractionalInt_IS_64BIT
reed@google.com4bc0a9d2012-03-07 21:47:41 +000018
19#ifdef FractionalInt_IS_64BIT
20 typedef SkFixed48 SkFractionalInt;
21 #define SkScalarToFractionalInt(x) SkScalarToFixed48(x)
22 #define SkFractionalIntToFixed(x) SkFixed48ToFixed(x)
reed@google.com411215a2012-03-08 20:13:46 +000023 #define SkFixedToFractionalInt(x) SkFixedToFixed48(x)
reed@google.com4bc0a9d2012-03-07 21:47:41 +000024 #define SkFractionalIntToInt(x) SkFixed48ToInt(x)
25#else
26 typedef SkFixed SkFractionalInt;
27 #define SkScalarToFractionalInt(x) SkScalarToFixed(x)
28 #define SkFractionalIntToFixed(x) (x)
reed@google.com411215a2012-03-08 20:13:46 +000029 #define SkFixedToFractionalInt(x) (x)
reed@google.com4bc0a9d2012-03-07 21:47:41 +000030 #define SkFractionalIntToInt(x) ((x) >> 16)
31#endif
32
reed@android.com8a1c16f2008-12-17 15:59:43 +000033class SkPaint;
34
35struct SkBitmapProcState {
36
reed@android.com7a99eb12009-07-16 01:13:14 +000037 typedef void (*ShaderProc32)(const SkBitmapProcState&, int x, int y,
38 SkPMColor[], int count);
39
40 typedef void (*ShaderProc16)(const SkBitmapProcState&, int x, int y,
41 uint16_t[], int count);
42
reed@android.com8a1c16f2008-12-17 15:59:43 +000043 typedef void (*MatrixProc)(const SkBitmapProcState&,
44 uint32_t bitmapXY[],
45 int count,
46 int x, int y);
rmistry@google.comfbfcd562012-08-23 18:09:54 +000047
reed@android.com8a1c16f2008-12-17 15:59:43 +000048 typedef void (*SampleProc32)(const SkBitmapProcState&,
49 const uint32_t[],
50 int count,
51 SkPMColor colors[]);
52
53 typedef void (*SampleProc16)(const SkBitmapProcState&,
54 const uint32_t[],
55 int count,
56 uint16_t colors[]);
rmistry@google.comfbfcd562012-08-23 18:09:54 +000057
reed@android.com8a1c16f2008-12-17 15:59:43 +000058 typedef U16CPU (*FixedTileProc)(SkFixed); // returns 0..0xFFFF
reed@google.comf444e8c2012-03-09 19:59:46 +000059 typedef U16CPU (*FixedTileLowBitsProc)(SkFixed, int); // returns 0..0xF
reed@android.com07d1f002009-08-13 19:35:48 +000060 typedef U16CPU (*IntTileProc)(int value, int count); // returns 0..count-1
reed@android.com7a99eb12009-07-16 01:13:14 +000061
reed@android.comeef375b2009-08-03 14:45:45 +000062 const SkBitmap* fBitmap; // chooseProcs - orig or mip
63 const SkMatrix* fInvMatrix; // chooseProcs
64 SkMatrix::MapXYProc fInvProc; // chooseProcs
65
reed@google.com4bc0a9d2012-03-07 21:47:41 +000066 SkFractionalInt fInvSxFractionalInt;
reed@google.com411215a2012-03-08 20:13:46 +000067 SkFractionalInt fInvKyFractionalInt;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000068
reed@android.com8a1c16f2008-12-17 15:59:43 +000069 FixedTileProc fTileProcX; // chooseProcs
70 FixedTileProc fTileProcY; // chooseProcs
reed@google.comf444e8c2012-03-09 19:59:46 +000071 FixedTileLowBitsProc fTileLowBitsProcX; // chooseProcs
72 FixedTileLowBitsProc fTileLowBitsProcY; // chooseProcs
reed@android.com07d1f002009-08-13 19:35:48 +000073 IntTileProc fIntTileProcY; // chooseProcs
reed@android.com8a1c16f2008-12-17 15:59:43 +000074 SkFixed fFilterOneX;
75 SkFixed fFilterOneY;
76
reed@android.com8a1c16f2008-12-17 15:59:43 +000077 SkPMColor fPaintPMColor; // chooseProcs - A8 config
reed@android.comeef375b2009-08-03 14:45:45 +000078 SkFixed fInvSx; // chooseProcs
reed@android.com8a1c16f2008-12-17 15:59:43 +000079 SkFixed fInvKy; // chooseProcs
reed@android.com8a1c16f2008-12-17 15:59:43 +000080 uint16_t fAlphaScale; // chooseProcs
81 uint8_t fInvType; // chooseProcs
82 uint8_t fTileModeX; // CONSTRUCTOR
83 uint8_t fTileModeY; // CONSTRUCTOR
84 SkBool8 fDoFilter; // chooseProcs
reed@android.com8a1c16f2008-12-17 15:59:43 +000085
reed@android.comc9a1d4b2009-08-03 15:05:55 +000086 /** Platforms implement this, and can optionally overwrite only the
87 following fields:
88
89 fShaderProc32
90 fShaderProc16
91 fMatrixProc
92 fSampleProc32
93 fSampleProc32
94
95 They will already have valid function pointers, so a platform that does
96 not have an accelerated version can just leave that field as is. A valid
97 implementation can do nothing (see SkBitmapProcState_opts_none.cpp)
98 */
99 void platformProcs();
100
reed@google.com4c69a062013-05-23 20:11:56 +0000101
reed@android.com258cb222010-04-14 13:36:33 +0000102 /** Given the byte size of the index buffer to be passed to the matrix proc,
103 return the maximum number of resulting pixels that can be computed
104 (i.e. the number of SkPMColor values to be written by the sample proc).
105 This routine takes into account that filtering and scale-vs-affine
106 affect the amount of buffer space needed.
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000107
reed@android.com4c128c42009-08-14 13:54:37 +0000108 Only valid to call after chooseProcs (setContext) has been called. It is
109 safe to call this inside the shader's shadeSpan() method.
110 */
111 int maxCountForBufferSize(size_t bufferSize) const;
112
reed@google.com9fe287b2012-03-27 15:54:28 +0000113 // If a shader proc is present, then the corresponding matrix/sample procs
114 // are ignored
115 ShaderProc32 getShaderProc32() const { return fShaderProc32; }
116 ShaderProc16 getShaderProc16() const { return fShaderProc16; }
humper@google.comb0889472013-07-09 21:37:14 +0000117
118 SkBitmapFilter* getBitmapFilter() const { return fBitmapFilter; }
reed@google.com9fe287b2012-03-27 15:54:28 +0000119
120#ifdef SK_DEBUG
121 MatrixProc getMatrixProc() const;
122#else
123 MatrixProc getMatrixProc() const { return fMatrixProc; }
124#endif
125 SampleProc32 getSampleProc32() const { return fSampleProc32; }
126 SampleProc16 getSampleProc16() const { return fSampleProc16; }
127
reed@android.com8a1c16f2008-12-17 15:59:43 +0000128private:
reed@android.comeef375b2009-08-03 14:45:45 +0000129 friend class SkBitmapProcShader;
130
reed@google.com9fe287b2012-03-27 15:54:28 +0000131 ShaderProc32 fShaderProc32; // chooseProcs
132 ShaderProc16 fShaderProc16; // chooseProcs
133 // These are used if the shaderproc is NULL
134 MatrixProc fMatrixProc; // chooseProcs
135 SampleProc32 fSampleProc32; // chooseProcs
136 SampleProc16 fSampleProc16; // chooseProcs
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000137
reed@android.comeef375b2009-08-03 14:45:45 +0000138 SkMatrix fUnitInvMatrix; // chooseProcs
139 SkBitmap fOrigBitmap; // CONSTRUCTOR
140 SkBitmap fMipBitmap;
141
reed@android.com07d1f002009-08-13 19:35:48 +0000142 MatrixProc chooseMatrixProc(bool trivial_matrix);
reed@android.comeef375b2009-08-03 14:45:45 +0000143 bool chooseProcs(const SkMatrix& inv, const SkPaint&);
reed@google.com9a4c7462012-10-12 18:21:37 +0000144 ShaderProc32 chooseShaderProc32();
humper@google.comb0889472013-07-09 21:37:14 +0000145
146 void buildFilterCoefficients(SkFixed dst[4], float t) const;
147 SkBitmapFilter *fBitmapFilter;
skia.committer@gmail.comb0a327e2012-11-21 02:02:25 +0000148
humper@google.comb0889472013-07-09 21:37:14 +0000149 ShaderProc32 chooseBitmapFilterProc(const SkPaint &paint);
skia.committer@gmail.com3e2345a2013-05-24 07:01:26 +0000150
reed@google.com6bb92bc2012-11-20 19:45:16 +0000151 // Return false if we failed to setup for fast translate (e.g. overflow)
152 bool setupForTranslate();
reed@google.com9fe287b2012-03-27 15:54:28 +0000153
154#ifdef SK_DEBUG
155 static void DebugMatrixProc(const SkBitmapProcState&,
156 uint32_t[], int count, int x, int y);
157#endif
reed@android.com8a1c16f2008-12-17 15:59:43 +0000158};
159
reed@android.com07d1f002009-08-13 19:35:48 +0000160/* Macros for packing and unpacking pairs of 16bit values in a 32bit uint.
161 Used to allow access to a stream of uint16_t either one at a time, or
162 2 at a time by unpacking a uint32_t
163 */
164#ifdef SK_CPU_BENDIAN
165 #define PACK_TWO_SHORTS(pri, sec) ((pri) << 16 | (sec))
166 #define UNPACK_PRIMARY_SHORT(packed) ((uint32_t)(packed) >> 16)
167 #define UNPACK_SECONDARY_SHORT(packed) ((packed) & 0xFFFF)
168#else
169 #define PACK_TWO_SHORTS(pri, sec) ((pri) | ((sec) << 16))
170 #define UNPACK_PRIMARY_SHORT(packed) ((packed) & 0xFFFF)
171 #define UNPACK_SECONDARY_SHORT(packed) ((uint32_t)(packed) >> 16)
172#endif
173
174#ifdef SK_DEBUG
175 static inline uint32_t pack_two_shorts(U16CPU pri, U16CPU sec) {
176 SkASSERT((uint16_t)pri == pri);
177 SkASSERT((uint16_t)sec == sec);
178 return PACK_TWO_SHORTS(pri, sec);
179 }
180#else
181 #define pack_two_shorts(pri, sec) PACK_TWO_SHORTS(pri, sec)
182#endif
183
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +0000184// These functions are generated via macros, but are exposed here so that
185// platformProcs may test for them by name.
186void S32_opaque_D32_filter_DX(const SkBitmapProcState& s, const uint32_t xy[],
187 int count, SkPMColor colors[]);
senorblanco@chromium.orgf3f0bd72009-12-10 22:46:31 +0000188void S32_alpha_D32_filter_DX(const SkBitmapProcState& s, const uint32_t xy[],
189 int count, SkPMColor colors[]);
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000190void S32_opaque_D32_filter_DXDY(const SkBitmapProcState& s,
191 const uint32_t xy[], int count, SkPMColor colors[]);
192void S32_alpha_D32_filter_DXDY(const SkBitmapProcState& s,
tomhudson@google.comae29b882012-03-06 14:59:04 +0000193 const uint32_t xy[], int count, SkPMColor colors[]);
tomhudson@google.com06a73132012-02-22 18:30:43 +0000194void ClampX_ClampY_filter_scale(const SkBitmapProcState& s, uint32_t xy[],
195 int count, int x, int y);
196void ClampX_ClampY_nofilter_scale(const SkBitmapProcState& s, uint32_t xy[],
197 int count, int x, int y);
tomhudson@google.com5efaf262012-02-28 15:41:49 +0000198void ClampX_ClampY_filter_affine(const SkBitmapProcState& s,
199 uint32_t xy[], int count, int x, int y);
200void ClampX_ClampY_nofilter_affine(const SkBitmapProcState& s,
201 uint32_t xy[], int count, int x, int y);
reed@google.com78662282012-07-24 13:53:23 +0000202void S32_D16_filter_DX(const SkBitmapProcState& s,
203 const uint32_t* xy, int count, uint16_t* colors);
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +0000204
humper@google.comb0889472013-07-09 21:37:14 +0000205void highQualityFilter_ScaleOnly(const SkBitmapProcState &s, int x, int y,
206 SkPMColor *SK_RESTRICT colors, int count);
207void highQualityFilter(const SkBitmapProcState &s, int x, int y,
208 SkPMColor *SK_RESTRICT colors, int count);
209
210
reed@android.com8a1c16f2008-12-17 15:59:43 +0000211#endif