Create an SkAndroidCodec API separate from SkCodec
We will implement this API using SkCodecs.
SkAndroidCodecs will be used to implement the
BitmapRegionDecoder Java API (and possibly
BitmapFactory).
BUG=skia:
Review URL: https://codereview.chromium.org/1406223002
diff --git a/dm/DM.cpp b/dm/DM.cpp
index 5d98fe7..c51a6fb 100644
--- a/dm/DM.cpp
+++ b/dm/DM.cpp
@@ -226,9 +226,6 @@
case CodecSrc::kCodec_Mode:
folder.append("codec");
break;
- case CodecSrc::kScaledCodec_Mode:
- folder.append("scaled_codec");
- break;
case CodecSrc::kScanline_Mode:
folder.append("scanline");
break;
@@ -262,6 +259,37 @@
push_src("image", folder, src);
}
+static void push_android_codec_src(Path path, AndroidCodecSrc::Mode mode,
+ CodecSrc::DstColorType dstColorType, int sampleSize) {
+ SkString folder;
+ switch (mode) {
+ case AndroidCodecSrc::kFullImage_Mode:
+ folder.append("scaled_codec");
+ break;
+ case AndroidCodecSrc::kDivisor_Mode:
+ folder.append("scaled_codec_divisor");
+ break;
+ }
+
+ switch (dstColorType) {
+ case CodecSrc::kGrayscale_Always_DstColorType:
+ folder.append("_kGray8");
+ break;
+ case CodecSrc::kIndex8_Always_DstColorType:
+ folder.append("_kIndex8");
+ break;
+ default:
+ break;
+ }
+
+ if (1 != sampleSize) {
+ folder.appendf("_%.3f", get_scale_from_sample_size(sampleSize));
+ }
+
+ AndroidCodecSrc* src = new AndroidCodecSrc(path, mode, dstColorType, sampleSize);
+ push_src("image", folder, src);
+}
+
static void push_codec_srcs(Path path) {
SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(path.c_str()));
if (!encoded) {
@@ -288,7 +316,9 @@
switch (codec->getInfo().colorType()) {
case kGray_8_SkColorType:
// FIXME: Is this a long term solution for testing wbmps decodes to kIndex8?
- // Further discussion on this topic is at skbug.com/3683
+ // Further discussion on this topic is at skbug.com/3683.
+ // This causes us to try to convert grayscale jpegs to kIndex8. We currently
+ // fail non-fatally in this case.
colorTypes[0] = CodecSrc::kGetFromCanvas_DstColorType;
colorTypes[1] = CodecSrc::kGrayscale_Always_DstColorType;
colorTypes[2] = CodecSrc::kIndex8_Always_DstColorType;
@@ -313,24 +343,34 @@
}
}
- if (path.endsWith(".ico") || path.endsWith(".ICO")) {
- // FIXME: skbug.com/4404: ICO does not have the ability to decode scanlines, so we cannot
- // use SkScaledCodec with it.
+ // skbug.com/4428
+ static const char* const exts[] = {
+ "jpg", "jpeg", "png", "webp",
+ "JPG", "JPEG", "PNG", "WEBP",
+ };
+ bool supported = false;
+ for (const char* ext : exts) {
+ if (path.endsWith(ext)) {
+ supported = true;
+ break;
+ }
+ }
+ if (!supported) {
return;
}
- // SkScaledCodec Scales
- // The native scales are included to make sure that SkScaledCodec defaults to the native
- // scaling strategy when possible.
- // 0.1, 0.16, 0.2 etc allow us to test SkScaledCodec with sampleSize 10, 6, 5, etc.
- // 0.4, 0.7 etc allow to test what happens when the client requests a scale that
- // does not exactly match a sampleSize or native scaling capability.
- const float samplingScales[] = { 0.1f, 0.125f, 0.167f, 0.2f, 0.25f, 0.333f, 0.375f, 0.4f, 0.5f,
- 0.6f, 0.625f, 0.750f, 0.8f, 0.875f, 1.0f };
+ const int sampleSizes[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
- for (float scale : samplingScales) {
- for (uint32_t i = 0; i < numColorTypes; i++) {
- push_codec_src(path, CodecSrc::kScaledCodec_Mode, colorTypes[i], scale);
+ const AndroidCodecSrc::Mode androidModes[] = {
+ AndroidCodecSrc::kFullImage_Mode,
+ AndroidCodecSrc::kDivisor_Mode,
+ };
+
+ for (int sampleSize : sampleSizes) {
+ for (AndroidCodecSrc::Mode mode : androidModes) {
+ for (uint32_t i = 0; i < numColorTypes; i++) {
+ push_android_codec_src(path, mode, colorTypes[i], sampleSize);
+ }
}
}
}