| 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 "SkBitmap.h" | 8 #include "SkBitmap.h" |
| 9 #include "SkCodecPriv.h" | 9 #include "SkCodecPriv.h" |
| 10 #include "SkColorPriv.h" | 10 #include "SkColorPriv.h" |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 fPng_ptr = nullptr; | 85 fPng_ptr = nullptr; |
| 86 fInfo_ptr = nullptr; | 86 fInfo_ptr = nullptr; |
| 87 } | 87 } |
| 88 | 88 |
| 89 private: | 89 private: |
| 90 png_structp fPng_ptr; | 90 png_structp fPng_ptr; |
| 91 png_infop fInfo_ptr; | 91 png_infop fInfo_ptr; |
| 92 }; | 92 }; |
| 93 #define AutoCleanPng(...) SK_REQUIRE_LOCAL_VAR(AutoCleanPng) | 93 #define AutoCleanPng(...) SK_REQUIRE_LOCAL_VAR(AutoCleanPng) |
| 94 | 94 |
| 95 static inline SkAlphaType xform_alpha_type(SkAlphaType dstAlphaType, SkAlphaType
srcAlphaType) { |
| 96 return (kOpaque_SkAlphaType == srcAlphaType) ? kOpaque_SkAlphaType : dstAlph
aType; |
| 97 } |
| 98 |
| 95 // Note: SkColorTable claims to store SkPMColors, which is not necessarily the c
ase here. | 99 // Note: SkColorTable claims to store SkPMColors, which is not necessarily the c
ase here. |
| 96 bool SkPngCodec::createColorTable(SkColorType dstColorType, bool premultiply, in
t* ctableCount) { | 100 bool SkPngCodec::createColorTable(const SkImageInfo& dstInfo, int* ctableCount)
{ |
| 97 | 101 |
| 98 int numColors; | 102 int numColors; |
| 99 png_color* palette; | 103 png_color* palette; |
| 100 if (!png_get_PLTE(fPng_ptr, fInfo_ptr, &palette, &numColors)) { | 104 if (!png_get_PLTE(fPng_ptr, fInfo_ptr, &palette, &numColors)) { |
| 101 return false; | 105 return false; |
| 102 } | 106 } |
| 103 | 107 |
| 104 // Note: These are not necessarily SkPMColors. | 108 // Contents depend on tableColorType and our choice of if/when to premultipl
y: |
| 105 SkPMColor colorPtr[256]; | 109 // { kPremul, kUnpremul, kOpaque } x { RGBA, BGRA } |
| 110 SkPMColor colorTable[256]; |
| 111 SkColorType tableColorType = fColorXform ? kRGBA_8888_SkColorType : dstInfo.
colorType(); |
| 106 | 112 |
| 107 png_bytep alphas; | 113 png_bytep alphas; |
| 108 int numColorsWithAlpha = 0; | 114 int numColorsWithAlpha = 0; |
| 109 if (png_get_tRNS(fPng_ptr, fInfo_ptr, &alphas, &numColorsWithAlpha, nullptr)
) { | 115 if (png_get_tRNS(fPng_ptr, fInfo_ptr, &alphas, &numColorsWithAlpha, nullptr)
) { |
| 116 // If we are performing a color xform, it will handle the premultiply.
Otherwise, |
| 117 // we'll do it here. |
| 118 bool premultiply = !fColorXform && needs_premul(dstInfo, this->getInfo(
)); |
| 119 |
| 110 // Choose which function to use to create the color table. If the final
destination's | 120 // Choose which function to use to create the color table. If the final
destination's |
| 111 // colortype is unpremultiplied, the color table will store unpremultipl
ied colors. | 121 // colortype is unpremultiplied, the color table will store unpremultipl
ied colors. |
| 112 PackColorProc proc = choose_pack_color_proc(premultiply, dstColorType); | 122 PackColorProc proc = choose_pack_color_proc(premultiply, tableColorType)
; |
| 113 | 123 |
| 114 for (int i = 0; i < numColorsWithAlpha; i++) { | 124 for (int i = 0; i < numColorsWithAlpha; i++) { |
| 115 // We don't have a function in SkOpts that combines a set of alphas
with a set | 125 // We don't have a function in SkOpts that combines a set of alphas
with a set |
| 116 // of RGBs. We could write one, but it's hardly worth it, given tha
t this | 126 // of RGBs. We could write one, but it's hardly worth it, given tha
t this |
| 117 // is such a small fraction of the total decode time. | 127 // is such a small fraction of the total decode time. |
| 118 colorPtr[i] = proc(alphas[i], palette->red, palette->green, palette-
>blue); | 128 colorTable[i] = proc(alphas[i], palette->red, palette->green, palett
e->blue); |
| 119 palette++; | 129 palette++; |
| 120 } | 130 } |
| 121 } | 131 } |
| 122 | 132 |
| 123 if (numColorsWithAlpha < numColors) { | 133 if (numColorsWithAlpha < numColors) { |
| 124 // The optimized code depends on a 3-byte png_color struct with the colo
rs | 134 // The optimized code depends on a 3-byte png_color struct with the colo
rs |
| 125 // in RGB order. These checks make sure it is safe to use. | 135 // in RGB order. These checks make sure it is safe to use. |
| 126 static_assert(3 == sizeof(png_color), "png_color struct has changed. Op
ts are broken."); | 136 static_assert(3 == sizeof(png_color), "png_color struct has changed. Op
ts are broken."); |
| 127 #ifdef SK_DEBUG | 137 #ifdef SK_DEBUG |
| 128 SkASSERT(&palette->red < &palette->green); | 138 SkASSERT(&palette->red < &palette->green); |
| 129 SkASSERT(&palette->green < &palette->blue); | 139 SkASSERT(&palette->green < &palette->blue); |
| 130 #endif | 140 #endif |
| 131 | 141 |
| 132 if (is_rgba(dstColorType)) { | 142 if (is_rgba(tableColorType)) { |
| 133 SkOpts::RGB_to_RGB1(colorPtr + numColorsWithAlpha, palette, | 143 SkOpts::RGB_to_RGB1(colorTable + numColorsWithAlpha, palette, |
| 134 numColors - numColorsWithAlpha); | 144 numColors - numColorsWithAlpha); |
| 135 } else { | 145 } else { |
| 136 SkOpts::RGB_to_BGR1(colorPtr + numColorsWithAlpha, palette, | 146 SkOpts::RGB_to_BGR1(colorTable + numColorsWithAlpha, palette, |
| 137 numColors - numColorsWithAlpha); | 147 numColors - numColorsWithAlpha); |
| 138 } | 148 } |
| 139 } | 149 } |
| 140 | 150 |
| 151 // If we are not decoding to F16, we can color xform now and store the resul
ts |
| 152 // in the color table. |
| 153 if (fColorXform && kRGBA_F16_SkColorType != dstInfo.colorType()) { |
| 154 SkColorType xformColorType = is_rgba(dstInfo.colorType()) ? |
| 155 kRGBA_8888_SkColorType : kBGRA_8888_SkColorType; |
| 156 SkAlphaType xformAlphaType = xform_alpha_type(dstInfo.alphaType(), |
| 157 this->getInfo().alphaType(
)); |
| 158 fColorXform->apply(colorTable, colorTable, numColors, xformColorType, xf
ormAlphaType); |
| 159 } |
| 160 |
| 141 // Pad the color table with the last color in the table (or black) in the ca
se that | 161 // Pad the color table with the last color in the table (or black) in the ca
se that |
| 142 // invalid pixel indices exceed the number of colors in the table. | 162 // invalid pixel indices exceed the number of colors in the table. |
| 143 const int maxColors = 1 << fBitDepth; | 163 const int maxColors = 1 << fBitDepth; |
| 144 if (numColors < maxColors) { | 164 if (numColors < maxColors) { |
| 145 SkPMColor lastColor = numColors > 0 ? colorPtr[numColors - 1] : SK_Color
BLACK; | 165 SkPMColor lastColor = numColors > 0 ? colorTable[numColors - 1] : SK_Col
orBLACK; |
| 146 sk_memset32(colorPtr + numColors, lastColor, maxColors - numColors); | 166 sk_memset32(colorTable + numColors, lastColor, maxColors - numColors); |
| 147 } | 167 } |
| 148 | 168 |
| 149 // Set the new color count. | 169 // Set the new color count. |
| 150 if (ctableCount != nullptr) { | 170 if (ctableCount != nullptr) { |
| 151 *ctableCount = maxColors; | 171 *ctableCount = maxColors; |
| 152 } | 172 } |
| 153 | 173 |
| 154 fColorTable.reset(new SkColorTable(colorPtr, maxColors)); | 174 fColorTable.reset(new SkColorTable(colorTable, maxColors)); |
| 155 return true; | 175 return true; |
| 156 } | 176 } |
| 157 | 177 |
| 158 /////////////////////////////////////////////////////////////////////////////// | 178 /////////////////////////////////////////////////////////////////////////////// |
| 159 // Creation | 179 // Creation |
| 160 /////////////////////////////////////////////////////////////////////////////// | 180 /////////////////////////////////////////////////////////////////////////////// |
| 161 | 181 |
| 162 bool SkPngCodec::IsPng(const char* buf, size_t bytesRead) { | 182 bool SkPngCodec::IsPng(const char* buf, size_t bytesRead) { |
| 163 return !png_sig_cmp((png_bytep) buf, (png_size_t)0, bytesRead); | 183 return !png_sig_cmp((png_bytep) buf, (png_size_t)0, bytesRead); |
| 164 } | 184 } |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 360 | 380 |
| 361 void SkPngCodec::allocateStorage() { | 381 void SkPngCodec::allocateStorage() { |
| 362 size_t colorXformBytes = fColorXform ? fSwizzler->swizzleWidth() * sizeof(ui
nt32_t) : 0; | 382 size_t colorXformBytes = fColorXform ? fSwizzler->swizzleWidth() * sizeof(ui
nt32_t) : 0; |
| 363 | 383 |
| 364 fStorage.reset(SkAlign4(fSrcRowBytes) + colorXformBytes); | 384 fStorage.reset(SkAlign4(fSrcRowBytes) + colorXformBytes); |
| 365 fSwizzlerSrcRow = fStorage.get(); | 385 fSwizzlerSrcRow = fStorage.get(); |
| 366 fColorXformSrcRow = | 386 fColorXformSrcRow = |
| 367 fColorXform ? SkTAddOffset<uint32_t>(fSwizzlerSrcRow, SkAlign4(fSrcR
owBytes)) : 0; | 387 fColorXform ? SkTAddOffset<uint32_t>(fSwizzlerSrcRow, SkAlign4(fSrcR
owBytes)) : 0; |
| 368 } | 388 } |
| 369 | 389 |
| 390 static inline bool apply_xform_on_decode(SkColorType dstColorType, SkEncodedInfo
::Color srcColor) { |
| 391 // We will apply the color xform when reading the color table, unless F16 is
requested. |
| 392 return SkEncodedInfo::kPalette_Color != srcColor || kRGBA_F16_SkColorType ==
dstColorType; |
| 393 } |
| 394 |
| 370 class SkPngNormalCodec : public SkPngCodec { | 395 class SkPngNormalCodec : public SkPngCodec { |
| 371 public: | 396 public: |
| 372 SkPngNormalCodec(const SkEncodedInfo& encodedInfo, const SkImageInfo& imageI
nfo, | 397 SkPngNormalCodec(const SkEncodedInfo& encodedInfo, const SkImageInfo& imageI
nfo, |
| 373 SkStream* stream, SkPngChunkReader* chunkReader, png_structp png_ptr
, | 398 SkStream* stream, SkPngChunkReader* chunkReader, png_structp png_ptr
, |
| 374 png_infop info_ptr, int bitDepth) | 399 png_infop info_ptr, int bitDepth) |
| 375 : INHERITED(encodedInfo, imageInfo, stream, chunkReader, png_ptr, info_p
tr, bitDepth, 1) | 400 : INHERITED(encodedInfo, imageInfo, stream, chunkReader, png_ptr, info_p
tr, bitDepth, 1) |
| 376 {} | 401 {} |
| 377 | 402 |
| 378 Result onStartScanlineDecode(const SkImageInfo& dstInfo, const Options& opti
ons, | 403 Result onStartScanlineDecode(const SkImageInfo& dstInfo, const Options& opti
ons, |
| 379 SkPMColor ctable[], int* ctableCount) override { | 404 SkPMColor ctable[], int* ctableCount) override { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 393 | 418 |
| 394 // Assume that an error in libpng indicates an incomplete input. | 419 // Assume that an error in libpng indicates an incomplete input. |
| 395 int y = 0; | 420 int y = 0; |
| 396 if (setjmp(png_jmpbuf(fPng_ptr))) { | 421 if (setjmp(png_jmpbuf(fPng_ptr))) { |
| 397 SkCodecPrintf("Failed to read row.\n"); | 422 SkCodecPrintf("Failed to read row.\n"); |
| 398 return y; | 423 return y; |
| 399 } | 424 } |
| 400 | 425 |
| 401 void* swizzlerDstRow = dst; | 426 void* swizzlerDstRow = dst; |
| 402 size_t swizzlerDstRowBytes = rowBytes; | 427 size_t swizzlerDstRowBytes = rowBytes; |
| 403 if (fColorXform) { | 428 |
| 429 bool colorXform = fColorXform && |
| 430 apply_xform_on_decode(dstInfo.colorType(), this->getEncodedInfo(
).color()); |
| 431 if (colorXform) { |
| 404 swizzlerDstRow = fColorXformSrcRow; | 432 swizzlerDstRow = fColorXformSrcRow; |
| 405 swizzlerDstRowBytes = 0; | 433 swizzlerDstRowBytes = 0; |
| 406 } | 434 } |
| 407 | 435 |
| 408 SkAlphaType xformAlphaType = (kOpaque_SkAlphaType == this->getInfo().alp
haType()) ? | 436 SkAlphaType xformAlphaType = xform_alpha_type(dstInfo.alphaType(), |
| 409 kOpaque_SkAlphaType : dstInfo.alphaType(); | 437 this->getInfo().alphaType(
)); |
| 410 for (; y < count; y++) { | 438 for (; y < count; y++) { |
| 411 png_read_row(fPng_ptr, fSwizzlerSrcRow, nullptr); | 439 png_read_row(fPng_ptr, fSwizzlerSrcRow, nullptr); |
| 412 fSwizzler->swizzle(swizzlerDstRow, fSwizzlerSrcRow); | 440 fSwizzler->swizzle(swizzlerDstRow, fSwizzlerSrcRow); |
| 413 | 441 |
| 414 if (fColorXform) { | 442 if (colorXform) { |
| 415 fColorXform->apply(dst, (const uint32_t*) swizzlerDstRow, fSwizz
ler->swizzleWidth(), | 443 fColorXform->apply(dst, (const uint32_t*) swizzlerDstRow, fSwizz
ler->swizzleWidth(), |
| 416 dstInfo.colorType(), xformAlphaType); | 444 dstInfo.colorType(), xformAlphaType); |
| 417 dst = SkTAddOffset<void>(dst, rowBytes); | 445 dst = SkTAddOffset<void>(dst, rowBytes); |
| 418 } | 446 } |
| 419 | 447 |
| 420 swizzlerDstRow = SkTAddOffset<void>(swizzlerDstRow, swizzlerDstRowBy
tes); | 448 swizzlerDstRow = SkTAddOffset<void>(swizzlerDstRow, swizzlerDstRowBy
tes); |
| 421 } | 449 } |
| 422 | 450 |
| 423 return y; | 451 return y; |
| 424 } | 452 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 435 | 463 |
| 436 for (int row = 0; row < count; row++) { | 464 for (int row = 0; row < count; row++) { |
| 437 png_read_row(fPng_ptr, fSwizzlerSrcRow, nullptr); | 465 png_read_row(fPng_ptr, fSwizzlerSrcRow, nullptr); |
| 438 } | 466 } |
| 439 return true; | 467 return true; |
| 440 } | 468 } |
| 441 | 469 |
| 442 typedef SkPngCodec INHERITED; | 470 typedef SkPngCodec INHERITED; |
| 443 }; | 471 }; |
| 444 | 472 |
| 445 | |
| 446 class SkPngInterlacedCodec : public SkPngCodec { | 473 class SkPngInterlacedCodec : public SkPngCodec { |
| 447 public: | 474 public: |
| 448 SkPngInterlacedCodec(const SkEncodedInfo& encodedInfo, const SkImageInfo& im
ageInfo, | 475 SkPngInterlacedCodec(const SkEncodedInfo& encodedInfo, const SkImageInfo& im
ageInfo, |
| 449 SkStream* stream, SkPngChunkReader* chunkReader, png_structp png_ptr
, | 476 SkStream* stream, SkPngChunkReader* chunkReader, png_structp png_ptr
, |
| 450 png_infop info_ptr, int bitDepth, int numberPasses) | 477 png_infop info_ptr, int bitDepth, int numberPasses) |
| 451 : INHERITED(encodedInfo, imageInfo, stream, chunkReader, png_ptr, info_p
tr, bitDepth, | 478 : INHERITED(encodedInfo, imageInfo, stream, chunkReader, png_ptr, info_p
tr, bitDepth, |
| 452 numberPasses) | 479 numberPasses) |
| 453 , fCanSkipRewind(false) | 480 , fCanSkipRewind(false) |
| 454 { | 481 { |
| 455 SkASSERT(numberPasses != 1); | 482 SkASSERT(numberPasses != 1); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 493 } | 520 } |
| 494 // Discard rows that we don't need. | 521 // Discard rows that we don't need. |
| 495 for (int y = 0; y < this->getInfo().height() - startRow - count; y++
) { | 522 for (int y = 0; y < this->getInfo().height() - startRow - count; y++
) { |
| 496 png_read_row(fPng_ptr, fSwizzlerSrcRow, nullptr); | 523 png_read_row(fPng_ptr, fSwizzlerSrcRow, nullptr); |
| 497 } | 524 } |
| 498 } | 525 } |
| 499 | 526 |
| 500 // Swizzle and xform the rows we care about | 527 // Swizzle and xform the rows we care about |
| 501 void* swizzlerDstRow = dst; | 528 void* swizzlerDstRow = dst; |
| 502 size_t swizzlerDstRowBytes = rowBytes; | 529 size_t swizzlerDstRowBytes = rowBytes; |
| 503 if (fColorXform) { | 530 |
| 531 bool colorXform = fColorXform && |
| 532 apply_xform_on_decode(dstInfo.colorType(), this->getEncodedInfo(
).color()); |
| 533 if (colorXform) { |
| 504 swizzlerDstRow = fColorXformSrcRow; | 534 swizzlerDstRow = fColorXformSrcRow; |
| 505 swizzlerDstRowBytes = 0; | 535 swizzlerDstRowBytes = 0; |
| 506 } | 536 } |
| 507 | 537 |
| 508 SkAlphaType xformAlphaType = (kOpaque_SkAlphaType == this->getInfo().alp
haType()) ? | 538 SkAlphaType xformAlphaType = xform_alpha_type(dstInfo.alphaType(), |
| 509 kOpaque_SkAlphaType : dstInfo.alphaType(); | 539 this->getInfo().alphaType(
)); |
| 510 srcRow = storage.get(); | 540 srcRow = storage.get(); |
| 511 for (int y = 0; y < count; y++) { | 541 for (int y = 0; y < count; y++) { |
| 512 fSwizzler->swizzle(swizzlerDstRow, srcRow); | 542 fSwizzler->swizzle(swizzlerDstRow, srcRow); |
| 513 srcRow = SkTAddOffset<uint8_t>(srcRow, fSrcRowBytes); | 543 srcRow = SkTAddOffset<uint8_t>(srcRow, fSrcRowBytes); |
| 514 | 544 |
| 515 if (fColorXform) { | 545 if (colorXform) { |
| 516 if (fColorXform) { | 546 fColorXform->apply(dst, (const uint32_t*) swizzlerDstRow, fSwizz
ler->swizzleWidth(), |
| 517 fColorXform->apply(dst, (const uint32_t*) swizzlerDstRow, | 547 dstInfo.colorType(), xformAlphaType); |
| 518 fSwizzler->swizzleWidth(), dstInfo.colorT
ype(), | 548 dst = SkTAddOffset<void>(dst, rowBytes); |
| 519 xformAlphaType); | |
| 520 dst = SkTAddOffset<void>(dst, rowBytes); | |
| 521 } | |
| 522 } | 549 } |
| 523 | 550 |
| 524 swizzlerDstRow = SkTAddOffset<void>(swizzlerDstRow, swizzlerDstRowBy
tes); | 551 swizzlerDstRow = SkTAddOffset<void>(swizzlerDstRow, swizzlerDstRowBy
tes); |
| 525 } | 552 } |
| 526 | 553 |
| 527 return count; | 554 return count; |
| 528 } | 555 } |
| 529 | 556 |
| 530 int onGetScanlines(void* dst, int count, size_t rowBytes) override { | 557 int onGetScanlines(void* dst, int count, size_t rowBytes) override { |
| 531 // rewind stream if have previously called onGetScanlines, | 558 // rewind stream if have previously called onGetScanlines, |
| (...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 795 if (needsColorXform) { | 822 if (needsColorXform) { |
| 796 switch (dstInfo.colorType()) { | 823 switch (dstInfo.colorType()) { |
| 797 case kRGBA_8888_SkColorType: | 824 case kRGBA_8888_SkColorType: |
| 798 case kBGRA_8888_SkColorType: | 825 case kBGRA_8888_SkColorType: |
| 799 case kRGBA_F16_SkColorType: | 826 case kRGBA_F16_SkColorType: |
| 800 swizzlerInfo = swizzlerInfo.makeColorType(kRGBA_8888_SkColorType
); | 827 swizzlerInfo = swizzlerInfo.makeColorType(kRGBA_8888_SkColorType
); |
| 801 if (kPremul_SkAlphaType == dstInfo.alphaType()) { | 828 if (kPremul_SkAlphaType == dstInfo.alphaType()) { |
| 802 swizzlerInfo = swizzlerInfo.makeAlphaType(kUnpremul_SkAlphaT
ype); | 829 swizzlerInfo = swizzlerInfo.makeAlphaType(kUnpremul_SkAlphaT
ype); |
| 803 } | 830 } |
| 804 break; | 831 break; |
| 832 case kIndex_8_SkColorType: |
| 833 break; |
| 805 default: | 834 default: |
| 806 return false; | 835 return false; |
| 807 } | 836 } |
| 808 | 837 |
| 809 fColorXform = SkColorSpaceXform::New(sk_ref_sp(this->getInfo().colorSpac
e()), | 838 fColorXform = SkColorSpaceXform::New(sk_ref_sp(this->getInfo().colorSpac
e()), |
| 810 sk_ref_sp(dstInfo.colorSpace())); | 839 sk_ref_sp(dstInfo.colorSpace())); |
| 811 | 840 |
| 812 if (!fColorXform && kRGBA_F16_SkColorType == dstInfo.colorType()) { | 841 if (!fColorXform && kRGBA_F16_SkColorType == dstInfo.colorType()) { |
| 813 return false; | 842 return false; |
| 814 } | 843 } |
| 815 } | 844 } |
| 816 | 845 |
| 817 if (SkEncodedInfo::kPalette_Color == this->getEncodedInfo().color()) { | 846 if (SkEncodedInfo::kPalette_Color == this->getEncodedInfo().color()) { |
| 818 if (!this->createColorTable(swizzlerInfo.colorType(), | 847 if (!this->createColorTable(dstInfo, ctableCount)) { |
| 819 kPremul_SkAlphaType == swizzlerInfo.alphaTyp
e(), ctableCount)) { | |
| 820 return false; | 848 return false; |
| 821 } | 849 } |
| 822 } | 850 } |
| 823 | 851 |
| 824 // Copy the color table to the client if they request kIndex8 mode | 852 // Copy the color table to the client if they request kIndex8 mode |
| 825 copy_color_table(swizzlerInfo, fColorTable, ctable, ctableCount); | 853 copy_color_table(swizzlerInfo, fColorTable, ctable, ctableCount); |
| 826 | 854 |
| 827 // Create the swizzler. SkPngCodec retains ownership of the color table. | 855 // Create the swizzler. SkPngCodec retains ownership of the color table. |
| 828 const SkPMColor* colors = get_color_ptr(fColorTable.get()); | 856 const SkPMColor* colors = get_color_ptr(fColorTable.get()); |
| 829 fSwizzler.reset(SkSwizzler::CreateSwizzler(this->getEncodedInfo(), colors, s
wizzlerInfo, | 857 fSwizzler.reset(SkSwizzler::CreateSwizzler(this->getEncodedInfo(), colors, s
wizzlerInfo, |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 889 SkCodec* outCodec; | 917 SkCodec* outCodec; |
| 890 if (read_header(stream, chunkReader, &outCodec, nullptr, nullptr)) { | 918 if (read_header(stream, chunkReader, &outCodec, nullptr, nullptr)) { |
| 891 // Codec has taken ownership of the stream. | 919 // Codec has taken ownership of the stream. |
| 892 SkASSERT(outCodec); | 920 SkASSERT(outCodec); |
| 893 streamDeleter.release(); | 921 streamDeleter.release(); |
| 894 return outCodec; | 922 return outCodec; |
| 895 } | 923 } |
| 896 | 924 |
| 897 return nullptr; | 925 return nullptr; |
| 898 } | 926 } |
| OLD | NEW |