OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 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 #include "SkGradientShaderPriv.h" | 8 #include "SkGradientShaderPriv.h" |
9 #include "SkLinearGradient.h" | 9 #include "SkLinearGradient.h" |
10 #include "SkRadialGradient.h" | 10 #include "SkRadialGradient.h" |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 } | 204 } |
205 | 205 |
206 bool SkGradientShaderBase::isOpaque() const { | 206 bool SkGradientShaderBase::isOpaque() const { |
207 return fColorsAreOpaque; | 207 return fColorsAreOpaque; |
208 } | 208 } |
209 | 209 |
210 SkGradientShaderBase::GradientShaderBaseContext::GradientShaderBaseContext( | 210 SkGradientShaderBase::GradientShaderBaseContext::GradientShaderBaseContext( |
211 const SkGradientShaderBase& shader, const SkBitmap& device, | 211 const SkGradientShaderBase& shader, const SkBitmap& device, |
212 const SkPaint& paint, const SkMatrix& matrix) | 212 const SkPaint& paint, const SkMatrix& matrix) |
213 : INHERITED(shader, device, paint, matrix) | 213 : INHERITED(shader, device, paint, matrix) |
214 , fCache(shader.getCache(getPaintAlpha())) | 214 , fCache(shader.refCache(getPaintAlpha())) |
215 { | 215 { |
216 const SkMatrix& inverse = this->getTotalInverse(); | 216 const SkMatrix& inverse = this->getTotalInverse(); |
217 | 217 |
218 fDstToIndex.setConcat(shader.fPtsToUnit, inverse); | 218 fDstToIndex.setConcat(shader.fPtsToUnit, inverse); |
219 | 219 |
220 fDstToIndexProc = fDstToIndex.getMapXYProc(); | 220 fDstToIndexProc = fDstToIndex.getMapXYProc(); |
221 fDstToIndexClass = (uint8_t)SkShader::Context::ComputeMatrixClass(fDstToInde
x); | 221 fDstToIndexClass = (uint8_t)SkShader::Context::ComputeMatrixClass(fDstToInde
x); |
222 | 222 |
223 // now convert our colors in to PMColors | 223 // now convert our colors in to PMColors |
224 unsigned paintAlpha = this->getPaintAlpha(); | 224 unsigned paintAlpha = this->getPaintAlpha(); |
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
551 cache->fCache32PixelRef->unref(); | 551 cache->fCache32PixelRef->unref(); |
552 cache->fCache32PixelRef = newPR; | 552 cache->fCache32PixelRef = newPR; |
553 cache->fCache32 = (SkPMColor*)newPR->getAddr(); | 553 cache->fCache32 = (SkPMColor*)newPR->getAddr(); |
554 } | 554 } |
555 } | 555 } |
556 | 556 |
557 /* | 557 /* |
558 * The gradient holds a cache for the most recent value of alpha. Successive | 558 * The gradient holds a cache for the most recent value of alpha. Successive |
559 * callers with the same alpha value will share the same cache. | 559 * callers with the same alpha value will share the same cache. |
560 */ | 560 */ |
561 SkGradientShaderBase::GradientShaderCache* SkGradientShaderBase::getCache(U8CPU
alpha) const { | 561 SkGradientShaderBase::GradientShaderCache* SkGradientShaderBase::refCache(U8CPU
alpha) const { |
562 SkAutoMutexAcquire ama(fCacheMutex); | 562 SkAutoMutexAcquire ama(fCacheMutex); |
563 if (!fCache || fCache->getAlpha() != alpha) { | 563 if (!fCache || fCache->getAlpha() != alpha) { |
564 fCache.reset(SkNEW_ARGS(GradientShaderCache, (alpha, *this))); | 564 fCache.reset(SkNEW_ARGS(GradientShaderCache, (alpha, *this))); |
565 } | 565 } |
566 // Increment the ref counter inside the mutex to ensure the returned pointer
is still valid. | 566 // Increment the ref counter inside the mutex to ensure the returned pointer
is still valid. |
567 // Otherwise, the pointer may have been overwritten on a different thread be
fore the object's | 567 // Otherwise, the pointer may have been overwritten on a different thread be
fore the object's |
568 // ref count was incremented. | 568 // ref count was incremented. |
569 fCache.get()->ref(); | 569 fCache.get()->ref(); |
570 return fCache; | 570 return fCache; |
571 } | 571 } |
572 | 572 |
573 /* | 573 /* |
574 * Because our caller might rebuild the same (logically the same) gradient | 574 * Because our caller might rebuild the same (logically the same) gradient |
575 * over and over, we'd like to return exactly the same "bitmap" if possible, | 575 * over and over, we'd like to return exactly the same "bitmap" if possible, |
576 * allowing the client to utilize a cache of our bitmap (e.g. with a GPU). | 576 * allowing the client to utilize a cache of our bitmap (e.g. with a GPU). |
577 * To do that, we maintain a private cache of built-bitmaps, based on our | 577 * To do that, we maintain a private cache of built-bitmaps, based on our |
578 * colors and positions. Note: we don't try to flatten the fMapper, so if one | 578 * colors and positions. Note: we don't try to flatten the fMapper, so if one |
579 * is present, we skip the cache for now. | 579 * is present, we skip the cache for now. |
580 */ | 580 */ |
581 void SkGradientShaderBase::getGradientTableBitmap(SkBitmap* bitmap) const { | 581 void SkGradientShaderBase::getGradientTableBitmap(SkBitmap* bitmap) const { |
582 // our caller assumes no external alpha, so we ensure that our cache is | 582 // our caller assumes no external alpha, so we ensure that our cache is |
583 // built with 0xFF | 583 // built with 0xFF |
584 GradientShaderCache* cache = this->getCache(0xFF); | 584 SkAutoTUnref<GradientShaderCache> cache(this->refCache(0xFF)); |
585 | 585 |
586 // don't have a way to put the mapper into our cache-key yet | 586 // don't have a way to put the mapper into our cache-key yet |
587 if (fMapper) { | 587 if (fMapper) { |
588 // force our cache32pixelref to be built | 588 // force our cache32pixelref to be built |
589 (void)cache->getCache32(); | 589 (void)cache->getCache32(); |
590 bitmap->setConfig(SkImageInfo::MakeN32Premul(kCache32Count, 1)); | 590 bitmap->setConfig(SkImageInfo::MakeN32Premul(kCache32Count, 1)); |
591 bitmap->setPixelRef(cache->getCache32PixelRef()); | 591 bitmap->setPixelRef(cache->getCache32PixelRef()); |
592 return; | 592 return; |
593 } | 593 } |
594 | 594 |
(...skipping 547 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1142 (*stops)[i] = stop; | 1142 (*stops)[i] = stop; |
1143 stop = i < outColors - 1 ? stop + random->nextUScalar1() * (1.f - st
op) : 1.f; | 1143 stop = i < outColors - 1 ? stop + random->nextUScalar1() * (1.f - st
op) : 1.f; |
1144 } | 1144 } |
1145 } | 1145 } |
1146 *tm = static_cast<SkShader::TileMode>(random->nextULessThan(SkShader::kTileM
odeCount)); | 1146 *tm = static_cast<SkShader::TileMode>(random->nextULessThan(SkShader::kTileM
odeCount)); |
1147 | 1147 |
1148 return outColors; | 1148 return outColors; |
1149 } | 1149 } |
1150 | 1150 |
1151 #endif | 1151 #endif |
OLD | NEW |