OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #include "SkBitmapHeap.h" | 10 #include "SkBitmapHeap.h" |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
125 } | 125 } |
126 | 126 |
127 void addBitmap(int index) { | 127 void addBitmap(int index) { |
128 SkBitmap* bm; | 128 SkBitmap* bm; |
129 if(fBitmaps.count() == index) { | 129 if(fBitmaps.count() == index) { |
130 bm = SkNEW(SkBitmap); | 130 bm = SkNEW(SkBitmap); |
131 *fBitmaps.append() = bm; | 131 *fBitmaps.append() = bm; |
132 } else { | 132 } else { |
133 bm = fBitmaps[index]; | 133 bm = fBitmaps[index]; |
134 } | 134 } |
135 bm->unflatten(*fReader); | 135 // When adding bitmaps, never use the bitmap storage. Bitmaps will alway
s |
| 136 // be either unflattened or decoded. Since bitmap storage takes priority
in |
| 137 // readBitmap, remove the bitmap storage and set it back afterwards. |
| 138 SkBitmapHeapReader* storage = fReader->getBitmapStorage(); |
| 139 // The storage must be either this or the fSharedHeap, depending on fFla
gs. |
| 140 SkASSERT((shouldFlattenBitmaps(fFlags) && this == storage) |
| 141 || (!shouldFlattenBitmaps(fFlags) && fSharedHeap == storage &&
storage != NULL)); |
| 142 fReader->setBitmapStorage(NULL); |
| 143 fReader->readBitmap(bm); |
| 144 fReader->setBitmapStorage(storage); |
136 } | 145 } |
137 | 146 |
138 /** | 147 /** |
139 * Override of SkBitmapHeapReader, so that SkOrderedReadBuffer can use | 148 * Override of SkBitmapHeapReader, so that SkOrderedReadBuffer can use |
140 * these SkBitmaps for bitmap shaders. | 149 * these SkBitmaps for bitmap shaders. |
141 */ | 150 */ |
142 virtual SkBitmap* getBitmap(int32_t index) const SK_OVERRIDE { | 151 virtual SkBitmap* getBitmap(int32_t index) const SK_OVERRIDE { |
143 return fBitmaps[index]; | 152 return fBitmaps[index]; |
144 } | 153 } |
145 | 154 |
(...skipping 619 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
765 SkSafeUnref(fSharedHeap); | 774 SkSafeUnref(fSharedHeap); |
766 } | 775 } |
767 | 776 |
768 /////////////////////////////////////////////////////////////////////////////// | 777 /////////////////////////////////////////////////////////////////////////////// |
769 | 778 |
770 #include "SkGPipe.h" | 779 #include "SkGPipe.h" |
771 | 780 |
772 SkGPipeReader::SkGPipeReader() { | 781 SkGPipeReader::SkGPipeReader() { |
773 fCanvas = NULL; | 782 fCanvas = NULL; |
774 fState = NULL; | 783 fState = NULL; |
| 784 fProc = NULL; |
775 } | 785 } |
776 | 786 |
777 SkGPipeReader::SkGPipeReader(SkCanvas* target) { | 787 SkGPipeReader::SkGPipeReader(SkCanvas* target) { |
778 fCanvas = NULL; | 788 fCanvas = NULL; |
779 this->setCanvas(target); | 789 this->setCanvas(target); |
780 fState = NULL; | 790 fState = NULL; |
| 791 fProc = NULL; |
781 } | 792 } |
782 | 793 |
783 void SkGPipeReader::setCanvas(SkCanvas *target) { | 794 void SkGPipeReader::setCanvas(SkCanvas *target) { |
784 SkRefCnt_SafeAssign(fCanvas, target); | 795 SkRefCnt_SafeAssign(fCanvas, target); |
785 } | 796 } |
786 | 797 |
787 SkGPipeReader::~SkGPipeReader() { | 798 SkGPipeReader::~SkGPipeReader() { |
788 SkSafeUnref(fCanvas); | 799 SkSafeUnref(fCanvas); |
789 delete fState; | 800 delete fState; |
790 } | 801 } |
791 | 802 |
792 SkGPipeReader::Status SkGPipeReader::playback(const void* data, size_t length, | 803 SkGPipeReader::Status SkGPipeReader::playback(const void* data, size_t length, |
793 uint32_t playbackFlags, size_t* by
tesRead) { | 804 uint32_t playbackFlags, size_t* by
tesRead) { |
794 if (NULL == fCanvas) { | 805 if (NULL == fCanvas) { |
795 return kError_Status; | 806 return kError_Status; |
796 } | 807 } |
797 | 808 |
798 if (NULL == fState) { | 809 if (NULL == fState) { |
799 fState = new SkGPipeState; | 810 fState = new SkGPipeState; |
800 } | 811 } |
801 | 812 |
802 fState->setSilent(playbackFlags & kSilent_PlaybackFlag); | 813 fState->setSilent(playbackFlags & kSilent_PlaybackFlag); |
803 | 814 |
804 SkASSERT(SK_ARRAY_COUNT(gReadTable) == (kDone_DrawOp + 1)); | 815 SkASSERT(SK_ARRAY_COUNT(gReadTable) == (kDone_DrawOp + 1)); |
805 | 816 |
806 const ReadProc* table = gReadTable; | 817 const ReadProc* table = gReadTable; |
807 SkOrderedReadBuffer reader(data, length); | 818 SkOrderedReadBuffer reader(data, length); |
| 819 reader.setBitmapDecoder(fProc); |
808 SkCanvas* canvas = fCanvas; | 820 SkCanvas* canvas = fCanvas; |
809 Status status = kEOF_Status; | 821 Status status = kEOF_Status; |
810 | 822 |
811 fState->setReader(&reader); | 823 fState->setReader(&reader); |
812 while (!reader.eof()) { | 824 while (!reader.eof()) { |
813 uint32_t op32 = reader.readUInt(); | 825 uint32_t op32 = reader.readUInt(); |
814 unsigned op = DrawOp_unpackOp(op32); | 826 unsigned op = DrawOp_unpackOp(op32); |
815 // SkDEBUGCODE(DrawOps drawOp = (DrawOps)op;) | 827 // SkDEBUGCODE(DrawOps drawOp = (DrawOps)op;) |
816 | 828 |
817 if (op >= SK_ARRAY_COUNT(gReadTable)) { | 829 if (op >= SK_ARRAY_COUNT(gReadTable)) { |
(...skipping 15 matching lines...) Expand all Loading... |
833 status = kReadAtom_Status; | 845 status = kReadAtom_Status; |
834 break; | 846 break; |
835 } | 847 } |
836 } | 848 } |
837 | 849 |
838 if (bytesRead) { | 850 if (bytesRead) { |
839 *bytesRead = reader.offset(); | 851 *bytesRead = reader.offset(); |
840 } | 852 } |
841 return status; | 853 return status; |
842 } | 854 } |
OLD | NEW |