2013-07-02 19:55:32 +00:00
|
|
|
/*
|
|
|
|
* Copyright 2013 Google Inc.
|
|
|
|
*
|
|
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
|
|
* found in the LICENSE file.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef SkDiffContext_DEFINED
|
|
|
|
#define SkDiffContext_DEFINED
|
|
|
|
|
2013-11-12 18:29:17 +00:00
|
|
|
#include "SkImageDiffer.h"
|
2013-07-02 19:55:32 +00:00
|
|
|
#include "SkString.h"
|
|
|
|
#include "SkTArray.h"
|
|
|
|
#include "SkTDArray.h"
|
2013-11-12 18:29:17 +00:00
|
|
|
#include "SkTLList.h"
|
|
|
|
#include "SkThread.h"
|
2013-07-02 19:55:32 +00:00
|
|
|
|
|
|
|
class SkWStream;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Collects records of diffs and outputs them as JSON.
|
|
|
|
*/
|
|
|
|
class SkDiffContext {
|
|
|
|
public:
|
|
|
|
SkDiffContext();
|
|
|
|
~SkDiffContext();
|
|
|
|
|
2013-10-16 18:36:49 +00:00
|
|
|
void setThreadCount(int threadCount) { fThreadCount = threadCount; }
|
|
|
|
|
2013-11-07 19:24:06 +00:00
|
|
|
/**
|
2014-07-02 14:43:04 +00:00
|
|
|
* Sets the directory within which to store alphaMasks (images that
|
|
|
|
* are transparent for each pixel that differs between baseline and test).
|
|
|
|
*
|
|
|
|
* If the directory does not exist yet, it will be created.
|
|
|
|
*/
|
|
|
|
void setAlphaMaskDir(const SkString& directory);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets the directory within which to store rgbDiffs (images showing the
|
|
|
|
* per-channel difference between baseline and test at each pixel).
|
|
|
|
*
|
|
|
|
* If the directory does not exist yet, it will be created.
|
|
|
|
*/
|
|
|
|
void setRgbDiffDir(const SkString& directory);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets the directory within which to store whiteDiffs (images showing white
|
|
|
|
* for each pixel that differs between baseline and test).
|
|
|
|
*
|
|
|
|
* If the directory does not exist yet, it will be created.
|
2013-11-07 19:24:06 +00:00
|
|
|
*/
|
2014-07-02 14:43:04 +00:00
|
|
|
void setWhiteDiffDir(const SkString& directory);
|
2013-11-07 19:24:06 +00:00
|
|
|
|
2013-07-02 19:55:32 +00:00
|
|
|
/**
|
|
|
|
* Sets the differs to be used in each diff. Already started diffs will not retroactively use
|
|
|
|
* these.
|
|
|
|
* @param differs An array of differs to use. The array is copied, but not the differs
|
|
|
|
* themselves.
|
|
|
|
*/
|
|
|
|
void setDiffers(const SkTDArray<SkImageDiffer*>& differs);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Compares two directories of images with the given differ
|
|
|
|
* @param baselinePath The baseline directory's path
|
|
|
|
* @param testPath The test directory's path
|
|
|
|
*/
|
|
|
|
void diffDirectories(const char baselinePath[], const char testPath[]);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Compares two sets of images identified by glob style patterns with the given differ
|
|
|
|
* @param baselinePattern A pattern for baseline files
|
|
|
|
* @param testPattern A pattern for test files that matches each file of the baseline file
|
|
|
|
*/
|
|
|
|
void diffPatterns(const char baselinePattern[], const char testPattern[]);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Compares the images at the given paths
|
|
|
|
* @param baselinePath The baseline file path
|
|
|
|
* @param testPath The matching test file path
|
|
|
|
*/
|
|
|
|
void addDiff(const char* baselinePath, const char* testPath);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Output the records of each diff in JSON.
|
|
|
|
*
|
|
|
|
* The format of the JSON document is one top level array named "records".
|
2013-11-12 18:29:17 +00:00
|
|
|
* Each record in the array is an object with the following values:
|
|
|
|
* "commonName" : string containing the common prefix of the baselinePath
|
|
|
|
* and testPath filenames
|
|
|
|
* "baselinePath" : string containing the path to the baseline image
|
|
|
|
* "testPath" : string containing the path to the test image
|
|
|
|
* "differencePath" : (optional) string containing the path to an alpha
|
|
|
|
* mask of the pixel difference between the baseline
|
|
|
|
* and test images
|
2014-07-02 14:43:04 +00:00
|
|
|
* TODO(epoger): consider renaming this "alphaMaskPath"
|
|
|
|
* to distinguish from other difference types?
|
|
|
|
* "rgbDiffPath" : (optional) string containing the path to a bitmap
|
|
|
|
* showing per-channel differences between the
|
|
|
|
* baseline and test images at each pixel
|
|
|
|
* "whiteDiffPath" : (optional) string containing the path to a bitmap
|
|
|
|
* showing every pixel that differs between the
|
|
|
|
* baseline and test images as white
|
2013-11-12 18:29:17 +00:00
|
|
|
*
|
2013-07-02 19:55:32 +00:00
|
|
|
* They also have an array named "diffs" with each element being one diff record for the two
|
|
|
|
* images indicated in the above field.
|
|
|
|
* A diff record includes:
|
|
|
|
* "differName" : string name of the diff metric used
|
|
|
|
* "result" : numerical result of the diff
|
|
|
|
*
|
|
|
|
* Here is an example:
|
|
|
|
*
|
|
|
|
* {
|
|
|
|
* "records": [
|
|
|
|
* {
|
2013-11-12 18:29:17 +00:00
|
|
|
* "commonName": "queue.png",
|
|
|
|
* "baselinePath": "/a/queue.png",
|
|
|
|
* "testPath": "/b/queue.png",
|
2013-07-02 19:55:32 +00:00
|
|
|
* "diffs": [
|
|
|
|
* {
|
|
|
|
* "differName": "different_pixels",
|
|
|
|
* "result": 1,
|
|
|
|
* }
|
|
|
|
* ]
|
|
|
|
* }
|
|
|
|
* ]
|
|
|
|
* }
|
|
|
|
*
|
2013-07-08 15:04:45 +00:00
|
|
|
* @param stream The stream to output the diff to
|
|
|
|
* @param useJSONP True to adding padding to the JSON output to make it cross-site requestable.
|
2013-07-02 19:55:32 +00:00
|
|
|
*/
|
2013-07-08 15:04:45 +00:00
|
|
|
void outputRecords(SkWStream& stream, bool useJSONP);
|
2013-07-02 19:55:32 +00:00
|
|
|
|
2013-07-22 15:24:26 +00:00
|
|
|
/**
|
|
|
|
* Output the records score in csv format.
|
|
|
|
*/
|
|
|
|
void outputCsv(SkWStream& stream);
|
|
|
|
|
|
|
|
|
2013-07-02 19:55:32 +00:00
|
|
|
private:
|
|
|
|
struct DiffData {
|
|
|
|
const char* fDiffName;
|
2013-11-12 18:29:17 +00:00
|
|
|
SkImageDiffer::Result fResult;
|
2013-07-02 19:55:32 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct DiffRecord {
|
2014-07-02 14:43:04 +00:00
|
|
|
// TODO(djsollen): Some of these fields are required, while others are optional
|
|
|
|
// (e.g., fRgbDiffPath is only filled in if SkDifferentPixelsMetric
|
|
|
|
// was run). Figure out a way to note that. See http://skbug.com/2712
|
|
|
|
// ('allow skpdiff to report different sets of result fields for
|
|
|
|
// different comparison algorithms')
|
2013-11-07 19:24:06 +00:00
|
|
|
SkString fCommonName;
|
2014-07-02 14:43:04 +00:00
|
|
|
SkString fAlphaMaskPath;
|
|
|
|
SkString fRgbDiffPath;
|
|
|
|
SkString fWhiteDiffPath;
|
2013-07-02 19:55:32 +00:00
|
|
|
SkString fBaselinePath;
|
|
|
|
SkString fTestPath;
|
2014-07-02 14:43:04 +00:00
|
|
|
SkISize fSize;
|
|
|
|
int fMaxRedDiff;
|
|
|
|
int fMaxGreenDiff;
|
|
|
|
int fMaxBlueDiff;
|
2013-07-02 19:55:32 +00:00
|
|
|
SkTArray<DiffData> fDiffs;
|
|
|
|
};
|
|
|
|
|
2013-11-12 18:29:17 +00:00
|
|
|
// Used to protect access to fRecords and ensure only one thread is
|
|
|
|
// adding new entries at a time.
|
|
|
|
SkMutex fRecordMutex;
|
|
|
|
|
2013-07-02 19:55:32 +00:00
|
|
|
// We use linked list for the records so that their pointers remain stable. A resizable array
|
|
|
|
// might change its pointers, which would make it harder for async diffs to record their
|
|
|
|
// results.
|
2013-11-12 18:29:17 +00:00
|
|
|
SkTLList<DiffRecord> fRecords;
|
2013-07-02 19:55:32 +00:00
|
|
|
|
|
|
|
SkImageDiffer** fDiffers;
|
|
|
|
int fDifferCount;
|
2013-10-16 18:36:49 +00:00
|
|
|
int fThreadCount;
|
2013-11-07 19:24:06 +00:00
|
|
|
|
2014-07-02 14:43:04 +00:00
|
|
|
SkString fAlphaMaskDir;
|
|
|
|
SkString fRgbDiffDir;
|
|
|
|
SkString fWhiteDiffDir;
|
2013-07-02 19:55:32 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|