OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
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 | 8 |
9 #include "SkImageDecoder.h" | 9 #include "SkImageDecoder.h" |
10 #include "SkBitmap.h" | 10 #include "SkBitmap.h" |
11 #include "SkImagePriv.h" | 11 #include "SkImagePriv.h" |
12 #include "SkPixelRef.h" | 12 #include "SkPixelRef.h" |
13 #include "SkStream.h" | 13 #include "SkStream.h" |
14 #include "SkTemplates.h" | 14 #include "SkTemplates.h" |
15 #include "SkCanvas.h" | 15 #include "SkCanvas.h" |
16 | 16 |
17 SkImageDecoder::SkImageDecoder() | 17 SkImageDecoder::SkImageDecoder() |
18 : fPeeker(NULL) | 18 : fPeeker(NULL) |
19 #ifdef SK_SUPPORT_LEGACY_IMAGEDECODER_CHOOSER | 19 #ifdef SK_SUPPORT_LEGACY_IMAGEDECODER_CHOOSER |
20 , fChooser(NULL) | 20 , fChooser(NULL) |
21 #endif | 21 #endif |
22 , fAllocator(NULL) | 22 , fAllocator(NULL) |
23 , fSampleSize(1) | 23 , fSampleSize(1) |
24 , fDefaultPref(SkBitmap::kNo_Config) | 24 , fDefaultPref(kUnknown_SkColorType) |
25 , fDitherImage(true) | 25 , fDitherImage(true) |
26 , fUsePrefTable(false) | 26 , fUsePrefTable(false) |
27 , fSkipWritingZeroes(false) | 27 , fSkipWritingZeroes(false) |
28 , fPreferQualityOverSpeed(false) | 28 , fPreferQualityOverSpeed(false) |
29 , fRequireUnpremultipliedColors(false) { | 29 , fRequireUnpremultipliedColors(false) { |
30 } | 30 } |
31 | 31 |
32 SkImageDecoder::~SkImageDecoder() { | 32 SkImageDecoder::~SkImageDecoder() { |
33 SkSafeUnref(fPeeker); | 33 SkSafeUnref(fPeeker); |
34 #ifdef SK_SUPPORT_LEGACY_IMAGEDECODER_CHOOSER | 34 #ifdef SK_SUPPORT_LEGACY_IMAGEDECODER_CHOOSER |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 /////////////////////////////////////////////////////////////////////////////// | 141 /////////////////////////////////////////////////////////////////////////////// |
142 | 142 |
143 void SkImageDecoder::setPrefConfigTable(const PrefConfigTable& prefTable) { | 143 void SkImageDecoder::setPrefConfigTable(const PrefConfigTable& prefTable) { |
144 fUsePrefTable = true; | 144 fUsePrefTable = true; |
145 fPrefTable = prefTable; | 145 fPrefTable = prefTable; |
146 } | 146 } |
147 | 147 |
148 // TODO: use colortype in fPrefTable, fDefaultPref so we can stop using SkBitmap
ConfigToColorType() | 148 // TODO: use colortype in fPrefTable, fDefaultPref so we can stop using SkBitmap
ConfigToColorType() |
149 // | 149 // |
150 SkColorType SkImageDecoder::getPrefColorType(SrcDepth srcDepth, bool srcHasAlpha
) const { | 150 SkColorType SkImageDecoder::getPrefColorType(SrcDepth srcDepth, bool srcHasAlpha
) const { |
151 SkBitmap::Config config = SkBitmap::kNo_Config; | 151 SkColorType ct = fDefaultPref; |
152 | 152 |
153 if (fUsePrefTable) { | 153 if (fUsePrefTable) { |
| 154 // Until we kill or change the PrefTable, we have to go into Config land
for a moment. |
| 155 SkBitmap::Config config = SkBitmap::kNo_Config; |
154 switch (srcDepth) { | 156 switch (srcDepth) { |
155 case kIndex_SrcDepth: | 157 case kIndex_SrcDepth: |
156 config = srcHasAlpha ? fPrefTable.fPrefFor_8Index_YesAlpha_src | 158 config = srcHasAlpha ? fPrefTable.fPrefFor_8Index_YesAlpha_src |
157 : fPrefTable.fPrefFor_8Index_NoAlpha_src; | 159 : fPrefTable.fPrefFor_8Index_NoAlpha_src; |
158 break; | 160 break; |
159 case k8BitGray_SrcDepth: | 161 case k8BitGray_SrcDepth: |
160 config = fPrefTable.fPrefFor_8Gray_src; | 162 config = fPrefTable.fPrefFor_8Gray_src; |
161 break; | 163 break; |
162 case k32Bit_SrcDepth: | 164 case k32Bit_SrcDepth: |
163 config = srcHasAlpha ? fPrefTable.fPrefFor_8bpc_YesAlpha_src | 165 config = srcHasAlpha ? fPrefTable.fPrefFor_8bpc_YesAlpha_src |
164 : fPrefTable.fPrefFor_8bpc_NoAlpha_src; | 166 : fPrefTable.fPrefFor_8bpc_NoAlpha_src; |
165 break; | 167 break; |
166 } | 168 } |
167 } else { | 169 // now return to SkColorType land |
168 config = fDefaultPref; | 170 ct = SkBitmapConfigToColorType(config); |
169 } | 171 } |
170 | 172 return ct; |
171 return SkBitmapConfigToColorType(config); | |
172 } | 173 } |
173 | 174 |
174 bool SkImageDecoder::decode(SkStream* stream, SkBitmap* bm, | 175 bool SkImageDecoder::decode(SkStream* stream, SkBitmap* bm, SkColorType pref, Mo
de mode) { |
175 SkBitmap::Config pref, Mode mode) { | |
176 // we reset this to false before calling onDecode | 176 // we reset this to false before calling onDecode |
177 fShouldCancelDecode = false; | 177 fShouldCancelDecode = false; |
178 // assign this, for use by getPrefConfig(), in case fUsePrefTable is false | 178 // assign this, for use by getPrefColorType(), in case fUsePrefTable is fals
e |
179 fDefaultPref = pref; | 179 fDefaultPref = pref; |
180 | 180 |
181 // pass a temporary bitmap, so that if we return false, we are assured of | 181 // pass a temporary bitmap, so that if we return false, we are assured of |
182 // leaving the caller's bitmap untouched. | 182 // leaving the caller's bitmap untouched. |
183 SkBitmap tmp; | 183 SkBitmap tmp; |
184 if (!this->onDecode(stream, &tmp, mode)) { | 184 if (!this->onDecode(stream, &tmp, mode)) { |
185 return false; | 185 return false; |
186 } | 186 } |
187 bm->swap(tmp); | 187 bm->swap(tmp); |
188 return true; | 188 return true; |
189 } | 189 } |
190 | 190 |
191 bool SkImageDecoder::decodeSubset(SkBitmap* bm, const SkIRect& rect, | 191 bool SkImageDecoder::decodeSubset(SkBitmap* bm, const SkIRect& rect, SkColorType
pref) { |
192 SkBitmap::Config pref) { | |
193 // we reset this to false before calling onDecodeSubset | 192 // we reset this to false before calling onDecodeSubset |
194 fShouldCancelDecode = false; | 193 fShouldCancelDecode = false; |
195 // assign this, for use by getPrefConfig(), in case fUsePrefTable is false | 194 // assign this, for use by getPrefColorType(), in case fUsePrefTable is fals
e |
196 fDefaultPref = pref; | 195 fDefaultPref = pref; |
197 | 196 |
198 return this->onDecodeSubset(bm, rect); | 197 return this->onDecodeSubset(bm, rect); |
199 } | 198 } |
200 | 199 |
201 bool SkImageDecoder::buildTileIndex(SkStreamRewindable* stream, | 200 bool SkImageDecoder::buildTileIndex(SkStreamRewindable* stream, int *width, int
*height) { |
202 int *width, int *height) { | |
203 // we reset this to false before calling onBuildTileIndex | 201 // we reset this to false before calling onBuildTileIndex |
204 fShouldCancelDecode = false; | 202 fShouldCancelDecode = false; |
205 | 203 |
206 return this->onBuildTileIndex(stream, width, height); | 204 return this->onBuildTileIndex(stream, width, height); |
207 } | 205 } |
208 | 206 |
209 bool SkImageDecoder::cropBitmap(SkBitmap *dst, SkBitmap *src, int sampleSize, | 207 bool SkImageDecoder::cropBitmap(SkBitmap *dst, SkBitmap *src, int sampleSize, |
210 int dstX, int dstY, int width, int height, | 208 int dstX, int dstY, int width, int height, |
211 int srcX, int srcY) { | 209 int srcX, int srcY) { |
212 int w = width / sampleSize; | 210 int w = width / sampleSize; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 | 246 |
249 SkCanvas canvas(*dst); | 247 SkCanvas canvas(*dst); |
250 canvas.drawSprite(*src, (srcX - dstX) / sampleSize, | 248 canvas.drawSprite(*src, (srcX - dstX) / sampleSize, |
251 (srcY - dstY) / sampleSize, | 249 (srcY - dstY) / sampleSize, |
252 &paint); | 250 &paint); |
253 return true; | 251 return true; |
254 } | 252 } |
255 | 253 |
256 /////////////////////////////////////////////////////////////////////////////// | 254 /////////////////////////////////////////////////////////////////////////////// |
257 | 255 |
258 bool SkImageDecoder::DecodeFile(const char file[], SkBitmap* bm, | 256 bool SkImageDecoder::DecodeFile(const char file[], SkBitmap* bm, SkColorType pre
f, Mode mode, |
259 SkBitmap::Config pref, Mode mode, Format* format) { | 257 Format* format) { |
260 SkASSERT(file); | 258 SkASSERT(file); |
261 SkASSERT(bm); | 259 SkASSERT(bm); |
262 | 260 |
263 SkAutoTUnref<SkStreamRewindable> stream(SkStream::NewFromFile(file)); | 261 SkAutoTUnref<SkStreamRewindable> stream(SkStream::NewFromFile(file)); |
264 if (stream.get()) { | 262 if (stream.get()) { |
265 if (SkImageDecoder::DecodeStream(stream, bm, pref, mode, format)) { | 263 if (SkImageDecoder::DecodeStream(stream, bm, pref, mode, format)) { |
266 bm->pixelRef()->setURI(file); | 264 bm->pixelRef()->setURI(file); |
267 return true; | 265 return true; |
268 } | 266 } |
269 } | 267 } |
270 return false; | 268 return false; |
271 } | 269 } |
272 | 270 |
273 bool SkImageDecoder::DecodeMemory(const void* buffer, size_t size, SkBitmap* bm, | 271 bool SkImageDecoder::DecodeMemory(const void* buffer, size_t size, SkBitmap* bm,
SkColorType pref, |
274 SkBitmap::Config pref, Mode mode, Format* format) { | 272 Mode mode, Format* format) { |
275 if (0 == size) { | 273 if (0 == size) { |
276 return false; | 274 return false; |
277 } | 275 } |
278 SkASSERT(buffer); | 276 SkASSERT(buffer); |
279 | 277 |
280 SkMemoryStream stream(buffer, size); | 278 SkMemoryStream stream(buffer, size); |
281 return SkImageDecoder::DecodeStream(&stream, bm, pref, mode, format); | 279 return SkImageDecoder::DecodeStream(&stream, bm, pref, mode, format); |
282 } | 280 } |
283 | 281 |
284 bool SkImageDecoder::DecodeStream(SkStreamRewindable* stream, SkBitmap* bm, | 282 bool SkImageDecoder::DecodeStream(SkStreamRewindable* stream, SkBitmap* bm, SkCo
lorType pref, |
285 SkBitmap::Config pref, Mode mode, | 283 Mode mode, Format* format) { |
286 Format* format) { | |
287 SkASSERT(stream); | 284 SkASSERT(stream); |
288 SkASSERT(bm); | 285 SkASSERT(bm); |
289 | 286 |
290 bool success = false; | 287 bool success = false; |
291 SkImageDecoder* codec = SkImageDecoder::Factory(stream); | 288 SkImageDecoder* codec = SkImageDecoder::Factory(stream); |
292 | 289 |
293 if (NULL != codec) { | 290 if (NULL != codec) { |
294 success = codec->decode(stream, bm, pref, mode); | 291 success = codec->decode(stream, bm, pref, mode); |
295 if (success && format) { | 292 if (success && format) { |
296 *format = codec->getFormat(); | 293 *format = codec->getFormat(); |
297 if (kUnknown_Format == *format) { | 294 if (kUnknown_Format == *format) { |
298 if (stream->rewind()) { | 295 if (stream->rewind()) { |
299 *format = GetStreamFormat(stream); | 296 *format = GetStreamFormat(stream); |
300 } | 297 } |
301 } | 298 } |
302 } | 299 } |
303 delete codec; | 300 delete codec; |
304 } | 301 } |
305 return success; | 302 return success; |
306 } | 303 } |
OLD | NEW |