aboutsummaryrefslogtreecommitdiffhomepage
path: root/dm/DM.cpp
diff options
context:
space:
mode:
authorGravatar msarett <msarett@google.com>2015-10-21 10:27:10 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-10-21 10:27:10 -0700
commit3d9d7a7213748761d46ade183e11aa7cb55313c1 (patch)
tree80478ddd5999b26b6671287ccd5803791454a4c9 /dm/DM.cpp
parentc7378af961cabef5b77c4dae40d8d3b9c1471a9e (diff)
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
Diffstat (limited to 'dm/DM.cpp')
-rw-r--r--dm/DM.cpp78
1 files changed, 59 insertions, 19 deletions
diff --git a/dm/DM.cpp b/dm/DM.cpp
index 5d98fe7ca5..c51a6fb8aa 100644
--- a/dm/DM.cpp
+++ b/dm/DM.cpp
@@ -226,9 +226,6 @@ static void push_codec_src(Path path, CodecSrc::Mode mode, CodecSrc::DstColorTyp
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 @@ static void push_codec_src(Path path, CodecSrc::Mode mode, CodecSrc::DstColorTyp
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 @@ static void push_codec_srcs(Path path) {
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 @@ static void push_codec_srcs(Path path) {
}
}
- 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 };
-
- for (float scale : samplingScales) {
- for (uint32_t i = 0; i < numColorTypes; i++) {
- push_codec_src(path, CodecSrc::kScaledCodec_Mode, colorTypes[i], scale);
+ const int sampleSizes[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
+
+ 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);
+ }
}
}
}