diff options
author | 2015-11-17 08:46:02 -0800 | |
---|---|---|
committer | 2015-11-17 08:46:02 -0800 | |
commit | 887e18e5f7b79397a3d4df7f5c74de13ba3a95d4 (patch) | |
tree | e12b317bd71a41e1378585f0b5bd2067caefb7d4 | |
parent | 195fe08421f3a6c52ed621be96dbcc5393b41e69 (diff) |
Make SkAndroidCodec support bmp
BUG=skia:
Review URL: https://codereview.chromium.org/1443783002
-rw-r--r-- | dm/DM.cpp | 4 | ||||
-rw-r--r-- | src/codec/SkAndroidCodec.cpp | 1 | ||||
-rw-r--r-- | src/codec/SkSampledCodec.cpp | 38 |
3 files changed, 41 insertions, 2 deletions
@@ -363,8 +363,8 @@ static void push_codec_srcs(Path path) { // The following image types are only supported by BitmapFactory, // so we only need to test full image decodes. static const char* fullExts[] = { - "wbmp", - "WBMP", + "wbmp", "bmp", + "WBMP", "BMP", }; for (const char* ext : fullExts) { if (path.endsWith(ext)) { diff --git a/src/codec/SkAndroidCodec.cpp b/src/codec/SkAndroidCodec.cpp index 9a955ec9b7..b0a78d0b17 100644 --- a/src/codec/SkAndroidCodec.cpp +++ b/src/codec/SkAndroidCodec.cpp @@ -32,6 +32,7 @@ SkAndroidCodec* SkAndroidCodec::NewFromStream(SkStream* stream) { case kPNG_SkEncodedFormat: case kJPEG_SkEncodedFormat: case kWBMP_SkEncodedFormat: + case kBMP_SkEncodedFormat: return new SkSampledCodec(codec.detach()); default: // FIXME: SkSampledCodec is temporarily disabled for other formats diff --git a/src/codec/SkSampledCodec.cpp b/src/codec/SkSampledCodec.cpp index d5fbd0fa52..08c4f2a3ab 100644 --- a/src/codec/SkSampledCodec.cpp +++ b/src/codec/SkSampledCodec.cpp @@ -226,6 +226,44 @@ SkCodec::Result SkSampledCodec::sampledDecode(const SkImageInfo& info, void* pix } return SkCodec::kSuccess; } + case SkCodec::kBottomUp_SkScanlineOrder: { + // Note that this mode does not support subsetting. + SkASSERT(0 == subsetY && nativeSize.height() == subsetHeight); + int y; + for (y = 0; y < nativeSize.height(); y++) { + int srcY = fCodec->nextScanline(); + if (is_coord_necessary(srcY, sampleY, dstHeight)) { + void* pixelPtr = SkTAddOffset<void>(pixels, + rowBytes * get_dst_coord(srcY, sampleY)); + if (1 != fCodec->getScanlines(pixelPtr, 1, rowBytes)) { + break; + } + } else { + if (!fCodec->skipScanlines(1)) { + break; + } + } + } + + if (nativeSize.height() == y) { + return SkCodec::kSuccess; + } + + // We handle filling uninitialized memory here instead of using fCodec. + // fCodec does not know that we are sampling. + const uint32_t fillValue = fCodec->getFillValue(info.colorType(), info.alphaType()); + const SkImageInfo fillInfo = info.makeWH(info.width(), 1); + for (; y < nativeSize.height(); y++) { + int srcY = fCodec->outputScanline(y); + if (!is_coord_necessary(srcY, sampleY, dstHeight)) { + continue; + } + + void* rowPtr = SkTAddOffset<void>(pixels, rowBytes * get_dst_coord(srcY, sampleY)); + SkSampler::Fill(fillInfo, rowPtr, rowBytes, fillValue, options.fZeroInitialized); + } + return SkCodec::kIncompleteInput; + } case SkCodec::kNone_SkScanlineOrder: { const int linesNeeded = subsetHeight - samplingOffsetY; SkAutoMalloc storage(linesNeeded * rowBytes); |