bool TiledPictureRenderer::render(SkBitmap** out) { SkASSERT(fPicture != NULL); if (NULL == fPicture) { return false; } SkBitmap bitmap; if (out){ *out = SkNEW(SkBitmap); setup_bitmap(*out, fPicture->width(), fPicture->height()); setup_bitmap(&bitmap, fTileWidth, fTileHeight); } bool success = true; for (int i = 0; i < fTileRects.count(); ++i) { draw_tile_to_canvas(fCanvas, fTileRects[i], fPicture); if (fEnableWrites) { success &= write(fCanvas, fWritePath, fMismatchPath, fInputFilename, fJsonSummaryPtr, fUseChecksumBasedFilenames, &i); } if (NULL != out) { if (fCanvas->readPixels(&bitmap, 0, 0)) { // Add this tile to the entire bitmap. bitmapCopyAtOffset(bitmap, *out, SkScalarFloorToInt(fTileRects[i].left()), SkScalarFloorToInt(fTileRects[i].top())); } else { success = false; } } } return success; }
bool TiledPictureRenderer::render(const SkString* path, SkBitmap** out) { SkASSERT(fPicture != NULL); if (NULL == fPicture) { return false; } SkBitmap bitmap; if (out){ *out = SkNEW(SkBitmap); setup_bitmap(*out, fPicture->width(), fPicture->height()); setup_bitmap(&bitmap, fTileWidth, fTileHeight); } bool success = true; for (int i = 0; i < fTileRects.count(); ++i) { draw_tile_to_canvas(fCanvas, fTileRects[i], fPicture); if (NULL != path) { success &= writeAppendNumber(fCanvas, path, i, fJsonSummaryPtr); } if (NULL != out) { if (fCanvas->readPixels(&bitmap, 0, 0)) { // Add this tile to the entire bitmap. bitmapCopyAtOffset(bitmap, *out, SkScalarFloorToInt(fTileRects[i].left()), SkScalarFloorToInt(fTileRects[i].top())); } else { success = false; } } } return success; }
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; }
void TiledPictureRenderer::drawCurrentTile() { SkASSERT(fCurrentTileOffset >= 0 && fCurrentTileOffset < fTileRects.count()); draw_tile_to_canvas(fCanvas, fTileRects[fCurrentTileOffset], fPicture); }