| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 "DMSrcSink.h" | 8 #include "DMSrcSink.h" |
| 9 #include "SamplePipeControllers.h" | 9 #include "SamplePipeControllers.h" |
| 10 #include "SkCodec.h" | 10 #include "SkCodec.h" |
| (...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 526 | 526 |
| 527 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ | 527 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ |
| 528 | 528 |
| 529 static SkISize auto_compute_translate(SkMatrix* matrix, int srcW, int srcH) { | 529 static SkISize auto_compute_translate(SkMatrix* matrix, int srcW, int srcH) { |
| 530 SkRect bounds = SkRect::MakeIWH(srcW, srcH); | 530 SkRect bounds = SkRect::MakeIWH(srcW, srcH); |
| 531 matrix->mapRect(&bounds); | 531 matrix->mapRect(&bounds); |
| 532 matrix->postTranslate(-bounds.x(), -bounds.y()); | 532 matrix->postTranslate(-bounds.x(), -bounds.y()); |
| 533 return SkISize::Make(SkScalarRoundToInt(bounds.width()), SkScalarRoundToInt(
bounds.height())); | 533 return SkISize::Make(SkScalarRoundToInt(bounds.width()), SkScalarRoundToInt(
bounds.height())); |
| 534 } | 534 } |
| 535 | 535 |
| 536 ViaMatrix::ViaMatrix(SkMatrix matrix, Sink* sink) : fMatrix(matrix), fSink(sink)
{} | 536 ViaMatrix::ViaMatrix(SkMatrix matrix, Sink* sink) : Via(sink), fMatrix(matrix) {
} |
| 537 | 537 |
| 538 Error ViaMatrix::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStr
ing* log) const { | 538 Error ViaMatrix::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStr
ing* log) const { |
| 539 SkMatrix matrix = fMatrix; | 539 SkMatrix matrix = fMatrix; |
| 540 SkISize size = auto_compute_translate(&matrix, src.size().width(), src.size(
).height()); | 540 SkISize size = auto_compute_translate(&matrix, src.size().width(), src.size(
).height()); |
| 541 return draw_to_canvas(fSink, bitmap, stream, log, size, [&](SkCanvas* canvas
) { | 541 return draw_to_canvas(fSink, bitmap, stream, log, size, [&](SkCanvas* canvas
) { |
| 542 canvas->concat(matrix); | 542 canvas->concat(matrix); |
| 543 return src.draw(canvas); | 543 return src.draw(canvas); |
| 544 }); | 544 }); |
| 545 } | 545 } |
| 546 | 546 |
| 547 // Undoes any flip or 90 degree rotate without changing the scale of the bitmap. | 547 // Undoes any flip or 90 degree rotate without changing the scale of the bitmap. |
| 548 // This should be pixel-preserving. | 548 // This should be pixel-preserving. |
| 549 ViaUpright::ViaUpright(SkMatrix matrix, Sink* sink) : fMatrix(matrix), fSink(sin
k) {} | 549 ViaUpright::ViaUpright(SkMatrix matrix, Sink* sink) : Via(sink), fMatrix(matrix)
{} |
| 550 | 550 |
| 551 Error ViaUpright::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkSt
ring* log) const { | 551 Error ViaUpright::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkSt
ring* log) const { |
| 552 Error err = fSink->draw(src, bitmap, stream, log); | 552 Error err = fSink->draw(src, bitmap, stream, log); |
| 553 if (!err.isEmpty()) { | 553 if (!err.isEmpty()) { |
| 554 return err; | 554 return err; |
| 555 } | 555 } |
| 556 | 556 |
| 557 SkMatrix inverse; | 557 SkMatrix inverse; |
| 558 if (!fMatrix.rectStaysRect() || !fMatrix.invert(&inverse)) { | 558 if (!fMatrix.rectStaysRect() || !fMatrix.invert(&inverse)) { |
| 559 return "Cannot upright --matrix."; | 559 return "Cannot upright --matrix."; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 574 paint.setXfermodeMode(SkXfermode::kSrc_Mode); | 574 paint.setXfermodeMode(SkXfermode::kSrc_Mode); |
| 575 canvas.drawBitmap(*bitmap, 0, 0, &paint); | 575 canvas.drawBitmap(*bitmap, 0, 0, &paint); |
| 576 | 576 |
| 577 *bitmap = uprighted; | 577 *bitmap = uprighted; |
| 578 bitmap->lockPixels(); | 578 bitmap->lockPixels(); |
| 579 return ""; | 579 return ""; |
| 580 } | 580 } |
| 581 | 581 |
| 582 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ | 582 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ |
| 583 | 583 |
| 584 ViaPipe::ViaPipe(Sink* sink) : fSink(sink) {} | |
| 585 | |
| 586 Error ViaPipe::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStrin
g* log) const { | 584 Error ViaPipe::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStrin
g* log) const { |
| 587 auto size = src.size(); | 585 auto size = src.size(); |
| 588 return draw_to_canvas(fSink, bitmap, stream, log, size, [&](SkCanvas* canvas
) { | 586 return draw_to_canvas(fSink, bitmap, stream, log, size, [&](SkCanvas* canvas
) { |
| 589 PipeController controller(canvas, &SkImageDecoder::DecodeMemory); | 587 PipeController controller(canvas, &SkImageDecoder::DecodeMemory); |
| 590 SkGPipeWriter pipe; | 588 SkGPipeWriter pipe; |
| 591 const uint32_t kFlags = 0; // We mirror SkDeferredCanvas, which doesn't
use any flags. | 589 const uint32_t kFlags = 0; // We mirror SkDeferredCanvas, which doesn't
use any flags. |
| 592 return src.draw(pipe.startRecording(&controller, kFlags, size.width(), s
ize.height())); | 590 return src.draw(pipe.startRecording(&controller, kFlags, size.width(), s
ize.height())); |
| 593 }); | 591 }); |
| 594 } | 592 } |
| 595 | 593 |
| 596 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ | 594 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ |
| 597 | 595 |
| 598 ViaDeferred::ViaDeferred(Sink* sink) : fSink(sink) {} | |
| 599 | |
| 600 Error ViaDeferred::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkS
tring* log) const { | 596 Error ViaDeferred::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkS
tring* log) const { |
| 601 // We draw via a deferred canvas into a surface that's compatible with the o
riginal canvas, | 597 // We draw via a deferred canvas into a surface that's compatible with the o
riginal canvas, |
| 602 // then snap that surface as an image and draw it into the original canvas. | 598 // then snap that surface as an image and draw it into the original canvas. |
| 603 return draw_to_canvas(fSink, bitmap, stream, log, src.size(), [&](SkCanvas*
canvas) -> Error { | 599 return draw_to_canvas(fSink, bitmap, stream, log, src.size(), [&](SkCanvas*
canvas) -> Error { |
| 604 SkAutoTUnref<SkSurface> surface(canvas->newSurface(canvas->imageInfo()))
; | 600 SkAutoTUnref<SkSurface> surface(canvas->newSurface(canvas->imageInfo()))
; |
| 605 if (!surface.get()) { | 601 if (!surface.get()) { |
| 606 return "can't make surface for deferred canvas"; | 602 return "can't make surface for deferred canvas"; |
| 607 } | 603 } |
| 608 SkAutoTDelete<SkDeferredCanvas> defcan(SkDeferredCanvas::Create(surface)
); | 604 SkAutoTDelete<SkDeferredCanvas> defcan(SkDeferredCanvas::Create(surface)
); |
| 609 Error err = src.draw(defcan); | 605 Error err = src.draw(defcan); |
| 610 if (!err.isEmpty()) { | 606 if (!err.isEmpty()) { |
| 611 return err; | 607 return err; |
| 612 } | 608 } |
| 613 SkAutoTUnref<SkImage> image(defcan->newImageSnapshot()); | 609 SkAutoTUnref<SkImage> image(defcan->newImageSnapshot()); |
| 614 if (!image) { | 610 if (!image) { |
| 615 return "failed to create deferred image snapshot"; | 611 return "failed to create deferred image snapshot"; |
| 616 } | 612 } |
| 617 canvas->drawImage(image, 0, 0, NULL); | 613 canvas->drawImage(image, 0, 0, NULL); |
| 618 return ""; | 614 return ""; |
| 619 }); | 615 }); |
| 620 } | 616 } |
| 621 | 617 |
| 622 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ | 618 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ |
| 623 | 619 |
| 624 ViaSerialization::ViaSerialization(Sink* sink) : fSink(sink) {} | |
| 625 | |
| 626 Error ViaSerialization::draw( | 620 Error ViaSerialization::draw( |
| 627 const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) cons
t { | 621 const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) cons
t { |
| 628 // Record our Src into a picture. | 622 // Record our Src into a picture. |
| 629 auto size = src.size(); | 623 auto size = src.size(); |
| 630 SkPictureRecorder recorder; | 624 SkPictureRecorder recorder; |
| 631 Error err = src.draw(recorder.beginRecording(SkIntToScalar(size.width()), | 625 Error err = src.draw(recorder.beginRecording(SkIntToScalar(size.width()), |
| 632 SkIntToScalar(size.height()))); | 626 SkIntToScalar(size.height()))); |
| 633 if (!err.isEmpty()) { | 627 if (!err.isEmpty()) { |
| 634 return err; | 628 return err; |
| 635 } | 629 } |
| 636 SkAutoTUnref<SkPicture> pic(recorder.endRecording()); | 630 SkAutoTUnref<SkPicture> pic(recorder.endRecording()); |
| 637 | 631 |
| 638 // Serialize it and then deserialize it. | 632 // Serialize it and then deserialize it. |
| 639 SkDynamicMemoryWStream wStream; | 633 SkDynamicMemoryWStream wStream; |
| 640 pic->serialize(&wStream); | 634 pic->serialize(&wStream); |
| 641 SkAutoTDelete<SkStream> rStream(wStream.detachAsStream()); | 635 SkAutoTDelete<SkStream> rStream(wStream.detachAsStream()); |
| 642 SkAutoTUnref<SkPicture> deserialized(SkPicture::CreateFromStream(rStream, &l
azy_decode_bitmap)); | 636 SkAutoTUnref<SkPicture> deserialized(SkPicture::CreateFromStream(rStream, &l
azy_decode_bitmap)); |
| 643 | 637 |
| 644 return draw_to_canvas(fSink, bitmap, stream, log, size, [&](SkCanvas* canvas
) { | 638 return draw_to_canvas(fSink, bitmap, stream, log, size, [&](SkCanvas* canvas
) { |
| 645 canvas->drawPicture(deserialized); | 639 canvas->drawPicture(deserialized); |
| 646 return ""; | 640 return ""; |
| 647 }); | 641 }); |
| 648 } | 642 } |
| 649 | 643 |
| 650 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ | 644 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ |
| 651 | 645 |
| 652 ViaTiles::ViaTiles(int w, int h, SkBBHFactory* factory, Sink* sink) | 646 ViaTiles::ViaTiles(int w, int h, SkBBHFactory* factory, Sink* sink) |
| 653 : fW(w) | 647 : Via(sink) |
| 648 , fW(w) |
| 654 , fH(h) | 649 , fH(h) |
| 655 , fFactory(factory) | 650 , fFactory(factory) {} |
| 656 , fSink(sink) {} | |
| 657 | 651 |
| 658 Error ViaTiles::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStri
ng* log) const { | 652 Error ViaTiles::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStri
ng* log) const { |
| 659 auto size = src.size(); | 653 auto size = src.size(); |
| 660 SkPictureRecorder recorder; | 654 SkPictureRecorder recorder; |
| 661 Error err = src.draw(recorder.beginRecording(SkIntToScalar(size.width()), | 655 Error err = src.draw(recorder.beginRecording(SkIntToScalar(size.width()), |
| 662 SkIntToScalar(size.height()), | 656 SkIntToScalar(size.height()), |
| 663 fFactory.get())); | 657 fFactory.get())); |
| 664 if (!err.isEmpty()) { | 658 if (!err.isEmpty()) { |
| 665 return err; | 659 return err; |
| 666 } | 660 } |
| (...skipping 29 matching lines...) Expand all Loading... |
| 696 canvas->drawImage(image, SkIntToScalar(i*fW), SkIntToScalar(j*fH
)); | 690 canvas->drawImage(image, SkIntToScalar(i*fW), SkIntToScalar(j*fH
)); |
| 697 } | 691 } |
| 698 } | 692 } |
| 699 surfaces.unrefAll(); | 693 surfaces.unrefAll(); |
| 700 return ""; | 694 return ""; |
| 701 }); | 695 }); |
| 702 } | 696 } |
| 703 | 697 |
| 704 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ | 698 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ |
| 705 | 699 |
| 706 ViaSecondPicture::ViaSecondPicture(Sink* sink) : fSink(sink) {} | |
| 707 | |
| 708 // Draw the Src into two pictures, then draw the second picture into the wrapped
Sink. | 700 // Draw the Src into two pictures, then draw the second picture into the wrapped
Sink. |
| 709 // This tests that any shortcuts we may take while recording that second picture
are legal. | 701 // This tests that any shortcuts we may take while recording that second picture
are legal. |
| 710 Error ViaSecondPicture::draw( | 702 Error ViaSecondPicture::draw( |
| 711 const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) cons
t { | 703 const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) cons
t { |
| 712 auto size = src.size(); | 704 auto size = src.size(); |
| 713 return draw_to_canvas(fSink, bitmap, stream, log, size, [&](SkCanvas* canvas
) -> Error { | 705 return draw_to_canvas(fSink, bitmap, stream, log, size, [&](SkCanvas* canvas
) -> Error { |
| 714 SkPictureRecorder recorder; | 706 SkPictureRecorder recorder; |
| 715 SkAutoTUnref<SkPicture> pic; | 707 SkAutoTUnref<SkPicture> pic; |
| 716 for (int i = 0; i < 2; i++) { | 708 for (int i = 0; i < 2; i++) { |
| 717 Error err = src.draw(recorder.beginRecording(SkIntToScalar(size.widt
h()), | 709 Error err = src.draw(recorder.beginRecording(SkIntToScalar(size.widt
h()), |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 753 fCanvas->drawPicture(pic); | 745 fCanvas->drawPicture(pic); |
| 754 } | 746 } |
| 755 | 747 |
| 756 // If you don't have a paint or are a SaveLayer, you're not a Draw-type op. | 748 // If you don't have a paint or are a SaveLayer, you're not a Draw-type op. |
| 757 // We cannot make subpictures out of these because they affect state. Draw
them directly. | 749 // We cannot make subpictures out of these because they affect state. Draw
them directly. |
| 758 template <typename T> | 750 template <typename T> |
| 759 SK_WHEN(!HasMember_paint<T>, void) operator()(const T& op) { this->draw(op,
fCanvas); } | 751 SK_WHEN(!HasMember_paint<T>, void) operator()(const T& op) { this->draw(op,
fCanvas); } |
| 760 void operator()(const SkRecords::SaveLayer& op) { this->draw(op,
fCanvas); } | 752 void operator()(const SkRecords::SaveLayer& op) { this->draw(op,
fCanvas); } |
| 761 }; | 753 }; |
| 762 | 754 |
| 763 ViaSingletonPictures::ViaSingletonPictures(Sink* sink) : fSink(sink) {} | |
| 764 | |
| 765 // Record Src into a picture, then record it into a macro picture with a sub-pic
ture for each draw. | 755 // Record Src into a picture, then record it into a macro picture with a sub-pic
ture for each draw. |
| 766 // Then play back that macro picture into our wrapped sink. | 756 // Then play back that macro picture into our wrapped sink. |
| 767 Error ViaSingletonPictures::draw( | 757 Error ViaSingletonPictures::draw( |
| 768 const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) cons
t { | 758 const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) cons
t { |
| 769 auto size = src.size(); | 759 auto size = src.size(); |
| 770 return draw_to_canvas(fSink, bitmap, stream, log, size, [&](SkCanvas* canvas
) -> Error { | 760 return draw_to_canvas(fSink, bitmap, stream, log, size, [&](SkCanvas* canvas
) -> Error { |
| 771 // Use low-level (Skia-private) recording APIs so we can read the SkReco
rd. | 761 // Use low-level (Skia-private) recording APIs so we can read the SkReco
rd. |
| 772 SkRecord skr; | 762 SkRecord skr; |
| 773 SkRecorder recorder(&skr, size.width(), size.height()); | 763 SkRecorder recorder(&skr, size.width(), size.height()); |
| 774 Error err = src.draw(&recorder); | 764 Error err = src.draw(&recorder); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 785 skr.visit<void>(i, drawsAsSingletonPictures); | 775 skr.visit<void>(i, drawsAsSingletonPictures); |
| 786 } | 776 } |
| 787 SkAutoTUnref<SkPicture> macroPic(macroRec.endRecordingAsPicture()); | 777 SkAutoTUnref<SkPicture> macroPic(macroRec.endRecordingAsPicture()); |
| 788 | 778 |
| 789 canvas->drawPicture(macroPic); | 779 canvas->drawPicture(macroPic); |
| 790 return ""; | 780 return ""; |
| 791 }); | 781 }); |
| 792 } | 782 } |
| 793 | 783 |
| 794 } // namespace DM | 784 } // namespace DM |
| OLD | NEW |