Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1068)

Side by Side Diff: dm/DMSrcSink.cpp

Issue 1117183007: DM: add Via abstract class (Closed) Base URL: https://skia.googlesource.com/skia@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « dm/DMSrcSink.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « dm/DMSrcSink.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698