aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/codec/SkBmpRLECodec.cpp
diff options
context:
space:
mode:
authorGravatar scroggo <scroggo@chromium.org>2015-08-14 08:32:46 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-08-14 08:32:46 -0700
commitcc2feb161f756c4035a407296567654d86bc7be7 (patch)
treefc18ba44cbd7bfc55ac169fe2610c45c4194fe03 /src/codec/SkBmpRLECodec.cpp
parent8f4ba76742c329bc4d5e1b8ca376d27922bd00b1 (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.cpp39
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.