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 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 } | 117 } |
118 | 118 |
119 void defFactory(const char* name) { | 119 void defFactory(const char* name) { |
120 SkFlattenable::Factory factory = SkFlattenable::NameToFactory(name); | 120 SkFlattenable::Factory factory = SkFlattenable::NameToFactory(name); |
121 if (factory) { | 121 if (factory) { |
122 SkASSERT(fFactoryArray.find(factory) < 0); | 122 SkASSERT(fFactoryArray.find(factory) < 0); |
123 *fFactoryArray.append() = factory; | 123 *fFactoryArray.append() = factory; |
124 } | 124 } |
125 } | 125 } |
126 | 126 |
| 127 /** |
| 128 * Add a bitmap to the array of bitmaps, or replace an existing one. |
| 129 * This is only used when in cross process mode without a shared heap. |
| 130 */ |
127 void addBitmap(int index) { | 131 void addBitmap(int index) { |
| 132 SkASSERT(shouldFlattenBitmaps(fFlags)); |
128 SkBitmap* bm; | 133 SkBitmap* bm; |
129 if(fBitmaps.count() == index) { | 134 if(fBitmaps.count() == index) { |
130 bm = SkNEW(SkBitmap); | 135 bm = SkNEW(SkBitmap); |
131 *fBitmaps.append() = bm; | 136 *fBitmaps.append() = bm; |
132 } else { | 137 } else { |
133 bm = fBitmaps[index]; | 138 bm = fBitmaps[index]; |
134 } | 139 } |
135 bm->unflatten(*fReader); | 140 fReader->readBitmap(bm); |
136 } | 141 } |
137 | 142 |
138 /** | 143 /** |
139 * Override of SkBitmapHeapReader, so that SkOrderedReadBuffer can use | 144 * Override of SkBitmapHeapReader, so that SkOrderedReadBuffer can use |
140 * these SkBitmaps for bitmap shaders. | 145 * these SkBitmaps for bitmap shaders. Used only in cross process mode |
| 146 * without a shared heap. |
141 */ | 147 */ |
142 virtual SkBitmap* getBitmap(int32_t index) const SK_OVERRIDE { | 148 virtual SkBitmap* getBitmap(int32_t index) const SK_OVERRIDE { |
| 149 SkASSERT(shouldFlattenBitmaps(fFlags)); |
143 return fBitmaps[index]; | 150 return fBitmaps[index]; |
144 } | 151 } |
145 | 152 |
146 /** | 153 /** |
147 * Needed to be a non-abstract subclass of SkBitmapHeapReader. | 154 * Needed to be a non-abstract subclass of SkBitmapHeapReader. |
148 */ | 155 */ |
149 virtual void releaseRef(int32_t) SK_OVERRIDE {} | 156 virtual void releaseRef(int32_t) SK_OVERRIDE {} |
150 | 157 |
151 void setSharedHeap(SkBitmapHeap* heap) { | 158 void setSharedHeap(SkBitmapHeap* heap) { |
152 SkASSERT(!shouldFlattenBitmaps(fFlags) || NULL == heap); | 159 SkASSERT(!shouldFlattenBitmaps(fFlags) || NULL == heap); |
153 SkRefCnt_SafeAssign(fSharedHeap, heap); | 160 SkRefCnt_SafeAssign(fSharedHeap, heap); |
154 this->updateReader(); | 161 this->updateReader(); |
155 } | 162 } |
156 | 163 |
| 164 /** |
| 165 * Access the shared heap. Only used in the case when bitmaps are not |
| 166 * flattened. |
| 167 */ |
157 SkBitmapHeap* getSharedHeap() const { | 168 SkBitmapHeap* getSharedHeap() const { |
| 169 SkASSERT(!shouldFlattenBitmaps(fFlags)); |
158 return fSharedHeap; | 170 return fSharedHeap; |
159 } | 171 } |
160 | 172 |
161 void addTypeface() { | 173 void addTypeface() { |
162 size_t size = fReader->read32(); | 174 size_t size = fReader->read32(); |
163 const void* data = fReader->skip(SkAlign4(size)); | 175 const void* data = fReader->skip(SkAlign4(size)); |
164 SkMemoryStream stream(data, size, false); | 176 SkMemoryStream stream(data, size, false); |
165 *fTypefaces.append() = SkTypeface::Deserialize(&stream); | 177 *fTypefaces.append() = SkTypeface::Deserialize(&stream); |
166 } | 178 } |
167 | 179 |
(...skipping 597 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
765 SkSafeUnref(fSharedHeap); | 777 SkSafeUnref(fSharedHeap); |
766 } | 778 } |
767 | 779 |
768 /////////////////////////////////////////////////////////////////////////////// | 780 /////////////////////////////////////////////////////////////////////////////// |
769 | 781 |
770 #include "SkGPipe.h" | 782 #include "SkGPipe.h" |
771 | 783 |
772 SkGPipeReader::SkGPipeReader() { | 784 SkGPipeReader::SkGPipeReader() { |
773 fCanvas = NULL; | 785 fCanvas = NULL; |
774 fState = NULL; | 786 fState = NULL; |
| 787 fProc = NULL; |
775 } | 788 } |
776 | 789 |
777 SkGPipeReader::SkGPipeReader(SkCanvas* target) { | 790 SkGPipeReader::SkGPipeReader(SkCanvas* target) { |
778 fCanvas = NULL; | 791 fCanvas = NULL; |
779 this->setCanvas(target); | 792 this->setCanvas(target); |
780 fState = NULL; | 793 fState = NULL; |
| 794 fProc = NULL; |
781 } | 795 } |
782 | 796 |
783 void SkGPipeReader::setCanvas(SkCanvas *target) { | 797 void SkGPipeReader::setCanvas(SkCanvas *target) { |
784 SkRefCnt_SafeAssign(fCanvas, target); | 798 SkRefCnt_SafeAssign(fCanvas, target); |
785 } | 799 } |
786 | 800 |
787 SkGPipeReader::~SkGPipeReader() { | 801 SkGPipeReader::~SkGPipeReader() { |
788 SkSafeUnref(fCanvas); | 802 SkSafeUnref(fCanvas); |
789 delete fState; | 803 delete fState; |
790 } | 804 } |
791 | 805 |
792 SkGPipeReader::Status SkGPipeReader::playback(const void* data, size_t length, | 806 SkGPipeReader::Status SkGPipeReader::playback(const void* data, size_t length, |
793 uint32_t playbackFlags, size_t* by
tesRead) { | 807 uint32_t playbackFlags, size_t* by
tesRead) { |
794 if (NULL == fCanvas) { | 808 if (NULL == fCanvas) { |
795 return kError_Status; | 809 return kError_Status; |
796 } | 810 } |
797 | 811 |
798 if (NULL == fState) { | 812 if (NULL == fState) { |
799 fState = new SkGPipeState; | 813 fState = new SkGPipeState; |
800 } | 814 } |
801 | 815 |
802 fState->setSilent(playbackFlags & kSilent_PlaybackFlag); | 816 fState->setSilent(playbackFlags & kSilent_PlaybackFlag); |
803 | 817 |
804 SkASSERT(SK_ARRAY_COUNT(gReadTable) == (kDone_DrawOp + 1)); | 818 SkASSERT(SK_ARRAY_COUNT(gReadTable) == (kDone_DrawOp + 1)); |
805 | 819 |
806 const ReadProc* table = gReadTable; | 820 const ReadProc* table = gReadTable; |
807 SkOrderedReadBuffer reader(data, length); | 821 SkOrderedReadBuffer reader(data, length); |
| 822 reader.setBitmapDecoder(fProc); |
808 SkCanvas* canvas = fCanvas; | 823 SkCanvas* canvas = fCanvas; |
809 Status status = kEOF_Status; | 824 Status status = kEOF_Status; |
810 | 825 |
811 fState->setReader(&reader); | 826 fState->setReader(&reader); |
812 while (!reader.eof()) { | 827 while (!reader.eof()) { |
813 uint32_t op32 = reader.readUInt(); | 828 uint32_t op32 = reader.readUInt(); |
814 unsigned op = DrawOp_unpackOp(op32); | 829 unsigned op = DrawOp_unpackOp(op32); |
815 // SkDEBUGCODE(DrawOps drawOp = (DrawOps)op;) | 830 // SkDEBUGCODE(DrawOps drawOp = (DrawOps)op;) |
816 | 831 |
817 if (op >= SK_ARRAY_COUNT(gReadTable)) { | 832 if (op >= SK_ARRAY_COUNT(gReadTable)) { |
(...skipping 15 matching lines...) Expand all Loading... |
833 status = kReadAtom_Status; | 848 status = kReadAtom_Status; |
834 break; | 849 break; |
835 } | 850 } |
836 } | 851 } |
837 | 852 |
838 if (bytesRead) { | 853 if (bytesRead) { |
839 *bytesRead = reader.offset(); | 854 *bytesRead = reader.offset(); |
840 } | 855 } |
841 return status; | 856 return status; |
842 } | 857 } |
OLD | NEW |