OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2010, The Android Open Source Project | 2 * Copyright 2010, The Android Open Source Project |
3 * | 3 * |
4 * Licensed under the Apache License, Version 2.0 (the "License"); | 4 * Licensed under the Apache License, Version 2.0 (the "License"); |
5 * you may not use this file except in compliance with the License. | 5 * you may not use this file except in compliance with the License. |
6 * You may obtain a copy of the License at | 6 * You may obtain a copy of the License at |
7 * | 7 * |
8 * http://www.apache.org/licenses/LICENSE-2.0 | 8 * http://www.apache.org/licenses/LICENSE-2.0 |
9 * | 9 * |
10 * Unless required by applicable law or agreed to in writing, software | 10 * Unless required by applicable law or agreed to in writing, software |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
88 if (sk_64_asS32(size) > (0x7FFFFFFF >> 2)) { | 88 if (sk_64_asS32(size) > (0x7FFFFFFF >> 2)) { |
89 return false; | 89 return false; |
90 } | 90 } |
91 } | 91 } |
92 return true; | 92 return true; |
93 } | 93 } |
94 | 94 |
95 class SkWEBPImageDecoder: public SkImageDecoder { | 95 class SkWEBPImageDecoder: public SkImageDecoder { |
96 public: | 96 public: |
97 SkWEBPImageDecoder() { | 97 SkWEBPImageDecoder() { |
98 fInputStream = NULL; | |
99 fOrigWidth = 0; | 98 fOrigWidth = 0; |
100 fOrigHeight = 0; | 99 fOrigHeight = 0; |
101 fHasAlpha = 0; | 100 fHasAlpha = 0; |
102 } | 101 } |
103 virtual ~SkWEBPImageDecoder() { | |
104 SkSafeUnref(fInputStream); | |
105 } | |
106 | 102 |
107 Format getFormat() const SK_OVERRIDE { | 103 Format getFormat() const SK_OVERRIDE { |
108 return kWEBP_Format; | 104 return kWEBP_Format; |
109 } | 105 } |
110 | 106 |
111 protected: | 107 protected: |
112 bool onBuildTileIndex(SkStreamRewindable *stream, int *width, int *height) S
K_OVERRIDE; | 108 bool onBuildTileIndex(SkStreamRewindable *stream, int *width, int *height) S
K_OVERRIDE; |
113 bool onDecodeSubset(SkBitmap* bitmap, const SkIRect& rect) SK_OVERRIDE; | 109 bool onDecodeSubset(SkBitmap* bitmap, const SkIRect& rect) SK_OVERRIDE; |
114 Result onDecode(SkStream* stream, SkBitmap* bm, Mode) SK_OVERRIDE; | 110 Result onDecode(SkStream* stream, SkBitmap* bm, Mode) SK_OVERRIDE; |
115 | 111 |
116 private: | 112 private: |
117 /** | 113 /** |
118 * Called when determining the output config to request to webp. | 114 * Called when determining the output config to request to webp. |
119 * If the image does not have alpha, there is no need to premultiply. | 115 * If the image does not have alpha, there is no need to premultiply. |
120 * If the caller wants unpremultiplied colors, that is respected. | 116 * If the caller wants unpremultiplied colors, that is respected. |
121 */ | 117 */ |
122 bool shouldPremultiply() const { | 118 bool shouldPremultiply() const { |
123 return SkToBool(fHasAlpha) && !this->getRequireUnpremultipliedColors(); | 119 return SkToBool(fHasAlpha) && !this->getRequireUnpremultipliedColors(); |
124 } | 120 } |
125 | 121 |
126 bool setDecodeConfig(SkBitmap* decodedBitmap, int width, int height); | 122 bool setDecodeConfig(SkBitmap* decodedBitmap, int width, int height); |
127 | 123 |
128 SkStream* fInputStream; | 124 SkAutoTDelete<SkStream> fInputStream; |
129 int fOrigWidth; | 125 int fOrigWidth; |
130 int fOrigHeight; | 126 int fOrigHeight; |
131 int fHasAlpha; | 127 int fHasAlpha; |
132 | 128 |
133 typedef SkImageDecoder INHERITED; | 129 typedef SkImageDecoder INHERITED; |
134 }; | 130 }; |
135 | 131 |
136 ////////////////////////////////////////////////////////////////////////// | 132 ////////////////////////////////////////////////////////////////////////// |
137 | 133 |
138 #ifdef TIME_DECODE | 134 #ifdef TIME_DECODE |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
309 alphaType = kUnpremul_SkAlphaType; | 305 alphaType = kUnpremul_SkAlphaType; |
310 } else { | 306 } else { |
311 alphaType = kPremul_SkAlphaType; | 307 alphaType = kPremul_SkAlphaType; |
312 } | 308 } |
313 } | 309 } |
314 return decodedBitmap->setInfo(SkImageInfo::Make(width, height, colorType, al
phaType)); | 310 return decodedBitmap->setInfo(SkImageInfo::Make(width, height, colorType, al
phaType)); |
315 } | 311 } |
316 | 312 |
317 bool SkWEBPImageDecoder::onBuildTileIndex(SkStreamRewindable* stream, | 313 bool SkWEBPImageDecoder::onBuildTileIndex(SkStreamRewindable* stream, |
318 int *width, int *height) { | 314 int *width, int *height) { |
| 315 SkAutoTDelete<SkStreamRewindable> streamDeleter(stream); |
319 int origWidth, origHeight, hasAlpha; | 316 int origWidth, origHeight, hasAlpha; |
320 if (!webp_parse_header(stream, &origWidth, &origHeight, &hasAlpha)) { | 317 if (!webp_parse_header(stream, &origWidth, &origHeight, &hasAlpha)) { |
321 return false; | 318 return false; |
322 } | 319 } |
323 | 320 |
324 if (!stream->rewind()) { | 321 if (!stream->rewind()) { |
325 SkDebugf("Failed to rewind webp stream!"); | 322 SkDebugf("Failed to rewind webp stream!"); |
326 return false; | 323 return false; |
327 } | 324 } |
328 | 325 |
329 *width = origWidth; | 326 *width = origWidth; |
330 *height = origHeight; | 327 *height = origHeight; |
331 | 328 |
332 SkRefCnt_SafeAssign(this->fInputStream, stream); | 329 this->fInputStream.reset(streamDeleter.detach()); |
333 this->fOrigWidth = origWidth; | 330 this->fOrigWidth = origWidth; |
334 this->fOrigHeight = origHeight; | 331 this->fOrigHeight = origHeight; |
335 this->fHasAlpha = hasAlpha; | 332 this->fHasAlpha = hasAlpha; |
336 | 333 |
337 return true; | 334 return true; |
338 } | 335 } |
339 | 336 |
340 static bool is_config_compatible(const SkBitmap& bitmap) { | 337 static bool is_config_compatible(const SkBitmap& bitmap) { |
341 const SkColorType ct = bitmap.colorType(); | 338 const SkColorType ct = bitmap.colorType(); |
342 return ct == kARGB_4444_SkColorType || ct == kRGB_565_SkColorType || ct == k
N32_SkColorType; | 339 return ct == kARGB_4444_SkColorType || ct == kRGB_565_SkColorType || ct == k
N32_SkColorType; |
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
673 return SkImageDecoder::kUnknown_Format; | 670 return SkImageDecoder::kUnknown_Format; |
674 } | 671 } |
675 | 672 |
676 static SkImageEncoder* sk_libwebp_efactory(SkImageEncoder::Type t) { | 673 static SkImageEncoder* sk_libwebp_efactory(SkImageEncoder::Type t) { |
677 return (SkImageEncoder::kWEBP_Type == t) ? SkNEW(SkWEBPImageEncoder) : NUL
L; | 674 return (SkImageEncoder::kWEBP_Type == t) ? SkNEW(SkWEBPImageEncoder) : NUL
L; |
678 } | 675 } |
679 | 676 |
680 static SkImageDecoder_DecodeReg gDReg(sk_libwebp_dfactory); | 677 static SkImageDecoder_DecodeReg gDReg(sk_libwebp_dfactory); |
681 static SkImageDecoder_FormatReg gFormatReg(get_format_webp); | 678 static SkImageDecoder_FormatReg gFormatReg(get_format_webp); |
682 static SkImageEncoder_EncodeReg gEReg(sk_libwebp_efactory); | 679 static SkImageEncoder_EncodeReg gEReg(sk_libwebp_efactory); |
OLD | NEW |