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 |