reland "extract some common code from PictureRenderer"

re-lands https://codereview.chromium.org/273703006/

NOTRY=True
R=bungeman@google.com, djsollen@google.com

Author: epoger@google.com

Review URL: https://codereview.chromium.org/278633002

git-svn-id: http://skia.googlecode.com/svn/trunk@14662 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
commit-bot@chromium.org 2014-05-09 03:18:41 +00:00
Родитель 8a1e688552
Коммит 90c0fbd349
8 изменённых файлов: 153 добавлений и 173 удалений

Просмотреть файл

@ -3,10 +3,13 @@
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*
* TODO(epoger): Combine this with tools/image_expectations.cpp, or eliminate one of the two.
*/
#include "gm_expectations.h"
#include "SkBitmapHasher.h"
#include "SkData.h"
#include "SkImageDecoder.h"
#define DEBUGFAIL_SEE_STDERR SkDEBUGFAIL("see stderr for message")
@ -219,33 +222,8 @@ namespace skiagm {
return Expectations(fJsonExpectedResults[testName]);
}
/*static*/ SkData* JsonExpectationsSource::ReadIntoSkData(SkStream &stream, size_t maxBytes) {
if (0 == maxBytes) {
return SkData::NewEmpty();
}
char* bufStart = reinterpret_cast<char *>(sk_malloc_throw(maxBytes));
char* bufPtr = bufStart;
size_t bytesRemaining = maxBytes;
while (bytesRemaining > 0) {
size_t bytesReadThisTime = stream.read(bufPtr, bytesRemaining);
if (0 == bytesReadThisTime) {
break;
}
bytesRemaining -= bytesReadThisTime;
bufPtr += bytesReadThisTime;
}
return SkData::NewFromMalloc(bufStart, maxBytes - bytesRemaining);
}
/*static*/ bool JsonExpectationsSource::Parse(const char *jsonPath, Json::Value *jsonRoot) {
SkFILEStream inFile(jsonPath);
if (!inFile.isValid()) {
SkDebugf("unable to read JSON file %s\n", jsonPath);
DEBUGFAIL_SEE_STDERR;
return false;
}
SkAutoDataUnref dataRef(ReadFileIntoSkData(inFile));
SkAutoDataUnref dataRef(SkData::NewFromFileName(jsonPath));
if (NULL == dataRef.get()) {
SkDebugf("error reading JSON file %s\n", jsonPath);
DEBUGFAIL_SEE_STDERR;

Просмотреть файл

@ -3,6 +3,8 @@
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*
* TODO(epoger): Combine this with tools/image_expectations.h, or eliminate one of the two.
*/
#ifndef gm_expectations_DEFINED
#define gm_expectations_DEFINED
@ -215,47 +217,6 @@ namespace skiagm {
private:
/**
* Read as many bytes as possible (up to maxBytes) from the stream into
* an SkData object.
*
* If the returned SkData contains fewer than maxBytes, then EOF has been
* reached and no more data would be available from subsequent calls.
* (If EOF has already been reached, then this call will return an empty
* SkData object immediately.)
*
* If there are fewer than maxBytes bytes available to read from the
* stream, but the stream has not been closed yet, this call will block
* until there are enough bytes to read or the stream has been closed.
*
* It is up to the caller to call unref() on the returned SkData object
* once the data is no longer needed, so that the underlying buffer will
* be freed. For example:
*
* {
* size_t maxBytes = 256;
* SkAutoDataUnref dataRef(readIntoSkData(stream, maxBytes));
* if (NULL != dataRef.get()) {
* size_t bytesActuallyRead = dataRef.get()->size();
* // use the data...
* }
* }
* // underlying buffer has been freed, thanks to auto unref
*
*/
// TODO(epoger): Move this, into SkStream.[cpp|h] as attempted in
// https://codereview.appspot.com/7300071 ?
// And maybe ReadFileIntoSkData() also?
static SkData* ReadIntoSkData(SkStream &stream, size_t maxBytes);
/**
* Wrapper around ReadIntoSkData for files: reads the entire file into
* an SkData object.
*/
static SkData* ReadFileIntoSkData(SkFILEStream &stream) {
return ReadIntoSkData(stream, stream.getLength());
}
/**
* Read the file contents from jsonPath and parse them into jsonRoot.
*

Просмотреть файл

@ -182,7 +182,6 @@
'gm.gyp:gm_expectations',
'jsoncpp.gyp:jsoncpp',
'skia_lib.gyp:skia_lib',
'utils.gyp:utils',
],
},
{
@ -237,7 +236,6 @@
'pdf.gyp:pdf',
'ports.gyp:ports',
'skia_lib.gyp:skia_lib',
'utils.gyp:utils',
],
},
{
@ -263,7 +261,6 @@
'pdf.gyp:pdf',
'ports.gyp:ports',
'skia_lib.gyp:skia_lib',
'utils.gyp:utils',
],
},
{
@ -369,6 +366,8 @@
'target_name': 'picture_renderer',
'type': 'static_library',
'sources': [
'../tools/image_expectations.h',
'../tools/image_expectations.cpp',
'../tools/LazyDecodeBitmap.cpp',
'../tools/PictureRenderer.h',
'../tools/PictureRenderer.cpp',
@ -388,7 +387,7 @@
],
'direct_dependent_settings': {
'include_dirs': [
# needed for JSON headers used within PictureRenderer.h
# needed for JSON headers used within image_expectations.h
'../third_party/externals/jsoncpp-chromium/overrides/include/',
'../third_party/externals/jsoncpp/include/',
],

Просмотреть файл

@ -48,67 +48,6 @@ enum {
kDefaultTileHeight = 256
};
/*
* TODO(epoger): Make constant strings consistent instead of mixing hypenated and camel-caps.
*
* TODO(epoger): Similar constants are already maintained in 2 other places:
* gm/gm_json.py and gm/gm_expectations.cpp. We shouldn't add yet a third place.
* Figure out a way to share the definitions instead.
*
* Note that, as of https://codereview.chromium.org/226293002 , the JSON
* schema used here has started to differ from the one in gm_expectations.cpp .
* TODO(epoger): Consider getting GM and render_pictures to use the same JSON
* output module.
*/
const static char kJsonKey_ActualResults[] = "actual-results";
const static char kJsonKey_Header[] = "header";
const static char kJsonKey_Header_Type[] = "type";
const static char kJsonKey_Header_Revision[] = "revision"; // unique within Type
const static char kJsonKey_Image_ChecksumAlgorithm[] = "checksumAlgorithm";
const static char kJsonKey_Image_ChecksumValue[] = "checksumValue";
const static char kJsonKey_Image_ComparisonResult[] = "comparisonResult";
const static char kJsonKey_Image_Filepath[] = "filepath";
const static char kJsonKey_Source_TiledImages[] = "tiled-images";
const static char kJsonKey_Source_WholeImage[] = "whole-image";
// Values (not keys) that are written out by this JSON generator
const static char kJsonValue_Header_Type[] = "ChecksummedImages";
const static int kJsonValue_Header_Revision = 1;
const static char kJsonValue_Image_ChecksumAlgorithm_Bitmap64bitMD5[] = "bitmap-64bitMD5";
const static char kJsonValue_Image_ComparisonResult_NoComparison[] = "no-comparison";
void ImageResultsSummary::add(const char *sourceName, const char *fileName, uint64_t hash,
const int *tileNumber) {
Json::Value image;
image[kJsonKey_Image_ChecksumAlgorithm] = kJsonValue_Image_ChecksumAlgorithm_Bitmap64bitMD5;
image[kJsonKey_Image_ChecksumValue] = Json::UInt64(hash);
image[kJsonKey_Image_ComparisonResult] = kJsonValue_Image_ComparisonResult_NoComparison;
image[kJsonKey_Image_Filepath] = fileName;
if (NULL == tileNumber) {
fActualResults[sourceName][kJsonKey_Source_WholeImage] = image;
} else {
fActualResults[sourceName][kJsonKey_Source_TiledImages][*tileNumber] = image;
}
}
void ImageResultsSummary::add(const char *sourceName, const char *fileName, const SkBitmap& bitmap,
const int *tileNumber) {
uint64_t hash;
SkAssertResult(SkBitmapHasher::ComputeDigest(bitmap, &hash));
this->add(sourceName, fileName, hash, tileNumber);
}
void ImageResultsSummary::writeToFile(const char *filename) {
Json::Value header;
header[kJsonKey_Header_Type] = kJsonValue_Header_Type;
header[kJsonKey_Header_Revision] = kJsonValue_Header_Revision;
Json::Value root;
root[kJsonKey_Header] = header;
root[kJsonKey_ActualResults] = fActualResults;
std::string jsonStdString = root.toStyledString();
SkFILEWStream stream(filename);
stream.write(jsonStdString.c_str(), jsonStdString.length());
}
void PictureRenderer::init(SkPicture* pict, const SkString* outputDir,
const SkString* inputFilename, bool useChecksumBasedFilenames) {
this->CopyString(&fOutputDir, outputDir);
@ -367,8 +306,10 @@ static bool write(SkCanvas* canvas, const SkString& outputDir, const SkString& i
generatedHash = true;
outputSubdirPtr = escapedInputFilename.c_str();
outputFilename.set(kJsonValue_Image_ChecksumAlgorithm_Bitmap64bitMD5);
outputFilename.append("_");
// TODO(epoger): The string constant below will be removed when I land
// the second part of https://codereview.chromium.org/261313004/
// ('add --readJsonSummaryPath to render_pictures')
outputFilename.set("bitmap-64bitMD5_");
outputFilename.appendU64(hash);
} else {
outputFilename.set(escapedInputFilename);

Просмотреть файл

@ -11,7 +11,6 @@
#include "SkCanvas.h"
#include "SkCountdown.h"
#include "SkDrawFilter.h"
#include "SkJSONCPP.h"
#include "SkMath.h"
#include "SkPaint.h"
#include "SkPicture.h"
@ -29,6 +28,8 @@
#include "GrContext.h"
#endif
#include "image_expectations.h"
class SkBitmap;
class SkCanvas;
class SkGLContextHelper;
@ -38,44 +39,6 @@ namespace sk_tools {
class TiledPictureRenderer;
/**
* Class for collecting image results (checksums) as we go.
*/
class ImageResultsSummary {
public:
/**
* Adds this image to the summary of results.
*
* @param sourceName name of the source file that generated this result
* @param fileName relative path to the image output file on local disk
* @param hash hash to store
* @param tileNumber if not NULL, ptr to tile number
*/
void add(const char *sourceName, const char *fileName, uint64_t hash,
const int *tileNumber=NULL);
/**
* Adds this image to the summary of results.
*
* @param sourceName name of the source file that generated this result
* @param fileName relative path to the image output file on local disk
* @param bitmap bitmap to store the hash of
* @param tileNumber if not NULL, ptr to tile number
*/
void add(const char *sourceName, const char *fileName, const SkBitmap& bitmap,
const int *tileNumber=NULL);
/**
* Writes the summary (as constructed so far) to a file.
*
* @param filename path to write the summary to
*/
void writeToFile(const char *filename);
private:
Json::Value fActualResults;
};
class PictureRenderer : public SkRefCnt {
public:

Просмотреть файл

@ -0,0 +1,80 @@
/*
* Copyright 2014 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "SkBitmap.h"
#include "SkBitmapHasher.h"
#include "SkJSONCPP.h"
#include "SkOSFile.h"
#include "SkStream.h"
#include "SkTypes.h"
#include "image_expectations.h"
/*
* TODO(epoger): Make constant strings consistent instead of mixing hypenated and camel-caps.
*
* TODO(epoger): Similar constants are already maintained in 2 other places:
* gm/gm_json.py and gm/gm_expectations.cpp. We shouldn't add yet a third place.
* Figure out a way to share the definitions instead.
*
* Note that, as of https://codereview.chromium.org/226293002 , the JSON
* schema used here has started to differ from the one in gm_expectations.cpp .
* TODO(epoger): Consider getting GM and render_pictures to use the same JSON
* output module.
*/
const static char kJsonKey_ActualResults[] = "actual-results";
const static char kJsonKey_Header[] = "header";
const static char kJsonKey_Header_Type[] = "type";
const static char kJsonKey_Header_Revision[] = "revision"; // unique within Type
const static char kJsonKey_Image_ChecksumAlgorithm[] = "checksumAlgorithm";
const static char kJsonKey_Image_ChecksumValue[] = "checksumValue";
const static char kJsonKey_Image_ComparisonResult[] = "comparisonResult";
const static char kJsonKey_Image_Filepath[] = "filepath";
const static char kJsonKey_Source_TiledImages[] = "tiled-images";
const static char kJsonKey_Source_WholeImage[] = "whole-image";
// Values (not keys) that are written out by this JSON generator
const static char kJsonValue_Header_Type[] = "ChecksummedImages";
const static int kJsonValue_Header_Revision = 1;
const static char kJsonValue_Image_ChecksumAlgorithm_Bitmap64bitMD5[] = "bitmap-64bitMD5";
const static char kJsonValue_Image_ComparisonResult_NoComparison[] = "no-comparison";
namespace sk_tools {
void ImageResultsSummary::add(const char *sourceName, const char *fileName, uint64_t hash,
const int *tileNumber) {
Json::Value image;
image[kJsonKey_Image_ChecksumAlgorithm] = kJsonValue_Image_ChecksumAlgorithm_Bitmap64bitMD5;
image[kJsonKey_Image_ChecksumValue] = Json::UInt64(hash);
image[kJsonKey_Image_ComparisonResult] = kJsonValue_Image_ComparisonResult_NoComparison;
image[kJsonKey_Image_Filepath] = fileName;
if (NULL == tileNumber) {
fActualResults[sourceName][kJsonKey_Source_WholeImage] = image;
} else {
fActualResults[sourceName][kJsonKey_Source_TiledImages][*tileNumber] = image;
}
}
void ImageResultsSummary::add(const char *sourceName, const char *fileName, const SkBitmap& bitmap,
const int *tileNumber) {
uint64_t hash;
SkAssertResult(SkBitmapHasher::ComputeDigest(bitmap, &hash));
this->add(sourceName, fileName, hash, tileNumber);
}
void ImageResultsSummary::writeToFile(const char *filename) {
Json::Value header;
header[kJsonKey_Header_Type] = kJsonValue_Header_Type;
header[kJsonKey_Header_Revision] = kJsonValue_Header_Revision;
Json::Value root;
root[kJsonKey_Header] = header;
root[kJsonKey_ActualResults] = fActualResults;
std::string jsonStdString = root.toStyledString();
SkFILEWStream stream(filename);
stream.write(jsonStdString.c_str(), jsonStdString.length());
}
} // namespace sk_tools

Просмотреть файл

@ -0,0 +1,56 @@
/*
* Copyright 2014 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef image_expectations_DEFINED
#define image_expectations_DEFINED
#include "SkBitmap.h"
#include "SkJSONCPP.h"
namespace sk_tools {
/**
* Class for collecting image results (checksums) as we go.
*/
class ImageResultsSummary {
public:
/**
* Adds this image to the summary of results.
*
* @param sourceName name of the source file that generated this result
* @param fileName relative path to the image output file on local disk
* @param hash hash to store
* @param tileNumber if not NULL, ptr to tile number
*/
void add(const char *sourceName, const char *fileName, uint64_t hash,
const int *tileNumber=NULL);
/**
* Adds this image to the summary of results.
*
* @param sourceName name of the source file that generated this result
* @param fileName relative path to the image output file on local disk
* @param bitmap bitmap to store the hash of
* @param tileNumber if not NULL, ptr to tile number
*/
void add(const char *sourceName, const char *fileName, const SkBitmap& bitmap,
const int *tileNumber=NULL);
/**
* Writes the summary (as constructed so far) to a file.
*
* @param filename path to write the summary to
*/
void writeToFile(const char *filename);
private:
Json::Value fActualResults;
};
} // namespace sk_tools
#endif // image_expectations_DEFINED

Просмотреть файл

@ -19,6 +19,8 @@
#include "SkPictureRecorder.h"
#include "SkStream.h"
#include "SkString.h"
#include "image_expectations.h"
#include "PictureRenderer.h"
#include "PictureRenderingFlags.h"
#include "picture_utils.h"