/** * If path is non NULL, append number to it, and call write() to write the * provided canvas to a file. Returns true if path is NULL or if write() succeeds. */ static bool writeAppendNumber(SkCanvas* canvas, const SkString* path, int number, ImageResultsSummary *jsonSummaryPtr) { if (NULL == path) { return true; } SkString pathWithNumber(*path); pathWithNumber.appendf("%i", number); return write(canvas, &pathWithNumber, jsonSummaryPtr); }
bool CopyTilesRenderer::render(const SkString* path) { int i = 0; bool success = true; SkBitmap dst; for (int x = 0; x < this->getViewWidth(); x += fLargeTileWidth) { for (int y = 0; y < this->getViewHeight(); y += fLargeTileHeight) { SkAutoCanvasRestore autoRestore(fCanvas, true); fCanvas->translate(SkIntToScalar(-x), SkIntToScalar(-y)); // Draw the picture fCanvas->drawPicture(*fPicture); // Now extract the picture into tiles const SkBitmap& baseBitmap = fCanvas->getDevice()->accessBitmap(false); SkIRect subset; for (int tileY = 0; tileY < fLargeTileHeight; tileY += this->getTileHeight()) { for (int tileX = 0; tileX < fLargeTileWidth; tileX += this->getTileWidth()) { subset.set(tileX, tileY, tileX + this->getTileWidth(), tileY + this->getTileHeight()); SkDEBUGCODE(bool extracted =) baseBitmap.extractSubset(&dst, subset); SkASSERT(extracted); if (path != NULL) { // Similar to writeAppendNumber in PictureRenderer.cpp, but just encodes // a bitmap directly. SkString pathWithNumber(*path); pathWithNumber.appendf("%i.png", i++); SkBitmap copy; #if SK_SUPPORT_GPU if (isUsingGpuDevice()) { dst.pixelRef()->readPixels(©, &subset); } else { #endif dst.copyTo(©, dst.config()); #if SK_SUPPORT_GPU } #endif success &= SkImageEncoder::EncodeFile(pathWithNumber.c_str(), copy, SkImageEncoder::kPNG_Type, 100); } } } } } return success; }