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

Side by Side Diff: src/core/SkImageGenerator.cpp

Issue 1351453004: use allocator (if present) when we allocate our cache bitmap (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 3 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
OLDNEW
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698