return kInvalidScale;
}
+ if (!valid_alpha(info.alphaType(), this->getInfo().alphaType())) {
+ return SkCodec::kInvalidConversion;
+ }
+
// Prepare a color table if necessary
setup_color_table(info.colorType(), ctable, ctableCount);
return SkCodec::kInvalidScale;
}
+ if (!valid_alpha(dstInfo.alphaType(), this->getInfo().alphaType())) {
+ return SkCodec::kInvalidConversion;
+ }
+
// Fill in the color table
setup_color_table(dstInfo.colorType(), inputColorTable, inputColorCount);
REPORTER_ASSERT(r, digest == goodDigest);
}
+/**
+ * Test decoding an SkCodec to a particular SkImageInfo.
+ *
+ * Calling getPixels(info) should return expectedResult, and if goodDigest is non NULL,
+ * the resulting decode should match.
+ */
+static void test_info(skiatest::Reporter* r, SkCodec* codec, const SkImageInfo& info,
+ SkCodec::Result expectedResult, const SkMD5::Digest* goodDigest) {
+ SkBitmap bm;
+ bm.allocPixels(info);
+ SkAutoLockPixels autoLockPixels(bm);
+
+ SkCodec::Result result = codec->getPixels(info, bm.getPixels(), bm.rowBytes());
+ REPORTER_ASSERT(r, result == expectedResult);
+
+ if (goodDigest) {
+ compare_to_good_digest(r, *goodDigest, bm);
+ }
+}
+
SkIRect generate_random_subset(SkRandom* rand, int w, int h) {
SkIRect rect;
do {
SkMD5::Digest digest;
md5(bm, &digest);
- bm.eraseColor(SK_ColorYELLOW);
-
- result =
- codec->getPixels(info, bm.getPixels(), bm.rowBytes(), NULL, NULL, NULL);
-
- REPORTER_ASSERT(r, result == SkCodec::kSuccess);
// verify that re-decoding gives the same result.
- compare_to_good_digest(r, digest, bm);
+ test_info(r, codec, info, SkCodec::kSuccess, &digest);
+
+ {
+ // Check alpha type conversions
+ if (info.alphaType() == kOpaque_SkAlphaType) {
+ test_info(r, codec, info.makeAlphaType(kUnpremul_SkAlphaType),
+ SkCodec::kInvalidConversion, NULL);
+ test_info(r, codec, info.makeAlphaType(kPremul_SkAlphaType),
+ SkCodec::kInvalidConversion, NULL);
+ } else {
+ // Decoding to opaque should fail
+ test_info(r, codec, info.makeAlphaType(kOpaque_SkAlphaType),
+ SkCodec::kInvalidConversion, NULL);
+ SkAlphaType otherAt = info.alphaType();
+ if (kPremul_SkAlphaType == otherAt) {
+ otherAt = kUnpremul_SkAlphaType;
+ } else {
+ otherAt = kPremul_SkAlphaType;
+ }
+ // The other non-opaque alpha type should always succeed, but not match.
+ test_info(r, codec, info.makeAlphaType(otherAt), SkCodec::kSuccess, NULL);
+ }
+ }
+
+ // Scanline decoding follows.
stream.reset(resource(path));
SkAutoTDelete<SkScanlineDecoder> scanlineDecoder(