| Index: dm/DM.cpp | 
| diff --git a/dm/DM.cpp b/dm/DM.cpp | 
| index 2ecba1da7a5d5b086e3a7bd821d9f31e8c146608..becea6ca6cf00c2c6eae2c548ec4692cd850628b 100644 | 
| --- a/dm/DM.cpp | 
| +++ b/dm/DM.cpp | 
| @@ -225,7 +225,7 @@ static void push_codec_src(Path path, CodecSrc::Mode mode, CodecSrc::DstColorTyp | 
| folder.append("stripe"); | 
| break; | 
| case CodecSrc::kSubset_Mode: | 
| -            folder.append("subset"); | 
| +            folder.append("codec_subset"); | 
| break; | 
| } | 
|  | 
| @@ -260,34 +260,69 @@ static void push_codec_srcs(Path path) { | 
| return; | 
| } | 
|  | 
| -    // Choose scales for scaling tests. | 
| +    // Native Scales | 
| // TODO (msarett): Implement scaling tests for SkImageDecoder in order to compare with these | 
| //                 tests.  SkImageDecoder supports downscales by integer factors. | 
| // SkJpegCodec natively supports scaling to: 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875 | 
| -    // 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 scales[] = { 0.1f, 0.125f, 0.166f, 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 float nativeScales[] = { 0.125f, 0.25f, 0.375f, 0.5f, 0.625f, 0.750f, 0.875f, 1.0f }; | 
| + | 
| +    const CodecSrc::Mode nativeModes[] = { CodecSrc::kCodec_Mode, CodecSrc::kScanline_Mode, | 
| +            CodecSrc::kScanline_Subset_Mode, CodecSrc::kStripe_Mode, CodecSrc::kSubset_Mode }; | 
| + | 
| +    CodecSrc::DstColorType colorTypes[3]; | 
| +    uint32_t numColorTypes; | 
| +    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 | 
| +            colorTypes[0] = CodecSrc::kGetFromCanvas_DstColorType; | 
| +            colorTypes[1] = CodecSrc::kGrayscale_Always_DstColorType; | 
| +            colorTypes[2] = CodecSrc::kIndex8_Always_DstColorType; | 
| +            numColorTypes = 3; | 
| +            break; | 
| +        case kIndex_8_SkColorType: | 
| +            colorTypes[0] = CodecSrc::kGetFromCanvas_DstColorType; | 
| +            colorTypes[1] = CodecSrc::kIndex8_Always_DstColorType; | 
| +            numColorTypes = 2; | 
| +            break; | 
| +        default: | 
| +            colorTypes[0] = CodecSrc::kGetFromCanvas_DstColorType; | 
| +            numColorTypes = 1; | 
| +            break; | 
| +    } | 
|  | 
| -    const CodecSrc::Mode modes[] = { CodecSrc::kCodec_Mode, CodecSrc::kScaledCodec_Mode, | 
| -            CodecSrc::kScanline_Mode, CodecSrc::kScanline_Subset_Mode, CodecSrc::kStripe_Mode, | 
| -            CodecSrc::kSubset_Mode }; | 
| +    for (float scale : nativeScales) { | 
| +        if (scale != 1.0f && (path.endsWith(".webp") || path.endsWith(".WEBP"))) { | 
| +            // FIXME: skbug.com/4038 Scaling webp seems to leave some pixels uninitialized/ | 
| +            // compute their colors based on uninitialized values. | 
| +            continue; | 
| +        } | 
| + | 
| +        for (CodecSrc::Mode mode : nativeModes) { | 
| +            for (uint32_t i = 0; i < numColorTypes; i++) { | 
| +                push_codec_src(path, mode, colorTypes[i], scale); | 
| +            } | 
| +        } | 
| +    } | 
|  | 
| -    const CodecSrc::DstColorType colorTypes[] = { CodecSrc::kGetFromCanvas_DstColorType, | 
| -            CodecSrc::kGrayscale_Always_DstColorType, CodecSrc::kIndex8_Always_DstColorType }; | 
| +    // 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.166f, 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 : scales) { | 
| +    for (float scale : samplingScales) { | 
| if (scale != 1.0f && (path.endsWith(".webp") || path.endsWith(".WEBP"))) { | 
| // FIXME: skbug.com/4038 Scaling webp seems to leave some pixels uninitialized/ | 
| // compute their colors based on uninitialized values. | 
| continue; | 
| } | 
|  | 
| -        for (CodecSrc::Mode mode : modes) { | 
| -            for (CodecSrc::DstColorType colorType : colorTypes) { | 
| -                push_codec_src(path, mode, colorType, scale); | 
| -            } | 
| +        for (uint32_t i = 0; i < numColorTypes; i++) { | 
| +            push_codec_src(path, CodecSrc::kScaledCodec_Mode, colorTypes[i], scale); | 
| } | 
| } | 
| } | 
|  |