OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 Google Inc. |
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 "SkImageGenerator.h" | 8 #include "SkImageGenerator.h" |
9 #include "SkNextID.h" | 9 #include "SkNextID.h" |
10 | 10 |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
121 bool SkImageGenerator::onGetPixels(const SkImageInfo& info, void* dst, size_t rb , | 121 bool SkImageGenerator::onGetPixels(const SkImageInfo& info, void* dst, size_t rb , |
122 SkPMColor* colors, int* colorCount) { | 122 SkPMColor* colors, int* colorCount) { |
123 return false; | 123 return false; |
124 } | 124 } |
125 | 125 |
126 //////////////////////////////////////////////////////////////////////////////// /////////////////// | 126 //////////////////////////////////////////////////////////////////////////////// /////////////////// |
127 | 127 |
128 #include "SkBitmap.h" | 128 #include "SkBitmap.h" |
129 #include "SkColorTable.h" | 129 #include "SkColorTable.h" |
130 | 130 |
131 static void release_malloc_proc(void* pixels, void* ctx) { | 131 bool SkImageGenerator::tryGenerateBitmap(SkBitmap* bitmap, const SkImageInfo* in foPtr, |
132 sk_free(pixels); | 132 SkBitmap::Allocator* allocator) { |
133 } | |
134 | |
135 bool SkImageGenerator::tryGenerateBitmap(SkBitmap* bitmap, const SkImageInfo* in foPtr) { | |
136 const SkImageInfo info = infoPtr ? *infoPtr : this->getInfo(); | 133 const SkImageInfo info = infoPtr ? *infoPtr : this->getInfo(); |
137 const size_t rowBytes = info.minRowBytes(); | 134 const size_t rowBytes = info.minRowBytes(); |
138 const size_t pixelSize = info.getSafeSize(rowBytes); | 135 const size_t pixelSize = info.getSafeSize(rowBytes); |
139 if (0 == pixelSize) { | 136 if (0 == pixelSize) { |
140 return false; | 137 return false; |
141 } | 138 } |
142 | 139 |
143 SkAutoFree pixelStorage(sk_malloc_flags(pixelSize, 0)); | 140 if (!bitmap->setInfo(info)) { |
144 void* pixels = pixelStorage.get(); | |
145 if (!pixels) { | |
146 return false; | 141 return false; |
147 } | 142 } |
148 | 143 |
149 SkPMColor ctStorage[256]; | 144 SkPMColor ctStorage[256]; |
150 int ctCount = 0; | 145 memset(ctStorage, 0xFF, sizeof(ctStorage)); // init with opaque-white for th e moment |
151 | 146 SkAutoTUnref<SkColorTable> ctable(new SkColorTable(ctStorage, 256)); |
152 if (!this->getPixels(info, pixels, rowBytes, ctStorage, &ctCount)) { | 147 if (!bitmap->tryAllocPixels(allocator, ctable)) { |
153 return false; | 148 return false; |
154 } | 149 } |
155 | 150 |
156 SkAutoTUnref<SkColorTable> ctable; | 151 bitmap->lockPixels(); |
152 if (!bitmap->getPixels()) { | |
153 bitmap->reset(); | |
154 return false; | |
155 } | |
156 | |
157 int ctCount = 0; | |
158 if (!this->getPixels(bitmap->info(), bitmap->getPixels(), bitmap->rowBytes() , | |
159 ctStorage, &ctCount)) { | |
tomhudson
2015/09/17 18:58:07
Do we need to reset the bitmap here?
reed1
2015/09/17 19:57:22
Done.
| |
160 return false; | |
161 } | |
162 | |
157 if (ctCount > 0) { | 163 if (ctCount > 0) { |
158 SkASSERT(kIndex_8_SkColorType == info.colorType()); | 164 SkASSERT(kIndex_8_SkColorType == bitmap->colorType()); |
159 ctable.reset(new SkColorTable(ctStorage, ctCount)); | 165 // we and bitmap should be owners |
166 SkASSERT(!ctable->unique()); | |
167 | |
168 // Now we need to overwrite the ctable we built earlier, with the correc t colors. | |
169 // This does mean that we may have made the table too big, but that cann ot be avoided | |
170 // until we can change SkImageGenerator's API to return us the ctable *b efore* we have to | |
171 // allocate space for all the pixels. | |
172 // ctable->dangerous_overwriteColors(ctStorage, ctCount); | |
tomhudson
2015/09/17 18:58:07
Resolve commented-out code before landing.
reed1
2015/09/17 19:57:23
Done.
| |
160 } else { | 173 } else { |
161 SkASSERT(kIndex_8_SkColorType != info.colorType()); | 174 SkASSERT(kIndex_8_SkColorType != bitmap->colorType()); |
175 // we should be the only owner | |
176 SkASSERT(ctable->unique()); | |
162 } | 177 } |
163 | 178 return true; |
164 return bitmap->installPixels(info, pixelStorage.detach(), rowBytes, ctable, | |
165 release_malloc_proc, nullptr); | |
166 } | 179 } |
167 | 180 |
168 #include "SkGraphics.h" | 181 #include "SkGraphics.h" |
169 | 182 |
170 static SkGraphics::ImageGeneratorFromEncodedFactory gFactory; | 183 static SkGraphics::ImageGeneratorFromEncodedFactory gFactory; |
171 | 184 |
172 SkGraphics::ImageGeneratorFromEncodedFactory | 185 SkGraphics::ImageGeneratorFromEncodedFactory |
173 SkGraphics::SetImageGeneratorFromEncodedFactory(ImageGeneratorFromEncodedFactory factory) | 186 SkGraphics::SetImageGeneratorFromEncodedFactory(ImageGeneratorFromEncodedFactory factory) |
174 { | 187 { |
175 ImageGeneratorFromEncodedFactory prev = gFactory; | 188 ImageGeneratorFromEncodedFactory prev = gFactory; |
176 gFactory = factory; | 189 gFactory = factory; |
177 return prev; | 190 return prev; |
178 } | 191 } |
179 | 192 |
180 SkImageGenerator* SkImageGenerator::NewFromEncoded(SkData* data) { | 193 SkImageGenerator* SkImageGenerator::NewFromEncoded(SkData* data) { |
181 if (nullptr == data) { | 194 if (nullptr == data) { |
182 return nullptr; | 195 return nullptr; |
183 } | 196 } |
184 if (gFactory) { | 197 if (gFactory) { |
185 if (SkImageGenerator* generator = gFactory(data)) { | 198 if (SkImageGenerator* generator = gFactory(data)) { |
186 return generator; | 199 return generator; |
187 } | 200 } |
188 } | 201 } |
189 return SkImageGenerator::NewFromEncodedImpl(data); | 202 return SkImageGenerator::NewFromEncodedImpl(data); |
190 } | 203 } |
OLD | NEW |