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 "SkCodecPriv.h" | 8 #include "SkCodecPriv.h" |
9 #include "SkColorSpaceXform.h" | 9 #include "SkColorSpaceXform.h" |
10 #include "SkWebpCodec.h" | 10 #include "SkWebpCodec.h" |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
137 break; | 137 break; |
138 default: | 138 default: |
139 return nullptr; | 139 return nullptr; |
140 } | 140 } |
141 | 141 |
142 SkEncodedInfo info = SkEncodedInfo::Make(color, alpha, 8); | 142 SkEncodedInfo info = SkEncodedInfo::Make(color, alpha, 8); |
143 return new SkWebpCodec(features.width, features.height, info, std::move(colo
rSpace), | 143 return new SkWebpCodec(features.width, features.height, info, std::move(colo
rSpace), |
144 streamDeleter.release(), demux.release(), std::move(d
ata)); | 144 streamDeleter.release(), demux.release(), std::move(d
ata)); |
145 } | 145 } |
146 | 146 |
| 147 static bool webp_conversion_possible(const SkImageInfo& dst, const SkImageInfo&
src, |
| 148 SkColorSpaceXform* colorXform) { |
| 149 if (!valid_alpha(dst.alphaType(), src.alphaType())) { |
| 150 return false; |
| 151 } |
| 152 |
| 153 switch (dst.colorType()) { |
| 154 case kRGBA_F16_SkColorType: |
| 155 return nullptr != colorXform; |
| 156 case kBGRA_8888_SkColorType: |
| 157 case kRGBA_8888_SkColorType: |
| 158 return true; |
| 159 case kRGB_565_SkColorType: |
| 160 return nullptr == colorXform && src.alphaType() == kOpaque_SkAlphaTy
pe; |
| 161 default: |
| 162 return false; |
| 163 } |
| 164 } |
| 165 |
147 SkISize SkWebpCodec::onGetScaledDimensions(float desiredScale) const { | 166 SkISize SkWebpCodec::onGetScaledDimensions(float desiredScale) const { |
148 SkISize dim = this->getInfo().dimensions(); | 167 SkISize dim = this->getInfo().dimensions(); |
149 // SkCodec treats zero dimensional images as errors, so the minimum size | 168 // SkCodec treats zero dimensional images as errors, so the minimum size |
150 // that we will recommend is 1x1. | 169 // that we will recommend is 1x1. |
151 dim.fWidth = SkTMax(1, SkScalarRoundToInt(desiredScale * dim.fWidth)); | 170 dim.fWidth = SkTMax(1, SkScalarRoundToInt(desiredScale * dim.fWidth)); |
152 dim.fHeight = SkTMax(1, SkScalarRoundToInt(desiredScale * dim.fHeight)); | 171 dim.fHeight = SkTMax(1, SkScalarRoundToInt(desiredScale * dim.fHeight)); |
153 return dim; | 172 return dim; |
154 } | 173 } |
155 | 174 |
156 bool SkWebpCodec::onDimensionsSupported(const SkISize& dim) { | 175 bool SkWebpCodec::onDimensionsSupported(const SkISize& dim) { |
(...skipping 29 matching lines...) Expand all Loading... |
186 // decode this exact subset. | 205 // decode this exact subset. |
187 // Leave right and bottom unmodified, so we suggest a slightly larger subset
than requested. | 206 // Leave right and bottom unmodified, so we suggest a slightly larger subset
than requested. |
188 desiredSubset->fLeft = (desiredSubset->fLeft >> 1) << 1; | 207 desiredSubset->fLeft = (desiredSubset->fLeft >> 1) << 1; |
189 desiredSubset->fTop = (desiredSubset->fTop >> 1) << 1; | 208 desiredSubset->fTop = (desiredSubset->fTop >> 1) << 1; |
190 return true; | 209 return true; |
191 } | 210 } |
192 | 211 |
193 SkCodec::Result SkWebpCodec::onGetPixels(const SkImageInfo& dstInfo, void* dst,
size_t rowBytes, | 212 SkCodec::Result SkWebpCodec::onGetPixels(const SkImageInfo& dstInfo, void* dst,
size_t rowBytes, |
194 const Options& options, SkPMColor*, int
*, | 213 const Options& options, SkPMColor*, int
*, |
195 int* rowsDecodedPtr) { | 214 int* rowsDecodedPtr) { |
196 if (!conversion_possible(dstInfo, this->getInfo())) { | |
197 return kInvalidConversion; | |
198 } | |
199 | 215 |
200 std::unique_ptr<SkColorSpaceXform> colorXform = nullptr; | 216 std::unique_ptr<SkColorSpaceXform> colorXform = nullptr; |
201 if (needs_color_xform(dstInfo, this->getInfo())) { | 217 if (needs_color_xform(dstInfo, this->getInfo())) { |
202 colorXform = SkColorSpaceXform::New(sk_ref_sp(this->getInfo().colorSpace
()), | 218 colorXform = SkColorSpaceXform::New(sk_ref_sp(this->getInfo().colorSpace
()), |
203 sk_ref_sp(dstInfo.colorSpace())); | 219 sk_ref_sp(dstInfo.colorSpace())); |
204 SkASSERT(colorXform); | 220 } |
| 221 |
| 222 if (!webp_conversion_possible(dstInfo, this->getInfo(), colorXform.get())) { |
| 223 return kInvalidConversion; |
205 } | 224 } |
206 | 225 |
207 WebPDecoderConfig config; | 226 WebPDecoderConfig config; |
208 if (0 == WebPInitDecoderConfig(&config)) { | 227 if (0 == WebPInitDecoderConfig(&config)) { |
209 // ABI mismatch. | 228 // ABI mismatch. |
210 // FIXME: New enum for this? | 229 // FIXME: New enum for this? |
211 return kInvalidInput; | 230 return kInvalidInput; |
212 } | 231 } |
213 | 232 |
214 // Free any memory associated with the buffer. Must be called last, so we de
clare it first. | 233 // Free any memory associated with the buffer. Must be called last, so we de
clare it first. |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 return result; | 341 return result; |
323 } | 342 } |
324 | 343 |
325 SkWebpCodec::SkWebpCodec(int width, int height, const SkEncodedInfo& info, | 344 SkWebpCodec::SkWebpCodec(int width, int height, const SkEncodedInfo& info, |
326 sk_sp<SkColorSpace> colorSpace, SkStream* stream, WebPD
emuxer* demux, | 345 sk_sp<SkColorSpace> colorSpace, SkStream* stream, WebPD
emuxer* demux, |
327 sk_sp<SkData> data) | 346 sk_sp<SkData> data) |
328 : INHERITED(width, height, info, stream, std::move(colorSpace)) | 347 : INHERITED(width, height, info, stream, std::move(colorSpace)) |
329 , fDemux(demux) | 348 , fDemux(demux) |
330 , fData(std::move(data)) | 349 , fData(std::move(data)) |
331 {} | 350 {} |
OLD | NEW |