DM: add --writePath

For fun, make the output prettier, hiding ", N failures" unless there is one.

BUG=
R=bsalomon@google.com

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

git-svn-id: http://skia.googlecode.com/svn/trunk@11867 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
mtklein@google.com 2013-10-18 20:52:44 +00:00
parent 59fd223870
commit a7a9f37a31
8 changed files with 90 additions and 3 deletions

View File

@ -1,6 +1,7 @@
#include "DMCpuTask.h"
#include "DMReplayTask.h"
#include "DMUtil.h"
#include "DMWriteTask.h"
#include "SkCommandLineFlags.h"
DEFINE_bool(replay, false, "If true, run replay tests for each CpuTask.");
@ -41,6 +42,7 @@ void CpuTask::draw() {
this->spawnChild(SkNEW_ARGS(ReplayTask,
("replay", *this, fGMFactory(NULL), bitmap)));
}
this->spawnChild(SkNEW_ARGS(WriteTask, (*this, bitmap)));
}
bool CpuTask::shouldSkip() const {

View File

@ -2,6 +2,7 @@
#include "DMComparisonTask.h"
#include "DMUtil.h"
#include "DMWriteTask.h"
#include "SkCommandLineFlags.h"
#include "SkGpuDevice.h"
#include "SkTLS.h"
@ -58,6 +59,7 @@ void GpuTask::draw() {
// We offload checksum comparison to the main CPU threadpool.
// This cuts run time by about 30%.
this->spawnChild(SkNEW_ARGS(ComparisonTask, (*this, fExpectations, bitmap)));
this->spawnChild(SkNEW_ARGS(WriteTask, (*this, bitmap)));
}
bool GpuTask::shouldSkip() const {

View File

@ -51,4 +51,4 @@ bool ReplayTask::shouldSkip() const {
fGM->getFlags() & skiagm::GM::kSkipPicture_Flag;
}
} // namespace
} // namespace DM

View File

@ -3,7 +3,13 @@
namespace DM {
void Reporter::updateStatusLine() const {
SkDebugf("\r\033[K%d / %d, %d failed", this->finished(), this->started(), this->failed());
SkString status;
status.printf("\r\033[K%d / %d", this->finished(), this->started());
const int failed = this->failed();
if (failed > 0) {
status.appendf(", %d failed", failed);
}
SkDebugf(status.c_str());
}
int32_t Reporter::failed() const {

47
dm/DMWriteTask.cpp Normal file
View File

@ -0,0 +1,47 @@
#include "DMWriteTask.h"
#include "DMUtil.h"
#include "SkCommandLineFlags.h"
#include "SkImageEncoder.h"
#include <string.h>
DEFINE_string2(writePath, w, "", "If set, write GMs here as .pngs.");
namespace DM {
WriteTask::WriteTask(const Task& parent, SkBitmap bitmap)
: Task(parent)
, fBitmap(bitmap) {
// Split parent's name <gmName>_<config> into gmName and config.
const char* parentName = parent.name().c_str();
const char* fromLastUnderscore = strrchr(parentName, '_');
const ptrdiff_t gmNameLength = fromLastUnderscore - parentName;
fConfig.set(fromLastUnderscore+1);
fGmName.set(parentName, gmNameLength);
}
void WriteTask::draw() {
const char* root = FLAGS_writePath[0];
const SkString dir = SkOSPath::SkPathJoin(root, fConfig.c_str());
if (!sk_mkdir(root) ||
!sk_mkdir(dir.c_str()) ||
!SkImageEncoder::EncodeFile(png(SkOSPath::SkPathJoin(dir.c_str(), fGmName.c_str())).c_str(),
fBitmap,
SkImageEncoder::kPNG_Type,
100/*quality*/))
{
this->fail();
}
}
SkString WriteTask::name() const {
return SkStringPrintf("writing %s/%s.png", fConfig.c_str(), fGmName.c_str());
}
bool WriteTask::shouldSkip() const {
return FLAGS_writePath.isEmpty();
}
} // namespace DM

30
dm/DMWriteTask.h Normal file
View File

@ -0,0 +1,30 @@
#ifndef DMWriteTask_DEFINED
#define DMWriteTask_DEFINED
#include "DMTask.h"
#include "SkBitmap.h"
#include "SkString.h"
// Writes a bitmap to a file.
namespace DM {
class WriteTask : public Task {
public:
WriteTask(const Task& parent, SkBitmap bitmap);
virtual void draw() SK_OVERRIDE;
virtual bool usesGpu() const SK_OVERRIDE { return false; }
virtual bool shouldSkip() const SK_OVERRIDE;
virtual SkString name() const SK_OVERRIDE;
private:
SkString fConfig;
SkString fGmName;
const SkBitmap fBitmap;
};
} // namespace DM
#endif // DMWriteTask_DEFINED

View File

@ -3,7 +3,6 @@ DM is like GM, but multithreaded. It doesn't do everything GM does yet.
Current approximate list of missing features:
--mismatchPath
--missingExpectationsPath
--writePath
--writePicturePath
--deferred / --pipe

View File

@ -25,6 +25,7 @@
'../dm/DMTask.cpp',
'../dm/DMTaskRunner.cpp',
'../dm/DMUtil.cpp',
'../dm/DMWriteTask.cpp',
'../gm/gm.cpp',
'../gm/gm_expectations.cpp',