Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(48)

Side by Side Diff: gm/gmmain.cpp

Issue 13165011: Add tile rendering to GM (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 /* 8 /*
9 * Code for the "gm" (Golden Master) rendering comparison tool. 9 * Code for the "gm" (Golden Master) rendering comparison tool.
10 * 10 *
(...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after
404 // size) overwrite our previous allocation 404 // size) overwrite our previous allocation
405 bitmap->setConfig(SkBitmap::kARGB_8888_Config, size.fWidth, 405 bitmap->setConfig(SkBitmap::kARGB_8888_Config, size.fWidth,
406 size.fHeight); 406 size.fHeight);
407 canvas->readPixels(bitmap, 0, 0); 407 canvas->readPixels(bitmap, 0, 0);
408 } 408 }
409 #endif 409 #endif
410 complete_bitmap(bitmap); 410 complete_bitmap(bitmap);
411 return kEmpty_ErrorCombination; 411 return kEmpty_ErrorCombination;
412 } 412 }
413 413
414 static void bitmap_copy_subset(const SkBitmap& src, SkBitmap* dst, int xDst,
415 int yDst) {
416 for (int y = 0; y <src.height() && y + yDst < dst->height() ; y++) {
417 for (int x = 0; x < src.width() && x + xDst < dst->width() ; x++) {
418 *dst->getAddr32(xDst + x, yDst + y) = *src.getAddr32(x, y);
419 }
420 }
421 }
422
414 static void generate_image_from_picture(GM* gm, const ConfigData& gRec, 423 static void generate_image_from_picture(GM* gm, const ConfigData& gRec,
415 SkPicture* pict, SkBitmap* bitmap, 424 SkPicture* pict, SkBitmap* bitmap,
416 SkScalar scale = SK_Scalar1) { 425 SkScalar scale = SK_Scalar1,
426 bool tile = false) {
417 SkISize size = gm->getISize(); 427 SkISize size = gm->getISize();
418 setup_bitmap(gRec, size, bitmap); 428 setup_bitmap(gRec, size, bitmap);
419 SkCanvas canvas(*bitmap); 429
420 installFilter(&canvas); 430 if (tile) {
421 canvas.scale(scale, scale); 431 // Generate the result image by rendering to tiles and accumulating
422 canvas.drawPicture(*pict); 432 // the results in 'bitmap'
423 complete_bitmap(bitmap); 433
434 // This 16x16 tiling matches the settings applied to 'pict' in
435 // 'generate_new_picture'
436 SkISize tileSize = SkISize::Make(16, 16);
437
438 SkBitmap tileBM;
439 setup_bitmap(gRec, tileSize, &tileBM);
440 SkCanvas tileCanvas(tileBM);
441 installFilter(&tileCanvas);
442
443 for (int yTile = 0; yTile < (size.height()+15)/16; ++yTile) {
444 for (int xTile = 0; xTile < (size.width()+15)/16; ++xTile) {
445 int saveCount = tileCanvas.save();
446 SkMatrix mat(tileCanvas.getTotalMatrix());
447 mat.postTranslate(SkIntToScalar(-xTile*tileSize.width()),
448 SkIntToScalar(-yTile*tileSize.height()));
449 tileCanvas.setMatrix(mat);
450 pict->draw(&tileCanvas);
451 tileCanvas.flush();
452 tileCanvas.restoreToCount(saveCount);
453 bitmap_copy_subset(tileBM, bitmap,
bsalomon 2013/04/01 17:36:43 Maybe create an SkCanvas around bitmap and drawBit
robertphillips 2013/04/01 18:21:52 What does that buy us?
bsalomon 2013/04/01 18:28:27 Faster, works with different src/dst bitmap types,
robertphillips 2013/04/02 13:29:53 Done.
454 xTile * tileSize.width(),
455 yTile * tileSize.height());
456 }
457 }
458 } else {
459 SkCanvas canvas(*bitmap);
460 installFilter(&canvas);
461 canvas.scale(scale, scale);
462 canvas.drawPicture(*pict);
463 complete_bitmap(bitmap);
464 }
424 } 465 }
425 466
426 static void generate_pdf(GM* gm, SkDynamicMemoryWStream& pdf) { 467 static void generate_pdf(GM* gm, SkDynamicMemoryWStream& pdf) {
427 #ifdef SK_SUPPORT_PDF 468 #ifdef SK_SUPPORT_PDF
428 SkMatrix initialTransform = gm->getInitialTransform(); 469 SkMatrix initialTransform = gm->getInitialTransform();
429 SkISize pageSize = gm->getISize(); 470 SkISize pageSize = gm->getISize();
430 SkPDFDevice* dev = NULL; 471 SkPDFDevice* dev = NULL;
431 if (initialTransform.isIdentity()) { 472 if (initialTransform.isIdentity()) {
432 dev = new SkPDFDevice(pageSize, pageSize, initialTransform); 473 dev = new SkPDFDevice(pageSize, pageSize, initialTransform);
433 } else { 474 } else {
(...skipping 878 matching lines...) Expand 10 before | Expand all | Expand 10 after
1312 if ((gmFlags & GM::kSkipScaledReplay_Flag) && replayScale != 1) { 1353 if ((gmFlags & GM::kSkipScaledReplay_Flag) && replayScale != 1) {
1313 continue; 1354 continue;
1314 } 1355 }
1315 // We record with the reciprocal scale to obtain a replay 1356 // We record with the reciprocal scale to obtain a replay
1316 // result that can be validated against comparisonBitmap. 1357 // result that can be validated against comparisonBitmap.
1317 SkScalar recordScale = SkScalarInvert(replayScale); 1358 SkScalar recordScale = SkScalarInvert(replayScale);
1318 SkPicture* pict = gmmain.generate_new_picture( 1359 SkPicture* pict = gmmain.generate_new_picture(
1319 gm, kTileGrid_BbhType, SkPicture::kUsePathBoundsForClip_Recordin gFlag, recordScale); 1360 gm, kTileGrid_BbhType, SkPicture::kUsePathBoundsForClip_Recordin gFlag, recordScale);
1320 SkAutoUnref aur(pict); 1361 SkAutoUnref aur(pict);
1321 SkBitmap bitmap; 1362 SkBitmap bitmap;
1322 gmmain.generate_image_from_picture(gm, compareConfig, pict, &bitmap, replayScale); 1363 // We cannot yet pass 'true' to generate_image_from_picture to
1364 // perform actual tiled rendering (see Issue 1198 -
1365 // https://code.google.com/p/skia/issues/detail?id=1198)
1366 gmmain.generate_image_from_picture(gm, compareConfig, pict, &bitmap,
1367 replayScale /*, true */);
1323 SkString suffix("-tilegrid"); 1368 SkString suffix("-tilegrid");
1324 if (SK_Scalar1 != replayScale) { 1369 if (SK_Scalar1 != replayScale) {
1325 suffix += "-scale-"; 1370 suffix += "-scale-";
1326 suffix.appendScalar(replayScale); 1371 suffix.appendScalar(replayScale);
1327 } 1372 }
1328 errorsForAllModes.add(gmmain.compare_test_results_to_reference_bitma p( 1373 errorsForAllModes.add(gmmain.compare_test_results_to_reference_bitma p(
1329 gm, compareConfig, suffix.c_str(), bitmap, &comparisonBitmap)); 1374 gm, compareConfig, suffix.c_str(), bitmap, &comparisonBitmap));
1330 } 1375 }
1331 } 1376 }
1332 1377
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
1657 if (FLAGS_forceBWtext) { 1702 if (FLAGS_forceBWtext) {
1658 canvas->setDrawFilter(SkNEW(BWTextDrawFilter))->unref(); 1703 canvas->setDrawFilter(SkNEW(BWTextDrawFilter))->unref();
1659 } 1704 }
1660 } 1705 }
1661 1706
1662 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) 1707 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL)
1663 int main(int argc, char * const argv[]) { 1708 int main(int argc, char * const argv[]) {
1664 return tool_main(argc, (char**) argv); 1709 return tool_main(argc, (char**) argv);
1665 } 1710 }
1666 #endif 1711 #endif
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698