| 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 579 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 590 } | 590 } |
| 591 } | 591 } |
| 592 | 592 |
| 593 /* | 593 /* |
| 594 * The gradient holds a cache for the most recent value of alpha. Successive | 594 * The gradient holds a cache for the most recent value of alpha. Successive |
| 595 * callers with the same alpha value will share the same cache. | 595 * callers with the same alpha value will share the same cache. |
| 596 */ | 596 */ |
| 597 SkGradientShaderBase::GradientShaderCache* SkGradientShaderBase::refCache(U8CPU
alpha) const { | 597 SkGradientShaderBase::GradientShaderCache* SkGradientShaderBase::refCache(U8CPU
alpha) const { |
| 598 SkAutoMutexAcquire ama(fCacheMutex); | 598 SkAutoMutexAcquire ama(fCacheMutex); |
| 599 if (!fCache || fCache->getAlpha() != alpha) { | 599 if (!fCache || fCache->getAlpha() != alpha) { |
| 600 fCache.reset(SkNEW_ARGS(GradientShaderCache, (alpha, *this))); | 600 fCache.reset(new GradientShaderCache(alpha, *this)); |
| 601 } | 601 } |
| 602 // Increment the ref counter inside the mutex to ensure the returned pointer
is still valid. | 602 // Increment the ref counter inside the mutex to ensure the returned pointer
is still valid. |
| 603 // Otherwise, the pointer may have been overwritten on a different thread be
fore the object's | 603 // Otherwise, the pointer may have been overwritten on a different thread be
fore the object's |
| 604 // ref count was incremented. | 604 // ref count was incremented. |
| 605 fCache.get()->ref(); | 605 fCache.get()->ref(); |
| 606 return fCache; | 606 return fCache; |
| 607 } | 607 } |
| 608 | 608 |
| 609 SK_DECLARE_STATIC_MUTEX(gGradientCacheMutex); | 609 SK_DECLARE_STATIC_MUTEX(gGradientCacheMutex); |
| 610 /* | 610 /* |
| (...skipping 30 matching lines...) Expand all Loading... |
| 641 SkASSERT(buffer - storage.get() == count); | 641 SkASSERT(buffer - storage.get() == count); |
| 642 | 642 |
| 643 /////////////////////////////////// | 643 /////////////////////////////////// |
| 644 | 644 |
| 645 static SkGradientBitmapCache* gCache; | 645 static SkGradientBitmapCache* gCache; |
| 646 // each cache cost 1K of RAM, since each bitmap will be 1x256 at 32bpp | 646 // each cache cost 1K of RAM, since each bitmap will be 1x256 at 32bpp |
| 647 static const int MAX_NUM_CACHED_GRADIENT_BITMAPS = 32; | 647 static const int MAX_NUM_CACHED_GRADIENT_BITMAPS = 32; |
| 648 SkAutoMutexAcquire ama(gGradientCacheMutex); | 648 SkAutoMutexAcquire ama(gGradientCacheMutex); |
| 649 | 649 |
| 650 if (NULL == gCache) { | 650 if (NULL == gCache) { |
| 651 gCache = SkNEW_ARGS(SkGradientBitmapCache, (MAX_NUM_CACHED_GRADIENT_BITM
APS)); | 651 gCache = new SkGradientBitmapCache(MAX_NUM_CACHED_GRADIENT_BITMAPS); |
| 652 } | 652 } |
| 653 size_t size = count * sizeof(int32_t); | 653 size_t size = count * sizeof(int32_t); |
| 654 | 654 |
| 655 if (!gCache->find(storage.get(), size, bitmap)) { | 655 if (!gCache->find(storage.get(), size, bitmap)) { |
| 656 // force our cahce32pixelref to be built | 656 // force our cahce32pixelref to be built |
| 657 (void)cache->getCache32(); | 657 (void)cache->getCache32(); |
| 658 bitmap->setInfo(SkImageInfo::MakeN32Premul(kCache32Count, 1)); | 658 bitmap->setInfo(SkImageInfo::MakeN32Premul(kCache32Count, 1)); |
| 659 bitmap->setPixelRef(cache->getCache32PixelRef()); | 659 bitmap->setPixelRef(cache->getCache32PixelRef()); |
| 660 | 660 |
| 661 gCache->add(storage.get(), size, *bitmap); | 661 gCache->add(storage.get(), size, *bitmap); |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 772 if (!pts) { | 772 if (!pts) { |
| 773 return NULL; | 773 return NULL; |
| 774 } | 774 } |
| 775 if (!valid_grad(colors, pos, colorCount, mode)) { | 775 if (!valid_grad(colors, pos, colorCount, mode)) { |
| 776 return NULL; | 776 return NULL; |
| 777 } | 777 } |
| 778 EXPAND_1_COLOR(colorCount); | 778 EXPAND_1_COLOR(colorCount); |
| 779 | 779 |
| 780 SkGradientShaderBase::Descriptor desc; | 780 SkGradientShaderBase::Descriptor desc; |
| 781 desc_init(&desc, colors, pos, colorCount, mode, flags, localMatrix); | 781 desc_init(&desc, colors, pos, colorCount, mode, flags, localMatrix); |
| 782 return SkNEW_ARGS(SkLinearGradient, (pts, desc)); | 782 return new SkLinearGradient(pts, desc); |
| 783 } | 783 } |
| 784 | 784 |
| 785 SkShader* SkGradientShader::CreateRadial(const SkPoint& center, SkScalar radius, | 785 SkShader* SkGradientShader::CreateRadial(const SkPoint& center, SkScalar radius, |
| 786 const SkColor colors[], | 786 const SkColor colors[], |
| 787 const SkScalar pos[], int colorCount, | 787 const SkScalar pos[], int colorCount, |
| 788 SkShader::TileMode mode, | 788 SkShader::TileMode mode, |
| 789 uint32_t flags, | 789 uint32_t flags, |
| 790 const SkMatrix* localMatrix) { | 790 const SkMatrix* localMatrix) { |
| 791 if (radius <= 0) { | 791 if (radius <= 0) { |
| 792 return NULL; | 792 return NULL; |
| 793 } | 793 } |
| 794 if (!valid_grad(colors, pos, colorCount, mode)) { | 794 if (!valid_grad(colors, pos, colorCount, mode)) { |
| 795 return NULL; | 795 return NULL; |
| 796 } | 796 } |
| 797 EXPAND_1_COLOR(colorCount); | 797 EXPAND_1_COLOR(colorCount); |
| 798 | 798 |
| 799 SkGradientShaderBase::Descriptor desc; | 799 SkGradientShaderBase::Descriptor desc; |
| 800 desc_init(&desc, colors, pos, colorCount, mode, flags, localMatrix); | 800 desc_init(&desc, colors, pos, colorCount, mode, flags, localMatrix); |
| 801 return SkNEW_ARGS(SkRadialGradient, (center, radius, desc)); | 801 return new SkRadialGradient(center, radius, desc); |
| 802 } | 802 } |
| 803 | 803 |
| 804 SkShader* SkGradientShader::CreateTwoPointConical(const SkPoint& start, | 804 SkShader* SkGradientShader::CreateTwoPointConical(const SkPoint& start, |
| 805 SkScalar startRadius, | 805 SkScalar startRadius, |
| 806 const SkPoint& end, | 806 const SkPoint& end, |
| 807 SkScalar endRadius, | 807 SkScalar endRadius, |
| 808 const SkColor colors[], | 808 const SkColor colors[], |
| 809 const SkScalar pos[], | 809 const SkScalar pos[], |
| 810 int colorCount, | 810 int colorCount, |
| 811 SkShader::TileMode mode, | 811 SkShader::TileMode mode, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 822 } | 822 } |
| 823 | 823 |
| 824 EXPAND_1_COLOR(colorCount); | 824 EXPAND_1_COLOR(colorCount); |
| 825 | 825 |
| 826 bool flipGradient = startRadius > endRadius; | 826 bool flipGradient = startRadius > endRadius; |
| 827 | 827 |
| 828 SkGradientShaderBase::Descriptor desc; | 828 SkGradientShaderBase::Descriptor desc; |
| 829 | 829 |
| 830 if (!flipGradient) { | 830 if (!flipGradient) { |
| 831 desc_init(&desc, colors, pos, colorCount, mode, flags, localMatrix); | 831 desc_init(&desc, colors, pos, colorCount, mode, flags, localMatrix); |
| 832 return SkNEW_ARGS(SkTwoPointConicalGradient, | 832 return new SkTwoPointConicalGradient(start, startRadius, end, endRadius,
flipGradient, |
| 833 (start, startRadius, end, endRadius, flipGradient, des
c)); | 833 desc); |
| 834 } else { | 834 } else { |
| 835 SkAutoSTArray<8, SkColor> colorsNew(colorCount); | 835 SkAutoSTArray<8, SkColor> colorsNew(colorCount); |
| 836 SkAutoSTArray<8, SkScalar> posNew(colorCount); | 836 SkAutoSTArray<8, SkScalar> posNew(colorCount); |
| 837 for (int i = 0; i < colorCount; ++i) { | 837 for (int i = 0; i < colorCount; ++i) { |
| 838 colorsNew[i] = colors[colorCount - i - 1]; | 838 colorsNew[i] = colors[colorCount - i - 1]; |
| 839 } | 839 } |
| 840 | 840 |
| 841 if (pos) { | 841 if (pos) { |
| 842 for (int i = 0; i < colorCount; ++i) { | 842 for (int i = 0; i < colorCount; ++i) { |
| 843 posNew[i] = 1 - pos[colorCount - i - 1]; | 843 posNew[i] = 1 - pos[colorCount - i - 1]; |
| 844 } | 844 } |
| 845 desc_init(&desc, colorsNew.get(), posNew.get(), colorCount, mode, fl
ags, localMatrix); | 845 desc_init(&desc, colorsNew.get(), posNew.get(), colorCount, mode, fl
ags, localMatrix); |
| 846 } else { | 846 } else { |
| 847 desc_init(&desc, colorsNew.get(), NULL, colorCount, mode, flags, loc
alMatrix); | 847 desc_init(&desc, colorsNew.get(), NULL, colorCount, mode, flags, loc
alMatrix); |
| 848 } | 848 } |
| 849 | 849 |
| 850 return SkNEW_ARGS(SkTwoPointConicalGradient, | 850 return new SkTwoPointConicalGradient(end, endRadius, start, startRadius,
flipGradient, |
| 851 (end, endRadius, start, startRadius, flipGradient, des
c)); | 851 desc); |
| 852 } | 852 } |
| 853 } | 853 } |
| 854 | 854 |
| 855 SkShader* SkGradientShader::CreateSweep(SkScalar cx, SkScalar cy, | 855 SkShader* SkGradientShader::CreateSweep(SkScalar cx, SkScalar cy, |
| 856 const SkColor colors[], | 856 const SkColor colors[], |
| 857 const SkScalar pos[], | 857 const SkScalar pos[], |
| 858 int colorCount, | 858 int colorCount, |
| 859 uint32_t flags, | 859 uint32_t flags, |
| 860 const SkMatrix* localMatrix) { | 860 const SkMatrix* localMatrix) { |
| 861 if (!valid_grad(colors, pos, colorCount, SkShader::kClamp_TileMode)) { | 861 if (!valid_grad(colors, pos, colorCount, SkShader::kClamp_TileMode)) { |
| 862 return NULL; | 862 return NULL; |
| 863 } | 863 } |
| 864 EXPAND_1_COLOR(colorCount); | 864 EXPAND_1_COLOR(colorCount); |
| 865 | 865 |
| 866 SkGradientShaderBase::Descriptor desc; | 866 SkGradientShaderBase::Descriptor desc; |
| 867 desc_init(&desc, colors, pos, colorCount, SkShader::kClamp_TileMode, flags,
localMatrix); | 867 desc_init(&desc, colors, pos, colorCount, SkShader::kClamp_TileMode, flags,
localMatrix); |
| 868 return SkNEW_ARGS(SkSweepGradient, (cx, cy, desc)); | 868 return new SkSweepGradient(cx, cy, desc); |
| 869 } | 869 } |
| 870 | 870 |
| 871 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkGradientShader) | 871 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkGradientShader) |
| 872 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLinearGradient) | 872 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLinearGradient) |
| 873 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkRadialGradient) | 873 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkRadialGradient) |
| 874 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSweepGradient) | 874 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSweepGradient) |
| 875 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkTwoPointConicalGradient) | 875 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkTwoPointConicalGradient) |
| 876 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 876 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| 877 | 877 |
| 878 /////////////////////////////////////////////////////////////////////////////// | 878 /////////////////////////////////////////////////////////////////////////////// |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1178 (*stops)[i] = stop; | 1178 (*stops)[i] = stop; |
| 1179 stop = i < outColors - 1 ? stop + random->nextUScalar1() * (1.f - st
op) : 1.f; | 1179 stop = i < outColors - 1 ? stop + random->nextUScalar1() * (1.f - st
op) : 1.f; |
| 1180 } | 1180 } |
| 1181 } | 1181 } |
| 1182 *tm = static_cast<SkShader::TileMode>(random->nextULessThan(SkShader::kTileM
odeCount)); | 1182 *tm = static_cast<SkShader::TileMode>(random->nextULessThan(SkShader::kTileM
odeCount)); |
| 1183 | 1183 |
| 1184 return outColors; | 1184 return outColors; |
| 1185 } | 1185 } |
| 1186 | 1186 |
| 1187 #endif | 1187 #endif |
| OLD | NEW |