Index: dm/DMQuiltTask.cpp |
diff --git a/dm/DMQuiltTask.cpp b/dm/DMQuiltTask.cpp |
index 44c4341a7d79de5475c92b7116fa0ef09d84b8da..960ca86747b3dec47eb3e54500b761f7c7ffc106 100644 |
--- a/dm/DMQuiltTask.cpp |
+++ b/dm/DMQuiltTask.cpp |
@@ -7,14 +7,17 @@ |
#include "SkThreadPool.h" |
DEFINE_bool(quilt, true, "If true, draw into a quilt of small tiles and compare."); |
-DEFINE_int32(quiltTile, 16, "Dimension of (square) quilt tile."); |
+DEFINE_int32(quiltTile, 256, "Dimension of (square) quilt tile."); |
DEFINE_bool(quiltThreaded, false, "If true, draw quilt tiles with multiple threads."); |
+static const char* kSuffixes[] = { "quilt", "quilt_skr" }; |
+ |
namespace DM { |
-QuiltTask::QuiltTask(const Task& parent, skiagm::GM* gm, SkBitmap reference) |
+QuiltTask::QuiltTask(const Task& parent, skiagm::GM* gm, SkBitmap reference, QuiltTask::Mode mode) |
: CpuTask(parent) |
- , fName(UnderJoin(parent.name().c_str(), "quilt")) |
+ , fMode(mode) |
+ , fName(UnderJoin(parent.name().c_str(), kSuffixes[mode])) |
, fGM(gm) |
, fReference(reference) |
{} |
@@ -25,62 +28,51 @@ static int tiles_needed(int fullDimension, int tileDimension) { |
class Tile : public SkRunnable { |
public: |
- Tile(int x, int y, SkColorType colorType, |
- const SkPicture& picture, SkCanvas* canvas, SkMutex* mutex) |
- : fX(x) |
- , fY(y) |
- , fColorType(colorType) |
+ Tile(int x, int y, const SkPicture& picture, SkBitmap* quilt) |
+ : fX(x * FLAGS_quiltTile) |
+ , fY(y * FLAGS_quiltTile) |
, fPicture(picture) |
- , fCanvas(canvas) |
- , fMutex(mutex) {} |
+ , fQuilt(quilt) {} |
virtual void run() SK_OVERRIDE { |
SkBitmap tile; |
- tile.allocPixels(SkImageInfo::Make(FLAGS_quiltTile, FLAGS_quiltTile, |
- fColorType, kPremul_SkAlphaType)); |
+ fQuilt->extractSubset(&tile, SkIRect::MakeXYWH(fX, fY, FLAGS_quiltTile, FLAGS_quiltTile)); |
SkCanvas tileCanvas(tile); |
- const SkScalar xOffset = SkIntToScalar(fX * tile.width()), |
- yOffset = SkIntToScalar(fY * tile.height()); |
- tileCanvas.translate(-xOffset, -yOffset); |
+ tileCanvas.translate(SkIntToScalar(-fX), SkIntToScalar(-fY)); |
fPicture.draw(&tileCanvas); |
tileCanvas.flush(); |
- { |
- SkAutoMutexAcquire lock(fMutex); |
- fCanvas->drawBitmap(tile, xOffset, yOffset, NULL); |
- } |
- |
delete this; |
} |
private: |
const int fX, fY; |
- const SkColorType fColorType; |
const SkPicture& fPicture; |
- SkCanvas* fCanvas; |
- SkMutex* fMutex; // Guards fCanvas. |
+ SkBitmap* fQuilt; |
}; |
void QuiltTask::draw() { |
- SkAutoTUnref<SkPicture> recorded(RecordPicture(fGM.get())); |
+ SkAutoTUnref<SkPicture> recorded( |
+ RecordPicture(fGM.get(), NULL/*bbh factory*/, kSkRecord_Mode == fMode)); |
SkBitmap full; |
AllocatePixels(fReference, &full); |
- SkCanvas fullCanvas(full); |
- SkMutex mutex; // Guards fullCanvas. |
- SkThreadPool pool(FLAGS_quiltThreaded ? SkThreadPool::kThreadPerCore : 0); |
+ int threads = 0; |
+ if (kSkRecord_Mode == fMode || FLAGS_quiltThreaded) { |
+ threads = SkThreadPool::kThreadPerCore; |
+ } |
+ SkThreadPool pool(threads); |
for (int y = 0; y < tiles_needed(full.height(), FLAGS_quiltTile); y++) { |
for (int x = 0; x < tiles_needed(full.width(), FLAGS_quiltTile); x++) { |
// Deletes itself when done. |
- pool.add(new Tile(x, y, fReference.colorType(), *recorded, &fullCanvas, &mutex)); |
+ pool.add(new Tile(x, y, *recorded, &full)); |
} |
} |
pool.wait(); |
- fullCanvas.flush(); |
if (!BitmapsEqual(full, fReference)) { |
this->fail(); |