OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |