blob: 2577cb4b76c97925b5b3468fb9c60d4ec43738ad [file] [log] [blame]
djsollen@google.comc73dd5c2012-08-07 15:54:32 +00001
reed@google.com02f65f22012-08-06 21:20:05 +00002#include "SkBitmap.h"
mike@reedtribe.orga69b48c2011-12-28 20:31:00 +00003#include "SkTableColorFilter.h"
djsollen@google.comc73dd5c2012-08-07 15:54:32 +00004#include "SkColorPriv.h"
5#include "SkFlattenableBuffers.h"
mike@reedtribe.orga69b48c2011-12-28 20:31:00 +00006#include "SkUnPreMultiply.h"
7
8class SkTable_ColorFilter : public SkColorFilter {
9public:
10 SkTable_ColorFilter(const uint8_t tableA[], const uint8_t tableR[],
11 const uint8_t tableG[], const uint8_t tableB[]) {
mike@reedtribe.orgf23f5f72012-01-07 03:48:45 +000012 fBitmap = NULL;
mike@reedtribe.orga69b48c2011-12-28 20:31:00 +000013 fFlags = 0;
mike@reedtribe.orgf23f5f72012-01-07 03:48:45 +000014
mike@reedtribe.orga69b48c2011-12-28 20:31:00 +000015 uint8_t* dst = fStorage;
16 if (tableA) {
17 memcpy(dst, tableA, 256);
18 dst += 256;
19 fFlags |= kA_Flag;
20 }
21 if (tableR) {
22 memcpy(dst, tableR, 256);
23 dst += 256;
24 fFlags |= kR_Flag;
25 }
26 if (tableG) {
27 memcpy(dst, tableG, 256);
28 dst += 256;
29 fFlags |= kG_Flag;
30 }
31 if (tableB) {
32 memcpy(dst, tableB, 256);
33 fFlags |= kB_Flag;
34 }
35 }
36
tomhudson@google.com1bb4be22012-07-24 17:24:21 +000037 virtual ~SkTable_ColorFilter() {
38 SkDELETE(fBitmap);
39 }
40
bsalomon@google.comb2ad1012012-10-17 15:00:32 +000041 virtual bool asComponentTable(SkBitmap* table) const SK_OVERRIDE;
42
43#if SK_SUPPORT_GPU
bsalomon@google.com8ea78d82012-10-24 20:11:30 +000044 virtual GrEffect* asNewEffect(GrContext* context) const SK_OVERRIDE;
bsalomon@google.comb2ad1012012-10-17 15:00:32 +000045#endif
mike@reedtribe.orgf23f5f72012-01-07 03:48:45 +000046
mike@reedtribe.orga69b48c2011-12-28 20:31:00 +000047 virtual void filterSpan(const SkPMColor src[], int count,
reed@google.combada6442012-12-17 20:21:44 +000048 SkPMColor dst[]) const SK_OVERRIDE;
mike@reedtribe.orga69b48c2011-12-28 20:31:00 +000049
djsollen@google.comba28d032012-03-26 17:57:35 +000050 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkTable_ColorFilter)
mike@reedtribe.orgf23f5f72012-01-07 03:48:45 +000051
bsalomon@google.com371e1052013-01-11 21:08:55 +000052 enum {
53 kA_Flag = 1 << 0,
54 kR_Flag = 1 << 1,
55 kG_Flag = 1 << 2,
56 kB_Flag = 1 << 3,
57 };
58
mike@reedtribe.orga69b48c2011-12-28 20:31:00 +000059protected:
60 SkTable_ColorFilter(SkFlattenableReadBuffer& buffer);
djsollen@google.com54924242012-03-29 15:18:04 +000061 virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE;
mike@reedtribe.orga69b48c2011-12-28 20:31:00 +000062
63private:
bsalomon@google.comb2ad1012012-10-17 15:00:32 +000064 mutable const SkBitmap* fBitmap; // lazily allocated
mike@reedtribe.orgf23f5f72012-01-07 03:48:45 +000065
mike@reedtribe.orga69b48c2011-12-28 20:31:00 +000066 uint8_t fStorage[256 * 4];
67 unsigned fFlags;
68
69 typedef SkColorFilter INHERITED;
70};
71
72static const uint8_t gIdentityTable[] = {
rmistry@google.comfbfcd562012-08-23 18:09:54 +000073 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
74 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
75 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
76 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
77 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
78 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
79 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
80 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
81 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
82 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
83 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
84 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
85 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
86 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
87 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
88 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
89 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
90 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
91 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
92 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
93 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
94 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
95 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
96 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
97 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
98 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
99 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
100 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
101 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
102 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
103 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
mike@reedtribe.orga69b48c2011-12-28 20:31:00 +0000104 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
105};
106
107void SkTable_ColorFilter::filterSpan(const SkPMColor src[], int count,
reed@google.combada6442012-12-17 20:21:44 +0000108 SkPMColor dst[]) const {
mike@reedtribe.orga69b48c2011-12-28 20:31:00 +0000109 const uint8_t* table = fStorage;
110 const uint8_t* tableA = gIdentityTable;
111 const uint8_t* tableR = gIdentityTable;
112 const uint8_t* tableG = gIdentityTable;
113 const uint8_t* tableB = gIdentityTable;
114 if (fFlags & kA_Flag) {
115 tableA = table; table += 256;
116 }
117 if (fFlags & kR_Flag) {
118 tableR = table; table += 256;
119 }
120 if (fFlags & kG_Flag) {
121 tableG = table; table += 256;
122 }
123 if (fFlags & kB_Flag) {
124 tableB = table;
125 }
126
127 const SkUnPreMultiply::Scale* scaleTable = SkUnPreMultiply::GetScaleTable();
128 for (int i = 0; i < count; ++i) {
129 SkPMColor c = src[i];
130 unsigned a, r, g, b;
131 if (0 == c) {
132 a = r = g = b = 0;
133 } else {
134 a = SkGetPackedA32(c);
135 r = SkGetPackedR32(c);
136 g = SkGetPackedG32(c);
137 b = SkGetPackedB32(c);
138
139 if (a < 255) {
140 SkUnPreMultiply::Scale scale = scaleTable[a];
141 r = SkUnPreMultiply::ApplyScale(scale, r);
142 g = SkUnPreMultiply::ApplyScale(scale, g);
143 b = SkUnPreMultiply::ApplyScale(scale, b);
144 }
145 }
146 dst[i] = SkPremultiplyARGBInline(tableA[a], tableR[r],
147 tableG[g], tableB[b]);
148 }
149}
150
mike@reedtribe.orga69b48c2011-12-28 20:31:00 +0000151static const uint8_t gCountNibBits[] = {
152 0, 1, 1, 2,
153 1, 2, 2, 3,
154 1, 2, 2, 3,
155 2, 3, 3, 4
156};
157
158#include "SkPackBits.h"
159
djsollen@google.com54924242012-03-29 15:18:04 +0000160void SkTable_ColorFilter::flatten(SkFlattenableWriteBuffer& buffer) const {
mike@reedtribe.orga69b48c2011-12-28 20:31:00 +0000161 this->INHERITED::flatten(buffer);
162
163 uint8_t storage[5*256];
164 int count = gCountNibBits[fFlags & 0xF];
165 size_t size = SkPackBits::Pack8(fStorage, count * 256, storage);
166 SkASSERT(size <= sizeof(storage));
167
168// SkDebugf("raw %d packed %d\n", count * 256, size);
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000169
mike@reedtribe.orga69b48c2011-12-28 20:31:00 +0000170 buffer.writeInt(fFlags);
djsollen@google.comc73dd5c2012-08-07 15:54:32 +0000171 buffer.writeByteArray(storage, size);
mike@reedtribe.orga69b48c2011-12-28 20:31:00 +0000172}
173
174SkTable_ColorFilter::SkTable_ColorFilter(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {
mike@reedtribe.orgf23f5f72012-01-07 03:48:45 +0000175 fBitmap = NULL;
176
mike@reedtribe.orga69b48c2011-12-28 20:31:00 +0000177 uint8_t storage[5*256];
178
179 fFlags = buffer.readInt();
djsollen@google.comc73dd5c2012-08-07 15:54:32 +0000180
181 size_t size = buffer.getArrayCount();
182 SkASSERT(size <= sizeof(storage));
183 buffer.readByteArray(storage);
mike@reedtribe.orga69b48c2011-12-28 20:31:00 +0000184
humper@google.com0e515772013-01-07 19:54:40 +0000185 SkDEBUGCODE(size_t raw = ) SkPackBits::Unpack8(storage, size, fStorage);
mike@reedtribe.orga69b48c2011-12-28 20:31:00 +0000186
187 SkASSERT(raw <= sizeof(fStorage));
humper@google.com0e515772013-01-07 19:54:40 +0000188 SkDEBUGCODE(size_t count = gCountNibBits[fFlags & 0xF]);
mike@reedtribe.orga69b48c2011-12-28 20:31:00 +0000189 SkASSERT(raw == count * 256);
190}
191
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000192bool SkTable_ColorFilter::asComponentTable(SkBitmap* table) const {
mike@reedtribe.orgf23f5f72012-01-07 03:48:45 +0000193 if (table) {
194 if (NULL == fBitmap) {
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000195 SkBitmap* bmp = SkNEW(SkBitmap);
196 bmp->setConfig(SkBitmap::kA8_Config, 256, 4, 256);
197 bmp->allocPixels();
198 uint8_t* bitmapPixels = bmp->getAddr8(0, 0);
twiz@google.com58071162012-07-18 21:41:50 +0000199 int offset = 0;
200 static const unsigned kFlags[] = { kA_Flag, kR_Flag, kG_Flag, kB_Flag };
201
202 for (int x = 0; x < 4; ++x) {
203 if (!(fFlags & kFlags[x])) {
204 memcpy(bitmapPixels, gIdentityTable, sizeof(gIdentityTable));
205 } else {
206 memcpy(bitmapPixels, fStorage + offset, 256);
207 offset += 256;
208 }
209 bitmapPixels += 256;
210 }
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000211 fBitmap = bmp;
mike@reedtribe.orgf23f5f72012-01-07 03:48:45 +0000212 }
213 *table = *fBitmap;
214 }
215 return true;
216}
217
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000218#if SK_SUPPORT_GPU
219
bsalomon@google.coma469c282012-10-24 18:28:34 +0000220#include "GrEffect.h"
bsalomon@google.com2eaaefd2012-10-29 19:51:22 +0000221#include "GrTBackendEffectFactory.h"
bsalomon@google.comd698f772012-10-25 13:22:00 +0000222#include "gl/GrGLEffect.h"
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000223#include "SkGr.h"
224
225class GLColorTableEffect;
226
bsalomon@google.coma469c282012-10-24 18:28:34 +0000227class ColorTableEffect : public GrEffect {
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000228public:
229
bsalomon@google.com371e1052013-01-11 21:08:55 +0000230 explicit ColorTableEffect(GrTexture* texture, unsigned flags);
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000231 virtual ~ColorTableEffect();
232
233 static const char* Name() { return "ColorTable"; }
bsalomon@google.com396e61f2012-10-25 19:00:29 +0000234 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE;
bsalomon@google.coma469c282012-10-24 18:28:34 +0000235 virtual bool isEqual(const GrEffect&) const SK_OVERRIDE;
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000236
bsalomon@google.com371e1052013-01-11 21:08:55 +0000237 virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE;
238
bsalomon@google.com422e81a2012-10-25 14:11:03 +0000239 typedef GLColorTableEffect GLEffect;
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000240
241private:
bsalomon@google.comf271cc72012-10-24 19:35:13 +0000242 GR_DECLARE_EFFECT_TEST;
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000243
244 GrTextureAccess fTextureAccess;
bsalomon@google.com371e1052013-01-11 21:08:55 +0000245 unsigned fFlags; // currently not used in shader code, just to assist
246 // getConstantColorComponents().
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000247
bsalomon@google.coma469c282012-10-24 18:28:34 +0000248 typedef GrEffect INHERITED;
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000249};
250
bsalomon@google.com22a800a2012-10-26 19:16:46 +0000251class GLColorTableEffect : public GrGLEffect {
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000252public:
bsalomon@google.com396e61f2012-10-25 19:00:29 +0000253 GLColorTableEffect(const GrBackendEffectFactory& factory,
bsalomon@google.com021fc732012-10-25 12:47:42 +0000254 const GrEffect& effect);
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000255
bsalomon@google.com22a800a2012-10-26 19:16:46 +0000256 virtual void emitCode(GrGLShaderBuilder*,
bsalomon@google.com2eaaefd2012-10-29 19:51:22 +0000257 const GrEffectStage&,
bsalomon@google.com22a800a2012-10-26 19:16:46 +0000258 EffectKey,
259 const char* vertexCoords,
260 const char* outputColor,
261 const char* inputColor,
262 const TextureSamplerArray&) SK_OVERRIDE;
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000263
bsalomon@google.com28a15fb2012-10-26 17:53:18 +0000264 virtual void setData(const GrGLUniformManager&, const GrEffectStage&) SK_OVERRIDE {}
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000265
bsalomon@google.com2eaaefd2012-10-29 19:51:22 +0000266 static EffectKey GenKey(const GrEffectStage&, const GrGLCaps&);
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000267
268private:
269
bsalomon@google.com22a800a2012-10-26 19:16:46 +0000270 typedef GrGLEffect INHERITED;
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000271};
272
273GLColorTableEffect::GLColorTableEffect(
bsalomon@google.com396e61f2012-10-25 19:00:29 +0000274 const GrBackendEffectFactory& factory, const GrEffect& effect)
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000275 : INHERITED(factory) {
276 }
277
bsalomon@google.com22a800a2012-10-26 19:16:46 +0000278void GLColorTableEffect::emitCode(GrGLShaderBuilder* builder,
bsalomon@google.com2eaaefd2012-10-29 19:51:22 +0000279 const GrEffectStage&,
bsalomon@google.com22a800a2012-10-26 19:16:46 +0000280 EffectKey,
281 const char* vertexCoords,
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000282 const char* outputColor,
283 const char* inputColor,
284 const TextureSamplerArray& samplers) {
bsalomon@google.com22a800a2012-10-26 19:16:46 +0000285
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000286 static const float kColorScaleFactor = 255.0f / 256.0f;
287 static const float kColorOffsetFactor = 1.0f / 512.0f;
288 SkString* code = &builder->fFSCode;
289 if (NULL == inputColor) {
290 // the input color is solid white (all ones).
291 static const float kMaxValue = kColorScaleFactor + kColorOffsetFactor;
292 code->appendf("\t\tvec4 coord = vec4(%f, %f, %f, %f);\n",
293 kMaxValue, kMaxValue, kMaxValue, kMaxValue);
294
295 } else {
296 code->appendf("\t\tfloat nonZeroAlpha = max(%s.a, .0001);\n", inputColor);
297 code->appendf("\t\tvec4 coord = vec4(%s.rgb / nonZeroAlpha, nonZeroAlpha);\n", inputColor);
298 code->appendf("\t\tcoord = coord * %f + vec4(%f, %f, %f, %f);\n",
299 kColorScaleFactor,
300 kColorOffsetFactor, kColorOffsetFactor,
301 kColorOffsetFactor, kColorOffsetFactor);
302 }
303
304 code->appendf("\t\t%s.a = ", outputColor);
305 builder->appendTextureLookup(code, samplers[0], "vec2(coord.a, 0.125)");
306 code->append(";\n");
307
308 code->appendf("\t\t%s.r = ", outputColor);
309 builder->appendTextureLookup(code, samplers[0], "vec2(coord.r, 0.375)");
310 code->append(";\n");
311
312 code->appendf("\t\t%s.g = ", outputColor);
313 builder->appendTextureLookup(code, samplers[0], "vec2(coord.g, 0.625)");
314 code->append(";\n");
315
316 code->appendf("\t\t%s.b = ", outputColor);
317 builder->appendTextureLookup(code, samplers[0], "vec2(coord.b, 0.875)");
318 code->append(";\n");
319
320 code->appendf("\t\t%s.rgb *= %s.a;\n", outputColor, outputColor);
321}
322
bsalomon@google.com2eaaefd2012-10-29 19:51:22 +0000323GrGLEffect::EffectKey GLColorTableEffect::GenKey(const GrEffectStage&, const GrGLCaps&) {
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000324 return 0;
325}
326
327///////////////////////////////////////////////////////////////////////////////
328
bsalomon@google.com371e1052013-01-11 21:08:55 +0000329ColorTableEffect::ColorTableEffect(GrTexture* texture, unsigned flags)
330 : fTextureAccess(texture, "a")
331 , fFlags(flags) {
bsalomon@google.com50db75c2013-01-11 13:54:30 +0000332 this->addTextureAccess(&fTextureAccess);
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000333}
334
335ColorTableEffect::~ColorTableEffect() {
336}
337
bsalomon@google.com396e61f2012-10-25 19:00:29 +0000338const GrBackendEffectFactory& ColorTableEffect::getFactory() const {
339 return GrTBackendEffectFactory<ColorTableEffect>::getInstance();
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000340}
341
bsalomon@google.coma469c282012-10-24 18:28:34 +0000342bool ColorTableEffect::isEqual(const GrEffect& sBase) const {
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000343 return INHERITED::isEqual(sBase);
344}
345
bsalomon@google.com371e1052013-01-11 21:08:55 +0000346void ColorTableEffect::getConstantColorComponents(GrColor* color, uint32_t* validFlags) const {
347 // If we kept the table in the effect then we could actually run known inputs through the
348 // table.
349 if (fFlags & SkTable_ColorFilter::kR_Flag) {
350 *validFlags = ~kR_ValidComponentFlag;
351 }
352 if (fFlags & SkTable_ColorFilter::kG_Flag) {
353 *validFlags &= ~kG_ValidComponentFlag;
354 }
355 if (fFlags & SkTable_ColorFilter::kB_Flag) {
356 *validFlags &= ~kB_ValidComponentFlag;
357 }
358 if (fFlags & SkTable_ColorFilter::kA_Flag) {
359 *validFlags &= ~kA_ValidComponentFlag;
360 }
361}
362
363
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000364///////////////////////////////////////////////////////////////////////////////
365
bsalomon@google.comf271cc72012-10-24 19:35:13 +0000366GR_DEFINE_EFFECT_TEST(ColorTableEffect);
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000367
bsalomon@google.coma469c282012-10-24 18:28:34 +0000368GrEffect* ColorTableEffect::TestCreate(SkRandom* random,
369 GrContext* context,
370 GrTexture* textures[]) {
bsalomon@google.com371e1052013-01-11 21:08:55 +0000371 static unsigned kAllFlags = SkTable_ColorFilter::kR_Flag | SkTable_ColorFilter::kG_Flag |
372 SkTable_ColorFilter::kB_Flag | SkTable_ColorFilter::kA_Flag;
373 return SkNEW_ARGS(ColorTableEffect, (textures[GrEffectUnitTest::kAlphaTextureIdx], kAllFlags));
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000374}
375
bsalomon@google.com8ea78d82012-10-24 20:11:30 +0000376GrEffect* SkTable_ColorFilter::asNewEffect(GrContext* context) const {
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000377 SkBitmap bitmap;
378 this->asComponentTable(&bitmap);
bsalomon@google.com8ea78d82012-10-24 20:11:30 +0000379 // passing NULL because this effect does no tiling or filtering.
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000380 GrTexture* texture = GrLockCachedBitmapTexture(context, bitmap, NULL);
bsalomon@google.com371e1052013-01-11 21:08:55 +0000381 GrEffect* effect = SkNEW_ARGS(ColorTableEffect, (texture, fFlags));
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000382
383 // Unlock immediately, this is not great, but we don't have a way of
384 // knowing when else to unlock it currently. TODO: Remove this when
385 // unref becomes the unlock replacement for all types of textures.
386 GrUnlockCachedBitmapTexture(texture);
bsalomon@google.com021fc732012-10-25 12:47:42 +0000387 return effect;
bsalomon@google.comb2ad1012012-10-17 15:00:32 +0000388}
389
390#endif // SK_SUPPORT_GPU
391
mike@reedtribe.orga69b48c2011-12-28 20:31:00 +0000392///////////////////////////////////////////////////////////////////////////////
393
394#ifdef SK_CPU_BENDIAN
395#else
396 #define SK_A32_INDEX (3 - (SK_A32_SHIFT >> 3))
397 #define SK_R32_INDEX (3 - (SK_R32_SHIFT >> 3))
398 #define SK_G32_INDEX (3 - (SK_G32_SHIFT >> 3))
399 #define SK_B32_INDEX (3 - (SK_B32_SHIFT >> 3))
400#endif
401
402///////////////////////////////////////////////////////////////////////////////
403
404SkColorFilter* SkTableColorFilter::Create(const uint8_t table[256]) {
405 return SkNEW_ARGS(SkTable_ColorFilter, (table, table, table, table));
406}
407
408SkColorFilter* SkTableColorFilter::CreateARGB(const uint8_t tableA[256],
409 const uint8_t tableR[256],
410 const uint8_t tableG[256],
411 const uint8_t tableB[256]) {
412 return SkNEW_ARGS(SkTable_ColorFilter, (tableA, tableR, tableG, tableB));
413}
djsollen@google.coma2ca41e2012-03-23 19:00:34 +0000414
415SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkTableColorFilter)
416 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkTable_ColorFilter)
417SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END