OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 "SkCodec_libgif.h" | 8 #include "SkCodec_libgif.h" |
9 #include "SkCodecPriv.h" | 9 #include "SkCodecPriv.h" |
10 #include "SkColorPriv.h" | 10 #include "SkColorPriv.h" |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 // index was not found. | 129 // index was not found. |
130 return SK_MaxU32; | 130 return SK_MaxU32; |
131 } | 131 } |
132 | 132 |
133 /* | 133 /* |
134 * Assumes IsGif was called and returned true | 134 * Assumes IsGif was called and returned true |
135 * Creates a gif decoder | 135 * Creates a gif decoder |
136 * Reads enough of the stream to determine the image format | 136 * Reads enough of the stream to determine the image format |
137 */ | 137 */ |
138 SkCodec* SkGifCodec::NewFromStream(SkStream* stream) { | 138 SkCodec* SkGifCodec::NewFromStream(SkStream* stream) { |
| 139 SkAutoTDelete<SkStream> streamDeleter(stream); |
139 // Read gif header, logical screen descriptor, and global color table | 140 // Read gif header, logical screen descriptor, and global color table |
140 SkAutoTCallIProc<GifFileType, CloseGif> gif(open_gif(stream)); | 141 SkAutoTCallIProc<GifFileType, CloseGif> gif(open_gif(stream)); |
141 | 142 |
142 if (NULL == gif) { | 143 if (NULL == gif) { |
143 gif_error("DGifOpen failed.\n"); | 144 gif_error("DGifOpen failed.\n"); |
144 return NULL; | 145 return NULL; |
145 } | 146 } |
146 | 147 |
147 // Get fields from header | 148 // Get fields from header |
148 const int32_t width = gif->SWidth; | 149 const int32_t width = gif->SWidth; |
149 const int32_t height = gif->SHeight; | 150 const int32_t height = gif->SHeight; |
150 if (width <= 0 || height <= 0) { | 151 if (width <= 0 || height <= 0) { |
151 gif_error("Invalid dimensions.\n"); | 152 gif_error("Invalid dimensions.\n"); |
152 return NULL; | 153 return NULL; |
153 } | 154 } |
154 | 155 |
155 // Return the codec | 156 // Return the codec |
156 // kIndex is the most natural color type for gifs, so we set this as | 157 // kIndex is the most natural color type for gifs, so we set this as |
157 // the default. | 158 // the default. |
158 // Many gifs specify a color table index for transparent pixels. Every | 159 // Many gifs specify a color table index for transparent pixels. Every |
159 // other pixel is guaranteed to be opaque. Despite this, because of the | 160 // other pixel is guaranteed to be opaque. Despite this, because of the |
160 // possiblity of transparent pixels, we cannot assume that the image is | 161 // possiblity of transparent pixels, we cannot assume that the image is |
161 // opaque. We have the option to set the alpha type as kPremul or | 162 // opaque. We have the option to set the alpha type as kPremul or |
162 // kUnpremul. Both are valid since the alpha component will always be | 163 // kUnpremul. Both are valid since the alpha component will always be |
163 // 0xFF or the entire 32-bit pixel will be set to zero. We prefer | 164 // 0xFF or the entire 32-bit pixel will be set to zero. We prefer |
164 // kPremul because we support kPremul, and it is more efficient to | 165 // kPremul because we support kPremul, and it is more efficient to |
165 // use kPremul directly even when kUnpremul is supported. | 166 // use kPremul directly even when kUnpremul is supported. |
166 const SkImageInfo& imageInfo = SkImageInfo::Make(width, height, | 167 const SkImageInfo& imageInfo = SkImageInfo::Make(width, height, |
167 kIndex_8_SkColorType, kPremul_SkAlphaType); | 168 kIndex_8_SkColorType, kPremul_SkAlphaType); |
168 return SkNEW_ARGS(SkGifCodec, (imageInfo, stream, gif.detach())); | 169 return SkNEW_ARGS(SkGifCodec, (imageInfo, streamDeleter.detach(), gif.detach
())); |
169 } | 170 } |
170 | 171 |
171 SkGifCodec::SkGifCodec(const SkImageInfo& srcInfo, SkStream* stream, | 172 SkGifCodec::SkGifCodec(const SkImageInfo& srcInfo, SkStream* stream, |
172 GifFileType* gif) | 173 GifFileType* gif) |
173 : INHERITED(srcInfo, stream) | 174 : INHERITED(srcInfo, stream) |
174 , fGif(gif) | 175 , fGif(gif) |
175 {} | 176 {} |
176 | 177 |
177 /* | 178 /* |
178 * Checks if the conversion between the input image and the requested output | 179 * Checks if the conversion between the input image and the requested output |
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
508 // giflib returns an error code if the record type is not known. | 509 // giflib returns an error code if the record type is not known. |
509 // We should catch this error immediately. | 510 // We should catch this error immediately. |
510 SkASSERT(false); | 511 SkASSERT(false); |
511 break; | 512 break; |
512 } | 513 } |
513 } while (TERMINATE_RECORD_TYPE != recordType); | 514 } while (TERMINATE_RECORD_TYPE != recordType); |
514 | 515 |
515 return gif_error("Could not find any images to decode in gif file.\n", | 516 return gif_error("Could not find any images to decode in gif file.\n", |
516 kInvalidInput); | 517 kInvalidInput); |
517 } | 518 } |
OLD | NEW |