void QuiltTask::draw() { SkAutoTUnref<SkPicture> recorded(RecordPicture(fGM.get())); SkBitmap full; SetupBitmap(fReference.colorType(), fGM.get(), &full); SkCanvas fullCanvas(full); SkBitmap tile; tile.allocPixels(SkImageInfo::Make(FLAGS_quiltTile, FLAGS_quiltTile, fReference.colorType(), kPremul_SkAlphaType)); SkCanvas tileCanvas(tile); for (int y = 0; y < tiles_needed(full.height(), tile.height()); y++) { for (int x = 0; x < tiles_needed(full.width(), tile.width()); x++) { SkAutoCanvasRestore ar(&tileCanvas, true/*also save now*/); const SkScalar xOffset = SkIntToScalar(x * tile.width()), yOffset = SkIntToScalar(y * tile.height()); SkMatrix matrix = tileCanvas.getTotalMatrix(); matrix.postTranslate(-xOffset, -yOffset); tileCanvas.setMatrix(matrix); recorded->draw(&tileCanvas); tileCanvas.flush(); fullCanvas.drawBitmap(tile, xOffset, yOffset, NULL); } } if (!BitmapsEqual(full, fReference)) { this->fail(); this->spawnChild(SkNEW_ARGS(WriteTask, (*this, full))); } }
void ReplayTask::draw() { const uint32_t flags = fUseRTree ? SkPicture::kOptimizeForClippedPlayback_RecordingFlag : 0; SkAutoTUnref<SkPicture> recorded(RecordPicture(fGM.get(), flags)); SkBitmap bitmap; SetupBitmap(fReference.colorType(), fGM.get(), &bitmap); DrawPicture(recorded, &bitmap); if (!BitmapsEqual(bitmap, fReference)) { this->fail(); this->spawnChild(SkNEW_ARGS(WriteTask, (*this, bitmap))); } }
void SerializeTask::draw() { SkPicture recorded; RecordPicture(fGM.get(), &recorded); SkDynamicMemoryWStream wStream; recorded.serialize(&wStream, &trivial_bitmap_encoder); SkAutoTUnref<SkStream> rStream(wStream.detachAsStream()); SkAutoTUnref<SkPicture> reconstructed(SkPicture::CreateFromStream(rStream)); SkBitmap bitmap; SetupBitmap(fReference.config(), fGM.get(), &bitmap); DrawPicture(reconstructed, &bitmap); if (!BitmapsEqual(bitmap, fReference)) { this->fail(); this->spawnChild(SkNEW_ARGS(WriteTask, (*this, bitmap))); } }
void TileGridTask::draw() { const SkTileGridPicture::TileGridInfo info = { fTileSize, SkISize::Make(0,0), // Overlap between adjacent tiles. SkIPoint::Make(0,0), // Offset. }; const SkISize size = fGM->getISize(); SkTileGridPicture recorded(size.width(), size.height(), info); RecordPicture(fGM.get(), &recorded, SkPicture::kUsePathBoundsForClip_RecordingFlag); SkBitmap full; SetupBitmap(fReference.colorType(), fGM.get(), &full); SkCanvas fullCanvas(full); SkBitmap tile; tile.allocPixels(SkImageInfo::Make(fTileSize.width(), fTileSize.height(), fReference.colorType(), kPremul_SkAlphaType)); SkCanvas tileCanvas(tile); SkPaint paint; paint.setXfermodeMode(SkXfermode::kSrc_Mode); for (int y = 0; y < tiles_needed(full.height(), tile.height()); y++) { for (int x = 0; x < tiles_needed(full.width(), tile.width()); x++) { SkAutoCanvasRestore ar(&tileCanvas, true/*also save now*/); const SkScalar xOffset = SkIntToScalar(x * tile.width()), yOffset = SkIntToScalar(y * tile.height()); SkMatrix matrix = tileCanvas.getTotalMatrix(); matrix.postTranslate(-xOffset, -yOffset); tileCanvas.setMatrix(matrix); recorded.draw(&tileCanvas); tileCanvas.flush(); fullCanvas.drawBitmap(tile, xOffset, yOffset, &paint); } } if (!BitmapsEqual(full, fReference)) { this->fail(); this->spawnChild(SkNEW_ARGS(WriteTask, (*this, full))); } }
bool PictureTest::Test(draw_func* func, BRect frame) { CleanUp(); fDirectBitmap = CreateBitmap(func, frame); TEST_AND_RETURN(fDirectBitmap == NULL, "Could not create direct draw bitmap!", false); BPicture *picture = RecordPicture(func, frame); AutoDelete<BPicture> _picture(picture); TEST_AND_RETURN(picture == NULL, "Picture could not be recorded!", false); BPicture *archivedPicture = SaveAndRestore(picture); AutoDelete<BPicture> _archivedPicture(archivedPicture); TEST_AND_RETURN(picture == NULL, "Picture could not be flattened and unflattened!", false); fBitmapFromPicture = CreateBitmap(picture, frame); TEST_AND_RETURN(fBitmapFromPicture == NULL, "Could not create bitmap from original picture!", false); fBitmapFromRestoredPicture = CreateBitmap(archivedPicture, frame); TEST_AND_RETURN(fBitmapFromRestoredPicture == NULL, "Could not create bitmap from archived picture!", false); BString reason; if (!IsSame(fDirectBitmap, fBitmapFromPicture, reason)) { BString message("Bitmap from picture differs from direct drawing bitmap: "); message += reason; SetErrorMessage(message.String()); return false; } if (!IsSame(fDirectBitmap, fBitmapFromRestoredPicture, reason)) { BString message("Bitmap from restored picture differs from direct drawing bitmap: "); message += reason; SetErrorMessage(message.String()); return false; } return true; }