Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(19)

Side by Side Diff: tools/skpdiff/SkPMetric.cpp

Issue 60833002: fix multithread related crashes in skpdiff (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: addressing comments Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« tools/skpdiff/SkImageDiffer.cpp ('K') | « tools/skpdiff/SkPMetric.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
258 // As we move down, scroll the row pointers down with us 258 // As we move down, scroll the row pointers down with us
259 for (int y = 0; y < matrixCount - 1; y++) 259 for (int y = 0; y < matrixCount - 1; y++)
260 { 260 {
261 rowPtrs[y] = rowPtrs[y + 1]; 261 rowPtrs[y] = rowPtrs[y + 1];
262 } 262 }
263 rowPtrs[matrixCount - 1] += imageL->width; 263 rowPtrs[matrixCount - 1] += imageL->width;
264 writeRow += imageL->width; 264 writeRow += imageL->width;
265 } 265 }
266 } 266 }
267 267
268 static double pmetric(const ImageLAB* baselineLAB, const ImageLAB* testLAB, SkTD Array<SkIPoint>* poi) { 268 static double pmetric(const ImageLAB* baselineLAB, const ImageLAB* testLAB, int* poiCount) {
269 SkASSERT(baselineLAB);
270 SkASSERT(testLAB);
271 SkASSERT(poiCount);
272
269 int width = baselineLAB->width; 273 int width = baselineLAB->width;
270 int height = baselineLAB->height; 274 int height = baselineLAB->height;
271 int maxLevels = 0; 275 int maxLevels = 0;
272 276
273 // Calculates how many levels to make by how many times the image can be div ided in two 277 // Calculates how many levels to make by how many times the image can be div ided in two
274 int smallerDimension = width < height ? width : height; 278 int smallerDimension = width < height ? width : height;
275 for ( ; smallerDimension > 1; smallerDimension /= 2) { 279 for ( ; smallerDimension > 1; smallerDimension /= 2) {
276 maxLevels++; 280 maxLevels++;
277 } 281 }
278 282
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
322 convolve(&scratchImageL, true, testL.getLayer(levelIndex)); 326 convolve(&scratchImageL, true, testL.getLayer(levelIndex));
323 } 327 }
324 328
325 // Compute F_freq - The elevation f 329 // Compute F_freq - The elevation f
326 for (int levelIndex = 0; levelIndex < maxLevels - 2; levelIndex++) { 330 for (int levelIndex = 0; levelIndex < maxLevels - 2; levelIndex++) {
327 float cpd = cyclesPerDegree[levelIndex]; 331 float cpd = cyclesPerDegree[levelIndex];
328 thresholdFactorFrequency[levelIndex] = contrastSensitivityMax / 332 thresholdFactorFrequency[levelIndex] = contrastSensitivityMax /
329 contrast_sensitivity(cpd, 100.0f) ; 333 contrast_sensitivity(cpd, 100.0f) ;
330 } 334 }
331 335
332 int failures = 0;
333 // Calculate F 336 // Calculate F
334 for (int y = 0; y < height; y++) { 337 for (int y = 0; y < height; y++) {
335 for (int x = 0; x < width; x++) { 338 for (int x = 0; x < width; x++) {
336 float lBaseline; 339 float lBaseline;
337 float lTest; 340 float lTest;
338 baselineL.getLayer(0)->readPixel(x, y, &lBaseline); 341 baselineL.getLayer(0)->readPixel(x, y, &lBaseline);
339 testL.getLayer(0)->readPixel(x, y, &lTest); 342 testL.getLayer(0)->readPixel(x, y, &lTest);
340 343
341 float avgLBaseline; 344 float avgLBaseline;
342 float avgLTest; 345 float avgLTest;
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
417 } 420 }
418 colorScale *= colorScale; 421 colorScale *= colorScale;
419 422
420 if ((contrastA * contrastA + contrastB * contrastB) * colorScale > F) 423 if ((contrastA * contrastA + contrastB * contrastB) * colorScale > F)
421 { 424 {
422 isFailure = true; 425 isFailure = true;
423 } 426 }
424 } 427 }
425 428
426 if (isFailure) { 429 if (isFailure) {
427 failures++; 430 (*poiCount)++;
428 poi->push()->set(x, y);
429 } 431 }
430 } 432 }
431 } 433 }
432 434
433 SkDELETE_ARRAY(cyclesPerDegree); 435 SkDELETE_ARRAY(cyclesPerDegree);
434 SkDELETE_ARRAY(contrast); 436 SkDELETE_ARRAY(contrast);
435 SkDELETE_ARRAY(thresholdFactorFrequency); 437 SkDELETE_ARRAY(thresholdFactorFrequency);
436 SkDELETE_ARRAY(contrastSensitivityTable); 438 SkDELETE_ARRAY(contrastSensitivityTable);
437 return 1.0 - (double)failures / (width * height); 439 return 1.0 - (double)(*poiCount) / (width * height);
438 } 440 }
439 441
440 const char* SkPMetric::getName() { 442 bool SkPMetric::diff(SkBitmap* baseline, SkBitmap* test, bool computeMask, Resul t* result) const {
441 return "perceptual";
442 }
443
444 int SkPMetric::queueDiff(SkBitmap* baseline, SkBitmap* test) {
445 double startTime = get_seconds(); 443 double startTime = get_seconds();
446 int diffID = fQueuedDiffs.count();
447 QueuedDiff& diff = fQueuedDiffs.push_back();
448 diff.result = 0.0;
449 444
450 // Ensure the images are comparable 445 // Ensure the images are comparable
451 if (baseline->width() != test->width() || baseline->height() != test->height () || 446 if (baseline->width() != test->width() || baseline->height() != test->height () ||
452 baseline->width() <= 0 || baseline->height() <= 0) { 447 baseline->width() <= 0 || baseline->height() <= 0) {
453 diff.finished = true; 448 return false;
454 return diffID;
455 } 449 }
456 450
457 ImageLAB baselineLAB(baseline->width(), baseline->height()); 451 ImageLAB baselineLAB(baseline->width(), baseline->height());
458 ImageLAB testLAB(baseline->width(), baseline->height()); 452 ImageLAB testLAB(baseline->width(), baseline->height());
459 453
460 if (!bitmap_to_cielab(baseline, &baselineLAB) || !bitmap_to_cielab(test, &te stLAB)) { 454 if (!bitmap_to_cielab(baseline, &baselineLAB) || !bitmap_to_cielab(test, &te stLAB)) {
461 return diffID; 455 return true;
462 } 456 }
463 457
464 diff.result = pmetric(&baselineLAB, &testLAB, &diff.poi); 458 result->poiCount = 0;
459 result->result = pmetric(&baselineLAB, &testLAB, &result->poiCount);
460 result->timeElapsed = get_seconds() - startTime;
465 461
466 SkDebugf("Time: %f\n", (get_seconds() - startTime)); 462 return true;
467
468 return diffID;
469 } 463 }
470
471
472 void SkPMetric::deleteDiff(int id) {
473
474 }
475
476 bool SkPMetric::isFinished(int id) {
477 return fQueuedDiffs[id].finished;
478 }
479
480 double SkPMetric::getResult(int id) {
481 return fQueuedDiffs[id].result;
482 }
483
484 int SkPMetric::getPointsOfInterestCount(int id) {
485 return fQueuedDiffs[id].poi.count();
486 }
487
488 SkIPoint* SkPMetric::getPointsOfInterest(int id) {
489 return fQueuedDiffs[id].poi.begin();
490 }
OLDNEW
« tools/skpdiff/SkImageDiffer.cpp ('K') | « tools/skpdiff/SkPMetric.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698