Chromium Code Reviews| 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 |