| Index: tools/PictureRenderer.cpp
|
| diff --git a/tools/PictureRenderer.cpp b/tools/PictureRenderer.cpp
|
| index d337a5ebb7df295c0828ed3bf2f6bcc0d8c36b34..acc787823018924daf0f62d897de18041be6d0e3 100644
|
| --- a/tools/PictureRenderer.cpp
|
| +++ b/tools/PictureRenderer.cpp
|
| @@ -698,188 +698,6 @@ SkString TiledPictureRenderer::getConfigNameInternal() {
|
|
|
| ///////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
| -// Holds all of the information needed to draw a set of tiles.
|
| -class CloneData : public SkRunnable {
|
| -
|
| -public:
|
| - CloneData(SkPicture* clone, SkCanvas* canvas, SkTDArray<SkRect>& rects, int start, int end,
|
| - SkRunnable* done, ImageResultsAndExpectations* jsonSummaryPtr,
|
| - bool useChecksumBasedFilenames, bool enableWrites)
|
| - : fClone(clone)
|
| - , fCanvas(canvas)
|
| - , fEnableWrites(enableWrites)
|
| - , fRects(rects)
|
| - , fStart(start)
|
| - , fEnd(end)
|
| - , fSuccess(NULL)
|
| - , fDone(done)
|
| - , fJsonSummaryPtr(jsonSummaryPtr)
|
| - , fUseChecksumBasedFilenames(useChecksumBasedFilenames) {
|
| - SkASSERT(fDone != NULL);
|
| - }
|
| -
|
| - virtual void run() SK_OVERRIDE {
|
| - SkGraphics::SetTLSFontCacheLimit(1024 * 1024);
|
| -
|
| - SkBitmap bitmap;
|
| - if (fBitmap != NULL) {
|
| - // All tiles are the same size.
|
| - setup_bitmap(&bitmap, SkScalarFloorToInt(fRects[0].width()), SkScalarFloorToInt(fRects[0].height()));
|
| - }
|
| -
|
| - for (int i = fStart; i < fEnd; i++) {
|
| - draw_tile_to_canvas(fCanvas, fRects[i], fClone);
|
| - if (fEnableWrites) {
|
| - if (!write(fCanvas, fWritePath, fMismatchPath, fInputFilename, fJsonSummaryPtr,
|
| - fUseChecksumBasedFilenames, &i)
|
| - && fSuccess != NULL) {
|
| - *fSuccess = false;
|
| - // If one tile fails to write to a file, do not continue drawing the rest.
|
| - break;
|
| - }
|
| - if (fBitmap != NULL) {
|
| - if (fCanvas->readPixels(&bitmap, 0, 0)) {
|
| - SkAutoLockPixels alp(*fBitmap);
|
| - bitmapCopyAtOffset(bitmap, fBitmap, SkScalarFloorToInt(fRects[i].left()),
|
| - SkScalarFloorToInt(fRects[i].top()));
|
| - } else {
|
| - *fSuccess = false;
|
| - // If one tile fails to read pixels, do not continue drawing the rest.
|
| - break;
|
| - }
|
| - }
|
| - }
|
| - }
|
| - fDone->run();
|
| - }
|
| -
|
| - void setPathsAndSuccess(const SkString& writePath, const SkString& mismatchPath,
|
| - const SkString& inputFilename, bool* success) {
|
| - fWritePath.set(writePath);
|
| - fMismatchPath.set(mismatchPath);
|
| - fInputFilename.set(inputFilename);
|
| - fSuccess = success;
|
| - }
|
| -
|
| - void setBitmap(SkBitmap* bitmap) {
|
| - fBitmap = bitmap;
|
| - }
|
| -
|
| -private:
|
| - // All pointers unowned.
|
| - SkPicture* fClone; // Picture to draw from. Each CloneData has a unique one which
|
| - // is threadsafe.
|
| - SkCanvas* fCanvas; // Canvas to draw to. Reused for each tile.
|
| - bool fEnableWrites; // TODO(epoger): Temporary hack; see declaration of
|
| - // fEnableWrites in PictureRenderer.h.
|
| - SkString fWritePath; // If not empty, write all results into this directory.
|
| - SkString fMismatchPath; // If not empty, write all unexpected results into this dir.
|
| - SkString fInputFilename; // Filename of input SkPicture file.
|
| - SkTDArray<SkRect>& fRects; // All tiles of the picture.
|
| - const int fStart; // Range of tiles drawn by this thread.
|
| - const int fEnd;
|
| - bool* fSuccess; // Only meaningful if path is non-null. Shared by all threads,
|
| - // and only set to false upon failure to write to a PNG.
|
| - SkRunnable* fDone;
|
| - SkBitmap* fBitmap;
|
| - ImageResultsAndExpectations* fJsonSummaryPtr;
|
| - bool fUseChecksumBasedFilenames;
|
| -};
|
| -
|
| -MultiCorePictureRenderer::MultiCorePictureRenderer(int threadCount)
|
| -: fNumThreads(threadCount)
|
| -, fThreadPool(threadCount)
|
| -, fCountdown(threadCount) {
|
| - // Only need to create fNumThreads - 1 clones, since one thread will use the base
|
| - // picture.
|
| - fPictureClones = SkNEW_ARRAY(SkPicture, fNumThreads - 1);
|
| - fCloneData = SkNEW_ARRAY(CloneData*, fNumThreads);
|
| -}
|
| -
|
| -void MultiCorePictureRenderer::init(SkPicture *pict, const SkString* writePath,
|
| - const SkString* mismatchPath, const SkString* inputFilename,
|
| - bool useChecksumBasedFilenames) {
|
| - // Set fPicture and the tiles.
|
| - this->INHERITED::init(pict, writePath, mismatchPath, inputFilename, useChecksumBasedFilenames);
|
| - for (int i = 0; i < fNumThreads; ++i) {
|
| - *fCanvasPool.append() = this->setupCanvas(this->getTileWidth(), this->getTileHeight());
|
| - }
|
| - // Only need to create fNumThreads - 1 clones, since one thread will use the base picture.
|
| - fPicture->clone(fPictureClones, fNumThreads - 1);
|
| - // Populate each thread with the appropriate data.
|
| - // Group the tiles into nearly equal size chunks, rounding up so we're sure to cover them all.
|
| - const int chunkSize = (fTileRects.count() + fNumThreads - 1) / fNumThreads;
|
| -
|
| - for (int i = 0; i < fNumThreads; i++) {
|
| - SkPicture* pic;
|
| - if (i == fNumThreads-1) {
|
| - // The last set will use the original SkPicture.
|
| - pic = fPicture;
|
| - } else {
|
| - pic = &fPictureClones[i];
|
| - }
|
| - const int start = i * chunkSize;
|
| - const int end = SkMin32(start + chunkSize, fTileRects.count());
|
| - fCloneData[i] = SkNEW_ARGS(CloneData,
|
| - (pic, fCanvasPool[i], fTileRects, start, end, &fCountdown,
|
| - fJsonSummaryPtr, useChecksumBasedFilenames, fEnableWrites));
|
| - }
|
| -}
|
| -
|
| -bool MultiCorePictureRenderer::render(SkBitmap** out) {
|
| - bool success = true;
|
| - if (!fWritePath.isEmpty() || !fMismatchPath.isEmpty()) {
|
| - for (int i = 0; i < fNumThreads-1; i++) {
|
| - fCloneData[i]->setPathsAndSuccess(fWritePath, fMismatchPath, fInputFilename, &success);
|
| - }
|
| - }
|
| -
|
| - if (NULL != out) {
|
| - *out = SkNEW(SkBitmap);
|
| - setup_bitmap(*out, fPicture->width(), fPicture->height());
|
| - for (int i = 0; i < fNumThreads; i++) {
|
| - fCloneData[i]->setBitmap(*out);
|
| - }
|
| - } else {
|
| - for (int i = 0; i < fNumThreads; i++) {
|
| - fCloneData[i]->setBitmap(NULL);
|
| - }
|
| - }
|
| -
|
| - fCountdown.reset(fNumThreads);
|
| - for (int i = 0; i < fNumThreads; i++) {
|
| - fThreadPool.add(fCloneData[i]);
|
| - }
|
| - fCountdown.wait();
|
| -
|
| - return success;
|
| -}
|
| -
|
| -void MultiCorePictureRenderer::end() {
|
| - for (int i = 0; i < fNumThreads - 1; i++) {
|
| - SkDELETE(fCloneData[i]);
|
| - fCloneData[i] = NULL;
|
| - }
|
| -
|
| - fCanvasPool.unrefAll();
|
| -
|
| - this->INHERITED::end();
|
| -}
|
| -
|
| -MultiCorePictureRenderer::~MultiCorePictureRenderer() {
|
| - // Each individual CloneData was deleted in end.
|
| - SkDELETE_ARRAY(fCloneData);
|
| - SkDELETE_ARRAY(fPictureClones);
|
| -}
|
| -
|
| -SkString MultiCorePictureRenderer::getConfigNameInternal() {
|
| - SkString name = this->INHERITED::getConfigNameInternal();
|
| - name.appendf("_multi_%i_threads", fNumThreads);
|
| - return name;
|
| -}
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////////////////////
|
| -
|
| void PlaybackCreationRenderer::setup() {
|
| SkAutoTDelete<SkBBHFactory> factory(this->getFactory());
|
| fRecorder.reset(SkNEW(SkPictureRecorder));
|
| @@ -941,27 +759,4 @@ PictureRenderer* CreateGatherPixelRefsRenderer() {
|
| return SkNEW(GatherRenderer);
|
| }
|
|
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -class PictureCloneRenderer : public PictureRenderer {
|
| -public:
|
| - virtual bool render(SkBitmap** out = NULL) SK_OVERRIDE {
|
| - for (int i = 0; i < 100; ++i) {
|
| - SkPicture* clone = fPicture->clone();
|
| - SkSafeUnref(clone);
|
| - }
|
| -
|
| - return (fWritePath.isEmpty()); // we don't have anything to write
|
| - }
|
| -
|
| -private:
|
| - virtual SkString getConfigNameInternal() SK_OVERRIDE {
|
| - return SkString("picture_clone");
|
| - }
|
| -};
|
| -
|
| -PictureRenderer* CreatePictureCloneRenderer() {
|
| - return SkNEW(PictureCloneRenderer);
|
| -}
|
| -
|
| } // namespace sk_tools
|
|
|