OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "CrashHandler.h" | 8 #include "CrashHandler.h" |
9 #include "DMJsonWriter.h" | 9 #include "DMJsonWriter.h" |
10 #include "DMSrcSink.h" | 10 #include "DMSrcSink.h" |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
218 FLAGS_src.contains(tag.c_str()) && | 218 FLAGS_src.contains(tag.c_str()) && |
219 !SkCommandLineFlags::ShouldSkip(FLAGS_match, src->name().c_str())) { | 219 !SkCommandLineFlags::ShouldSkip(FLAGS_match, src->name().c_str())) { |
220 TaggedSrc& s = gSrcs.push_back(); | 220 TaggedSrc& s = gSrcs.push_back(); |
221 s.reset(src.detach()); | 221 s.reset(src.detach()); |
222 s.tag = tag; | 222 s.tag = tag; |
223 s.options = options; | 223 s.options = options; |
224 } | 224 } |
225 } | 225 } |
226 | 226 |
227 static void push_codec_src(Path path, CodecSrc::Mode mode, CodecSrc::DstColorTyp e dstColorType, | 227 static void push_codec_src(Path path, CodecSrc::Mode mode, CodecSrc::DstColorTyp e dstColorType, |
228 float scale) { | 228 SkAlphaType dstAlphaType, float scale) { |
229 SkString folder; | 229 SkString folder; |
230 switch (mode) { | 230 switch (mode) { |
231 case CodecSrc::kCodec_Mode: | 231 case CodecSrc::kCodec_Mode: |
232 folder.append("codec"); | 232 folder.append("codec"); |
233 break; | 233 break; |
234 case CodecSrc::kCodecZeroInit_Mode: | 234 case CodecSrc::kCodecZeroInit_Mode: |
235 folder.append("codec_zero_init"); | 235 folder.append("codec_zero_init"); |
236 break; | 236 break; |
237 case CodecSrc::kScanline_Mode: | 237 case CodecSrc::kScanline_Mode: |
238 folder.append("scanline"); | 238 folder.append("scanline"); |
(...skipping 13 matching lines...) Expand all Loading... | |
252 case CodecSrc::kGrayscale_Always_DstColorType: | 252 case CodecSrc::kGrayscale_Always_DstColorType: |
253 folder.append("_kGray8"); | 253 folder.append("_kGray8"); |
254 break; | 254 break; |
255 case CodecSrc::kIndex8_Always_DstColorType: | 255 case CodecSrc::kIndex8_Always_DstColorType: |
256 folder.append("_kIndex8"); | 256 folder.append("_kIndex8"); |
257 break; | 257 break; |
258 default: | 258 default: |
259 break; | 259 break; |
260 } | 260 } |
261 | 261 |
262 switch (dstAlphaType) { | |
263 case kOpaque_SkAlphaType: | |
264 folder.append("_opaque"); | |
scroggo
2016/01/29 17:19:54
I think you have in the past considered such an ex
msarett
2016/01/29 19:17:05
I think this is good. IMO it provides useful info
| |
265 break; | |
266 case kPremul_SkAlphaType: | |
267 folder.append("_premul"); | |
268 break; | |
269 default: | |
270 break; | |
271 } | |
272 | |
262 if (1.0f != scale) { | 273 if (1.0f != scale) { |
263 folder.appendf("_%.3f", scale); | 274 folder.appendf("_%.3f", scale); |
264 } | 275 } |
265 | 276 |
266 CodecSrc* src = new CodecSrc(path, mode, dstColorType, scale); | 277 CodecSrc* src = new CodecSrc(path, mode, dstColorType, dstAlphaType, scale); |
267 push_src("image", folder, src); | 278 push_src("image", folder, src); |
268 } | 279 } |
269 | 280 |
270 static void push_android_codec_src(Path path, AndroidCodecSrc::Mode mode, | 281 static void push_android_codec_src(Path path, AndroidCodecSrc::Mode mode, |
271 CodecSrc::DstColorType dstColorType, int sampleSize) { | 282 CodecSrc::DstColorType dstColorType, SkAlphaType dstAlphaType, int sampl eSize) { |
272 SkString folder; | 283 SkString folder; |
273 switch (mode) { | 284 switch (mode) { |
274 case AndroidCodecSrc::kFullImage_Mode: | 285 case AndroidCodecSrc::kFullImage_Mode: |
275 folder.append("scaled_codec"); | 286 folder.append("scaled_codec"); |
276 break; | 287 break; |
277 case AndroidCodecSrc::kDivisor_Mode: | 288 case AndroidCodecSrc::kDivisor_Mode: |
278 folder.append("scaled_codec_divisor"); | 289 folder.append("scaled_codec_divisor"); |
279 break; | 290 break; |
280 } | 291 } |
281 | 292 |
282 switch (dstColorType) { | 293 switch (dstColorType) { |
283 case CodecSrc::kGrayscale_Always_DstColorType: | 294 case CodecSrc::kGrayscale_Always_DstColorType: |
284 folder.append("_kGray8"); | 295 folder.append("_kGray8"); |
285 break; | 296 break; |
286 case CodecSrc::kIndex8_Always_DstColorType: | 297 case CodecSrc::kIndex8_Always_DstColorType: |
287 folder.append("_kIndex8"); | 298 folder.append("_kIndex8"); |
288 break; | 299 break; |
289 default: | 300 default: |
290 break; | 301 break; |
291 } | 302 } |
292 | 303 |
304 switch (dstAlphaType) { | |
305 case kOpaque_SkAlphaType: | |
306 folder.append("_opaque"); | |
307 break; | |
308 case kPremul_SkAlphaType: | |
309 folder.append("_premul"); | |
310 break; | |
311 default: | |
312 break; | |
313 } | |
314 | |
293 if (1 != sampleSize) { | 315 if (1 != sampleSize) { |
294 folder.appendf("_%.3f", 1.0f / (float) sampleSize); | 316 folder.appendf("_%.3f", 1.0f / (float) sampleSize); |
295 } | 317 } |
296 | 318 |
297 AndroidCodecSrc* src = new AndroidCodecSrc(path, mode, dstColorType, sampleS ize); | 319 AndroidCodecSrc* src = new AndroidCodecSrc(path, mode, dstColorType, dstAlph aType, sampleSize); |
298 push_src("image", folder, src); | 320 push_src("image", folder, src); |
299 } | 321 } |
300 | 322 |
301 static void push_codec_srcs(Path path) { | 323 static void push_codec_srcs(Path path) { |
302 SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(path.c_str())); | 324 SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(path.c_str())); |
303 if (!encoded) { | 325 if (!encoded) { |
304 SkDebugf("Couldn't read %s.", path.c_str()); | 326 SkDebugf("Couldn't read %s.", path.c_str()); |
305 return; | 327 return; |
306 } | 328 } |
307 SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded)); | 329 SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded)); |
(...skipping 29 matching lines...) Expand all Loading... | |
337 colorTypes[0] = CodecSrc::kGetFromCanvas_DstColorType; | 359 colorTypes[0] = CodecSrc::kGetFromCanvas_DstColorType; |
338 colorTypes[1] = CodecSrc::kIndex8_Always_DstColorType; | 360 colorTypes[1] = CodecSrc::kIndex8_Always_DstColorType; |
339 numColorTypes = 2; | 361 numColorTypes = 2; |
340 break; | 362 break; |
341 default: | 363 default: |
342 colorTypes[0] = CodecSrc::kGetFromCanvas_DstColorType; | 364 colorTypes[0] = CodecSrc::kGetFromCanvas_DstColorType; |
343 numColorTypes = 1; | 365 numColorTypes = 1; |
344 break; | 366 break; |
345 } | 367 } |
346 | 368 |
369 SkTArray<SkAlphaType> alphaModes; | |
370 alphaModes.push_back(kPremul_SkAlphaType); | |
371 // FIXME: Currently we cannot draw unpremultiplied sources. skbug.com/3338 a nd skbug.com/3339 | |
372 // alphaModes.push_back(kUnpremul_SkAlphaType); | |
373 if (codec->getInfo().alphaType() == kOpaque_SkAlphaType) { | |
374 alphaModes.push_back(kOpaque_SkAlphaType); | |
375 } | |
347 | 376 |
348 for (CodecSrc::Mode mode : nativeModes) { | 377 for (CodecSrc::Mode mode : nativeModes) { |
349 // SkCodecImageGenerator only runs for the default colorType | 378 // SkCodecImageGenerator only runs for the default colorType |
350 // recommended by SkCodec. There is no need to generate multiple | 379 // recommended by SkCodec. There is no need to generate multiple |
351 // tests for different colorTypes. | 380 // tests for different colorTypes. |
352 // TODO (msarett): Add scaling support to SkCodecImageGenerator. | 381 // TODO (msarett): Add scaling support to SkCodecImageGenerator. |
353 if (CodecSrc::kGen_Mode == mode) { | 382 if (CodecSrc::kGen_Mode == mode) { |
354 // FIXME: The gpu backend does not draw kGray sources correctly. (sk bug.com/4822) | 383 // FIXME: The gpu backend does not draw kGray sources correctly. (sk bug.com/4822) |
355 if (kGray_8_SkColorType != codec->getInfo().colorType()) { | 384 if (kGray_8_SkColorType != codec->getInfo().colorType()) { |
356 push_codec_src(path, mode, CodecSrc::kGetFromCanvas_DstColorType , 1.0f); | 385 push_codec_src(path, mode, CodecSrc::kGetFromCanvas_DstColorType , |
386 codec->getInfo().alphaType(), 1.0f); | |
scroggo
2016/01/29 17:19:54
This will be ignored, besides appending the suffix
msarett
2016/01/29 19:17:05
Acknowledged.
| |
357 } | 387 } |
358 continue; | 388 continue; |
359 } | 389 } |
360 | 390 |
361 for (float scale : nativeScales) { | 391 for (float scale : nativeScales) { |
362 for (uint32_t i = 0; i < numColorTypes; i++) { | 392 for (uint32_t i = 0; i < numColorTypes; i++) { |
363 push_codec_src(path, mode, colorTypes[i], scale); | 393 for (SkAlphaType alphaType : alphaModes) { |
394 push_codec_src(path, mode, colorTypes[i], alphaType, scale); | |
395 } | |
364 } | 396 } |
365 } | 397 } |
366 } | 398 } |
367 | 399 |
368 // https://bug.skia.org/4428 | 400 // https://bug.skia.org/4428 |
369 bool subset = false; | 401 bool subset = false; |
370 // The following image types are supported by BitmapRegionDecoder, | 402 // The following image types are supported by BitmapRegionDecoder, |
371 // so we will test full image decodes and subset decodes. | 403 // so we will test full image decodes and subset decodes. |
372 static const char* const exts[] = { | 404 static const char* const exts[] = { |
373 "jpg", "jpeg", "png", "webp", | 405 "jpg", "jpeg", "png", "webp", |
374 "JPG", "JPEG", "PNG", "WEBP", | 406 "JPG", "JPEG", "PNG", "WEBP", |
375 }; | 407 }; |
376 for (const char* ext : exts) { | 408 for (const char* ext : exts) { |
377 if (path.endsWith(ext)) { | 409 if (path.endsWith(ext)) { |
378 subset = true; | 410 subset = true; |
379 break; | 411 break; |
380 } | 412 } |
381 } | 413 } |
382 | 414 |
383 const int sampleSizes[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; | 415 const int sampleSizes[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; |
384 | 416 |
385 for (int sampleSize : sampleSizes) { | 417 for (int sampleSize : sampleSizes) { |
386 for (uint32_t i = 0; i < numColorTypes; i++) { | 418 for (uint32_t i = 0; i < numColorTypes; i++) { |
387 push_android_codec_src(path, AndroidCodecSrc::kFullImage_Mode, color Types[i], | 419 for (SkAlphaType alphaType : alphaModes) { |
388 sampleSize); | 420 push_android_codec_src(path, AndroidCodecSrc::kFullImage_Mode, c olorTypes[i], |
389 if (subset) { | 421 alphaType, sampleSize); |
390 push_android_codec_src(path, AndroidCodecSrc::kDivisor_Mode, col orTypes[i], | 422 if (subset) { |
391 sampleSize); | 423 push_android_codec_src(path, AndroidCodecSrc::kDivisor_Mode, colorTypes[i], |
424 alphaType, sampleSize); | |
425 } | |
392 } | 426 } |
393 } | 427 } |
394 } | 428 } |
395 } | 429 } |
396 | 430 |
397 static bool brd_color_type_supported(SkBitmapRegionDecoder::Strategy strategy, | 431 static bool brd_color_type_supported(SkBitmapRegionDecoder::Strategy strategy, |
398 CodecSrc::DstColorType dstColorType) { | 432 CodecSrc::DstColorType dstColorType) { |
399 switch (strategy) { | 433 switch (strategy) { |
400 case SkBitmapRegionDecoder::kCanvas_Strategy: | 434 case SkBitmapRegionDecoder::kCanvas_Strategy: |
401 if (CodecSrc::kGetFromCanvas_DstColorType == dstColorType) { | 435 if (CodecSrc::kGetFromCanvas_DstColorType == dstColorType) { |
(...skipping 859 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1261 Reporter* reporter, | 1295 Reporter* reporter, |
1262 GrContextFactory* fac tory); | 1296 GrContextFactory* fac tory); |
1263 } // namespace skiatest | 1297 } // namespace skiatest |
1264 | 1298 |
1265 #if !defined(SK_BUILD_FOR_IOS) | 1299 #if !defined(SK_BUILD_FOR_IOS) |
1266 int main(int argc, char** argv) { | 1300 int main(int argc, char** argv) { |
1267 SkCommandLineFlags::Parse(argc, argv); | 1301 SkCommandLineFlags::Parse(argc, argv); |
1268 return dm_main(); | 1302 return dm_main(); |
1269 } | 1303 } |
1270 #endif | 1304 #endif |
OLD | NEW |