Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: src/effects/gradients/SkGradientShader.cpp

Issue 283273002: remove unused (by clients) SkUnitMapper (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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"
11 #include "SkTwoPointRadialGradient.h" 11 #include "SkTwoPointRadialGradient.h"
12 #include "SkTwoPointConicalGradient.h" 12 #include "SkTwoPointConicalGradient.h"
13 #include "SkSweepGradient.h" 13 #include "SkSweepGradient.h"
14 14
15 SkGradientShaderBase::SkGradientShaderBase(const Descriptor& desc, const SkMatri x* localMatrix) 15 SkGradientShaderBase::SkGradientShaderBase(const Descriptor& desc, const SkMatri x* localMatrix)
16 : INHERITED(localMatrix) 16 : INHERITED(localMatrix)
17 { 17 {
18 SkASSERT(desc.fCount > 1); 18 SkASSERT(desc.fCount > 1);
19 19
20 fMapper = desc.fMapper;
21 SkSafeRef(fMapper);
22 fGradFlags = SkToU8(desc.fGradFlags); 20 fGradFlags = SkToU8(desc.fGradFlags);
23 21
24 SkASSERT((unsigned)desc.fTileMode < SkShader::kTileModeCount); 22 SkASSERT((unsigned)desc.fTileMode < SkShader::kTileModeCount);
25 SkASSERT(SkShader::kTileModeCount == SK_ARRAY_COUNT(gTileProcs)); 23 SkASSERT(SkShader::kTileModeCount == SK_ARRAY_COUNT(gTileProcs));
26 fTileMode = desc.fTileMode; 24 fTileMode = desc.fTileMode;
27 fTileProc = gTileProcs[desc.fTileMode]; 25 fTileProc = gTileProcs[desc.fTileMode];
28 26
29 /* Note: we let the caller skip the first and/or last position. 27 /* Note: we let the caller skip the first and/or last position.
30 i.e. pos[0] = 0.3, pos[1] = 0.7 28 i.e. pos[0] = 0.3, pos[1] = 0.7
31 In these cases, we insert dummy entries to ensure that the final data 29 In these cases, we insert dummy entries to ensure that the final data
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 133
136 static SkShader::TileMode unpack_mode(uint32_t packed) { 134 static SkShader::TileMode unpack_mode(uint32_t packed) {
137 return (SkShader::TileMode)(packed & 0xF); 135 return (SkShader::TileMode)(packed & 0xF);
138 } 136 }
139 137
140 static uint32_t unpack_flags(uint32_t packed) { 138 static uint32_t unpack_flags(uint32_t packed) {
141 return packed >> 4; 139 return packed >> 4;
142 } 140 }
143 141
144 SkGradientShaderBase::SkGradientShaderBase(SkReadBuffer& buffer) : INHERITED(buf fer) { 142 SkGradientShaderBase::SkGradientShaderBase(SkReadBuffer& buffer) : INHERITED(buf fer) {
145 fMapper = buffer.readUnitMapper(); 143 #if 0
scroggo 2014/05/15 14:33:38 Can this code be removed entirely?
reed1 2014/05/15 15:37:21 Replaced with code to skip the unitmapper
144 if (buffer.pictureVersion() > KILL_UNITMAPPER_VERSION) {
145 void* obj = buffer.readFlattenable<kSkDeadUnitMapper_Type>();
146 SkASSERT(NULL == obj);
147 }
148 #endif
146 149
147 int colorCount = fColorCount = buffer.getArrayCount(); 150 int colorCount = fColorCount = buffer.getArrayCount();
148 if (colorCount > kColorStorageCount) { 151 if (colorCount > kColorStorageCount) {
149 size_t allocSize = (sizeof(SkColor) + sizeof(SkPMColor) + sizeof(Rec)) * colorCount; 152 size_t allocSize = (sizeof(SkColor) + sizeof(SkPMColor) + sizeof(Rec)) * colorCount;
150 if (buffer.validateAvailable(allocSize)) { 153 if (buffer.validateAvailable(allocSize)) {
151 fOrigColors = reinterpret_cast<SkColor*>(sk_malloc_throw(allocSize)) ; 154 fOrigColors = reinterpret_cast<SkColor*>(sk_malloc_throw(allocSize)) ;
152 } else { 155 } else {
153 fOrigColors = NULL; 156 fOrigColors = NULL;
154 colorCount = fColorCount = 0; 157 colorCount = fColorCount = 0;
155 } 158 }
(...skipping 18 matching lines...) Expand all
174 } 177 }
175 } 178 }
176 buffer.readMatrix(&fPtsToUnit); 179 buffer.readMatrix(&fPtsToUnit);
177 this->initCommon(); 180 this->initCommon();
178 } 181 }
179 182
180 SkGradientShaderBase::~SkGradientShaderBase() { 183 SkGradientShaderBase::~SkGradientShaderBase() {
181 if (fOrigColors != fStorage) { 184 if (fOrigColors != fStorage) {
182 sk_free(fOrigColors); 185 sk_free(fOrigColors);
183 } 186 }
184 SkSafeUnref(fMapper);
185 } 187 }
186 188
187 void SkGradientShaderBase::initCommon() { 189 void SkGradientShaderBase::initCommon() {
188 unsigned colorAlpha = 0xFF; 190 unsigned colorAlpha = 0xFF;
189 for (int i = 0; i < fColorCount; i++) { 191 for (int i = 0; i < fColorCount; i++) {
190 colorAlpha &= SkColorGetA(fOrigColors[i]); 192 colorAlpha &= SkColorGetA(fOrigColors[i]);
191 } 193 }
192 fColorsAreOpaque = colorAlpha == 0xFF; 194 fColorsAreOpaque = colorAlpha == 0xFF;
193 } 195 }
194 196
195 void SkGradientShaderBase::flatten(SkWriteBuffer& buffer) const { 197 void SkGradientShaderBase::flatten(SkWriteBuffer& buffer) const {
196 this->INHERITED::flatten(buffer); 198 this->INHERITED::flatten(buffer);
197 buffer.writeFlattenable(fMapper);
198 buffer.writeColorArray(fOrigColors, fColorCount); 199 buffer.writeColorArray(fOrigColors, fColorCount);
199 buffer.writeUInt(pack_mode_flags(fTileMode, fGradFlags)); 200 buffer.writeUInt(pack_mode_flags(fTileMode, fGradFlags));
200 if (fColorCount > 2) { 201 if (fColorCount > 2) {
201 Rec* recs = fRecs; 202 Rec* recs = fRecs;
202 for (int i = 1; i < fColorCount; i++) { 203 for (int i = 1; i < fColorCount; i++) {
203 buffer.writeInt(recs[i].fPos); 204 buffer.writeInt(recs[i].fPos);
204 buffer.writeUInt(recs[i].fScale); 205 buffer.writeUInt(recs[i].fScale);
205 } 206 }
206 } 207 }
207 buffer.writeMatrix(fPtsToUnit); 208 buffer.writeMatrix(fPtsToUnit);
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after
521 for (int i = 1; i < cache->fShader.fColorCount; i++) { 522 for (int i = 1; i < cache->fShader.fColorCount; i++) {
522 int nextIndex = SkFixedToFFFF(rec[i].fPos) >> kCache16Shift; 523 int nextIndex = SkFixedToFFFF(rec[i].fPos) >> kCache16Shift;
523 SkASSERT(nextIndex < kCache16Count); 524 SkASSERT(nextIndex < kCache16Count);
524 525
525 if (nextIndex > prevIndex) 526 if (nextIndex > prevIndex)
526 Build16bitCache(cache->fCache16 + prevIndex, cache->fShader.fOri gColors[i-1], 527 Build16bitCache(cache->fCache16 + prevIndex, cache->fShader.fOri gColors[i-1],
527 cache->fShader.fOrigColors[i], nextIndex - prevI ndex + 1); 528 cache->fShader.fOrigColors[i], nextIndex - prevI ndex + 1);
528 prevIndex = nextIndex; 529 prevIndex = nextIndex;
529 } 530 }
530 } 531 }
531
532 if (cache->fShader.fMapper) {
533 cache->fCache16Storage = (uint16_t*)sk_malloc_throw(allocSize);
534 uint16_t* linear = cache->fCache16; // just computed linear data
535 uint16_t* mapped = cache->fCache16Storage; // storage for mapped data
536 SkUnitMapper* map = cache->fShader.fMapper;
537 for (int i = 0; i < kCache16Count; i++) {
538 int index = map->mapUnit16(bitsTo16(i, kCache16Bits)) >> kCache16Shi ft;
539 mapped[i] = linear[index];
540 mapped[i + kCache16Count] = linear[index + kCache16Count];
541 }
542 sk_free(cache->fCache16);
543 cache->fCache16 = cache->fCache16Storage;
544 }
545 } 532 }
546 533
547 const SkPMColor* SkGradientShaderBase::GradientShaderCache::getCache32() { 534 const SkPMColor* SkGradientShaderBase::GradientShaderCache::getCache32() {
548 SkOnce(&fCache32Inited, &fCache32Mutex, SkGradientShaderBase::GradientShader Cache::initCache32, 535 SkOnce(&fCache32Inited, &fCache32Mutex, SkGradientShaderBase::GradientShader Cache::initCache32,
549 this); 536 this);
550 SkASSERT(fCache32); 537 SkASSERT(fCache32);
551 return fCache32; 538 return fCache32;
552 } 539 }
553 540
554 void SkGradientShaderBase::GradientShaderCache::initCache32(GradientShaderCache* cache) { 541 void SkGradientShaderBase::GradientShaderCache::initCache32(GradientShaderCache* cache) {
(...skipping 17 matching lines...) Expand all
572 int nextIndex = SkFixedToFFFF(rec[i].fPos) >> kCache32Shift; 559 int nextIndex = SkFixedToFFFF(rec[i].fPos) >> kCache32Shift;
573 SkASSERT(nextIndex < kCache32Count); 560 SkASSERT(nextIndex < kCache32Count);
574 561
575 if (nextIndex > prevIndex) 562 if (nextIndex > prevIndex)
576 Build32bitCache(cache->fCache32 + prevIndex, cache->fShader.fOri gColors[i-1], 563 Build32bitCache(cache->fCache32 + prevIndex, cache->fShader.fOri gColors[i-1],
577 cache->fShader.fOrigColors[i], nextIndex - prevI ndex + 1, 564 cache->fShader.fOrigColors[i], nextIndex - prevI ndex + 1,
578 cache->fCacheAlpha, cache->fShader.fGradFlags); 565 cache->fCacheAlpha, cache->fShader.fGradFlags);
579 prevIndex = nextIndex; 566 prevIndex = nextIndex;
580 } 567 }
581 } 568 }
582
583 if (cache->fShader.fMapper) {
584 SkMallocPixelRef* newPR = SkMallocPixelRef::NewAllocate(info, 0, NULL);
585 SkPMColor* linear = cache->fCache32; // just computed linear d ata
586 SkPMColor* mapped = (SkPMColor*)newPR->getAddr(); // storage for mapp ed data
587 SkUnitMapper* map = cache->fShader.fMapper;
588 for (int i = 0; i < kCache32Count; i++) {
589 int index = map->mapUnit16((i << 8) | i) >> 8;
590 mapped[i + kCache32Count*0] = linear[index + kCache32Count*0];
591 mapped[i + kCache32Count*1] = linear[index + kCache32Count*1];
592 mapped[i + kCache32Count*2] = linear[index + kCache32Count*2];
593 mapped[i + kCache32Count*3] = linear[index + kCache32Count*3];
594 }
595 cache->fCache32PixelRef->unref();
596 cache->fCache32PixelRef = newPR;
597 cache->fCache32 = (SkPMColor*)newPR->getAddr();
598 }
599 } 569 }
600 570
601 /* 571 /*
602 * The gradient holds a cache for the most recent value of alpha. Successive 572 * The gradient holds a cache for the most recent value of alpha. Successive
603 * callers with the same alpha value will share the same cache. 573 * callers with the same alpha value will share the same cache.
604 */ 574 */
605 SkGradientShaderBase::GradientShaderCache* SkGradientShaderBase::refCache(U8CPU alpha) const { 575 SkGradientShaderBase::GradientShaderCache* SkGradientShaderBase::refCache(U8CPU alpha) const {
606 SkAutoMutexAcquire ama(fCacheMutex); 576 SkAutoMutexAcquire ama(fCacheMutex);
607 if (!fCache || fCache->getAlpha() != alpha) { 577 if (!fCache || fCache->getAlpha() != alpha) {
608 fCache.reset(SkNEW_ARGS(GradientShaderCache, (alpha, *this))); 578 fCache.reset(SkNEW_ARGS(GradientShaderCache, (alpha, *this)));
(...skipping 11 matching lines...) Expand all
620 * allowing the client to utilize a cache of our bitmap (e.g. with a GPU). 590 * allowing the client to utilize a cache of our bitmap (e.g. with a GPU).
621 * To do that, we maintain a private cache of built-bitmaps, based on our 591 * To do that, we maintain a private cache of built-bitmaps, based on our
622 * colors and positions. Note: we don't try to flatten the fMapper, so if one 592 * colors and positions. Note: we don't try to flatten the fMapper, so if one
623 * is present, we skip the cache for now. 593 * is present, we skip the cache for now.
624 */ 594 */
625 void SkGradientShaderBase::getGradientTableBitmap(SkBitmap* bitmap) const { 595 void SkGradientShaderBase::getGradientTableBitmap(SkBitmap* bitmap) const {
626 // our caller assumes no external alpha, so we ensure that our cache is 596 // our caller assumes no external alpha, so we ensure that our cache is
627 // built with 0xFF 597 // built with 0xFF
628 SkAutoTUnref<GradientShaderCache> cache(this->refCache(0xFF)); 598 SkAutoTUnref<GradientShaderCache> cache(this->refCache(0xFF));
629 599
630 // don't have a way to put the mapper into our cache-key yet
631 if (fMapper) {
632 // force our cache32pixelref to be built
633 (void)cache->getCache32();
634 bitmap->setConfig(SkImageInfo::MakeN32Premul(kCache32Count, 1));
635 bitmap->setPixelRef(cache->getCache32PixelRef());
636 return;
637 }
638
639 // build our key: [numColors + colors[] + {positions[]} + flags ] 600 // build our key: [numColors + colors[] + {positions[]} + flags ]
640 int count = 1 + fColorCount + 1; 601 int count = 1 + fColorCount + 1;
641 if (fColorCount > 2) { 602 if (fColorCount > 2) {
642 count += fColorCount - 1; // fRecs[].fPos 603 count += fColorCount - 1; // fRecs[].fPos
643 } 604 }
644 605
645 SkAutoSTMalloc<16, int32_t> storage(count); 606 SkAutoSTMalloc<16, int32_t> storage(count);
646 int32_t* buffer = storage.get(); 607 int32_t* buffer = storage.get();
647 608
648 *buffer++ = fColorCount; 609 *buffer++ = fColorCount;
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
737 str->append(")"); 698 str->append(")");
738 } 699 }
739 700
740 static const char* gTileModeName[SkShader::kTileModeCount] = { 701 static const char* gTileModeName[SkShader::kTileModeCount] = {
741 "clamp", "repeat", "mirror" 702 "clamp", "repeat", "mirror"
742 }; 703 };
743 704
744 str->append(" "); 705 str->append(" ");
745 str->append(gTileModeName[fTileMode]); 706 str->append(gTileModeName[fTileMode]);
746 707
747 // TODO: add "fMapper->toString(str);" when SkUnitMapper::toString is added
748
749 this->INHERITED::toString(str); 708 this->INHERITED::toString(str);
750 } 709 }
751 #endif 710 #endif
752 711
753 /////////////////////////////////////////////////////////////////////////////// 712 ///////////////////////////////////////////////////////////////////////////////
754 /////////////////////////////////////////////////////////////////////////////// 713 ///////////////////////////////////////////////////////////////////////////////
755 714
756 #include "SkEmptyShader.h" 715 #include "SkEmptyShader.h"
757 716
758 // assumes colors is SkColor* and pos is SkScalar* 717 // assumes colors is SkColor* and pos is SkScalar*
759 #define EXPAND_1_COLOR(count) \ 718 #define EXPAND_1_COLOR(count) \
760 SkColor tmp[2]; \ 719 SkColor tmp[2]; \
761 do { \ 720 do { \
762 if (1 == count) { \ 721 if (1 == count) { \
763 tmp[0] = tmp[1] = colors[0]; \ 722 tmp[0] = tmp[1] = colors[0]; \
764 colors = tmp; \ 723 colors = tmp; \
765 pos = NULL; \ 724 pos = NULL; \
766 count = 2; \ 725 count = 2; \
767 } \ 726 } \
768 } while (0) 727 } while (0)
769 728
770 static void desc_init(SkGradientShaderBase::Descriptor* desc, 729 static void desc_init(SkGradientShaderBase::Descriptor* desc,
771 const SkColor colors[], 730 const SkColor colors[],
772 const SkScalar pos[], int colorCount, 731 const SkScalar pos[], int colorCount,
773 SkShader::TileMode mode, 732 SkShader::TileMode mode, uint32_t flags) {
774 SkUnitMapper* mapper, uint32_t flags) {
775 desc->fColors = colors; 733 desc->fColors = colors;
776 desc->fPos = pos; 734 desc->fPos = pos;
777 desc->fCount = colorCount; 735 desc->fCount = colorCount;
778 desc->fTileMode = mode; 736 desc->fTileMode = mode;
779 desc->fMapper = mapper;
780 desc->fGradFlags = flags; 737 desc->fGradFlags = flags;
781 } 738 }
782 739
783 SkShader* SkGradientShader::CreateLinear(const SkPoint pts[2], 740 SkShader* SkGradientShader::CreateLinear(const SkPoint pts[2],
784 const SkColor colors[], 741 const SkColor colors[],
785 const SkScalar pos[], int colorCount, 742 const SkScalar pos[], int colorCount,
786 SkShader::TileMode mode, 743 SkShader::TileMode mode,
787 SkUnitMapper* mapper,
788 uint32_t flags, 744 uint32_t flags,
789 const SkMatrix* localMatrix) { 745 const SkMatrix* localMatrix) {
790 if (NULL == pts || NULL == colors || colorCount < 1) { 746 if (NULL == pts || NULL == colors || colorCount < 1) {
791 return NULL; 747 return NULL;
792 } 748 }
793 EXPAND_1_COLOR(colorCount); 749 EXPAND_1_COLOR(colorCount);
794 750
795 SkGradientShaderBase::Descriptor desc; 751 SkGradientShaderBase::Descriptor desc;
796 desc_init(&desc, colors, pos, colorCount, mode, mapper, flags); 752 desc_init(&desc, colors, pos, colorCount, mode, flags);
797 return SkNEW_ARGS(SkLinearGradient, (pts, desc, localMatrix)); 753 return SkNEW_ARGS(SkLinearGradient, (pts, desc, localMatrix));
798 } 754 }
799 755
800 SkShader* SkGradientShader::CreateRadial(const SkPoint& center, SkScalar radius, 756 SkShader* SkGradientShader::CreateRadial(const SkPoint& center, SkScalar radius,
801 const SkColor colors[], 757 const SkColor colors[],
802 const SkScalar pos[], int colorCount, 758 const SkScalar pos[], int colorCount,
803 SkShader::TileMode mode, 759 SkShader::TileMode mode,
804 SkUnitMapper* mapper,
805 uint32_t flags, 760 uint32_t flags,
806 const SkMatrix* localMatrix) { 761 const SkMatrix* localMatrix) {
807 if (radius <= 0 || NULL == colors || colorCount < 1) { 762 if (radius <= 0 || NULL == colors || colorCount < 1) {
808 return NULL; 763 return NULL;
809 } 764 }
810 EXPAND_1_COLOR(colorCount); 765 EXPAND_1_COLOR(colorCount);
811 766
812 SkGradientShaderBase::Descriptor desc; 767 SkGradientShaderBase::Descriptor desc;
813 desc_init(&desc, colors, pos, colorCount, mode, mapper, flags); 768 desc_init(&desc, colors, pos, colorCount, mode, flags);
814 return SkNEW_ARGS(SkRadialGradient, (center, radius, desc, localMatrix)); 769 return SkNEW_ARGS(SkRadialGradient, (center, radius, desc, localMatrix));
815 } 770 }
816 771
817 SkShader* SkGradientShader::CreateTwoPointRadial(const SkPoint& start, 772 SkShader* SkGradientShader::CreateTwoPointRadial(const SkPoint& start,
818 SkScalar startRadius, 773 SkScalar startRadius,
819 const SkPoint& end, 774 const SkPoint& end,
820 SkScalar endRadius, 775 SkScalar endRadius,
821 const SkColor colors[], 776 const SkColor colors[],
822 const SkScalar pos[], 777 const SkScalar pos[],
823 int colorCount, 778 int colorCount,
824 SkShader::TileMode mode, 779 SkShader::TileMode mode,
825 SkUnitMapper* mapper,
826 uint32_t flags, 780 uint32_t flags,
827 const SkMatrix* localMatrix) { 781 const SkMatrix* localMatrix) {
828 if (startRadius < 0 || endRadius < 0 || NULL == colors || colorCount < 1) { 782 if (startRadius < 0 || endRadius < 0 || NULL == colors || colorCount < 1) {
829 return NULL; 783 return NULL;
830 } 784 }
831 EXPAND_1_COLOR(colorCount); 785 EXPAND_1_COLOR(colorCount);
832 786
833 SkGradientShaderBase::Descriptor desc; 787 SkGradientShaderBase::Descriptor desc;
834 desc_init(&desc, colors, pos, colorCount, mode, mapper, flags); 788 desc_init(&desc, colors, pos, colorCount, mode, flags);
835 return SkNEW_ARGS(SkTwoPointRadialGradient, 789 return SkNEW_ARGS(SkTwoPointRadialGradient,
836 (start, startRadius, end, endRadius, desc, localMatrix)); 790 (start, startRadius, end, endRadius, desc, localMatrix));
837 } 791 }
838 792
839 SkShader* SkGradientShader::CreateTwoPointConical(const SkPoint& start, 793 SkShader* SkGradientShader::CreateTwoPointConical(const SkPoint& start,
840 SkScalar startRadius, 794 SkScalar startRadius,
841 const SkPoint& end, 795 const SkPoint& end,
842 SkScalar endRadius, 796 SkScalar endRadius,
843 const SkColor colors[], 797 const SkColor colors[],
844 const SkScalar pos[], 798 const SkScalar pos[],
845 int colorCount, 799 int colorCount,
846 SkShader::TileMode mode, 800 SkShader::TileMode mode,
847 SkUnitMapper* mapper,
848 uint32_t flags, 801 uint32_t flags,
849 const SkMatrix* localMatrix) { 802 const SkMatrix* localMatrix) {
850 if (startRadius < 0 || endRadius < 0 || NULL == colors || colorCount < 1) { 803 if (startRadius < 0 || endRadius < 0 || NULL == colors || colorCount < 1) {
851 return NULL; 804 return NULL;
852 } 805 }
853 if (start == end && startRadius == endRadius) { 806 if (start == end && startRadius == endRadius) {
854 return SkNEW(SkEmptyShader); 807 return SkNEW(SkEmptyShader);
855 } 808 }
856 809
857 EXPAND_1_COLOR(colorCount); 810 EXPAND_1_COLOR(colorCount);
858 811
859 bool flipGradient = startRadius > endRadius; 812 bool flipGradient = startRadius > endRadius;
860 813
861 SkGradientShaderBase::Descriptor desc; 814 SkGradientShaderBase::Descriptor desc;
862 815
863 if (!flipGradient) { 816 if (!flipGradient) {
864 desc_init(&desc, colors, pos, colorCount, mode, mapper, flags); 817 desc_init(&desc, colors, pos, colorCount, mode, flags);
865 return SkNEW_ARGS(SkTwoPointConicalGradient, 818 return SkNEW_ARGS(SkTwoPointConicalGradient,
866 (start, startRadius, end, endRadius, flipGradient, des c, localMatrix)); 819 (start, startRadius, end, endRadius, flipGradient, des c, localMatrix));
867 } else { 820 } else {
868 SkAutoSTArray<8, SkColor> colorsNew(colorCount); 821 SkAutoSTArray<8, SkColor> colorsNew(colorCount);
869 SkAutoSTArray<8, SkScalar> posNew(colorCount); 822 SkAutoSTArray<8, SkScalar> posNew(colorCount);
870 for (int i = 0; i < colorCount; ++i) { 823 for (int i = 0; i < colorCount; ++i) {
871 colorsNew[i] = colors[colorCount - i - 1]; 824 colorsNew[i] = colors[colorCount - i - 1];
872 } 825 }
873 826
874 if (pos) { 827 if (pos) {
875 for (int i = 0; i < colorCount; ++i) { 828 for (int i = 0; i < colorCount; ++i) {
876 posNew[i] = 1 - pos[colorCount - i - 1]; 829 posNew[i] = 1 - pos[colorCount - i - 1];
877 } 830 }
878 desc_init(&desc, colorsNew.get(), posNew.get(), colorCount, mode, ma pper, flags); 831 desc_init(&desc, colorsNew.get(), posNew.get(), colorCount, mode, fl ags);
879 } else { 832 } else {
880 desc_init(&desc, colorsNew.get(), NULL, colorCount, mode, mapper, fl ags); 833 desc_init(&desc, colorsNew.get(), NULL, colorCount, mode, flags);
881 } 834 }
882 835
883 return SkNEW_ARGS(SkTwoPointConicalGradient, 836 return SkNEW_ARGS(SkTwoPointConicalGradient,
884 (end, endRadius, start, startRadius, flipGradient, des c, localMatrix)); 837 (end, endRadius, start, startRadius, flipGradient, des c, localMatrix));
885 } 838 }
886 } 839 }
887 840
888 SkShader* SkGradientShader::CreateSweep(SkScalar cx, SkScalar cy, 841 SkShader* SkGradientShader::CreateSweep(SkScalar cx, SkScalar cy,
889 const SkColor colors[], 842 const SkColor colors[],
890 const SkScalar pos[], 843 const SkScalar pos[],
891 int colorCount, SkUnitMapper* mapper, 844 int colorCount,
892 uint32_t flags, 845 uint32_t flags,
893 const SkMatrix* localMatrix) { 846 const SkMatrix* localMatrix) {
894 if (NULL == colors || colorCount < 1) { 847 if (NULL == colors || colorCount < 1) {
895 return NULL; 848 return NULL;
896 } 849 }
897 EXPAND_1_COLOR(colorCount); 850 EXPAND_1_COLOR(colorCount);
898 851
899 SkGradientShaderBase::Descriptor desc; 852 SkGradientShaderBase::Descriptor desc;
900 desc_init(&desc, colors, pos, colorCount, SkShader::kClamp_TileMode, mapper, flags); 853 desc_init(&desc, colors, pos, colorCount, SkShader::kClamp_TileMode, flags);
901 return SkNEW_ARGS(SkSweepGradient, (cx, cy, desc, localMatrix)); 854 return SkNEW_ARGS(SkSweepGradient, (cx, cy, desc, localMatrix));
902 } 855 }
903 856
904 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkGradientShader) 857 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkGradientShader)
905 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLinearGradient) 858 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkLinearGradient)
906 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkRadialGradient) 859 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkRadialGradient)
907 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSweepGradient) 860 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSweepGradient)
908 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkTwoPointRadialGradient) 861 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkTwoPointRadialGradient)
909 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkTwoPointConicalGradient) 862 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkTwoPointConicalGradient)
910 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 863 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after
1210 (*stops)[i] = stop; 1163 (*stops)[i] = stop;
1211 stop = i < outColors - 1 ? stop + random->nextUScalar1() * (1.f - st op) : 1.f; 1164 stop = i < outColors - 1 ? stop + random->nextUScalar1() * (1.f - st op) : 1.f;
1212 } 1165 }
1213 } 1166 }
1214 *tm = static_cast<SkShader::TileMode>(random->nextULessThan(SkShader::kTileM odeCount)); 1167 *tm = static_cast<SkShader::TileMode>(random->nextULessThan(SkShader::kTileM odeCount));
1215 1168
1216 return outColors; 1169 return outColors;
1217 } 1170 }
1218 1171
1219 #endif 1172 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698