diff options
author | scroggo <scroggo@chromium.org> | 2015-08-14 08:32:46 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-08-14 08:32:46 -0700 |
commit | cc2feb161f756c4035a407296567654d86bc7be7 (patch) | |
tree | fc18ba44cbd7bfc55ac169fe2610c45c4194fe03 /src/codec/SkBmpRLECodec.cpp | |
parent | 8f4ba76742c329bc4d5e1b8ca376d27922bd00b1 (diff) |
Support more swizzles to 565 in SkCodec
Add more swizzling functions for swizzling to 565. Much of this
code was revived from crrev.com/1055743003 (for BMP). Also added
swizzling functions for WBMP.
Consolidate the static function conversion_possible.
In SkCodec::getPixels, check that the alphatype corresponds to the
colorType. This prevents requesting 565 + non-opaque.
In SkIcoCodec, report that the image is unpremul (instead of
whatever the largest embedded codec thinks), but modify the
requested info to have the alpha type expected/required by the
embedded codec.
Add tests for decoding to 565.
BUG=skia:3257
BUG=skia:3683
Review URL: https://codereview.chromium.org/1277213002
Diffstat (limited to 'src/codec/SkBmpRLECodec.cpp')
-rw-r--r-- | src/codec/SkBmpRLECodec.cpp | 39 |
1 files changed, 10 insertions, 29 deletions
diff --git a/src/codec/SkBmpRLECodec.cpp b/src/codec/SkBmpRLECodec.cpp index c71a5409d2..14a5b01c1f 100644 --- a/src/codec/SkBmpRLECodec.cpp +++ b/src/codec/SkBmpRLECodec.cpp @@ -12,35 +12,6 @@ #include "SkStream.h" /* - * Checks if the conversion between the input image and the requested output - * image has been implemented - */ -static bool conversion_possible(const SkImageInfo& dst, - const SkImageInfo& src) { - // Ensure that the profile type is unchanged - if (dst.profileType() != src.profileType()) { - return false; - } - - // Ensure the alpha type is valid - if (!valid_alpha(dst.alphaType(), src.alphaType())) { - return false; - } - - // Check for supported color types - switch (dst.colorType()) { - // Allow output to kN32 from any type of input - case kN32_SkColorType: - return true; - // Allow output to kIndex_8 from compatible inputs - case kIndex_8_SkColorType: - return kIndex_8_SkColorType == src.colorType(); - default: - return false; - } -} - -/* * Creates an instance of the decoder * Called only by NewFromStream */ @@ -240,6 +211,11 @@ void SkBmpRLECodec::setPixel(void* dst, size_t dstRowBytes, dstRow[x] = fColorTable->operator[](index); break; } + case kRGB_565_SkColorType: { + uint16_t* dstRow = SkTAddOffset<uint16_t>(dst, row * (int) dstRowBytes); + dstRow[x] = SkPixel32ToPixel16(fColorTable->operator[](index)); + break; + } default: // This case should not be reached. We should catch an invalid // color type when we check that the conversion is possible. @@ -272,6 +248,11 @@ void SkBmpRLECodec::setRGBPixel(void* dst, size_t dstRowBytes, dstRow[x] = SkPackARGB32NoCheck(0xFF, red, green, blue); break; } + case kRGB_565_SkColorType: { + uint16_t* dstRow = SkTAddOffset<uint16_t>(dst, row * (int) dstRowBytes); + dstRow[x] = SkPack888ToRGB16(red, green, blue); + break; + } default: // This case should not be reached. We should catch an invalid // color type when we check that the conversion is possible. |