Chromium Code Reviews| 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 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 316 #endif | 316 #endif |
| 317 } | 317 } |
| 318 | 318 |
| 319 uint32_t PictureRenderer::recordFlags() { | 319 uint32_t PictureRenderer::recordFlags() { |
| 320 return (kNone_BBoxHierarchyType == fBBoxHierarchyType) | 320 return (kNone_BBoxHierarchyType == fBBoxHierarchyType) |
| 321 ? 0 | 321 ? 0 |
| 322 : SkPicture::kUsePathBoundsForClip_RecordingFlag; | 322 : SkPicture::kUsePathBoundsForClip_RecordingFlag; |
| 323 } | 323 } |
| 324 | 324 |
| 325 /** | 325 /** |
| 326 * Write the canvas to the specified path. | 326 * Write the canvas to the specified path. |
|
scroggo
2014/04/24 21:15:08
Since this function does a lot more than this (and
epoger
2014/04/25 15:26:43
Done.
| |
| 327 * | 327 * |
| 328 * @param canvas Must be non-null. Canvas to be written to a file. | 328 * @param canvas Must be non-null. Canvas to be written to a file. |
| 329 * @param outputDir If nonempty, write the binary image to a file within this di rectory. | 329 * @param outputDir If nonempty, write the binary image to a file within this di rectory. |
| 330 * @param inputFilename If we are writing out a binary image, use this to build its filename. | 330 * @param inputFilename If we are writing out a binary image, use this to build its filename. |
| 331 * @param jsonSummaryPtr If not null, add image results to this summary. | 331 * @param jsonSummaryPtr If not null, add image results to this summary. |
| 332 * @param useChecksumBasedFilenames If true, use checksum-based filenames when w riting to disk. | 332 * @param useChecksumBasedFilenames If true, use checksum-based filenames when w riting to disk. |
| 333 * @param tileNumberPtr If not null, which tile number this image contains. | 333 * @param tileNumberPtr If not null, which tile number this image contains. |
| 334 * @return bool True if the Canvas is written to a file. | 334 * @return bool True if the Canvas is written to a file. |
|
scroggo
2014/04/24 21:15:08
or if outputDir is NULL but we still wrote a summa
epoger
2014/04/25 15:26:43
It's slightly different than that... updated.
| |
| 335 * | |
| 336 * TODO(epoger): Right now, all canvases must pass through this function in orde r to be appended | |
| 337 * to the ImageResultsSummary. We need some way to add bitmaps to the ImageResu ltsSummary | |
| 338 * even if --writePath has not been specified (and thus this function is not cal led). | |
| 339 * | |
| 340 * One fix would be to pass in these path elements separately, and allow this fu nction to be | |
| 341 * called even if --writePath was not specified... | |
| 342 * const char *outputDir // NULL if we don't want to write image files to dis k | |
| 343 * const char *filename // name we use within JSON summary, and as the filen ame within outputDir | |
| 344 * | |
| 345 * UPDATE: Now that outputDir and inputFilename are passed separately, we should be able to do that. | |
| 346 */ | 335 */ |
| 347 static bool write(SkCanvas* canvas, const SkString& outputDir, const SkString& i nputFilename, | 336 static bool write(SkCanvas* canvas, const SkString& outputDir, const SkString& i nputFilename, |
| 348 ImageResultsSummary *jsonSummaryPtr, bool useChecksumBasedFile names, | 337 ImageResultsSummary *jsonSummaryPtr, bool useChecksumBasedFile names, |
| 349 const int* tileNumberPtr=NULL) { | 338 const int* tileNumberPtr=NULL) { |
| 350 SkASSERT(canvas != NULL); | 339 SkASSERT(canvas != NULL); |
| 351 if (NULL == canvas) { | 340 if (NULL == canvas) { |
| 352 return false; | 341 return false; |
| 353 } | 342 } |
| 354 | 343 |
| 355 SkBitmap bitmap; | 344 SkBitmap bitmap; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 400 outputRelativePath.append("/"); // always use "/", even on Windows | 389 outputRelativePath.append("/"); // always use "/", even on Windows |
| 401 outputRelativePath.append(outputFilename); | 390 outputRelativePath.append(outputFilename); |
| 402 } else { | 391 } else { |
| 403 outputRelativePath.set(outputFilename); | 392 outputRelativePath.set(outputFilename); |
| 404 } | 393 } |
| 405 | 394 |
| 406 jsonSummaryPtr->add(inputFilename.c_str(), outputRelativePath.c_str(), | 395 jsonSummaryPtr->add(inputFilename.c_str(), outputRelativePath.c_str(), |
| 407 hash, tileNumberPtr); | 396 hash, tileNumberPtr); |
| 408 } | 397 } |
| 409 | 398 |
| 410 SkASSERT(!outputDir.isEmpty()); // TODO(epoger): we want to remove this cons traint, | 399 if (outputDir.isEmpty()) { |
| 411 // as noted above | 400 return true; |
| 401 } | |
| 402 | |
| 412 SkString dirPath; | 403 SkString dirPath; |
| 413 if (outputSubdirPtr) { | 404 if (outputSubdirPtr) { |
| 414 dirPath = SkOSPath::SkPathJoin(outputDir.c_str(), outputSubdirPtr); | 405 dirPath = SkOSPath::SkPathJoin(outputDir.c_str(), outputSubdirPtr); |
| 415 sk_mkdir(dirPath.c_str()); | 406 sk_mkdir(dirPath.c_str()); |
| 416 } else { | 407 } else { |
| 417 dirPath.set(outputDir); | 408 dirPath.set(outputDir); |
| 418 } | 409 } |
| 419 SkString fullPath = SkOSPath::SkPathJoin(dirPath.c_str(), outputFilename.c_s tr()); | 410 SkString fullPath = SkOSPath::SkPathJoin(dirPath.c_str(), outputFilename.c_s tr()); |
| 420 return SkImageEncoder::EncodeFile(fullPath.c_str(), bitmap, SkImageEncoder:: kPNG_Type, 100); | 411 return SkImageEncoder::EncodeFile(fullPath.c_str(), bitmap, SkImageEncoder:: kPNG_Type, 100); |
| 421 } | 412 } |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 463 if (NULL == fCanvas.get() || NULL == fPicture) { | 454 if (NULL == fCanvas.get() || NULL == fPicture) { |
| 464 return false; | 455 return false; |
| 465 } | 456 } |
| 466 | 457 |
| 467 PipeController pipeController(fCanvas.get()); | 458 PipeController pipeController(fCanvas.get()); |
| 468 SkGPipeWriter writer; | 459 SkGPipeWriter writer; |
| 469 SkCanvas* pipeCanvas = writer.startRecording(&pipeController); | 460 SkCanvas* pipeCanvas = writer.startRecording(&pipeController); |
| 470 pipeCanvas->drawPicture(*fPicture); | 461 pipeCanvas->drawPicture(*fPicture); |
| 471 writer.endRecording(); | 462 writer.endRecording(); |
| 472 fCanvas->flush(); | 463 fCanvas->flush(); |
| 473 if (!fOutputDir.isEmpty()) { | |
| 474 return write(fCanvas, fOutputDir, fInputFilename, fJsonSummaryPtr, | |
| 475 fUseChecksumBasedFilenames); | |
| 476 } | |
| 477 if (NULL != out) { | 464 if (NULL != out) { |
| 478 *out = SkNEW(SkBitmap); | 465 *out = SkNEW(SkBitmap); |
| 479 setup_bitmap(*out, fPicture->width(), fPicture->height()); | 466 setup_bitmap(*out, fPicture->width(), fPicture->height()); |
| 480 fCanvas->readPixels(*out, 0, 0); | 467 fCanvas->readPixels(*out, 0, 0); |
| 481 } | 468 } |
| 482 return true; | 469 return write(fCanvas, fOutputDir, fInputFilename, fJsonSummaryPtr, |
| 470 fUseChecksumBasedFilenames); | |
| 483 } | 471 } |
| 484 | 472 |
| 485 SkString PipePictureRenderer::getConfigNameInternal() { | 473 SkString PipePictureRenderer::getConfigNameInternal() { |
| 486 return SkString("pipe"); | 474 return SkString("pipe"); |
| 487 } | 475 } |
| 488 | 476 |
| 489 //////////////////////////////////////////////////////////////////////////////// /////////////// | 477 //////////////////////////////////////////////////////////////////////////////// /////////////// |
| 490 | 478 |
| 491 void SimplePictureRenderer::init(SkPicture* picture, const SkString* outputDir, | 479 void SimplePictureRenderer::init(SkPicture* picture, const SkString* outputDir, |
| 492 const SkString* inputFilename, bool useChecksum BasedFilenames) { | 480 const SkString* inputFilename, bool useChecksum BasedFilenames) { |
| 493 INHERITED::init(picture, outputDir, inputFilename, useChecksumBasedFilenames ); | 481 INHERITED::init(picture, outputDir, inputFilename, useChecksumBasedFilenames ); |
| 494 this->buildBBoxHierarchy(); | 482 this->buildBBoxHierarchy(); |
| 495 } | 483 } |
| 496 | 484 |
| 497 bool SimplePictureRenderer::render(SkBitmap** out) { | 485 bool SimplePictureRenderer::render(SkBitmap** out) { |
| 498 SkASSERT(fCanvas.get() != NULL); | 486 SkASSERT(fCanvas.get() != NULL); |
| 499 SkASSERT(NULL != fPicture); | 487 SkASSERT(NULL != fPicture); |
| 500 if (NULL == fCanvas.get() || NULL == fPicture) { | 488 if (NULL == fCanvas.get() || NULL == fPicture) { |
| 501 return false; | 489 return false; |
| 502 } | 490 } |
| 503 | 491 |
| 504 fCanvas->drawPicture(*fPicture); | 492 fCanvas->drawPicture(*fPicture); |
| 505 fCanvas->flush(); | 493 fCanvas->flush(); |
| 506 if (!fOutputDir.isEmpty()) { | |
| 507 return write(fCanvas, fOutputDir, fInputFilename, fJsonSummaryPtr, | |
| 508 fUseChecksumBasedFilenames); | |
| 509 } | |
| 510 | |
| 511 if (NULL != out) { | 494 if (NULL != out) { |
| 512 *out = SkNEW(SkBitmap); | 495 *out = SkNEW(SkBitmap); |
| 513 setup_bitmap(*out, fPicture->width(), fPicture->height()); | 496 setup_bitmap(*out, fPicture->width(), fPicture->height()); |
| 514 fCanvas->readPixels(*out, 0, 0); | 497 fCanvas->readPixels(*out, 0, 0); |
| 515 } | 498 } |
| 516 | 499 return write(fCanvas, fOutputDir, fInputFilename, fJsonSummaryPtr, |
| 517 return true; | 500 fUseChecksumBasedFilenames); |
| 518 } | 501 } |
| 519 | 502 |
| 520 SkString SimplePictureRenderer::getConfigNameInternal() { | 503 SkString SimplePictureRenderer::getConfigNameInternal() { |
| 521 return SkString("simple"); | 504 return SkString("simple"); |
| 522 } | 505 } |
| 523 | 506 |
| 524 //////////////////////////////////////////////////////////////////////////////// /////////////// | 507 //////////////////////////////////////////////////////////////////////////////// /////////////// |
| 525 | 508 |
| 526 TiledPictureRenderer::TiledPictureRenderer() | 509 TiledPictureRenderer::TiledPictureRenderer() |
| 527 : fTileWidth(kDefaultTileWidth) | 510 : fTileWidth(kDefaultTileWidth) |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 715 | 698 |
| 716 SkBitmap bitmap; | 699 SkBitmap bitmap; |
| 717 if (out){ | 700 if (out){ |
| 718 *out = SkNEW(SkBitmap); | 701 *out = SkNEW(SkBitmap); |
| 719 setup_bitmap(*out, fPicture->width(), fPicture->height()); | 702 setup_bitmap(*out, fPicture->width(), fPicture->height()); |
| 720 setup_bitmap(&bitmap, fTileWidth, fTileHeight); | 703 setup_bitmap(&bitmap, fTileWidth, fTileHeight); |
| 721 } | 704 } |
| 722 bool success = true; | 705 bool success = true; |
| 723 for (int i = 0; i < fTileRects.count(); ++i) { | 706 for (int i = 0; i < fTileRects.count(); ++i) { |
| 724 draw_tile_to_canvas(fCanvas, fTileRects[i], fPicture); | 707 draw_tile_to_canvas(fCanvas, fTileRects[i], fPicture); |
| 725 if (!fOutputDir.isEmpty()) { | 708 success &= write(fCanvas, fOutputDir, fInputFilename, fJsonSummaryPtr, |
| 726 success &= write(fCanvas, fOutputDir, fInputFilename, fJsonSummaryPt r, | 709 fUseChecksumBasedFilenames, &i); |
| 727 fUseChecksumBasedFilenames, &i); | |
| 728 } | |
| 729 if (NULL != out) { | 710 if (NULL != out) { |
| 730 if (fCanvas->readPixels(&bitmap, 0, 0)) { | 711 if (fCanvas->readPixels(&bitmap, 0, 0)) { |
| 731 // Add this tile to the entire bitmap. | 712 // Add this tile to the entire bitmap. |
| 732 bitmapCopyAtOffset(bitmap, *out, SkScalarFloorToInt(fTileRects[i ].left()), | 713 bitmapCopyAtOffset(bitmap, *out, SkScalarFloorToInt(fTileRects[i ].left()), |
| 733 SkScalarFloorToInt(fTileRects[i].top())); | 714 SkScalarFloorToInt(fTileRects[i].top())); |
| 734 } else { | 715 } else { |
| 735 success = false; | 716 success = false; |
| 736 } | 717 } |
| 737 } | 718 } |
| 738 } | 719 } |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 800 SkGraphics::SetTLSFontCacheLimit(1024 * 1024); | 781 SkGraphics::SetTLSFontCacheLimit(1024 * 1024); |
| 801 | 782 |
| 802 SkBitmap bitmap; | 783 SkBitmap bitmap; |
| 803 if (fBitmap != NULL) { | 784 if (fBitmap != NULL) { |
| 804 // All tiles are the same size. | 785 // All tiles are the same size. |
| 805 setup_bitmap(&bitmap, SkScalarFloorToInt(fRects[0].width()), SkScala rFloorToInt(fRects[0].height())); | 786 setup_bitmap(&bitmap, SkScalarFloorToInt(fRects[0].width()), SkScala rFloorToInt(fRects[0].height())); |
| 806 } | 787 } |
| 807 | 788 |
| 808 for (int i = fStart; i < fEnd; i++) { | 789 for (int i = fStart; i < fEnd; i++) { |
| 809 draw_tile_to_canvas(fCanvas, fRects[i], fClone); | 790 draw_tile_to_canvas(fCanvas, fRects[i], fClone); |
| 810 if ((!fOutputDir.isEmpty()) | 791 if (!write(fCanvas, fOutputDir, fInputFilename, fJsonSummaryPtr, |
| 811 && !write(fCanvas, fOutputDir, fInputFilename, fJsonSummaryPtr, | 792 fUseChecksumBasedFilenames, &i) |
| 812 fUseChecksumBasedFilenames, &i) | |
| 813 && fSuccess != NULL) { | 793 && fSuccess != NULL) { |
| 814 *fSuccess = false; | 794 *fSuccess = false; |
| 815 // If one tile fails to write to a file, do not continue drawing the rest. | 795 // If one tile fails to write to a file, do not continue drawing the rest. |
| 816 break; | 796 break; |
| 817 } | 797 } |
| 818 if (fBitmap != NULL) { | 798 if (fBitmap != NULL) { |
| 819 if (fCanvas->readPixels(&bitmap, 0, 0)) { | 799 if (fCanvas->readPixels(&bitmap, 0, 0)) { |
| 820 SkAutoLockPixels alp(*fBitmap); | 800 SkAutoLockPixels alp(*fBitmap); |
| 821 bitmapCopyAtOffset(bitmap, fBitmap, SkScalarFloorToInt(fRect s[i].left()), | 801 bitmapCopyAtOffset(bitmap, fBitmap, SkScalarFloorToInt(fRect s[i].left()), |
| 822 SkScalarFloorToInt(fRects[i].top())); | 802 SkScalarFloorToInt(fRects[i].top())); |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1030 virtual SkString getConfigNameInternal() SK_OVERRIDE { | 1010 virtual SkString getConfigNameInternal() SK_OVERRIDE { |
| 1031 return SkString("picture_clone"); | 1011 return SkString("picture_clone"); |
| 1032 } | 1012 } |
| 1033 }; | 1013 }; |
| 1034 | 1014 |
| 1035 PictureRenderer* CreatePictureCloneRenderer() { | 1015 PictureRenderer* CreatePictureCloneRenderer() { |
| 1036 return SkNEW(PictureCloneRenderer); | 1016 return SkNEW(PictureCloneRenderer); |
| 1037 } | 1017 } |
| 1038 | 1018 |
| 1039 } // namespace sk_tools | 1019 } // namespace sk_tools |
| OLD | NEW |