aboutsummaryrefslogtreecommitdiffhomepage
path: root/dm
diff options
context:
space:
mode:
authorGravatar Leon Scroggins <scroggo@google.com>2017-07-10 19:51:46 +0000
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-07-10 19:51:59 +0000
commit8321f7585b6aded0c35e50e9af8709b25fdce3f6 (patch)
tree9a9e3a1843c8864a9e847d0c7b59b987946f6b24 /dm
parenta48ae6ec2feb32e3d781ad43353209a90059a01d (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.cpp64
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 = &subset;
- 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 "";
}