Index: dm/DM.cpp |
diff --git a/dm/DM.cpp b/dm/DM.cpp |
index becea6ca6cf00c2c6eae2c548ec4692cd850628b..578e39cd648b996c2eb7d255b5c9ddda74188eba 100644 |
--- a/dm/DM.cpp |
+++ b/dm/DM.cpp |
@@ -327,12 +327,123 @@ static void push_codec_srcs(Path path) { |
} |
} |
-static bool codec_supported(const char* ext) { |
- // FIXME: Once other versions of SkCodec are available, we can add them to this |
- // list (and eventually we can remove this check once they are all supported). |
+static bool brd_color_type_supported(SkBitmapRegionDecoderInterface::Strategy strategy, |
+ CodecSrc::DstColorType dstColorType) { |
+ switch (strategy) { |
+ case SkBitmapRegionDecoderInterface::kCanvas_Strategy: |
+ if (CodecSrc::kGetFromCanvas_DstColorType == dstColorType) { |
+ return true; |
+ } |
+ return false; |
+ case SkBitmapRegionDecoderInterface::kOriginal_Strategy: |
+ switch (dstColorType) { |
+ case CodecSrc::kGetFromCanvas_DstColorType: |
+ case CodecSrc::kIndex8_Always_DstColorType: |
+ case CodecSrc::kGrayscale_Always_DstColorType: |
+ return true; |
+ default: |
+ return false; |
+ } |
+ default: |
+ SkASSERT(false); |
+ return false; |
+ } |
+} |
+ |
+static void push_brd_src(Path path, SkBitmapRegionDecoderInterface::Strategy strategy, |
+ CodecSrc::DstColorType dstColorType, BRDSrc::Mode mode, uint32_t sampleSize) { |
+ SkString folder; |
+ switch (strategy) { |
+ case SkBitmapRegionDecoderInterface::kCanvas_Strategy: |
+ folder.append("brd_canvas"); |
+ break; |
+ case SkBitmapRegionDecoderInterface::kOriginal_Strategy: |
+ folder.append("brd_sample"); |
+ break; |
+ default: |
+ SkASSERT(false); |
+ return; |
+ } |
+ |
+ switch (mode) { |
+ case BRDSrc::kFullImage_Mode: |
+ break; |
+ case BRDSrc::kDivisor_Mode: |
+ folder.append("_divisor"); |
+ break; |
+ default: |
+ SkASSERT(false); |
+ return; |
+ } |
+ |
+ switch (dstColorType) { |
+ case CodecSrc::kGetFromCanvas_DstColorType: |
+ break; |
+ case CodecSrc::kIndex8_Always_DstColorType: |
+ folder.append("_kIndex"); |
+ break; |
+ case CodecSrc::kGrayscale_Always_DstColorType: |
+ folder.append("_kGray"); |
+ break; |
+ default: |
+ SkASSERT(false); |
+ return; |
+ } |
+ |
+ if (1 != sampleSize) { |
+ folder.appendf("_%.3f", BRDSrc::GetScale(sampleSize)); |
+ } |
+ |
+ BRDSrc* src = new BRDSrc(path, strategy, mode, dstColorType, sampleSize); |
+ push_src("image", folder, src); |
+} |
+ |
+static void push_brd_srcs(Path path) { |
+ |
+ const SkBitmapRegionDecoderInterface::Strategy strategies[] = { |
+ SkBitmapRegionDecoderInterface::kCanvas_Strategy, |
+ SkBitmapRegionDecoderInterface::kOriginal_Strategy |
+ }; |
+ |
+ // We will only test to one backend (8888), but we will test all of the |
+ // color types that we need to decode to on this backend. |
+ const CodecSrc::DstColorType dstColorTypes[] = { |
+ CodecSrc::kGetFromCanvas_DstColorType, |
+ CodecSrc::kIndex8_Always_DstColorType, |
+ CodecSrc::kGrayscale_Always_DstColorType, |
+ }; |
+ |
+ const BRDSrc::Mode modes[] = { |
+ BRDSrc::kFullImage_Mode, |
+ BRDSrc::kDivisor_Mode |
+ }; |
+ |
+ const uint32_t sampleSizes[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; |
+ |
+ for (SkBitmapRegionDecoderInterface::Strategy strategy : strategies) { |
+ // We disable png testing for kOriginal_Strategy because the implementation leaks |
+ // memory in our forked libpng. |
+ // TODO (msarett): Decide if we want to test pngs in this mode and how we might do this. |
+ if (SkBitmapRegionDecoderInterface::kOriginal_Strategy == strategy && |
+ (path.endsWith(".png") || path.endsWith(".PNG"))) { |
+ continue; |
+ } |
+ for (CodecSrc::DstColorType dstColorType : dstColorTypes) { |
+ if (brd_color_type_supported(strategy, dstColorType)) { |
+ for (BRDSrc::Mode mode : modes) { |
+ for (uint32_t sampleSize : sampleSizes) { |
+ push_brd_src(path, strategy, dstColorType, mode, sampleSize); |
+ } |
+ } |
+ } |
+ } |
+ } |
+} |
+ |
+static bool brd_supported(const char* ext) { |
static const char* const exts[] = { |
- "bmp", "gif", "jpg", "jpeg", "png", "ico", "wbmp", "webp", |
- "BMP", "GIF", "JPG", "JPEG", "PNG", "ICO", "WBMP", "WEBP", |
+ "jpg", "jpeg", "png", "webp", |
+ "JPG", "JPEG", "PNG", "WEBP", |
}; |
for (uint32_t i = 0; i < SK_ARRAY_COUNT(exts); i++) { |
@@ -371,8 +482,9 @@ static void gather_srcs() { |
SkString path = SkOSPath::Join(flag, file.c_str()); |
push_src("image", "decode", new ImageSrc(path)); // Decode entire image |
push_src("image", "subset", new ImageSrc(path, 2)); // Decode into 2x2 subsets |
- if (codec_supported(exts[j])) { |
- push_codec_srcs(path); |
+ push_codec_srcs(path); |
+ if (brd_supported(exts[j])) { |
+ push_brd_srcs(path); |
} |
} |
} |
@@ -381,6 +493,7 @@ static void gather_srcs() { |
push_src("image", "decode", new ImageSrc(flag)); // Decode entire image. |
push_src("image", "subset", new ImageSrc(flag, 2)); // Decode into 2 x 2 subsets |
push_codec_srcs(flag); |
+ push_brd_srcs(flag); |
} |
} |
} |