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 |