bool SimplePictureRenderer::render(SkBitmap** out) { SkASSERT(fCanvas.get() != NULL); SkASSERT(fPicture); if (NULL == fCanvas.get() || NULL == fPicture) { return false; } if (fUseMultiPictureDraw) { SkMultiPictureDraw mpd; mpd.add(fCanvas, fPicture); mpd.draw(); } else { fCanvas->drawPicture(fPicture); } fCanvas->flush(); if (out) { *out = SkNEW(SkBitmap); setup_bitmap(*out, SkScalarCeilToInt(fPicture->cullRect().width()), SkScalarCeilToInt(fPicture->cullRect().height())); fCanvas->readPixels(*out, 0, 0); } if (fEnableWrites) { return write(fCanvas, fWritePath, fMismatchPath, fInputFilename, fJsonSummaryPtr, fUseChecksumBasedFilenames); } else { return true; } }
void SKPBench::onDraw(const int loops, SkCanvas* canvas) { if (fUseMultiPictureDraw) { for (int i = 0; i < loops; i++) { SkMultiPictureDraw mpd; for (int j = 0; j < fTileRects.count(); ++j) { SkMatrix trans; trans.setTranslate(-fTileRects[j].fLeft/fScale, -fTileRects[j].fTop/fScale); mpd.add(fSurfaces[j]->getCanvas(), fPic, &trans); } mpd.draw(); for (int j = 0; j < fTileRects.count(); ++j) { fSurfaces[j]->getCanvas()->flush(); } } } else { for (int i = 0; i < loops; i++) { for (int j = 0; j < fTileRects.count(); ++j) { SkMatrix trans; trans.setTranslate(-fTileRects[j].fLeft / fScale, -fTileRects[j].fTop / fScale); fSurfaces[j]->getCanvas()->drawPicture(fPic, &trans, NULL); } for (int j = 0; j < fTileRects.count(); ++j) { fSurfaces[j]->getCanvas()->flush(); } } } }
void SKPBench::drawMPDPicture() { SkMultiPictureDraw mpd; for (int j = 0; j < fTileRects.count(); ++j) { SkMatrix trans; trans.setTranslate(-fTileRects[j].fLeft/fScale, -fTileRects[j].fTop/fScale); mpd.add(fSurfaces[j]->getCanvas(), fPic, &trans); } mpd.draw(); for (int j = 0; j < fTileRects.count(); ++j) { fSurfaces[j]->getCanvas()->flush(); } }
void SKPBench::onDraw(const int loops, SkCanvas* canvas) { if (fUseMultiPictureDraw) { for (int i = 0; i < loops; i++) { SkMultiPictureDraw mpd; for (int i = 0; i < fTileRects.count(); ++i) { SkMatrix trans; trans.setTranslate(-fTileRects[i].fLeft/fScale, -fTileRects[i].fTop/fScale); mpd.add(fSurfaces[i]->getCanvas(), fPic, &trans); } mpd.draw(); for (int i = 0; i < fTileRects.count(); ++i) { fSurfaces[i]->getCanvas()->flush(); } } } else { SkIRect bounds; SkAssertResult(canvas->getClipDeviceBounds(&bounds)); SkAutoCanvasRestore overall(canvas, true/*save now*/); canvas->scale(fScale, fScale); for (int i = 0; i < loops; i++) { for (int y = bounds.fTop; y < bounds.fBottom; y += FLAGS_benchTile) { for (int x = bounds.fLeft; x < bounds.fRight; x += FLAGS_benchTile) { SkAutoCanvasRestore perTile(canvas, true/*save now*/); canvas->clipRect(SkRect::MakeXYWH(x/fScale, y/fScale, FLAGS_benchTile/fScale, FLAGS_benchTile/fScale)); fPic->playback(canvas); } } canvas->flush(); } } }
bool TiledPictureRenderer::render(SkBitmap** out) { SkASSERT(fPicture != NULL); if (NULL == fPicture) { return false; } SkBitmap bitmap; if (out) { *out = SkNEW(SkBitmap); setup_bitmap(*out, SkScalarCeilToInt(fPicture->cullRect().width()), SkScalarCeilToInt(fPicture->cullRect().height())); setup_bitmap(&bitmap, fTileWidth, fTileHeight); } bool success = true; if (fUseMultiPictureDraw) { SkMultiPictureDraw mpd; SkTDArray<SkSurface*> surfaces; surfaces.setReserve(fTileRects.count()); // Create a separate SkSurface/SkCanvas for each tile along with a // translated version of the skp (to mimic Chrome's behavior) and // feed all such pairs to the MultiPictureDraw. for (int i = 0; i < fTileRects.count(); ++i) { SkImageInfo ii = fCanvas->imageInfo().makeWH(fTileRects[i].width(), fTileRects[i].height()); *surfaces.append() = fCanvas->newSurface(ii); surfaces[i]->getCanvas()->setMatrix(fCanvas->getTotalMatrix()); SkPictureRecorder recorder; SkRTreeFactory bbhFactory; SkCanvas* c = recorder.beginRecording(SkIntToScalar(fTileRects[i].width()), SkIntToScalar(fTileRects[i].height()), &bbhFactory, SkPictureRecorder::kComputeSaveLayerInfo_RecordFlag); c->save(); SkMatrix mat; mat.setTranslate(-SkIntToScalar(fTileRects[i].fLeft), -SkIntToScalar(fTileRects[i].fTop)); c->setMatrix(mat); c->drawPicture(fPicture); c->restore(); SkAutoTUnref<SkPicture> xlatedPicture(recorder.endRecording()); mpd.add(surfaces[i]->getCanvas(), xlatedPicture); } // Render all the buffered SkCanvases/SkPictures mpd.draw(); // Sort out the results and cleanup the allocated surfaces for (int i = 0; i < fTileRects.count(); ++i) { success &= this->postRender(surfaces[i]->getCanvas(), fTileRects[i], &bitmap, out, i); surfaces[i]->unref(); } } else { for (int i = 0; i < fTileRects.count(); ++i) { draw_tile_to_canvas(fCanvas, fTileRects[i], fPicture); success &= this->postRender(fCanvas, fTileRects[i], &bitmap, out, i); } } return success; }
bool CopyTilesRenderer::render(SkBitmap** out) { 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); // Translate so that we draw the correct portion of the picture. // Perform a postTranslate so that the scaleFactor does not interfere with the // positioning. SkMatrix mat(fCanvas->getTotalMatrix()); mat.postTranslate(SkIntToScalar(-x), SkIntToScalar(-y)); fCanvas->setMatrix(mat); // Draw the picture if (fUseMultiPictureDraw) { SkMultiPictureDraw mpd; mpd.add(fCanvas, fPicture); mpd.draw(); } else { fCanvas->drawPicture(fPicture); } // Now extract the picture into tiles SkBitmap baseBitmap; fCanvas->readPixels(SkIRect::MakeSize(fCanvas->getBaseLayerSize()), &baseBitmap); 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 (!fWritePath.isEmpty()) { // Similar to write() in PictureRenderer.cpp, but just encodes // a bitmap directly. // TODO: Share more common code with write() to do this, to properly // write out the JSON summary, etc. SkString pathWithNumber = SkOSPath::Join(fWritePath.c_str(), fInputFilename.c_str()); pathWithNumber.remove(pathWithNumber.size() - 4, 4); pathWithNumber.appendf("%i.png", i++); SkBitmap copy; #if SK_SUPPORT_GPU if (isUsingGpuDevice()) { dst.pixelRef()->readPixels(©, &subset); } else { #endif dst.copyTo(©); #if SK_SUPPORT_GPU } #endif success &= SkImageEncoder::EncodeFile(pathWithNumber.c_str(), copy, SkImageEncoder::kPNG_Type, 100); } } } } } return success; }
~AutoMPDReset() { fMPD->reset(); }