Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(302)

Side by Side Diff: src/codec/SkPngCodec.cpp

Issue 2339233003: Support Float32 output from SkColorSpaceXform (Closed)
Patch Set: Some fixes Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 numColors - numColorsWithAlpha); 142 numColors - numColorsWithAlpha);
143 } else { 143 } else {
144 SkOpts::RGB_to_BGR1(colorTable + numColorsWithAlpha, palette, 144 SkOpts::RGB_to_BGR1(colorTable + numColorsWithAlpha, palette,
145 numColors - numColorsWithAlpha); 145 numColors - numColorsWithAlpha);
146 } 146 }
147 } 147 }
148 148
149 // If we are not decoding to F16, we can color xform now and store the resul ts 149 // If we are not decoding to F16, we can color xform now and store the resul ts
150 // in the color table. 150 // in the color table.
151 if (fColorXform && kRGBA_F16_SkColorType != dstInfo.colorType()) { 151 if (fColorXform && kRGBA_F16_SkColorType != dstInfo.colorType()) {
152 SkColorType xformColorType = is_rgba(dstInfo.colorType()) ? 152 SkColorSpaceXform::ColorFormat xformColorFormat = is_rgba(dstInfo.colorT ype()) ?
153 kRGBA_8888_SkColorType : kBGRA_8888_SkColorType; 153 SkColorSpaceXform::kRGBA_8888_ColorFormat :
154 SkAlphaType xformAlphaType = select_alpha_xform(dstInfo.alphaType(), 154 SkColorSpaceXform::kBGRA_8888_ColorFormat;
155 SkAlphaType xformAlphaType = select_xform_alpha(dstInfo.alphaType(),
155 this->getInfo().alphaTyp e()); 156 this->getInfo().alphaTyp e());
156 fColorXform->apply(colorTable, colorTable, numColors, xformColorType, xf ormAlphaType); 157 fColorXform->apply(colorTable, colorTable, numColors, xformColorFormat, xformAlphaType);
157 } 158 }
158 159
159 // Pad the color table with the last color in the table (or black) in the ca se that 160 // Pad the color table with the last color in the table (or black) in the ca se that
160 // invalid pixel indices exceed the number of colors in the table. 161 // invalid pixel indices exceed the number of colors in the table.
161 const int maxColors = 1 << fBitDepth; 162 const int maxColors = 1 << fBitDepth;
162 if (numColors < maxColors) { 163 if (numColors < maxColors) {
163 SkPMColor lastColor = numColors > 0 ? colorTable[numColors - 1] : SK_Col orBLACK; 164 SkPMColor lastColor = numColors > 0 ? colorTable[numColors - 1] : SK_Col orBLACK;
164 sk_memset32(colorTable + numColors, lastColor, maxColors - numColors); 165 sk_memset32(colorTable + numColors, lastColor, maxColors - numColors);
165 } 166 }
166 167
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
373 fStorage.reset(SkAlign4(fSrcRowBytes) + colorXformBytes); 374 fStorage.reset(SkAlign4(fSrcRowBytes) + colorXformBytes);
374 fSwizzlerSrcRow = fStorage.get(); 375 fSwizzlerSrcRow = fStorage.get();
375 fColorXformSrcRow = SkTAddOffset<uint32_t>(fSwizzlerSrcRow, SkAlign4 (fSrcRowBytes)); 376 fColorXformSrcRow = SkTAddOffset<uint32_t>(fSwizzlerSrcRow, SkAlign4 (fSrcRowBytes));
376 break; 377 break;
377 } 378 }
378 } 379 }
379 } 380 }
380 381
381 void SkPngCodec::applyXformRow(void* dst, const void* src, SkColorType colorType , 382 void SkPngCodec::applyXformRow(void* dst, const void* src, SkColorType colorType ,
382 SkAlphaType alphaType, int width) { 383 SkAlphaType alphaType, int width) {
384 SkColorSpaceXform::ColorFormat colorFormat = select_xform_format(colorType);
msarett 2016/09/14 20:20:35 Leon, ideally your PNG change can land first? I t
scroggo 2016/09/14 20:35:01 That depends. How much of a hurry are you to get t
msarett 2016/09/14 21:09:43 I'll probably want to write some stuff based on th
383 switch (fXformMode) { 385 switch (fXformMode) {
384 case kSwizzleOnly_XformMode: 386 case kSwizzleOnly_XformMode:
385 fSwizzler->swizzle(dst, (const uint8_t*) src); 387 fSwizzler->swizzle(dst, (const uint8_t*) src);
386 break; 388 break;
387 case kColorOnly_XformMode: 389 case kColorOnly_XformMode:
388 fColorXform->apply(dst, (const uint32_t*) src, width, colorType, alp haType); 390 fColorXform->apply(dst, (const uint32_t*) src, width, colorFormat, a lphaType);
389 break; 391 break;
390 case kSwizzleColor_XformMode: 392 case kSwizzleColor_XformMode:
391 fSwizzler->swizzle(fColorXformSrcRow, (const uint8_t*) src); 393 fSwizzler->swizzle(fColorXformSrcRow, (const uint8_t*) src);
392 fColorXform->apply(dst, fColorXformSrcRow, width, colorType, alphaTy pe); 394 fColorXform->apply(dst, fColorXformSrcRow, width, colorFormat, alpha Type);
393 break; 395 break;
394 } 396 }
395 } 397 }
396 398
397 class SkPngNormalCodec : public SkPngCodec { 399 class SkPngNormalCodec : public SkPngCodec {
398 public: 400 public:
399 SkPngNormalCodec(const SkEncodedInfo& encodedInfo, const SkImageInfo& imageI nfo, 401 SkPngNormalCodec(const SkEncodedInfo& encodedInfo, const SkImageInfo& imageI nfo,
400 SkStream* stream, SkPngChunkReader* chunkReader, png_structp png_ptr , 402 SkStream* stream, SkPngChunkReader* chunkReader, png_structp png_ptr ,
401 png_infop info_ptr, int bitDepth) 403 png_infop info_ptr, int bitDepth)
402 : INHERITED(encodedInfo, imageInfo, stream, chunkReader, png_ptr, info_p tr, bitDepth, 1) 404 : INHERITED(encodedInfo, imageInfo, stream, chunkReader, png_ptr, info_p tr, bitDepth, 1)
(...skipping 15 matching lines...) Expand all
418 override { 420 override {
419 SkASSERT(0 == startRow); 421 SkASSERT(0 == startRow);
420 422
421 // Assume that an error in libpng indicates an incomplete input. 423 // Assume that an error in libpng indicates an incomplete input.
422 int y = 0; 424 int y = 0;
423 if (setjmp(png_jmpbuf((png_struct*)fPng_ptr))) { 425 if (setjmp(png_jmpbuf((png_struct*)fPng_ptr))) {
424 SkCodecPrintf("Failed to read row.\n"); 426 SkCodecPrintf("Failed to read row.\n");
425 return y; 427 return y;
426 } 428 }
427 429
428 SkAlphaType xformAlphaType = select_alpha_xform(dstInfo.alphaType(), 430 SkAlphaType xformAlphaType = select_xform_alpha(dstInfo.alphaType(),
429 this->getInfo().alphaTyp e()); 431 this->getInfo().alphaTyp e());
430 int width = fSwizzler ? fSwizzler->swizzleWidth() : dstInfo.width(); 432 int width = fSwizzler ? fSwizzler->swizzleWidth() : dstInfo.width();
431 433
432 for (; y < count; y++) { 434 for (; y < count; y++) {
433 png_read_row(fPng_ptr, fSwizzlerSrcRow, nullptr); 435 png_read_row(fPng_ptr, fSwizzlerSrcRow, nullptr);
434 this->applyXformRow(dst, fSwizzlerSrcRow, dstInfo.colorType(), xform AlphaType, width); 436 this->applyXformRow(dst, fSwizzlerSrcRow, dstInfo.colorType(), xform AlphaType, width);
435 dst = SkTAddOffset<void>(dst, rowBytes); 437 dst = SkTAddOffset<void>(dst, rowBytes);
436 } 438 }
437 439
438 return y; 440 return y;
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
504 for (int y = 0; y < count; y++) { 506 for (int y = 0; y < count; y++) {
505 png_read_row(fPng_ptr, srcRow, nullptr); 507 png_read_row(fPng_ptr, srcRow, nullptr);
506 srcRow += fSrcRowBytes; 508 srcRow += fSrcRowBytes;
507 } 509 }
508 // Discard rows that we don't need. 510 // Discard rows that we don't need.
509 for (int y = 0; y < this->getInfo().height() - startRow - count; y++ ) { 511 for (int y = 0; y < this->getInfo().height() - startRow - count; y++ ) {
510 png_read_row(fPng_ptr, fSwizzlerSrcRow, nullptr); 512 png_read_row(fPng_ptr, fSwizzlerSrcRow, nullptr);
511 } 513 }
512 } 514 }
513 515
514 SkAlphaType xformAlphaType = select_alpha_xform(dstInfo.alphaType(), 516 SkAlphaType xformAlphaType = select_xform_alpha(dstInfo.alphaType(),
515 this->getInfo().alphaTyp e()); 517 this->getInfo().alphaTyp e());
516 int width = fSwizzler ? fSwizzler->swizzleWidth() : dstInfo.width(); 518 int width = fSwizzler ? fSwizzler->swizzleWidth() : dstInfo.width();
517 srcRow = storage.get(); 519 srcRow = storage.get();
518 for (int y = 0; y < count; y++) { 520 for (int y = 0; y < count; y++) {
519 this->applyXformRow(dst, srcRow, dstInfo.colorType(), xformAlphaType , width); 521 this->applyXformRow(dst, srcRow, dstInfo.colorType(), xformAlphaType , width);
520 srcRow = SkTAddOffset<uint8_t>(srcRow, fSrcRowBytes); 522 srcRow = SkTAddOffset<uint8_t>(srcRow, fSrcRowBytes);
521 dst = SkTAddOffset<void>(dst, rowBytes); 523 dst = SkTAddOffset<void>(dst, rowBytes);
522 } 524 }
523 525
524 return count; 526 return count;
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
895 *rowsDecoded = count; 897 *rowsDecoded = count;
896 return kIncompleteInput; 898 return kIncompleteInput;
897 } 899 }
898 900
899 return kSuccess; 901 return kSuccess;
900 } 902 }
901 903
902 uint64_t SkPngCodec::onGetFillValue(const SkImageInfo& dstInfo) const { 904 uint64_t SkPngCodec::onGetFillValue(const SkImageInfo& dstInfo) const {
903 const SkPMColor* colorPtr = get_color_ptr(fColorTable.get()); 905 const SkPMColor* colorPtr = get_color_ptr(fColorTable.get());
904 if (colorPtr) { 906 if (colorPtr) {
905 SkAlphaType alphaType = select_alpha_xform(dstInfo.alphaType(), 907 SkAlphaType alphaType = select_xform_alpha(dstInfo.alphaType(),
906 this->getInfo().alphaType()); 908 this->getInfo().alphaType());
907 return get_color_table_fill_value(dstInfo.colorType(), alphaType, colorP tr, 0, 909 return get_color_table_fill_value(dstInfo.colorType(), alphaType, colorP tr, 0,
908 fColorXform.get()); 910 fColorXform.get());
909 } 911 }
910 return INHERITED::onGetFillValue(dstInfo); 912 return INHERITED::onGetFillValue(dstInfo);
911 } 913 }
912 914
913 SkCodec* SkPngCodec::NewFromStream(SkStream* stream, SkPngChunkReader* chunkRead er) { 915 SkCodec* SkPngCodec::NewFromStream(SkStream* stream, SkPngChunkReader* chunkRead er) {
914 SkAutoTDelete<SkStream> streamDeleter(stream); 916 SkAutoTDelete<SkStream> streamDeleter(stream);
915 917
916 SkCodec* outCodec; 918 SkCodec* outCodec;
917 if (read_header(stream, chunkReader, &outCodec, nullptr, nullptr)) { 919 if (read_header(stream, chunkReader, &outCodec, nullptr, nullptr)) {
918 // Codec has taken ownership of the stream. 920 // Codec has taken ownership of the stream.
919 SkASSERT(outCodec); 921 SkASSERT(outCodec);
920 streamDeleter.release(); 922 streamDeleter.release();
921 return outCodec; 923 return outCodec;
922 } 924 }
923 925
924 return nullptr; 926 return nullptr;
925 } 927 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698