OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 #include "skdiff.h" | 7 #include "skdiff.h" |
8 #include "skdiff_html.h" | 8 #include "skdiff_html.h" |
9 #include "skdiff_utils.h" | 9 #include "skdiff_utils.h" |
10 #include "SkBitmap.h" | 10 #include "SkBitmap.h" |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
304 get_bitmap(fileBits, resource, SkImageDecoder::kDecodeBounds_Mode); | 304 get_bitmap(fileBits, resource, SkImageDecoder::kDecodeBounds_Mode); |
305 } | 305 } |
306 } | 306 } |
307 } | 307 } |
308 | 308 |
309 static void get_bounds(DiffRecord& drp) { | 309 static void get_bounds(DiffRecord& drp) { |
310 get_bounds(drp.fBase, "base"); | 310 get_bounds(drp.fBase, "base"); |
311 get_bounds(drp.fComparison, "comparison"); | 311 get_bounds(drp.fComparison, "comparison"); |
312 } | 312 } |
313 | 313 |
| 314 #ifdef SK_OS_WIN |
| 315 #define ANSI_COLOR_RED "" |
| 316 #define ANSI_COLOR_GREEN "" |
| 317 #define ANSI_COLOR_YELLOW "" |
| 318 #define ANSI_COLOR_RESET "" |
| 319 #else |
| 320 #define ANSI_COLOR_RED "\x1b[31m" |
| 321 #define ANSI_COLOR_GREEN "\x1b[32m" |
| 322 #define ANSI_COLOR_YELLOW "\x1b[33m" |
| 323 #define ANSI_COLOR_RESET "\x1b[0m" |
| 324 #endif |
| 325 |
| 326 #define VERBOSE_STATUS(status,color,filename) if (verbose) printf( "[ " color "
%10s " ANSI_COLOR_RESET " ] %s\n", status, filename->c_str()) |
| 327 |
314 /// Creates difference images, returns the number that have a 0 metric. | 328 /// Creates difference images, returns the number that have a 0 metric. |
315 /// If outputDir.isEmpty(), don't write out diff files. | 329 /// If outputDir.isEmpty(), don't write out diff files. |
316 static void create_diff_images (DiffMetricProc dmp, | 330 static void create_diff_images (DiffMetricProc dmp, |
317 const int colorThreshold, | 331 const int colorThreshold, |
318 RecordArray* differences, | 332 RecordArray* differences, |
319 const SkString& baseDir, | 333 const SkString& baseDir, |
320 const SkString& comparisonDir, | 334 const SkString& comparisonDir, |
321 const SkString& outputDir, | 335 const SkString& outputDir, |
322 const StringArray& matchSubstrings, | 336 const StringArray& matchSubstrings, |
323 const StringArray& nomatchSubstrings, | 337 const StringArray& nomatchSubstrings, |
324 bool recurseIntoSubdirs, | 338 bool recurseIntoSubdirs, |
325 bool getBounds, | 339 bool getBounds, |
| 340 bool verbose, |
326 DiffSummary* summary) { | 341 DiffSummary* summary) { |
327 SkASSERT(!baseDir.isEmpty()); | 342 SkASSERT(!baseDir.isEmpty()); |
328 SkASSERT(!comparisonDir.isEmpty()); | 343 SkASSERT(!comparisonDir.isEmpty()); |
329 | 344 |
330 FileArray baseFiles; | 345 FileArray baseFiles; |
331 FileArray comparisonFiles; | 346 FileArray comparisonFiles; |
332 | 347 |
333 get_file_list(baseDir, matchSubstrings, nomatchSubstrings, recurseIntoSubdir
s, &baseFiles); | 348 get_file_list(baseDir, matchSubstrings, nomatchSubstrings, recurseIntoSubdir
s, &baseFiles); |
334 get_file_list(comparisonDir, matchSubstrings, nomatchSubstrings, recurseInto
Subdirs, | 349 get_file_list(comparisonDir, matchSubstrings, nomatchSubstrings, recurseInto
Subdirs, |
335 &comparisonFiles); | 350 &comparisonFiles); |
(...skipping 27 matching lines...) Expand all Loading... |
363 comparisonPath.append(*baseFiles[i]); | 378 comparisonPath.append(*baseFiles[i]); |
364 | 379 |
365 drp->fBase.fFilename = *baseFiles[i]; | 380 drp->fBase.fFilename = *baseFiles[i]; |
366 drp->fBase.fFullPath = basePath; | 381 drp->fBase.fFullPath = basePath; |
367 drp->fBase.fStatus = DiffResource::kExists_Status; | 382 drp->fBase.fStatus = DiffResource::kExists_Status; |
368 | 383 |
369 drp->fComparison.fFilename = *baseFiles[i]; | 384 drp->fComparison.fFilename = *baseFiles[i]; |
370 drp->fComparison.fFullPath = comparisonPath; | 385 drp->fComparison.fFullPath = comparisonPath; |
371 drp->fComparison.fStatus = DiffResource::kDoesNotExist_Status; | 386 drp->fComparison.fStatus = DiffResource::kDoesNotExist_Status; |
372 | 387 |
| 388 VERBOSE_STATUS("MISSING", ANSI_COLOR_YELLOW, baseFiles[i]); |
| 389 |
373 ++i; | 390 ++i; |
374 } else if (v > 0) { | 391 } else if (v > 0) { |
375 // in comparisonDir, but not in baseDir | 392 // in comparisonDir, but not in baseDir |
376 drp->fResult = DiffRecord::kCouldNotCompare_Result; | 393 drp->fResult = DiffRecord::kCouldNotCompare_Result; |
377 | 394 |
378 basePath.append(*comparisonFiles[j]); | 395 basePath.append(*comparisonFiles[j]); |
379 comparisonPath.append(*comparisonFiles[j]); | 396 comparisonPath.append(*comparisonFiles[j]); |
380 | 397 |
381 drp->fBase.fFilename = *comparisonFiles[j]; | 398 drp->fBase.fFilename = *comparisonFiles[j]; |
382 drp->fBase.fFullPath = basePath; | 399 drp->fBase.fFullPath = basePath; |
383 drp->fBase.fStatus = DiffResource::kDoesNotExist_Status; | 400 drp->fBase.fStatus = DiffResource::kDoesNotExist_Status; |
384 | 401 |
385 drp->fComparison.fFilename = *comparisonFiles[j]; | 402 drp->fComparison.fFilename = *comparisonFiles[j]; |
386 drp->fComparison.fFullPath = comparisonPath; | 403 drp->fComparison.fFullPath = comparisonPath; |
387 drp->fComparison.fStatus = DiffResource::kExists_Status; | 404 drp->fComparison.fStatus = DiffResource::kExists_Status; |
388 | 405 |
| 406 VERBOSE_STATUS("MISSING", ANSI_COLOR_YELLOW, comparisonFiles[j]); |
| 407 |
389 ++j; | 408 ++j; |
390 } else { | 409 } else { |
391 // Found the same filename in both baseDir and comparisonDir. | 410 // Found the same filename in both baseDir and comparisonDir. |
392 SkASSERT(DiffRecord::kUnknown_Result == drp->fResult); | 411 SkASSERT(DiffRecord::kUnknown_Result == drp->fResult); |
393 | 412 |
394 basePath.append(*baseFiles[i]); | 413 basePath.append(*baseFiles[i]); |
395 comparisonPath.append(*comparisonFiles[j]); | 414 comparisonPath.append(*comparisonFiles[j]); |
396 | 415 |
397 drp->fBase.fFilename = *baseFiles[i]; | 416 drp->fBase.fFilename = *baseFiles[i]; |
398 drp->fBase.fFullPath = basePath; | 417 drp->fBase.fFullPath = basePath; |
399 drp->fBase.fStatus = DiffResource::kExists_Status; | 418 drp->fBase.fStatus = DiffResource::kExists_Status; |
400 | 419 |
401 drp->fComparison.fFilename = *comparisonFiles[j]; | 420 drp->fComparison.fFilename = *comparisonFiles[j]; |
402 drp->fComparison.fFullPath = comparisonPath; | 421 drp->fComparison.fFullPath = comparisonPath; |
403 drp->fComparison.fStatus = DiffResource::kExists_Status; | 422 drp->fComparison.fStatus = DiffResource::kExists_Status; |
404 | 423 |
405 SkAutoDataUnref baseFileBits(read_file(drp->fBase.fFullPath.c_str())
); | 424 SkAutoDataUnref baseFileBits(read_file(drp->fBase.fFullPath.c_str())
); |
406 if (NULL != baseFileBits) { | 425 if (NULL != baseFileBits) { |
407 drp->fBase.fStatus = DiffResource::kRead_Status; | 426 drp->fBase.fStatus = DiffResource::kRead_Status; |
408 } | 427 } |
409 SkAutoDataUnref comparisonFileBits(read_file(drp->fComparison.fFullP
ath.c_str())); | 428 SkAutoDataUnref comparisonFileBits(read_file(drp->fComparison.fFullP
ath.c_str())); |
410 if (NULL != comparisonFileBits) { | 429 if (NULL != comparisonFileBits) { |
411 drp->fComparison.fStatus = DiffResource::kRead_Status; | 430 drp->fComparison.fStatus = DiffResource::kRead_Status; |
412 } | 431 } |
413 if (NULL == baseFileBits || NULL == comparisonFileBits) { | 432 if (NULL == baseFileBits || NULL == comparisonFileBits) { |
414 if (NULL == baseFileBits) { | 433 if (NULL == baseFileBits) { |
415 drp->fBase.fStatus = DiffResource::kCouldNotRead_Status; | 434 drp->fBase.fStatus = DiffResource::kCouldNotRead_Status; |
| 435 VERBOSE_STATUS("READ FAIL", ANSI_COLOR_RED, baseFiles[i]); |
416 } | 436 } |
417 if (NULL == comparisonFileBits) { | 437 if (NULL == comparisonFileBits) { |
418 drp->fComparison.fStatus = DiffResource::kCouldNotRead_Statu
s; | 438 drp->fComparison.fStatus = DiffResource::kCouldNotRead_Statu
s; |
| 439 VERBOSE_STATUS("READ FAIL", ANSI_COLOR_RED, comparisonFiles[
j]); |
419 } | 440 } |
420 drp->fResult = DiffRecord::kCouldNotCompare_Result; | 441 drp->fResult = DiffRecord::kCouldNotCompare_Result; |
421 | 442 |
422 } else if (are_buffers_equal(baseFileBits, comparisonFileBits)) { | 443 } else if (are_buffers_equal(baseFileBits, comparisonFileBits)) { |
423 drp->fResult = DiffRecord::kEqualBits_Result; | 444 drp->fResult = DiffRecord::kEqualBits_Result; |
424 | 445 VERBOSE_STATUS("MATCH", ANSI_COLOR_GREEN, baseFiles[i]); |
425 } else { | 446 } else { |
426 AutoReleasePixels arp(drp); | 447 AutoReleasePixels arp(drp); |
427 get_bitmap(baseFileBits, drp->fBase, SkImageDecoder::kDecodePixe
ls_Mode); | 448 get_bitmap(baseFileBits, drp->fBase, SkImageDecoder::kDecodePixe
ls_Mode); |
428 get_bitmap(comparisonFileBits, drp->fComparison, | 449 get_bitmap(comparisonFileBits, drp->fComparison, |
429 SkImageDecoder::kDecodePixels_Mode); | 450 SkImageDecoder::kDecodePixels_Mode); |
| 451 VERBOSE_STATUS("DIFFERENT", ANSI_COLOR_RED, baseFiles[i]); |
430 if (DiffResource::kDecoded_Status == drp->fBase.fStatus && | 452 if (DiffResource::kDecoded_Status == drp->fBase.fStatus && |
431 DiffResource::kDecoded_Status == drp->fComparison.fStatus) { | 453 DiffResource::kDecoded_Status == drp->fComparison.fStatus) { |
432 create_and_write_diff_image(drp, dmp, colorThreshold, | 454 create_and_write_diff_image(drp, dmp, colorThreshold, |
433 outputDir, drp->fBase.fFilename)
; | 455 outputDir, drp->fBase.fFilename)
; |
434 } else { | 456 } else { |
435 drp->fResult = DiffRecord::kCouldNotCompare_Result; | 457 drp->fResult = DiffRecord::kCouldNotCompare_Result; |
436 } | 458 } |
437 } | 459 } |
438 | 460 |
439 ++i; | 461 ++i; |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
551 SkString comparisonDir; | 573 SkString comparisonDir; |
552 SkString outputDir; | 574 SkString outputDir; |
553 | 575 |
554 StringArray matchSubstrings; | 576 StringArray matchSubstrings; |
555 StringArray nomatchSubstrings; | 577 StringArray nomatchSubstrings; |
556 | 578 |
557 bool generateDiffs = true; | 579 bool generateDiffs = true; |
558 bool listFilenames = false; | 580 bool listFilenames = false; |
559 bool printDirNames = true; | 581 bool printDirNames = true; |
560 bool recurseIntoSubdirs = true; | 582 bool recurseIntoSubdirs = true; |
| 583 bool verbose = false; |
561 | 584 |
562 RecordArray differences; | 585 RecordArray differences; |
563 DiffSummary summary; | 586 DiffSummary summary; |
564 | 587 |
565 bool failOnResultType[DiffRecord::kResultCount]; | 588 bool failOnResultType[DiffRecord::kResultCount]; |
566 for (int i = 0; i < DiffRecord::kResultCount; i++) { | 589 for (int i = 0; i < DiffRecord::kResultCount; i++) { |
567 failOnResultType[i] = false; | 590 failOnResultType[i] = false; |
568 } | 591 } |
569 | 592 |
570 bool failOnStatusType[DiffResource::kStatusCount][DiffResource::kStatusCount
]; | 593 bool failOnStatusType[DiffResource::kStatusCount][DiffResource::kStatusCount
]; |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
618 continue; | 641 continue; |
619 } | 642 } |
620 if (!strcmp(argv[i], "--help")) { | 643 if (!strcmp(argv[i], "--help")) { |
621 usage(argv[0]); | 644 usage(argv[0]); |
622 return kNoError; | 645 return kNoError; |
623 } | 646 } |
624 if (!strcmp(argv[i], "--listfilenames")) { | 647 if (!strcmp(argv[i], "--listfilenames")) { |
625 listFilenames = true; | 648 listFilenames = true; |
626 continue; | 649 continue; |
627 } | 650 } |
| 651 if (!strcmp(argv[i], "--verbose")) { |
| 652 verbose = true; |
| 653 continue; |
| 654 } |
628 if (!strcmp(argv[i], "--match")) { | 655 if (!strcmp(argv[i], "--match")) { |
629 matchSubstrings.push(new SkString(argv[++i])); | 656 matchSubstrings.push(new SkString(argv[++i])); |
630 continue; | 657 continue; |
631 } | 658 } |
632 if (!strcmp(argv[i], "--nodiffs")) { | 659 if (!strcmp(argv[i], "--nodiffs")) { |
633 generateDiffs = false; | 660 generateDiffs = false; |
634 continue; | 661 continue; |
635 } | 662 } |
636 if (!strcmp(argv[i], "--nomatch")) { | 663 if (!strcmp(argv[i], "--nomatch")) { |
637 nomatchSubstrings.push(new SkString(argv[++i])); | 664 nomatchSubstrings.push(new SkString(argv[++i])); |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
721 | 748 |
722 // If no matchSubstrings were specified, match ALL strings | 749 // If no matchSubstrings were specified, match ALL strings |
723 // (except for whatever nomatchSubstrings were specified, if any). | 750 // (except for whatever nomatchSubstrings were specified, if any). |
724 if (matchSubstrings.isEmpty()) { | 751 if (matchSubstrings.isEmpty()) { |
725 matchSubstrings.push(new SkString("")); | 752 matchSubstrings.push(new SkString("")); |
726 } | 753 } |
727 | 754 |
728 create_diff_images(diffProc, colorThreshold, &differences, | 755 create_diff_images(diffProc, colorThreshold, &differences, |
729 baseDir, comparisonDir, outputDir, | 756 baseDir, comparisonDir, outputDir, |
730 matchSubstrings, nomatchSubstrings, recurseIntoSubdirs, g
enerateDiffs, | 757 matchSubstrings, nomatchSubstrings, recurseIntoSubdirs, g
enerateDiffs, |
731 &summary); | 758 verbose, &summary); |
732 summary.print(listFilenames, failOnResultType, failOnStatusType); | 759 summary.print(listFilenames, failOnResultType, failOnStatusType); |
733 | 760 |
734 if (differences.count()) { | 761 if (differences.count()) { |
735 qsort(differences.begin(), differences.count(), | 762 qsort(differences.begin(), differences.count(), |
736 sizeof(DiffRecord*), sortProc); | 763 sizeof(DiffRecord*), sortProc); |
737 } | 764 } |
738 | 765 |
739 if (generateDiffs) { | 766 if (generateDiffs) { |
740 print_diff_page(summary.fNumMatches, colorThreshold, differences, | 767 print_diff_page(summary.fNumMatches, colorThreshold, differences, |
741 baseDir, comparisonDir, outputDir); | 768 baseDir, comparisonDir, outputDir); |
(...skipping 25 matching lines...) Expand all Loading... |
767 // range [0...255] are wrapped (mod 256). Do the conversion ourselves, to | 794 // range [0...255] are wrapped (mod 256). Do the conversion ourselves, to |
768 // make sure that we only return 0 when there were no failures. | 795 // make sure that we only return 0 when there were no failures. |
769 return (num_failing_results > 255) ? 255 : num_failing_results; | 796 return (num_failing_results > 255) ? 255 : num_failing_results; |
770 } | 797 } |
771 | 798 |
772 #if !defined SK_BUILD_FOR_IOS | 799 #if !defined SK_BUILD_FOR_IOS |
773 int main(int argc, char * const argv[]) { | 800 int main(int argc, char * const argv[]) { |
774 return tool_main(argc, (char**) argv); | 801 return tool_main(argc, (char**) argv); |
775 } | 802 } |
776 #endif | 803 #endif |
OLD | NEW |