blob: 78df53e38ae7c3a3b706b21773c6b448052cbc12 [file] [log] [blame]
reed@google.comac10a2d2010-12-22 21:39:39 +00001/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00002 * Copyright 2010 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
reed@google.comac10a2d2010-12-22 21:39:39 +00006 */
7
reed@google.comac10a2d2010-12-22 21:39:39 +00008#include "SkGr.h"
commit-bot@chromium.org8dcff642014-05-15 20:32:48 +00009#include "SkColorFilter.h"
commit-bot@chromium.orgea476e12013-10-14 18:29:23 +000010#include "SkConfig8888.h"
commit-bot@chromium.org50a30432013-10-24 17:44:27 +000011#include "SkMessageBus.h"
12#include "SkPixelRef.h"
13#include "GrResourceCache.h"
reed@google.comac10a2d2010-12-22 21:39:39 +000014
15/* Fill out buffer with the compressed format Ganesh expects from a colortable
16 based bitmap. [palette (colortable) + indices].
bsalomon@google.com5782d712011-01-21 21:03:59 +000017
18 At the moment Ganesh only supports 8bit version. If Ganesh allowed we others
reed@google.comac10a2d2010-12-22 21:39:39 +000019 we could detect that the colortable.count is <= 16, and then repack the
20 indices as nibbles to save RAM, but it would take more time (i.e. a lot
21 slower than memcpy), so skipping that for now.
bsalomon@google.com5782d712011-01-21 21:03:59 +000022
reed@google.comac10a2d2010-12-22 21:39:39 +000023 Ganesh wants a full 256 palette entry, even though Skia's ctable is only as big
24 as the colortable.count says it is.
25 */
26static void build_compressed_data(void* buffer, const SkBitmap& bitmap) {
27 SkASSERT(SkBitmap::kIndex8_Config == bitmap.config());
bsalomon@google.com5782d712011-01-21 21:03:59 +000028
bsalomon@google.com7f4ad5a2013-05-07 19:36:43 +000029 SkAutoLockPixels alp(bitmap);
reed@google.comac10a2d2010-12-22 21:39:39 +000030 if (!bitmap.readyToDraw()) {
tomhudson@google.com0c00f212011-12-28 14:59:50 +000031 SkDEBUGFAIL("bitmap not ready to draw!");
reed@google.comac10a2d2010-12-22 21:39:39 +000032 return;
33 }
34
35 SkColorTable* ctable = bitmap.getColorTable();
36 char* dst = (char*)buffer;
bsalomon@google.com5782d712011-01-21 21:03:59 +000037
reed@google.com7111d462014-03-25 16:20:24 +000038 const int count = ctable->count();
39
40 SkDstPixelInfo dstPI;
41 dstPI.fColorType = kRGBA_8888_SkColorType;
42 dstPI.fAlphaType = kPremul_SkAlphaType;
43 dstPI.fPixels = buffer;
44 dstPI.fRowBytes = count * sizeof(SkPMColor);
45
46 SkSrcPixelInfo srcPI;
commit-bot@chromium.org28fcae22014-04-11 17:15:40 +000047 srcPI.fColorType = kN32_SkColorType;
reed@google.com7111d462014-03-25 16:20:24 +000048 srcPI.fAlphaType = kPremul_SkAlphaType;
49 srcPI.fPixels = ctable->lockColors();
50 srcPI.fRowBytes = count * sizeof(SkPMColor);
51
52 srcPI.convertPixelsTo(&dstPI, count, 1);
53
reed@google.com0a6151d2013-10-10 14:44:56 +000054 ctable->unlockColors();
bsalomon@google.com5782d712011-01-21 21:03:59 +000055
reed@google.comac10a2d2010-12-22 21:39:39 +000056 // always skip a full 256 number of entries, even if we memcpy'd fewer
bsalomon@google.comfea37b52011-04-25 15:51:06 +000057 dst += kGrColorTableSize;
reed@google.comac10a2d2010-12-22 21:39:39 +000058
scroggo@google.com0ba4bf42013-02-25 16:02:36 +000059 if ((unsigned)bitmap.width() == bitmap.rowBytes()) {
reed@google.comac10a2d2010-12-22 21:39:39 +000060 memcpy(dst, bitmap.getPixels(), bitmap.getSize());
61 } else {
62 // need to trim off the extra bytes per row
63 size_t width = bitmap.width();
64 size_t rowBytes = bitmap.rowBytes();
65 const char* src = (const char*)bitmap.getPixels();
66 for (int y = 0; y < bitmap.height(); y++) {
67 memcpy(dst, src, width);
68 src += rowBytes;
69 dst += width;
70 }
71 }
72}
73
74////////////////////////////////////////////////////////////////////////////////
75
bsalomon@google.com0797c2c2012-12-20 15:13:01 +000076static void generate_bitmap_cache_id(const SkBitmap& bitmap, GrCacheID* id) {
77 // Our id includes the offset, width, and height so that bitmaps created by extractSubset()
78 // are unique.
79 uint32_t genID = bitmap.getGenerationID();
reed@google.com672588b2014-01-08 15:42:01 +000080 SkIPoint origin = bitmap.pixelRefOrigin();
81 int16_t width = SkToS16(bitmap.width());
82 int16_t height = SkToS16(bitmap.height());
bsalomon@google.com0797c2c2012-12-20 15:13:01 +000083
skia.committer@gmail.com2859eb72012-12-21 02:01:28 +000084 GrCacheID::Key key;
reed@google.com672588b2014-01-08 15:42:01 +000085 memcpy(key.fData8 + 0, &genID, 4);
86 memcpy(key.fData8 + 4, &origin.fX, 4);
87 memcpy(key.fData8 + 8, &origin.fY, 4);
88 memcpy(key.fData8 + 12, &width, 2);
89 memcpy(key.fData8 + 14, &height, 2);
90 static const size_t kKeyDataSize = 16;
bsalomon@google.com10a9fb82013-01-02 19:29:57 +000091 memset(key.fData8 + kKeyDataSize, 0, sizeof(key) - kKeyDataSize);
reed@google.com672588b2014-01-08 15:42:01 +000092 GR_STATIC_ASSERT(sizeof(key) >= kKeyDataSize);
bsalomon@google.com0797c2c2012-12-20 15:13:01 +000093 static const GrCacheID::Domain gBitmapTextureDomain = GrCacheID::GenerateDomain();
94 id->reset(gBitmapTextureDomain, key);
95}
96
97static void generate_bitmap_texture_desc(const SkBitmap& bitmap, GrTextureDesc* desc) {
98 desc->fFlags = kNone_GrTextureFlags;
99 desc->fWidth = bitmap.width();
100 desc->fHeight = bitmap.height();
commit-bot@chromium.org3adcc342014-04-23 19:18:09 +0000101 desc->fConfig = SkImageInfo2GrPixelConfig(bitmap.info());
bsalomon@google.com0797c2c2012-12-20 15:13:01 +0000102 desc->fSampleCnt = 0;
103}
104
commit-bot@chromium.org50a30432013-10-24 17:44:27 +0000105namespace {
106
107// When the SkPixelRef genID changes, invalidate a corresponding GrResource described by key.
108class GrResourceInvalidator : public SkPixelRef::GenIDChangeListener {
109public:
110 explicit GrResourceInvalidator(GrResourceKey key) : fKey(key) {}
111private:
112 GrResourceKey fKey;
113
114 virtual void onChange() SK_OVERRIDE {
115 const GrResourceInvalidatedMessage message = { fKey };
116 SkMessageBus<GrResourceInvalidatedMessage>::Post(message);
117 }
118};
119
120} // namespace
121
122static void add_genID_listener(GrResourceKey key, SkPixelRef* pixelRef) {
123 SkASSERT(NULL != pixelRef);
124 pixelRef->addGenIDChangeListener(SkNEW_ARGS(GrResourceInvalidator, (key)));
125}
126
robertphillips@google.com1f47f4f2012-08-16 14:49:16 +0000127static GrTexture* sk_gr_create_bitmap_texture(GrContext* ctx,
bsalomon@google.com0797c2c2012-12-20 15:13:01 +0000128 bool cache,
robertphillips@google.com1f47f4f2012-08-16 14:49:16 +0000129 const GrTextureParams* params,
130 const SkBitmap& origBitmap) {
reed@google.comac10a2d2010-12-22 21:39:39 +0000131 SkBitmap tmpBitmap;
132
133 const SkBitmap* bitmap = &origBitmap;
bsalomon@google.com5782d712011-01-21 21:03:59 +0000134
robertphillips@google.com75b3c962012-06-07 12:08:45 +0000135 GrTextureDesc desc;
bsalomon@google.com0797c2c2012-12-20 15:13:01 +0000136 generate_bitmap_texture_desc(*bitmap, &desc);
bsalomon@google.com5782d712011-01-21 21:03:59 +0000137
reed@google.comac10a2d2010-12-22 21:39:39 +0000138 if (SkBitmap::kIndex8_Config == bitmap->config()) {
139 // build_compressed_data doesn't do npot->pot expansion
140 // and paletted textures can't be sub-updated
bsalomon@google.com7f4ad5a2013-05-07 19:36:43 +0000141 if (ctx->supportsIndex8PixelConfig(params, bitmap->width(), bitmap->height())) {
142 size_t imagesize = bitmap->width() * bitmap->height() + kGrColorTableSize;
reed@google.comac10a2d2010-12-22 21:39:39 +0000143 SkAutoMalloc storage(imagesize);
bsalomon@google.com5782d712011-01-21 21:03:59 +0000144
reed@google.comac10a2d2010-12-22 21:39:39 +0000145 build_compressed_data(storage.get(), origBitmap);
146
147 // our compressed data will be trimmed, so pass width() for its
148 // "rowBytes", since they are the same now.
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000149
bsalomon@google.com0797c2c2012-12-20 15:13:01 +0000150 if (cache) {
151 GrCacheID cacheID;
152 generate_bitmap_cache_id(origBitmap, &cacheID);
commit-bot@chromium.org50a30432013-10-24 17:44:27 +0000153
154 GrResourceKey key;
155 GrTexture* result = ctx->createTexture(params, desc, cacheID,
156 storage.get(), bitmap->width(), &key);
commit-bot@chromium.org3843f3f2013-10-31 20:22:47 +0000157 if (NULL != result) {
158 add_genID_listener(key, origBitmap.pixelRef());
159 }
commit-bot@chromium.org50a30432013-10-24 17:44:27 +0000160 return result;
junov@google.com4ee7ae52011-06-30 17:30:49 +0000161 } else {
bsalomon@google.com95ed55a2013-01-24 14:46:47 +0000162 GrTexture* result = ctx->lockAndRefScratchTexture(desc,
bsalomon@google.com0797c2c2012-12-20 15:13:01 +0000163 GrContext::kExact_ScratchTexMatch);
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000164 result->writePixels(0, 0, bitmap->width(),
robertphillips@google.com1f47f4f2012-08-16 14:49:16 +0000165 bitmap->height(), desc.fConfig,
bsalomon@google.com0342a852012-08-20 19:22:38 +0000166 storage.get());
robertphillips@google.com1f47f4f2012-08-16 14:49:16 +0000167 return result;
junov@google.com4ee7ae52011-06-30 17:30:49 +0000168 }
reed@google.comac10a2d2010-12-22 21:39:39 +0000169 } else {
commit-bot@chromium.org28fcae22014-04-11 17:15:40 +0000170 origBitmap.copyTo(&tmpBitmap, kN32_SkColorType);
reed@google.comac10a2d2010-12-22 21:39:39 +0000171 // now bitmap points to our temp, which has been promoted to 32bits
172 bitmap = &tmpBitmap;
commit-bot@chromium.org3adcc342014-04-23 19:18:09 +0000173 desc.fConfig = SkImageInfo2GrPixelConfig(bitmap->info());
reed@google.comac10a2d2010-12-22 21:39:39 +0000174 }
bsalomon@google.com5782d712011-01-21 21:03:59 +0000175 }
reed@google.comac10a2d2010-12-22 21:39:39 +0000176
bsalomon@google.com7f4ad5a2013-05-07 19:36:43 +0000177 SkAutoLockPixels alp(*bitmap);
178 if (!bitmap->readyToDraw()) {
179 return NULL;
180 }
bsalomon@google.com0797c2c2012-12-20 15:13:01 +0000181 if (cache) {
robertphillips@google.com9c2ea842012-08-13 17:47:59 +0000182 // This texture is likely to be used again so leave it in the cache
bsalomon@google.com0797c2c2012-12-20 15:13:01 +0000183 GrCacheID cacheID;
184 generate_bitmap_cache_id(origBitmap, &cacheID);
commit-bot@chromium.org50a30432013-10-24 17:44:27 +0000185
186 GrResourceKey key;
187 GrTexture* result = ctx->createTexture(params, desc, cacheID,
188 bitmap->getPixels(), bitmap->rowBytes(), &key);
commit-bot@chromium.org3843f3f2013-10-31 20:22:47 +0000189 if (NULL != result) {
190 add_genID_listener(key, origBitmap.pixelRef());
191 }
commit-bot@chromium.org50a30432013-10-24 17:44:27 +0000192 return result;
193 } else {
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000194 // This texture is unlikely to be used again (in its present form) so
195 // just use a scratch texture. This will remove the texture from the
196 // cache so no one else can find it. Additionally, once unlocked, the
197 // scratch texture will go to the end of the list for purging so will
robertphillips@google.com9c2ea842012-08-13 17:47:59 +0000198 // likely be available for this volatile bitmap the next time around.
bsalomon@google.com95ed55a2013-01-24 14:46:47 +0000199 GrTexture* result = ctx->lockAndRefScratchTexture(desc, GrContext::kExact_ScratchTexMatch);
robertphillips@google.com1f47f4f2012-08-16 14:49:16 +0000200 result->writePixels(0, 0,
201 bitmap->width(), bitmap->height(),
202 desc.fConfig,
203 bitmap->getPixels(),
204 bitmap->rowBytes());
205 return result;
junov@google.com4ee7ae52011-06-30 17:30:49 +0000206 }
reed@google.comac10a2d2010-12-22 21:39:39 +0000207}
208
bsalomon@google.com0797c2c2012-12-20 15:13:01 +0000209bool GrIsBitmapInCache(const GrContext* ctx,
210 const SkBitmap& bitmap,
211 const GrTextureParams* params) {
212 GrCacheID cacheID;
213 generate_bitmap_cache_id(bitmap, &cacheID);
214
215 GrTextureDesc desc;
216 generate_bitmap_texture_desc(bitmap, &desc);
217 return ctx->isTextureInCache(desc, cacheID, params);
218}
reed@google.comac10a2d2010-12-22 21:39:39 +0000219
bsalomon@google.com95ed55a2013-01-24 14:46:47 +0000220GrTexture* GrLockAndRefCachedBitmapTexture(GrContext* ctx,
221 const SkBitmap& bitmap,
222 const GrTextureParams* params) {
robertphillips@google.com1f47f4f2012-08-16 14:49:16 +0000223 GrTexture* result = NULL;
rileya@google.com24f3ad12012-07-18 21:47:40 +0000224
bsalomon@google.com0797c2c2012-12-20 15:13:01 +0000225 bool cache = !bitmap.isVolatile();
226
227 if (cache) {
228 // If the bitmap isn't changing try to find a cached copy first.
229
230 GrCacheID cacheID;
231 generate_bitmap_cache_id(bitmap, &cacheID);
rileya@google.com24f3ad12012-07-18 21:47:40 +0000232
233 GrTextureDesc desc;
bsalomon@google.com0797c2c2012-12-20 15:13:01 +0000234 generate_bitmap_texture_desc(bitmap, &desc);
rileya@google.com24f3ad12012-07-18 21:47:40 +0000235
bsalomon@google.com95ed55a2013-01-24 14:46:47 +0000236 result = ctx->findAndRefTexture(desc, cacheID, params);
bsalomon@google.com0797c2c2012-12-20 15:13:01 +0000237 }
238 if (NULL == result) {
239 result = sk_gr_create_bitmap_texture(ctx, cache, params, bitmap);
rileya@google.com24f3ad12012-07-18 21:47:40 +0000240 }
robertphillips@google.com1f47f4f2012-08-16 14:49:16 +0000241 if (NULL == result) {
rileya@google.com24f3ad12012-07-18 21:47:40 +0000242 GrPrintf("---- failed to create texture for cache [%d %d]\n",
243 bitmap.width(), bitmap.height());
244 }
robertphillips@google.com1f47f4f2012-08-16 14:49:16 +0000245 return result;
rileya@google.com24f3ad12012-07-18 21:47:40 +0000246}
247
bsalomon@google.com95ed55a2013-01-24 14:46:47 +0000248void GrUnlockAndUnrefCachedBitmapTexture(GrTexture* texture) {
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +0000249 SkASSERT(NULL != texture->getContext());
robertphillips@google.com1f47f4f2012-08-16 14:49:16 +0000250
robertphillips@google.com9fbcad02012-09-09 14:44:15 +0000251 texture->getContext()->unlockScratchTexture(texture);
bsalomon@google.com95ed55a2013-01-24 14:46:47 +0000252 texture->unref();
rileya@google.com24f3ad12012-07-18 21:47:40 +0000253}
254
255///////////////////////////////////////////////////////////////////////////////
256
rileya@google.com24f3ad12012-07-18 21:47:40 +0000257GrPixelConfig SkBitmapConfig2GrPixelConfig(SkBitmap::Config config) {
reed@google.comac10a2d2010-12-22 21:39:39 +0000258 switch (config) {
259 case SkBitmap::kA8_Config:
bsalomon@google.com669fdc42011-04-05 17:08:27 +0000260 return kAlpha_8_GrPixelConfig;
reed@google.comac10a2d2010-12-22 21:39:39 +0000261 case SkBitmap::kIndex8_Config:
bsalomon@google.com669fdc42011-04-05 17:08:27 +0000262 return kIndex_8_GrPixelConfig;
reed@google.comac10a2d2010-12-22 21:39:39 +0000263 case SkBitmap::kRGB_565_Config:
bsalomon@google.com669fdc42011-04-05 17:08:27 +0000264 return kRGB_565_GrPixelConfig;
reed@google.comac10a2d2010-12-22 21:39:39 +0000265 case SkBitmap::kARGB_4444_Config:
bsalomon@google.com669fdc42011-04-05 17:08:27 +0000266 return kRGBA_4444_GrPixelConfig;
reed@google.comac10a2d2010-12-22 21:39:39 +0000267 case SkBitmap::kARGB_8888_Config:
bsalomon@google.comfec0bc32013-02-07 14:43:04 +0000268 return kSkia8888_GrPixelConfig;
reed@google.comac10a2d2010-12-22 21:39:39 +0000269 default:
reed@google.com2cb14802013-06-26 14:35:02 +0000270 // kNo_Config, kA1_Config missing
bsalomon@google.com669fdc42011-04-05 17:08:27 +0000271 return kUnknown_GrPixelConfig;
reed@google.comac10a2d2010-12-22 21:39:39 +0000272 }
273}
reed@google.combf790232013-12-13 19:45:58 +0000274
commit-bot@chromium.org15a14052014-02-16 00:59:25 +0000275// alphatype is ignore for now, but if GrPixelConfig is expanded to encompass
276// alpha info, that will be considered.
277GrPixelConfig SkImageInfo2GrPixelConfig(SkColorType ct, SkAlphaType) {
278 switch (ct) {
279 case kUnknown_SkColorType:
280 return kUnknown_GrPixelConfig;
281 case kAlpha_8_SkColorType:
282 return kAlpha_8_GrPixelConfig;
283 case kRGB_565_SkColorType:
284 return kRGB_565_GrPixelConfig;
285 case kARGB_4444_SkColorType:
286 return kRGBA_4444_GrPixelConfig;
287 case kRGBA_8888_SkColorType:
288 return kRGBA_8888_GrPixelConfig;
289 case kBGRA_8888_SkColorType:
290 return kBGRA_8888_GrPixelConfig;
291 case kIndex_8_SkColorType:
292 return kIndex_8_GrPixelConfig;
293 }
294 SkASSERT(0); // shouldn't get here
295 return kUnknown_GrPixelConfig;
296}
297
reed@google.combf790232013-12-13 19:45:58 +0000298bool GrPixelConfig2ColorType(GrPixelConfig config, SkColorType* ctOut) {
299 SkColorType ct;
300 switch (config) {
301 case kAlpha_8_GrPixelConfig:
302 ct = kAlpha_8_SkColorType;
303 break;
304 case kIndex_8_GrPixelConfig:
305 ct = kIndex_8_SkColorType;
306 break;
307 case kRGB_565_GrPixelConfig:
308 ct = kRGB_565_SkColorType;
309 break;
310 case kRGBA_4444_GrPixelConfig:
311 ct = kARGB_4444_SkColorType;
312 break;
313 case kRGBA_8888_GrPixelConfig:
314 ct = kRGBA_8888_SkColorType;
315 break;
316 case kBGRA_8888_GrPixelConfig:
317 ct = kBGRA_8888_SkColorType;
318 break;
319 default:
320 return false;
321 }
322 if (ctOut) {
323 *ctOut = ct;
324 }
325 return true;
326}
commit-bot@chromium.org8dcff642014-05-15 20:32:48 +0000327
328///////////////////////////////////////////////////////////////////////////////
329
commit-bot@chromium.org3595f882014-05-19 19:35:57 +0000330void SkPaint2GrPaintNoShader(GrContext* context, const SkPaint& skPaint, bool justAlpha,
commit-bot@chromium.org8dcff642014-05-15 20:32:48 +0000331 bool constantColor, GrPaint* grPaint) {
332
333 grPaint->setDither(skPaint.isDither());
334 grPaint->setAntiAlias(skPaint.isAntiAlias());
335
336 SkXfermode::Coeff sm;
337 SkXfermode::Coeff dm;
338
339 SkXfermode* mode = skPaint.getXfermode();
340 GrEffectRef* xferEffect = NULL;
341 if (SkXfermode::AsNewEffectOrCoeff(mode, &xferEffect, &sm, &dm)) {
342 if (NULL != xferEffect) {
343 grPaint->addColorEffect(xferEffect)->unref();
344 sm = SkXfermode::kOne_Coeff;
345 dm = SkXfermode::kZero_Coeff;
346 }
347 } else {
348 //SkDEBUGCODE(SkDebugf("Unsupported xfer mode.\n");)
349 // Fall back to src-over
350 sm = SkXfermode::kOne_Coeff;
351 dm = SkXfermode::kISA_Coeff;
352 }
353 grPaint->setBlendFunc(sk_blend_to_grblend(sm), sk_blend_to_grblend(dm));
354
355 if (justAlpha) {
356 uint8_t alpha = skPaint.getAlpha();
357 grPaint->setColor(GrColorPackRGBA(alpha, alpha, alpha, alpha));
358 // justAlpha is currently set to true only if there is a texture,
359 // so constantColor should not also be true.
360 SkASSERT(!constantColor);
361 } else {
362 grPaint->setColor(SkColor2GrColor(skPaint.getColor()));
363 }
364
365 SkColorFilter* colorFilter = skPaint.getColorFilter();
366 if (NULL != colorFilter) {
367 // if the source color is a constant then apply the filter here once rather than per pixel
368 // in a shader.
369 if (constantColor) {
370 SkColor filtered = colorFilter->filterColor(skPaint.getColor());
371 grPaint->setColor(SkColor2GrColor(filtered));
372 } else {
commit-bot@chromium.org3595f882014-05-19 19:35:57 +0000373 SkAutoTUnref<GrEffectRef> effect(colorFilter->asNewEffect(context));
commit-bot@chromium.org8dcff642014-05-15 20:32:48 +0000374 if (NULL != effect.get()) {
375 grPaint->addColorEffect(effect);
376 }
377 }
378 }
379}
380
commit-bot@chromium.org3595f882014-05-19 19:35:57 +0000381void SkPaint2GrPaintShader(GrContext* context, const SkPaint& skPaint,
commit-bot@chromium.org8dcff642014-05-15 20:32:48 +0000382 bool constantColor, GrPaint* grPaint) {
383 SkShader* shader = skPaint.getShader();
384 if (NULL == shader) {
commit-bot@chromium.org3595f882014-05-19 19:35:57 +0000385 SkPaint2GrPaintNoShader(context, skPaint, false, constantColor, grPaint);
commit-bot@chromium.org8dcff642014-05-15 20:32:48 +0000386 return;
387 }
388
389 // SkShader::asNewEffect() may do offscreen rendering. Setup default drawing state and require
390 // the shader to set a render target.
commit-bot@chromium.org3595f882014-05-19 19:35:57 +0000391 GrContext::AutoWideOpenIdentityDraw awo(context, NULL);
commit-bot@chromium.org8dcff642014-05-15 20:32:48 +0000392
393 // setup the shader as the first color effect on the paint
commit-bot@chromium.org3595f882014-05-19 19:35:57 +0000394 SkAutoTUnref<GrEffectRef> effect(shader->asNewEffect(context, skPaint, NULL));
commit-bot@chromium.org8dcff642014-05-15 20:32:48 +0000395 if (NULL != effect.get()) {
396 grPaint->addColorEffect(effect);
397 // Now setup the rest of the paint.
commit-bot@chromium.org3595f882014-05-19 19:35:57 +0000398 SkPaint2GrPaintNoShader(context, skPaint, true, false, grPaint);
commit-bot@chromium.org8dcff642014-05-15 20:32:48 +0000399 } else {
400 // We still don't have SkColorShader::asNewEffect() implemented.
401 SkShader::GradientInfo info;
402 SkColor color;
403
404 info.fColors = &color;
405 info.fColorOffsets = NULL;
406 info.fColorCount = 1;
407 if (SkShader::kColor_GradientType == shader->asAGradient(&info)) {
408 SkPaint copy(skPaint);
409 copy.setShader(NULL);
410 // modulate the paint alpha by the shader's solid color alpha
411 U8CPU newA = SkMulDiv255Round(SkColorGetA(color), copy.getAlpha());
412 copy.setColor(SkColorSetA(color, newA));
commit-bot@chromium.org3595f882014-05-19 19:35:57 +0000413 SkPaint2GrPaintNoShader(context, copy, false, constantColor, grPaint);
commit-bot@chromium.org8dcff642014-05-15 20:32:48 +0000414 } else {
commit-bot@chromium.org3595f882014-05-19 19:35:57 +0000415 SkPaint2GrPaintNoShader(context, skPaint, false, constantColor, grPaint);
commit-bot@chromium.org8dcff642014-05-15 20:32:48 +0000416 }
417 }
418}