OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2007 The Android Open Source Project | 2 * Copyright 2007 The Android Open Source Project |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #ifndef SkBitmapProcState_DEFINED | 8 #ifndef SkBitmapProcState_DEFINED |
9 #define SkBitmapProcState_DEFINED | 9 #define SkBitmapProcState_DEFINED |
10 | 10 |
11 #include "SkBitmap.h" | 11 #include "SkBitmap.h" |
12 #include "SkBitmapController.h" | 12 #include "SkBitmapController.h" |
13 #include "SkBitmapFilter.h" | 13 #include "SkBitmapFilter.h" |
14 #include "SkBitmapProvider.h" | 14 #include "SkBitmapProvider.h" |
15 #include "SkFloatBits.h" | 15 #include "SkFloatBits.h" |
16 #include "SkMatrix.h" | 16 #include "SkMatrix.h" |
17 #include "SkMipMap.h" | 17 #include "SkMipMap.h" |
18 #include "SkPaint.h" | 18 #include "SkPaint.h" |
19 #include "SkShader.h" | 19 #include "SkShader.h" |
20 #include "SkTemplates.h" | 20 #include "SkTemplates.h" |
21 | 21 |
22 typedef SkFixed3232 SkFractionalInt; | 22 typedef SkFixed3232 SkFractionalInt; |
23 #define SkScalarToFractionalInt(x) SkScalarToFixed3232(x) | 23 #define SkScalarToFractionalInt(x) SkScalarToFixed3232(x) |
24 #define SkFractionalIntToFixed(x) SkFixed3232ToFixed(x) | 24 #define SkFractionalIntToFixed(x) SkFixed3232ToFixed(x) |
25 #define SkFixedToFractionalInt(x) SkFixedToFixed3232(x) | 25 #define SkFixedToFractionalInt(x) SkFixedToFixed3232(x) |
26 #define SkFractionalIntToInt(x) SkFixed3232ToInt(x) | 26 #define SkFractionalIntToInt(x) SkFixed3232ToInt(x) |
27 | 27 |
28 class SkPaint; | 28 class SkPaint; |
29 | 29 |
30 struct SkBitmapProcState { | 30 struct SkBitmapProcInfo { |
31 SkBitmapProcState(const SkBitmapProvider&, SkShader::TileMode tmx, SkShader:
:TileMode tmy); | 31 SkBitmapProcInfo(const SkBitmapProvider&, SkShader::TileMode tmx, SkShader::
TileMode tmy); |
32 SkBitmapProcState(const SkBitmap&, SkShader::TileMode tmx, SkShader::TileMod
e tmy); | 32 SkBitmapProcInfo(const SkBitmap&, SkShader::TileMode tmx, SkShader::TileMode
tmy); |
33 ~SkBitmapProcState(); | 33 ~SkBitmapProcInfo(); |
| 34 |
| 35 const SkBitmapProvider fProvider; |
| 36 |
| 37 SkPixmap fPixmap; |
| 38 SkMatrix fInvMatrix; // copy of what is in fBMState, can
we remove the dup? |
| 39 SkColor fPaintColor; |
| 40 SkShader::TileMode fTileModeX; |
| 41 SkShader::TileMode fTileModeY; |
| 42 SkFilterQuality fFilterQuality; |
| 43 SkMatrix::TypeMask fInvType; |
| 44 |
| 45 bool init(const SkMatrix& inverse, const SkPaint&); |
| 46 |
| 47 private: |
| 48 enum { |
| 49 kBMStateSize = 136 // found by inspection. if too small, we will call n
ew/delete |
| 50 }; |
| 51 SkAlignedSStorage<kBMStateSize> fBMStateStorage; |
| 52 SkBitmapController::State* fBMState; |
| 53 }; |
| 54 |
| 55 struct SkBitmapProcState : public SkBitmapProcInfo { |
| 56 SkBitmapProcState(const SkBitmapProvider& prov, SkShader::TileMode tmx, SkSh
ader::TileMode tmy) |
| 57 : SkBitmapProcInfo(prov, tmx, tmy) {} |
| 58 SkBitmapProcState(const SkBitmap& bitmap, SkShader::TileMode tmx, SkShader::
TileMode tmy) |
| 59 : SkBitmapProcInfo(bitmap, tmx, tmy) {} |
| 60 |
| 61 bool setup(const SkMatrix& inv, const SkPaint& paint) { |
| 62 return this->init(inv, paint) && this->chooseProcs(); |
| 63 } |
34 | 64 |
35 typedef void (*ShaderProc32)(const void* ctx, int x, int y, SkPMColor[], int
count); | 65 typedef void (*ShaderProc32)(const void* ctx, int x, int y, SkPMColor[], int
count); |
36 | 66 |
37 typedef void (*ShaderProc16)(const void* ctx, int x, int y, uint16_t[], int
count); | 67 typedef void (*ShaderProc16)(const void* ctx, int x, int y, uint16_t[], int
count); |
38 | 68 |
39 typedef void (*MatrixProc)(const SkBitmapProcState&, | 69 typedef void (*MatrixProc)(const SkBitmapProcState&, |
40 uint32_t bitmapXY[], | 70 uint32_t bitmapXY[], |
41 int count, | 71 int count, |
42 int x, int y); | 72 int x, int y); |
43 | 73 |
44 typedef void (*SampleProc32)(const SkBitmapProcState&, | 74 typedef void (*SampleProc32)(const SkBitmapProcState&, |
45 const uint32_t[], | 75 const uint32_t[], |
46 int count, | 76 int count, |
47 SkPMColor colors[]); | 77 SkPMColor colors[]); |
48 | 78 |
49 typedef U16CPU (*FixedTileProc)(SkFixed); // returns 0..0xFFFF | 79 typedef U16CPU (*FixedTileProc)(SkFixed); // returns 0..0xFFFF |
50 typedef U16CPU (*FixedTileLowBitsProc)(SkFixed, int); // returns 0..0xF | 80 typedef U16CPU (*FixedTileLowBitsProc)(SkFixed, int); // returns 0..0xF |
51 typedef U16CPU (*IntTileProc)(int value, int count); // returns 0..count-1 | 81 typedef U16CPU (*IntTileProc)(int value, int count); // returns 0..count-1 |
52 | 82 |
53 SkPixmap fPixmap; | |
54 SkMatrix fInvMatrix; // copy of what is in fBMState, can
we remove the dup? | |
55 | |
56 SkMatrix::MapXYProc fInvProc; // chooseProcs | 83 SkMatrix::MapXYProc fInvProc; // chooseProcs |
57 | |
58 SkFractionalInt fInvSxFractionalInt; | 84 SkFractionalInt fInvSxFractionalInt; |
59 SkFractionalInt fInvKyFractionalInt; | 85 SkFractionalInt fInvKyFractionalInt; |
60 | 86 |
61 FixedTileProc fTileProcX; // chooseProcs | 87 FixedTileProc fTileProcX; // chooseProcs |
62 FixedTileProc fTileProcY; // chooseProcs | 88 FixedTileProc fTileProcY; // chooseProcs |
63 FixedTileLowBitsProc fTileLowBitsProcX; // chooseProcs | 89 FixedTileLowBitsProc fTileLowBitsProcX; // chooseProcs |
64 FixedTileLowBitsProc fTileLowBitsProcY; // chooseProcs | 90 FixedTileLowBitsProc fTileLowBitsProcY; // chooseProcs |
65 IntTileProc fIntTileProcY; // chooseProcs | 91 IntTileProc fIntTileProcY; // chooseProcs |
66 SkFixed fFilterOneX; | 92 SkFixed fFilterOneX; |
67 SkFixed fFilterOneY; | 93 SkFixed fFilterOneY; |
68 | 94 |
69 SkPMColor fPaintPMColor; // chooseProcs - A8 config | |
70 SkFixed fInvSx; // chooseProcs | 95 SkFixed fInvSx; // chooseProcs |
71 SkFixed fInvKy; // chooseProcs | 96 SkFixed fInvKy; // chooseProcs |
| 97 SkPMColor fPaintPMColor; // chooseProcs - A8 config |
72 uint16_t fAlphaScale; // chooseProcs | 98 uint16_t fAlphaScale; // chooseProcs |
73 uint8_t fInvType; // chooseProcs | |
74 uint8_t fTileModeX; // CONSTRUCTOR | |
75 uint8_t fTileModeY; // CONSTRUCTOR | |
76 uint8_t fFilterLevel; // chooseProcs | |
77 | 99 |
78 /** Platforms implement this, and can optionally overwrite only the | 100 /** Platforms implement this, and can optionally overwrite only the |
79 following fields: | 101 following fields: |
80 | 102 |
81 fShaderProc32 | 103 fShaderProc32 |
82 fShaderProc16 | 104 fShaderProc16 |
83 fMatrixProc | 105 fMatrixProc |
84 fSampleProc32 | 106 fSampleProc32 |
85 fSampleProc32 | 107 fSampleProc32 |
86 | 108 |
(...skipping 20 matching lines...) Expand all Loading... |
107 ShaderProc16 getShaderProc16() const { return fShaderProc16; } | 129 ShaderProc16 getShaderProc16() const { return fShaderProc16; } |
108 | 130 |
109 #ifdef SK_DEBUG | 131 #ifdef SK_DEBUG |
110 MatrixProc getMatrixProc() const; | 132 MatrixProc getMatrixProc() const; |
111 #else | 133 #else |
112 MatrixProc getMatrixProc() const { return fMatrixProc; } | 134 MatrixProc getMatrixProc() const { return fMatrixProc; } |
113 #endif | 135 #endif |
114 SampleProc32 getSampleProc32() const { return fSampleProc32; } | 136 SampleProc32 getSampleProc32() const { return fSampleProc32; } |
115 | 137 |
116 private: | 138 private: |
117 friend class SkBitmapProcShader; | |
118 friend class SkLightingShaderImpl; | |
119 | |
120 ShaderProc32 fShaderProc32; // chooseProcs | 139 ShaderProc32 fShaderProc32; // chooseProcs |
121 ShaderProc16 fShaderProc16; // chooseProcs | 140 ShaderProc16 fShaderProc16; // chooseProcs |
122 // These are used if the shaderproc is nullptr | 141 // These are used if the shaderproc is nullptr |
123 MatrixProc fMatrixProc; // chooseProcs | 142 MatrixProc fMatrixProc; // chooseProcs |
124 SampleProc32 fSampleProc32; // chooseProcs | 143 SampleProc32 fSampleProc32; // chooseProcs |
125 | 144 |
126 const SkBitmapProvider fProvider; | |
127 | |
128 enum { | |
129 kBMStateSize = 136 // found by inspection. if too small, we will call n
ew/delete | |
130 }; | |
131 SkAlignedSStorage<kBMStateSize> fBMStateStorage; | |
132 SkBitmapController::State* fBMState; | |
133 | |
134 MatrixProc chooseMatrixProc(bool trivial_matrix); | 145 MatrixProc chooseMatrixProc(bool trivial_matrix); |
135 bool chooseProcs(const SkMatrix& inv, const SkPaint&); | 146 bool chooseProcs(); // caller must have called init() first (on our base-cla
ss) |
136 bool chooseScanlineProcs(bool trivialMatrix, bool clampClamp, const SkPaint&
paint); | 147 bool chooseScanlineProcs(bool trivialMatrix, bool clampClamp); |
137 ShaderProc32 chooseShaderProc32(); | 148 ShaderProc32 chooseShaderProc32(); |
138 | 149 |
139 // Return false if we failed to setup for fast translate (e.g. overflow) | 150 // Return false if we failed to setup for fast translate (e.g. overflow) |
140 bool setupForTranslate(); | 151 bool setupForTranslate(); |
141 | 152 |
142 #ifdef SK_DEBUG | 153 #ifdef SK_DEBUG |
143 static void DebugMatrixProc(const SkBitmapProcState&, | 154 static void DebugMatrixProc(const SkBitmapProcState&, |
144 uint32_t[], int count, int x, int y); | 155 uint32_t[], int count, int x, int y); |
145 #endif | 156 #endif |
146 }; | 157 }; |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
192 class SkBitmapProcStateAutoMapper { | 203 class SkBitmapProcStateAutoMapper { |
193 public: | 204 public: |
194 SkBitmapProcStateAutoMapper(const SkBitmapProcState& s, int x, int y, | 205 SkBitmapProcStateAutoMapper(const SkBitmapProcState& s, int x, int y, |
195 SkPoint* scalarPoint = nullptr) { | 206 SkPoint* scalarPoint = nullptr) { |
196 SkPoint pt; | 207 SkPoint pt; |
197 s.fInvProc(s.fInvMatrix, | 208 s.fInvProc(s.fInvMatrix, |
198 SkIntToScalar(x) + SK_ScalarHalf, | 209 SkIntToScalar(x) + SK_ScalarHalf, |
199 SkIntToScalar(y) + SK_ScalarHalf, &pt); | 210 SkIntToScalar(y) + SK_ScalarHalf, &pt); |
200 | 211 |
201 SkFixed biasX, biasY; | 212 SkFixed biasX, biasY; |
202 if (s.fFilterLevel == kNone_SkFilterQuality) { | 213 if (s.fFilterQuality == kNone_SkFilterQuality) { |
203 // SkFixed epsilon bias to ensure inverse-mapped bitmap coordinates
are rounded | 214 // SkFixed epsilon bias to ensure inverse-mapped bitmap coordinates
are rounded |
204 // consistently WRT geometry. Note that we only need the bias for p
ositive scales: | 215 // consistently WRT geometry. Note that we only need the bias for p
ositive scales: |
205 // for negative scales, the rounding is intrinsically correct. | 216 // for negative scales, the rounding is intrinsically correct. |
206 // We scale it to persist SkFractionalInt -> SkFixed conversions. | 217 // We scale it to persist SkFractionalInt -> SkFixed conversions. |
207 biasX = (s.fInvMatrix.getScaleX() > 0); | 218 biasX = (s.fInvMatrix.getScaleX() > 0); |
208 biasY = (s.fInvMatrix.getScaleY() > 0); | 219 biasY = (s.fInvMatrix.getScaleY() > 0); |
209 } else { | 220 } else { |
210 biasX = s.fFilterOneX >> 1; | 221 biasX = s.fFilterOneX >> 1; |
211 biasY = s.fFilterOneY >> 1; | 222 biasY = s.fFilterOneY >> 1; |
212 } | 223 } |
(...skipping 14 matching lines...) Expand all Loading... |
227 SkFixed fixedY() const { return SkFractionalIntToFixed(fY); } | 238 SkFixed fixedY() const { return SkFractionalIntToFixed(fY); } |
228 | 239 |
229 int intX() const { return SkFractionalIntToInt(fX); } | 240 int intX() const { return SkFractionalIntToInt(fX); } |
230 int intY() const { return SkFractionalIntToInt(fY); } | 241 int intY() const { return SkFractionalIntToInt(fY); } |
231 | 242 |
232 private: | 243 private: |
233 SkFractionalInt fX, fY; | 244 SkFractionalInt fX, fY; |
234 }; | 245 }; |
235 | 246 |
236 #endif | 247 #endif |
OLD | NEW |