diff options
author | 2017-07-10 19:51:46 +0000 | |
---|---|---|
committer | 2017-07-10 19:51:59 +0000 | |
commit | 8321f7585b6aded0c35e50e9af8709b25fdce3f6 (patch) | |
tree | 9a9e3a1843c8864a9e847d0c7b59b987946f6b24 /dm | |
parent | a48ae6ec2feb32e3d781ad43353209a90059a01d (diff) |
Revert "Remove support for decoding to kIndex_8"
This reverts commit 742a3e298fda669006147e4a305bab8452369b1f.
Reason for revert: Breaking Android roll:
frameworks/base/core/jni/android/graphics/BitmapFactory.cpp:453:18: error: no member named 'fColorPtr' in 'SkAndroidCodec::AndroidOptions'
codecOptions.fColorPtr = colorPtr;
~~~~~~~~~~~~ ^
frameworks/base/core/jni/android/graphics/BitmapFactory.cpp:454:18: error: no member named 'fColorCount' in 'SkAndroidCodec::AndroidOptions'
codecOptions.fColorCount = colorCount;
~~~~~~~~~~~~ ^
Original change's description:
> Remove support for decoding to kIndex_8
>
> Fix up callsites, and remove tests that no longer make sense.
>
> Bug: skia:6828
> Change-Id: I2548c4b7528b7b1be7412563156f27b52c9d4295
> Reviewed-on: https://skia-review.googlesource.com/21664
> Reviewed-by: Derek Sollenberger <djsollen@google.com>
> Commit-Queue: Leon Scroggins <scroggo@google.com>
TBR=djsollen@google.com,scroggo@google.com
Change-Id: I1bc669441f250690884e75a9a61427fdf75c6907
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: skia:6828
Reviewed-on: https://skia-review.googlesource.com/22120
Reviewed-by: Leon Scroggins <scroggo@google.com>
Commit-Queue: Leon Scroggins <scroggo@google.com>
Diffstat (limited to 'dm')
-rw-r--r-- | dm/DMSrcSink.cpp | 64 |
1 files changed, 43 insertions, 21 deletions
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp index fb78d84023..0febd2abb0 100644 --- a/dm/DMSrcSink.cpp +++ b/dm/DMSrcSink.cpp @@ -343,9 +343,12 @@ static void premultiply_if_necessary(SkBitmap& bitmap) { SkOpts::RGBA_to_rgbA(row, row, bitmap.width()); } break; - case kIndex_8_SkColorType: - SkASSERT(false); + case kIndex_8_SkColorType: { + SkColorTable* colorTable = bitmap.getColorTable(); + SkPMColor* colorPtr = const_cast<SkPMColor*>(colorTable->readColors()); + SkOpts::RGBA_to_rgbA(colorPtr, colorPtr, colorTable->count()); break; + } default: // No need to premultiply kGray or k565 outputs. break; @@ -397,10 +400,11 @@ static bool get_decode_info(SkImageInfo* decodeInfo, SkColorType canvasColorType } static void draw_to_canvas(SkCanvas* canvas, const SkImageInfo& info, void* pixels, size_t rowBytes, - CodecSrc::DstColorType dstColorType, + SkPMColor* colorPtr, int colorCount, CodecSrc::DstColorType dstColorType, SkScalar left = 0, SkScalar top = 0) { + sk_sp<SkColorTable> colorTable(new SkColorTable(colorPtr, colorCount)); SkBitmap bitmap; - bitmap.installPixels(info, pixels, rowBytes); + bitmap.installPixels(info, pixels, rowBytes, colorTable.get(), nullptr, nullptr); premultiply_if_necessary(bitmap); swap_rb_if_necessary(bitmap, dstColorType); canvas->drawBitmap(bitmap, left, top); @@ -453,6 +457,8 @@ Error CodecSrc::draw(SkCanvas* canvas) const { const size_t rowBytes = size.width() * bpp; const size_t safeSize = decodeInfo.getSafeSize(rowBytes); SkAutoMalloc pixels(safeSize); + SkPMColor colorPtr[256]; + int colorCount = 256; SkCodec::Options options; options.fPremulBehavior = canvas->imageInfo().colorSpace() ? @@ -498,7 +504,8 @@ Error CodecSrc::draw(SkCanvas* canvas) const { options.fPriorFrame = SkCodec::kNone; } SkCodec::Result result = codec->getPixels(decodeInfo, pixels.get(), - rowBytes, &options); + rowBytes, &options, + colorPtr, &colorCount); if (SkCodec::kInvalidInput == result && i > 0) { // Some of our test images have truncated later frames. Treat that // the same as incomplete. @@ -524,7 +531,8 @@ Error CodecSrc::draw(SkCanvas* canvas) const { const int xTranslate = (i % factor) * decodeInfo.width(); const int yTranslate = (i / factor) * decodeInfo.height(); canvas->translate(SkIntToScalar(xTranslate), SkIntToScalar(yTranslate)); - draw_to_canvas(canvas, bitmapInfo, pixels.get(), rowBytes, fDstColorType); + draw_to_canvas(canvas, bitmapInfo, pixels.get(), rowBytes, + colorPtr, colorCount, fDstColorType); if (result != SkCodec::kSuccess) { return ""; } @@ -546,7 +554,8 @@ Error CodecSrc::draw(SkCanvas* canvas) const { } case kCodecZeroInit_Mode: case kCodec_Mode: { - switch (codec->getPixels(decodeInfo, pixels.get(), rowBytes, &options)) { + switch (codec->getPixels(decodeInfo, pixels.get(), rowBytes, &options, + colorPtr, &colorCount)) { case SkCodec::kSuccess: // We consider these to be valid, since we should still decode what is // available. @@ -558,7 +567,8 @@ Error CodecSrc::draw(SkCanvas* canvas) const { return SkStringPrintf("Couldn't getPixels %s.", fPath.c_str()); } - draw_to_canvas(canvas, bitmapInfo, pixels.get(), rowBytes, fDstColorType); + draw_to_canvas(canvas, bitmapInfo, pixels.get(), rowBytes, colorPtr, colorCount, + fDstColorType); break; } case kScanline_Mode: { @@ -579,7 +589,7 @@ Error CodecSrc::draw(SkCanvas* canvas) const { bool useOldScanlineMethod = !useIncremental && !ico; if (useIncremental || ico) { if (SkCodec::kSuccess == codec->startIncrementalDecode(decodeInfo, dst, - rowBytes, &options)) { + rowBytes, &options, colorPtr, &colorCount)) { int rowsDecoded; auto result = codec->incrementalDecode(&rowsDecoded); if (SkCodec::kIncompleteInput == result || SkCodec::kErrorInInput == result) { @@ -599,7 +609,8 @@ Error CodecSrc::draw(SkCanvas* canvas) const { } if (useOldScanlineMethod) { - if (SkCodec::kSuccess != codec->startScanlineDecode(decodeInfo)) { + if (SkCodec::kSuccess != codec->startScanlineDecode(decodeInfo, NULL, colorPtr, + &colorCount)) { return "Could not start scanline decoder"; } @@ -613,7 +624,7 @@ Error CodecSrc::draw(SkCanvas* canvas) const { } } - draw_to_canvas(canvas, bitmapInfo, dst, rowBytes, fDstColorType); + draw_to_canvas(canvas, bitmapInfo, dst, rowBytes, colorPtr, colorCount, fDstColorType); break; } case kStripe_Mode: { @@ -625,7 +636,8 @@ Error CodecSrc::draw(SkCanvas* canvas) const { void* dst = pixels.get(); // Decode odd stripes - if (SkCodec::kSuccess != codec->startScanlineDecode(decodeInfo, &options)) { + if (SkCodec::kSuccess != codec->startScanlineDecode(decodeInfo, &options, colorPtr, + &colorCount)) { return "Could not start scanline decoder"; } @@ -650,7 +662,8 @@ Error CodecSrc::draw(SkCanvas* canvas) const { } // Decode even stripes - const SkCodec::Result startResult = codec->startScanlineDecode(decodeInfo); + const SkCodec::Result startResult = codec->startScanlineDecode(decodeInfo, nullptr, + colorPtr, &colorCount); if (SkCodec::kSuccess != startResult) { return "Failed to restart scanline decoder with same parameters."; } @@ -668,7 +681,7 @@ Error CodecSrc::draw(SkCanvas* canvas) const { } } - draw_to_canvas(canvas, bitmapInfo, dst, rowBytes, fDstColorType); + draw_to_canvas(canvas, bitmapInfo, dst, rowBytes, colorPtr, colorCount, fDstColorType); break; } case kCroppedScanline_Mode: { @@ -682,14 +695,16 @@ Error CodecSrc::draw(SkCanvas* canvas) const { for (int x = 0; x < width; x += tileSize) { subset = SkIRect::MakeXYWH(x, 0, SkTMin(tileSize, width - x), height); options.fSubset = ⊂ - if (SkCodec::kSuccess != codec->startScanlineDecode(decodeInfo, &options)) { + if (SkCodec::kSuccess != codec->startScanlineDecode(decodeInfo, &options, + colorPtr, &colorCount)) { return "Could not start scanline decoder."; } codec->getScanlines(SkTAddOffset<void>(pixels.get(), x * bpp), height, rowBytes); } - draw_to_canvas(canvas, bitmapInfo, pixels.get(), rowBytes, fDstColorType); + draw_to_canvas(canvas, bitmapInfo, pixels.get(), rowBytes, colorPtr, colorCount, + fDstColorType); break; } case kSubset_Mode: { @@ -732,7 +747,7 @@ Error CodecSrc::draw(SkCanvas* canvas) const { SkImageInfo subsetBitmapInfo = bitmapInfo.makeWH(scaledW, scaledH); size_t subsetRowBytes = subsetBitmapInfo.minRowBytes(); const SkCodec::Result result = codec->getPixels(decodeInfo, dst, subsetRowBytes, - &options); + &options, colorPtr, &colorCount); switch (result) { case SkCodec::kSuccess: case SkCodec::kErrorInInput: @@ -744,8 +759,9 @@ Error CodecSrc::draw(SkCanvas* canvas) const { x, y, decodeInfo.width(), decodeInfo.height(), fPath.c_str(), W, H, result); } - draw_to_canvas(canvas, subsetBitmapInfo, dst, subsetRowBytes, fDstColorType, - SkIntToScalar(left), SkIntToScalar(top)); + draw_to_canvas(canvas, subsetBitmapInfo, dst, subsetRowBytes, colorPtr, + colorCount, fDstColorType, SkIntToScalar(left), + SkIntToScalar(top)); // translate by the scaled height. top += decodeInfo.height(); @@ -849,6 +865,8 @@ Error AndroidCodecSrc::draw(SkCanvas* canvas) const { int bpp = SkColorTypeBytesPerPixel(decodeInfo.colorType()); size_t rowBytes = size.width() * bpp; SkAutoMalloc pixels(size.height() * rowBytes); + SkPMColor colorPtr[256]; + int colorCount = 256; SkBitmap bitmap; SkImageInfo bitmapInfo = decodeInfo; @@ -860,6 +878,8 @@ Error AndroidCodecSrc::draw(SkCanvas* canvas) const { // Create options for the codec. SkAndroidCodec::AndroidOptions options; + options.fColorPtr = colorPtr; + options.fColorCount = &colorCount; options.fSampleSize = fSampleSize; switch (codec->getAndroidPixels(decodeInfo, pixels.get(), rowBytes, &options)) { @@ -870,7 +890,7 @@ Error AndroidCodecSrc::draw(SkCanvas* canvas) const { default: return SkStringPrintf("Couldn't getPixels %s.", fPath.c_str()); } - draw_to_canvas(canvas, bitmapInfo, pixels.get(), rowBytes, fDstColorType); + draw_to_canvas(canvas, bitmapInfo, pixels.get(), rowBytes, colorPtr, colorCount, fDstColorType); return ""; } @@ -989,8 +1009,10 @@ Error ImageGenSrc::draw(SkCanvas* canvas) const { return err; } + SkPMColor colorPtr[256]; + int colorCount = 256; set_bitmap_color_space(&decodeInfo); - draw_to_canvas(canvas, decodeInfo, pixels.get(), rowBytes, + draw_to_canvas(canvas, decodeInfo, pixels.get(), rowBytes, colorPtr, colorCount, CodecSrc::kGetFromCanvas_DstColorType); return ""; } |