Index: gm/gmmain.cpp |
=================================================================== |
--- gm/gmmain.cpp (revision 8479) |
+++ gm/gmmain.cpp (working copy) |
@@ -413,14 +413,51 @@ |
static void generate_image_from_picture(GM* gm, const ConfigData& gRec, |
SkPicture* pict, SkBitmap* bitmap, |
- SkScalar scale = SK_Scalar1) { |
+ SkScalar scale = SK_Scalar1, |
+ bool tile = false) { |
SkISize size = gm->getISize(); |
setup_bitmap(gRec, size, bitmap); |
- SkCanvas canvas(*bitmap); |
- installFilter(&canvas); |
- canvas.scale(scale, scale); |
- canvas.drawPicture(*pict); |
- complete_bitmap(bitmap); |
+ |
+ if (tile) { |
+ // Generate the result image by rendering to tiles and accumulating |
+ // the results in 'bitmap' |
+ |
+ // This 16x16 tiling matches the settings applied to 'pict' in |
+ // 'generate_new_picture' |
+ SkISize tileSize = SkISize::Make(16, 16); |
+ |
+ SkBitmap tileBM; |
+ setup_bitmap(gRec, tileSize, &tileBM); |
+ SkCanvas tileCanvas(tileBM); |
+ installFilter(&tileCanvas); |
+ |
+ SkCanvas bmpCanvas(*bitmap); |
+ SkPaint bmpPaint; |
+ bmpPaint.setXfermodeMode(SkXfermode::kSrc_Mode); |
+ |
+ for (int yTile = 0; yTile < (size.height()+15)/16; ++yTile) { |
+ for (int xTile = 0; xTile < (size.width()+15)/16; ++xTile) { |
+ int saveCount = tileCanvas.save(); |
+ SkMatrix mat(tileCanvas.getTotalMatrix()); |
+ mat.postTranslate(SkIntToScalar(-xTile*tileSize.width()), |
+ SkIntToScalar(-yTile*tileSize.height())); |
+ tileCanvas.setMatrix(mat); |
+ pict->draw(&tileCanvas); |
+ tileCanvas.flush(); |
+ tileCanvas.restoreToCount(saveCount); |
+ bmpCanvas.drawBitmap(tileBM, |
+ SkIntToScalar(xTile * tileSize.width()), |
+ SkIntToScalar(yTile * tileSize.height()), |
+ &bmpPaint); |
+ } |
+ } |
+ } else { |
+ SkCanvas canvas(*bitmap); |
+ installFilter(&canvas); |
+ canvas.scale(scale, scale); |
+ canvas.drawPicture(*pict); |
+ complete_bitmap(bitmap); |
+ } |
} |
static void generate_pdf(GM* gm, SkDynamicMemoryWStream& pdf) { |
@@ -1319,7 +1356,11 @@ |
gm, kTileGrid_BbhType, SkPicture::kUsePathBoundsForClip_RecordingFlag, recordScale); |
SkAutoUnref aur(pict); |
SkBitmap bitmap; |
- gmmain.generate_image_from_picture(gm, compareConfig, pict, &bitmap, replayScale); |
+ // We cannot yet pass 'true' to generate_image_from_picture to |
+ // perform actual tiled rendering (see Issue 1198 - |
+ // https://code.google.com/p/skia/issues/detail?id=1198) |
+ gmmain.generate_image_from_picture(gm, compareConfig, pict, &bitmap, |
+ replayScale /*, true */); |
SkString suffix("-tilegrid"); |
if (SK_Scalar1 != replayScale) { |
suffix += "-scale-"; |