| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 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 #include "PictureRenderer.h" | 8 #include "PictureRenderer.h" |
| 9 #include "picture_utils.h" | 9 #include "picture_utils.h" |
| 10 #include "SamplePipeControllers.h" | 10 #include "SamplePipeControllers.h" |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 276 return; | 276 return; |
| 277 } | 277 } |
| 278 | 278 |
| 279 // resetState should've already done this | 279 // resetState should've already done this |
| 280 fGrContext->flush(); | 280 fGrContext->flush(); |
| 281 | 281 |
| 282 fGrContext->purgeAllUnlockedResources(); | 282 fGrContext->purgeAllUnlockedResources(); |
| 283 #endif | 283 #endif |
| 284 } | 284 } |
| 285 | 285 |
| 286 /** | |
| 287 * Write the canvas to an image file and/or JSON summary. | |
| 288 * | |
| 289 * @param canvas Must be non-null. Canvas to be written to a file. | |
| 290 * @param writePath If nonempty, write the binary image to a file within this di
rectory. | |
| 291 * @param mismatchPath If nonempty, write the binary image to a file within this
directory, | |
| 292 * but only if the image does not match expectations. | |
| 293 * @param inputFilename If we are writing out a binary image, use this to build
its filename. | |
| 294 * @param jsonSummaryPtr If not null, add image results (checksum) to this summa
ry. | |
| 295 * @param useChecksumBasedFilenames If true, use checksum-based filenames when w
riting to disk. | |
| 296 * @param tileNumberPtr If not null, which tile number this image contains. | |
| 297 * | |
| 298 * @return bool True if the operation completed successfully. | |
| 299 */ | |
| 300 static bool write(SkCanvas* canvas, const SkString& writePath, const SkString& m
ismatchPath, | |
| 301 const SkString& inputFilename, ImageResultsAndExpectations *js
onSummaryPtr, | |
| 302 bool useChecksumBasedFilenames, const int* tileNumberPtr=nullp
tr) { | |
| 303 SkASSERT(canvas != nullptr); | |
| 304 if (nullptr == canvas) { | |
| 305 return false; | |
| 306 } | |
| 307 | |
| 308 SkBitmap bitmap; | |
| 309 SkISize size = canvas->getDeviceSize(); | |
| 310 setup_bitmap(&bitmap, size.width(), size.height()); | |
| 311 | |
| 312 canvas->readPixels(&bitmap, 0, 0); | |
| 313 force_all_opaque(bitmap); | |
| 314 BitmapAndDigest bitmapAndDigest(bitmap); | |
| 315 | |
| 316 SkString escapedInputFilename(inputFilename); | |
| 317 replace_char(&escapedInputFilename, '.', '_'); | |
| 318 | |
| 319 // TODO(epoger): what about including the config type within outputFilename?
That way, | |
| 320 // we could combine results of different config types without conflicting fi
lenames. | |
| 321 SkString outputFilename; | |
| 322 const char *outputSubdirPtr = nullptr; | |
| 323 if (useChecksumBasedFilenames) { | |
| 324 ImageDigest *imageDigestPtr = bitmapAndDigest.getImageDigestPtr(); | |
| 325 outputSubdirPtr = escapedInputFilename.c_str(); | |
| 326 outputFilename.set(imageDigestPtr->getHashType()); | |
| 327 outputFilename.append("_"); | |
| 328 outputFilename.appendU64(imageDigestPtr->getHashValue()); | |
| 329 } else { | |
| 330 outputFilename.set(escapedInputFilename); | |
| 331 if (tileNumberPtr) { | |
| 332 outputFilename.append("-tile"); | |
| 333 outputFilename.appendS32(*tileNumberPtr); | |
| 334 } | |
| 335 } | |
| 336 outputFilename.append(".png"); | |
| 337 | |
| 338 if (jsonSummaryPtr) { | |
| 339 ImageDigest *imageDigestPtr = bitmapAndDigest.getImageDigestPtr(); | |
| 340 SkString outputRelativePath; | |
| 341 if (outputSubdirPtr) { | |
| 342 outputRelativePath.set(outputSubdirPtr); | |
| 343 outputRelativePath.append("/"); // always use "/", even on Windows | |
| 344 outputRelativePath.append(outputFilename); | |
| 345 } else { | |
| 346 outputRelativePath.set(outputFilename); | |
| 347 } | |
| 348 | |
| 349 jsonSummaryPtr->add(inputFilename.c_str(), outputRelativePath.c_str(), | |
| 350 *imageDigestPtr, tileNumberPtr); | |
| 351 if (!mismatchPath.isEmpty() && | |
| 352 !jsonSummaryPtr->getExpectation(inputFilename.c_str(), | |
| 353 tileNumberPtr).matches(*imageDigestP
tr)) { | |
| 354 if (!write_bitmap_to_disk(bitmap, mismatchPath, outputSubdirPtr, out
putFilename)) { | |
| 355 return false; | |
| 356 } | |
| 357 } | |
| 358 } | |
| 359 | |
| 360 if (writePath.isEmpty()) { | |
| 361 return true; | |
| 362 } else { | |
| 363 return write_bitmap_to_disk(bitmap, writePath, outputSubdirPtr, outputFi
lename); | |
| 364 } | |
| 365 } | |
| 366 | |
| 367 ////////////////////////////////////////////////////////////////////////////////
/////////////// | 286 ////////////////////////////////////////////////////////////////////////////////
/////////////// |
| 368 | 287 |
| 369 SkCanvas* RecordPictureRenderer::setupCanvas(int width, int height) { | 288 SkCanvas* RecordPictureRenderer::setupCanvas(int width, int height) { |
| 370 // defer the canvas setup until the render step | 289 // defer the canvas setup until the render step |
| 371 return nullptr; | 290 return nullptr; |
| 372 } | 291 } |
| 373 | 292 |
| 374 bool RecordPictureRenderer::render(SkBitmap** out) { | 293 bool RecordPictureRenderer::render(SkBitmap** out) { |
| 375 SkAutoTDelete<SkBBHFactory> factory(this->getFactory()); | 294 SkAutoTDelete<SkBBHFactory> factory(this->getFactory()); |
| 376 SkPictureRecorder recorder; | 295 SkPictureRecorder recorder; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 410 SkCanvas* pipeCanvas = writer.startRecording(&pipeController); | 329 SkCanvas* pipeCanvas = writer.startRecording(&pipeController); |
| 411 pipeCanvas->drawPicture(fPicture); | 330 pipeCanvas->drawPicture(fPicture); |
| 412 writer.endRecording(); | 331 writer.endRecording(); |
| 413 fCanvas->flush(); | 332 fCanvas->flush(); |
| 414 if (out) { | 333 if (out) { |
| 415 *out = new SkBitmap; | 334 *out = new SkBitmap; |
| 416 setup_bitmap(*out, SkScalarCeilToInt(fPicture->cullRect().width()), | 335 setup_bitmap(*out, SkScalarCeilToInt(fPicture->cullRect().width()), |
| 417 SkScalarCeilToInt(fPicture->cullRect().height())); | 336 SkScalarCeilToInt(fPicture->cullRect().height())); |
| 418 fCanvas->readPixels(*out, 0, 0); | 337 fCanvas->readPixels(*out, 0, 0); |
| 419 } | 338 } |
| 420 if (fEnableWrites) { | 339 return true; |
| 421 return write(fCanvas, fWritePath, fMismatchPath, fInputFilename, fJsonSu
mmaryPtr, | |
| 422 fUseChecksumBasedFilenames); | |
| 423 } else { | |
| 424 return true; | |
| 425 } | |
| 426 } | 340 } |
| 427 | 341 |
| 428 SkString PipePictureRenderer::getConfigNameInternal() { | 342 SkString PipePictureRenderer::getConfigNameInternal() { |
| 429 return SkString("pipe"); | 343 return SkString("pipe"); |
| 430 } | 344 } |
| 431 | 345 |
| 432 ////////////////////////////////////////////////////////////////////////////////
/////////////// | 346 ////////////////////////////////////////////////////////////////////////////////
/////////////// |
| 433 | 347 |
| 434 void SimplePictureRenderer::init(const SkPicture* picture, const SkString* write
Path, | 348 void SimplePictureRenderer::init(const SkPicture* picture, const SkString* write
Path, |
| 435 const SkString* mismatchPath, const SkString* i
nputFilename, | 349 const SkString* mismatchPath, const SkString* i
nputFilename, |
| (...skipping 19 matching lines...) Expand all Loading... |
| 455 } else { | 369 } else { |
| 456 fCanvas->drawPicture(fPicture); | 370 fCanvas->drawPicture(fPicture); |
| 457 } | 371 } |
| 458 fCanvas->flush(); | 372 fCanvas->flush(); |
| 459 if (out) { | 373 if (out) { |
| 460 *out = new SkBitmap; | 374 *out = new SkBitmap; |
| 461 setup_bitmap(*out, SkScalarCeilToInt(fPicture->cullRect().width()), | 375 setup_bitmap(*out, SkScalarCeilToInt(fPicture->cullRect().width()), |
| 462 SkScalarCeilToInt(fPicture->cullRect().height())); | 376 SkScalarCeilToInt(fPicture->cullRect().height())); |
| 463 fCanvas->readPixels(*out, 0, 0); | 377 fCanvas->readPixels(*out, 0, 0); |
| 464 } | 378 } |
| 465 if (fEnableWrites) { | 379 return true; |
| 466 return write(fCanvas, fWritePath, fMismatchPath, fInputFilename, fJsonSu
mmaryPtr, | |
| 467 fUseChecksumBasedFilenames); | |
| 468 } else { | |
| 469 return true; | |
| 470 } | |
| 471 } | 380 } |
| 472 | 381 |
| 473 SkString SimplePictureRenderer::getConfigNameInternal() { | 382 SkString SimplePictureRenderer::getConfigNameInternal() { |
| 474 return SkString("simple"); | 383 return SkString("simple"); |
| 475 } | 384 } |
| 476 | 385 |
| 477 ////////////////////////////////////////////////////////////////////////////////
/////////////// | 386 ////////////////////////////////////////////////////////////////////////////////
/////////////// |
| 478 | 387 |
| 479 #if SK_SUPPORT_GPU | 388 #if SK_SUPPORT_GPU |
| 480 TiledPictureRenderer::TiledPictureRenderer(const GrContextOptions& opts) | 389 TiledPictureRenderer::TiledPictureRenderer(const GrContextOptions& opts) |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 667 void TiledPictureRenderer::drawCurrentTile() { | 576 void TiledPictureRenderer::drawCurrentTile() { |
| 668 SkASSERT(fCurrentTileOffset >= 0 && fCurrentTileOffset < fTileRects.count())
; | 577 SkASSERT(fCurrentTileOffset >= 0 && fCurrentTileOffset < fTileRects.count())
; |
| 669 draw_tile_to_canvas(fCanvas, fTileRects[fCurrentTileOffset], fPicture); | 578 draw_tile_to_canvas(fCanvas, fTileRects[fCurrentTileOffset], fPicture); |
| 670 } | 579 } |
| 671 | 580 |
| 672 bool TiledPictureRenderer::postRender(SkCanvas* canvas, const SkIRect& tileRect, | 581 bool TiledPictureRenderer::postRender(SkCanvas* canvas, const SkIRect& tileRect, |
| 673 SkBitmap* tempBM, SkBitmap** out, | 582 SkBitmap* tempBM, SkBitmap** out, |
| 674 int tileNumber) { | 583 int tileNumber) { |
| 675 bool success = true; | 584 bool success = true; |
| 676 | 585 |
| 677 if (fEnableWrites) { | |
| 678 success &= write(canvas, fWritePath, fMismatchPath, fInputFilename, fJso
nSummaryPtr, | |
| 679 fUseChecksumBasedFilenames, &tileNumber); | |
| 680 } | |
| 681 if (out) { | 586 if (out) { |
| 682 if (canvas->readPixels(tempBM, 0, 0)) { | 587 if (canvas->readPixels(tempBM, 0, 0)) { |
| 683 // Add this tile to the entire bitmap. | 588 // Add this tile to the entire bitmap. |
| 684 bitmapCopyAtOffset(*tempBM, *out, tileRect.left(), tileRect.top()); | 589 bitmapCopyAtOffset(*tempBM, *out, tileRect.left(), tileRect.top()); |
| 685 } else { | 590 } else { |
| 686 success = false; | 591 success = false; |
| 687 } | 592 } |
| 688 } | 593 } |
| 689 | 594 |
| 690 return success; | 595 return success; |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 825 case kNone_BBoxHierarchyType: | 730 case kNone_BBoxHierarchyType: |
| 826 return nullptr; | 731 return nullptr; |
| 827 case kRTree_BBoxHierarchyType: | 732 case kRTree_BBoxHierarchyType: |
| 828 return new SkRTreeFactory; | 733 return new SkRTreeFactory; |
| 829 } | 734 } |
| 830 SkASSERT(0); // invalid bbhType | 735 SkASSERT(0); // invalid bbhType |
| 831 return nullptr; | 736 return nullptr; |
| 832 } | 737 } |
| 833 | 738 |
| 834 } // namespace sk_tools | 739 } // namespace sk_tools |
| OLD | NEW |