diff options
author | Leon Scroggins III <scroggo@google.com> | 2017-12-04 16:40:24 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-12-05 00:52:42 +0000 |
commit | c6f7a4ffa9522159efc42f7c948bba5e66bb8844 (patch) | |
tree | 90de4148501653aa680b137398d58a2f5621c96b /tests | |
parent | 06ab3836f779dbcbcd067a9261300616ff7cc594 (diff) |
Hide SkEncodedInfo
Bug: skia:7353
Bug: skia:6839
This contains information that is not necessary for clients to know. The
Color enum tells the number of components in the input, but this is only
interesting internally (to the SkSwizzler).
Similarly, the Alpha enum differs from SkAlphaType in that it has
kBinary instead of kPremul. This is useful information only internally
for determining whether the SkColorSpaceXform needs to premultiply.
The bitsPerComponent is potentially useful for a client; Android (in
SkAndroidCodec) uses it to determine the SkColorType. Rather than
exposing bitsPerComponent, use it to make the same decision that Android
would have made - 16 bits per component means to set the info to F16. Add
a test that computeOutputColorType behaves as expected.
Switch conversionSupported to use an SkColorType, which is enough info.
Replace the SkEncodedInfo::Alpha field on SkCodec::FrameInfo with an
SkAlphaType.
SkCodec still needs an SkEncodedInfo, so move its header (which is
already not SK_API) to include/private.
Change-Id: Ie2cf11339bf999ebfd4390c0f448f7edd6feabda
Reviewed-on: https://skia-review.googlesource.com/79260
Reviewed-by: Mike Reed <reed@google.com>
Reviewed-by: Mike Klein <mtklein@chromium.org>
Commit-Queue: Leon Scroggins <scroggo@google.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/CodecAnimTest.cpp | 36 | ||||
-rw-r--r-- | tests/CodecRecommendedTypeTest.cpp | 41 |
2 files changed, 56 insertions, 21 deletions
diff --git a/tests/CodecAnimTest.cpp b/tests/CodecAnimTest.cpp index e354ea6cbf..b274ee538a 100644 --- a/tests/CodecAnimTest.cpp +++ b/tests/CodecAnimTest.cpp @@ -67,9 +67,8 @@ static bool restore_previous(const SkCodec::FrameInfo& info) { } DEF_TEST(Codec_frames, r) { - #define kOpaque SkEncodedInfo::kOpaque_Alpha - #define kUnpremul SkEncodedInfo::kUnpremul_Alpha - #define kBinary SkEncodedInfo::kBinary_Alpha + #define kOpaque kOpaque_SkAlphaType + #define kUnpremul kUnpremul_SkAlphaType #define kKeep SkCodecAnimation::DisposalMethod::kKeep #define kRestoreBG SkCodecAnimation::DisposalMethod::kRestoreBGColor #define kRestorePrev SkCodecAnimation::DisposalMethod::kRestorePrevious @@ -79,8 +78,8 @@ DEF_TEST(Codec_frames, r) { // One less than fFramecount, since the first frame is always // independent. std::vector<int> fRequiredFrames; - // Same, since the first frame should match getEncodedInfo - std::vector<SkEncodedInfo::Alpha> fAlphas; + // Same, since the first frame should match getInfo + std::vector<SkAlphaType> fAlphas; // The size of this one should match fFrameCount for animated, empty // otherwise. std::vector<int> fDurations; @@ -89,15 +88,15 @@ DEF_TEST(Codec_frames, r) { } gRecs[] = { { "required.gif", 7, { 0, 1, 2, 3, 4, 5 }, - { kOpaque, kBinary, kBinary, kBinary, kBinary, kBinary }, + { kOpaque, kUnpremul, kUnpremul, kUnpremul, kUnpremul, kUnpremul }, { 100, 100, 100, 100, 100, 100, 100 }, 0, { kKeep, kRestoreBG, kKeep, kKeep, kKeep, kRestoreBG, kKeep } }, { "alphabetAnim.gif", 13, { SkCodec::kNone, 0, 0, 0, 0, 5, 6, SkCodec::kNone, SkCodec::kNone, 9, 10, 11 }, - { kBinary, kBinary, kBinary, kBinary, kBinary, kBinary, - kBinary, kBinary, kBinary, kBinary, kBinary, kBinary }, + { kUnpremul, kUnpremul, kUnpremul, kUnpremul, kUnpremul, kUnpremul, + kUnpremul, kUnpremul, kUnpremul, kUnpremul, kUnpremul, kUnpremul }, { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 }, 0, { kKeep, kRestorePrev, kRestorePrev, kRestorePrev, kRestorePrev, @@ -116,8 +115,8 @@ DEF_TEST(Codec_frames, r) { { "randPixelsAnim.gif", 13, // required frames { 0, 1, 2, 3, 4, 3, 6, 7, 7, 7, 9, 9 }, - { kBinary, kBinary, kBinary, kBinary, kBinary, kBinary, - kBinary, kBinary, kBinary, kBinary, kBinary, kBinary }, + { kUnpremul, kUnpremul, kUnpremul, kUnpremul, kUnpremul, kUnpremul, + kUnpremul, kUnpremul, kUnpremul, kUnpremul, kUnpremul, kUnpremul }, // durations { 0, 1000, 170, 40, 220, 7770, 90, 90, 90, 90, 90, 90, 90 }, // repetition count @@ -161,7 +160,6 @@ DEF_TEST(Codec_frames, r) { }; #undef kOpaque #undef kUnpremul - #undef kBinary #undef kKeep #undef kRestorePrev #undef kRestoreBG @@ -270,22 +268,20 @@ DEF_TEST(Codec_frames, r) { rec.fName, i, rec.fDurations[i], frameInfo.fDuration); } - auto to_string = [](SkEncodedInfo::Alpha alpha) { + auto to_string = [](SkAlphaType alpha) { switch (alpha) { - case SkEncodedInfo::kUnpremul_Alpha: + case kUnpremul_SkAlphaType: return "unpremul"; - case SkEncodedInfo::kOpaque_Alpha: + case kOpaque_SkAlphaType: return "opaque"; - case SkEncodedInfo::kBinary_Alpha: - return "binary"; default: SkASSERT(false); return "unknown"; } }; - auto expectedAlpha = 0 == i ? codec->getEncodedInfo().alpha() : rec.fAlphas[i-1]; - auto alpha = frameInfo.fAlpha; + auto expectedAlpha = 0 == i ? codec->getInfo().alphaType() : rec.fAlphas[i-1]; + auto alpha = frameInfo.fAlphaType; if (expectedAlpha != alpha) { ERRORF(r, "%s's frame %i has wrong alpha type! expected: %s\tactual: %s", rec.fName, i, to_string(expectedAlpha), to_string(alpha)); @@ -319,9 +315,7 @@ DEF_TEST(Codec_frames, r) { auto decode = [&](SkBitmap* bm, int index, int cachedIndex) { auto decodeInfo = info; if (index > 0) { - auto alphaType = frameInfos[index].fAlpha == SkEncodedInfo::kOpaque_Alpha - ? kOpaque_SkAlphaType : kPremul_SkAlphaType; - decodeInfo = info.makeAlphaType(alphaType); + decodeInfo = info.makeAlphaType(frameInfos[index].fAlphaType); } bm->allocPixels(decodeInfo); if (cachedIndex != SkCodec::kNone) { diff --git a/tests/CodecRecommendedTypeTest.cpp b/tests/CodecRecommendedTypeTest.cpp new file mode 100644 index 0000000000..d3494e8301 --- /dev/null +++ b/tests/CodecRecommendedTypeTest.cpp @@ -0,0 +1,41 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "SkAndroidCodec.h" +#include "SkBitmap.h" +#include "SkCodec.h" +#include "SkColorSpace.h" +#include "SkEncodedImageFormat.h" +#include "SkImageEncoder.h" +#include "SkImageInfo.h" +#include "SkStream.h" + +#include "Test.h" + +DEF_TEST(Codec_recommendedF16, r) { + // Encode an F16 bitmap. SkEncodeImage will encode this to a true-color PNG + // with a bit depth of 16. SkAndroidCodec should always recommend F16 for + // such a PNG. + SkBitmap bm; + bm.allocPixels(SkImageInfo::Make(10, 10, kRGBA_F16_SkColorType, + kPremul_SkAlphaType, SkColorSpace::MakeSRGBLinear())); + // What is drawn is not important. + bm.eraseColor(SK_ColorBLUE); + + SkDynamicMemoryWStream wstream; + REPORTER_ASSERT(r, SkEncodeImage(&wstream, bm, SkEncodedImageFormat::kPNG, 100)); + auto data = wstream.detachAsData(); + auto androidCodec = SkAndroidCodec::MakeFromData(std::move(data)); + if (!androidCodec) { + ERRORF(r, "Failed to create SkAndroidCodec"); + return; + } + + REPORTER_ASSERT(r, androidCodec->getInfo().colorType() == kRGBA_F16_SkColorType); + REPORTER_ASSERT(r, androidCodec->computeOutputColorType(kN32_SkColorType) + == kRGBA_F16_SkColorType); +} |