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.h" | 8 #include "SkCodec.h" |
9 #include "SkCodecPriv.h" | 9 #include "SkCodecPriv.h" |
10 #include "SkMath.h" | 10 #include "SkMath.h" |
11 #include "SkSampledCodec.h" | 11 #include "SkSampledCodec.h" |
| 12 #include "SkTemplates.h" |
12 | 13 |
13 SkSampledCodec::SkSampledCodec(SkCodec* codec) | 14 SkSampledCodec::SkSampledCodec(SkCodec* codec) |
14 : INHERITED(codec->getInfo()) | 15 : INHERITED(codec->getInfo()) |
15 , fCodec(codec) | 16 , fCodec(codec) |
16 {} | 17 {} |
17 | 18 |
18 SkISize SkSampledCodec::accountForNativeScaling(int* sampleSizePtr, int* nativeS
ampleSize) const { | 19 SkISize SkSampledCodec::accountForNativeScaling(int* sampleSizePtr, int* nativeS
ampleSize) const { |
19 SkISize preSampledSize = fCodec->getInfo().dimensions(); | 20 SkISize preSampledSize = fCodec->getInfo().dimensions(); |
20 int sampleSize = *sampleSizePtr; | 21 int sampleSize = *sampleSizePtr; |
21 SkASSERT(sampleSize > 1); | 22 SkASSERT(sampleSize > 1); |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
260 continue; | 261 continue; |
261 } | 262 } |
262 | 263 |
263 void* rowPtr = SkTAddOffset<void>(pixels, rowBytes * get_dst_coo
rd(srcY, sampleY)); | 264 void* rowPtr = SkTAddOffset<void>(pixels, rowBytes * get_dst_coo
rd(srcY, sampleY)); |
264 SkSampler::Fill(fillInfo, rowPtr, rowBytes, fillValue, options.f
ZeroInitialized); | 265 SkSampler::Fill(fillInfo, rowPtr, rowBytes, fillValue, options.f
ZeroInitialized); |
265 } | 266 } |
266 return SkCodec::kIncompleteInput; | 267 return SkCodec::kIncompleteInput; |
267 } | 268 } |
268 case SkCodec::kNone_SkScanlineOrder: { | 269 case SkCodec::kNone_SkScanlineOrder: { |
269 const int linesNeeded = subsetHeight - samplingOffsetY; | 270 const int linesNeeded = subsetHeight - samplingOffsetY; |
270 SkAutoMalloc storage(linesNeeded * rowBytes); | 271 SkAutoTMalloc<uint8_t> storage(linesNeeded * rowBytes); |
271 uint8_t* storagePtr = static_cast<uint8_t*>(storage.get()); | 272 uint8_t* storagePtr = storage.get(); |
272 | 273 |
273 if (!fCodec->skipScanlines(startY)) { | 274 if (!fCodec->skipScanlines(startY)) { |
274 fCodec->fillIncompleteImage(info, pixels, rowBytes, options.fZer
oInitialized, | 275 fCodec->fillIncompleteImage(info, pixels, rowBytes, options.fZer
oInitialized, |
275 dstHeight, 0); | 276 dstHeight, 0); |
276 return SkCodec::kIncompleteInput; | 277 return SkCodec::kIncompleteInput; |
277 } | 278 } |
278 int scanlines = fCodec->getScanlines(storagePtr, linesNeeded, rowByt
es); | 279 int scanlines = fCodec->getScanlines(storagePtr, linesNeeded, rowByt
es); |
279 | 280 |
280 for (int y = 0; y < dstHeight; y++) { | 281 for (int y = 0; y < dstHeight; y++) { |
281 memcpy(pixels, storagePtr, info.minRowBytes()); | 282 memcpy(pixels, storagePtr, info.minRowBytes()); |
282 storagePtr += sampleY * rowBytes; | 283 storagePtr += sampleY * rowBytes; |
283 pixels = SkTAddOffset<void>(pixels, rowBytes); | 284 pixels = SkTAddOffset<void>(pixels, rowBytes); |
284 } | 285 } |
285 | 286 |
286 if (scanlines < dstHeight) { | 287 if (scanlines < dstHeight) { |
287 // fCodec has already handled filling uninitialized memory. | 288 // fCodec has already handled filling uninitialized memory. |
288 return SkCodec::kIncompleteInput; | 289 return SkCodec::kIncompleteInput; |
289 } | 290 } |
290 return SkCodec::kSuccess; | 291 return SkCodec::kSuccess; |
291 } | 292 } |
292 default: | 293 default: |
293 SkASSERT(false); | 294 SkASSERT(false); |
294 return SkCodec::kUnimplemented; | 295 return SkCodec::kUnimplemented; |
295 } | 296 } |
296 } | 297 } |
OLD | NEW |