OLD | NEW |
1 #include <cmath> | 1 #include <cmath> |
2 | 2 |
3 #include "SkBitmap.h" | 3 #include "SkBitmap.h" |
4 #include "skpdiff_util.h" | 4 #include "skpdiff_util.h" |
5 #include "SkPMetric.h" | 5 #include "SkPMetric.h" |
6 #include "SkPMetricUtil_generated.h" | 6 #include "SkPMetricUtil_generated.h" |
7 | 7 |
8 struct RGB { | 8 struct RGB { |
9 float r, g, b; | 9 float r, g, b; |
10 }; | 10 }; |
(...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
423 SkDELETE_ARRAY(contrastSensitivityTable); | 423 SkDELETE_ARRAY(contrastSensitivityTable); |
424 return 1.0 - (double)failures / (width * height); | 424 return 1.0 - (double)failures / (width * height); |
425 } | 425 } |
426 | 426 |
427 const char* SkPMetric::getName() { | 427 const char* SkPMetric::getName() { |
428 return "perceptual"; | 428 return "perceptual"; |
429 } | 429 } |
430 | 430 |
431 int SkPMetric::queueDiff(SkBitmap* baseline, SkBitmap* test) { | 431 int SkPMetric::queueDiff(SkBitmap* baseline, SkBitmap* test) { |
432 double startTime = get_seconds(); | 432 double startTime = get_seconds(); |
| 433 |
| 434 // since we currently synchronously do the diff within queueDiff we only nee
d |
| 435 // to protect the createion of the ID and queuedDiff object. |
| 436 SkAutoMutexAcquire queueLock(fQueueMutex); |
433 int diffID = fQueuedDiffs.count(); | 437 int diffID = fQueuedDiffs.count(); |
434 QueuedDiff& diff = fQueuedDiffs.push_back(); | 438 QueuedDiff& diff = fQueuedDiffs.push_back(); |
| 439 queueLock.release(); |
| 440 |
435 diff.result = 0.0; | 441 diff.result = 0.0; |
436 | 442 |
437 // Ensure the images are comparable | 443 // Ensure the images are comparable |
438 if (baseline->width() != test->width() || baseline->height() != test->height
() || | 444 if (baseline->width() != test->width() || baseline->height() != test->height
() || |
439 baseline->width() <= 0 || baseline->height() <= 0) { | 445 baseline->width() <= 0 || baseline->height() <= 0) { |
440 diff.finished = true; | 446 diff.finished = true; |
441 return diffID; | 447 return diffID; |
442 } | 448 } |
443 | 449 |
444 ImageLAB baselineLAB(baseline->width(), baseline->height()); | 450 ImageLAB baselineLAB(baseline->width(), baseline->height()); |
445 ImageLAB testLAB(baseline->width(), baseline->height()); | 451 ImageLAB testLAB(baseline->width(), baseline->height()); |
446 | 452 |
447 bitmap_to_cielab(baseline, &baselineLAB); | 453 bitmap_to_cielab(baseline, &baselineLAB); |
448 bitmap_to_cielab(test, &testLAB); | 454 bitmap_to_cielab(test, &testLAB); |
449 | 455 |
450 diff.result = pmetric(&baselineLAB, &testLAB, &diff.poi); | 456 diff.result = pmetric(&baselineLAB, &testLAB, &diff.poi); |
451 | 457 |
452 SkDebugf("Time: %f\n", (get_seconds() - startTime)); | 458 SkDebugf("Time: %f\n", (get_seconds() - startTime)); |
453 | 459 |
454 return diffID; | 460 return diffID; |
455 } | 461 } |
456 | 462 |
457 | 463 |
458 void SkPMetric::deleteDiff(int id) { | 464 void SkPMetric::deleteDiff(int id) { |
459 | 465 // clean up the POI array to save space |
| 466 return fQueuedDiffs[id].poi.reset(); |
460 } | 467 } |
461 | 468 |
462 bool SkPMetric::isFinished(int id) { | 469 bool SkPMetric::isFinished(int id) { |
463 return fQueuedDiffs[id].finished; | 470 return fQueuedDiffs[id].finished; |
464 } | 471 } |
465 | 472 |
466 double SkPMetric::getResult(int id) { | 473 double SkPMetric::getResult(int id) { |
467 return fQueuedDiffs[id].result; | 474 return fQueuedDiffs[id].result; |
468 } | 475 } |
469 | 476 |
470 int SkPMetric::getPointsOfInterestCount(int id) { | 477 int SkPMetric::getPointsOfInterestCount(int id) { |
471 return fQueuedDiffs[id].poi.count(); | 478 return fQueuedDiffs[id].poi.count(); |
472 } | 479 } |
473 | 480 |
474 SkIPoint* SkPMetric::getPointsOfInterest(int id) { | 481 SkIPoint* SkPMetric::getPointsOfInterest(int id) { |
475 return fQueuedDiffs[id].poi.begin(); | 482 return fQueuedDiffs[id].poi.begin(); |
476 } | 483 } |
OLD | NEW |