OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2007 The Android Open Source Project | 2 * Copyright 2007 The Android Open Source Project |
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 | 8 |
9 #include "SkScaledBitmapSampler.h" | 9 #include "SkScaledBitmapSampler.h" |
10 #include "SkBitmap.h" | 10 #include "SkBitmap.h" |
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
336 src += deltaSrc; | 336 src += deltaSrc; |
337 alphaMask &= alpha; | 337 alphaMask &= alpha; |
338 } | 338 } |
339 return alphaMask != 0xFF; | 339 return alphaMask != 0xFF; |
340 } | 340 } |
341 | 341 |
342 static SkScaledBitmapSampler::RowProc | 342 static SkScaledBitmapSampler::RowProc |
343 get_RGBA_to_4444_proc(const SkScaledBitmapSampler::Options& opts) { | 343 get_RGBA_to_4444_proc(const SkScaledBitmapSampler::Options& opts) { |
344 if (!opts.fPremultiplyAlpha) { | 344 if (!opts.fPremultiplyAlpha) { |
345 // Unpremultiplied is not supported for 4444 | 345 // Unpremultiplied is not supported for 4444 |
346 return NULL; | 346 return nullptr; |
347 } | 347 } |
348 if (opts.fSkipZeros) { | 348 if (opts.fSkipZeros) { |
349 if (opts.fDither) { | 349 if (opts.fDither) { |
350 return Sample_RGBA_D4444_D_SkipZ; | 350 return Sample_RGBA_D4444_D_SkipZ; |
351 } | 351 } |
352 return Sample_RGBA_D4444_SkipZ; | 352 return Sample_RGBA_D4444_SkipZ; |
353 } | 353 } |
354 if (opts.fDither) { | 354 if (opts.fDither) { |
355 return Sample_RGBA_D4444_D; | 355 return Sample_RGBA_D4444_D; |
356 } | 356 } |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
508 } | 508 } |
509 src += deltaSrc; | 509 src += deltaSrc; |
510 } | 510 } |
511 return cc != A32_MASK_IN_PLACE; | 511 return cc != A32_MASK_IN_PLACE; |
512 } | 512 } |
513 | 513 |
514 static SkScaledBitmapSampler::RowProc | 514 static SkScaledBitmapSampler::RowProc |
515 get_index_to_4444_proc(const SkScaledBitmapSampler::Options& opts) { | 515 get_index_to_4444_proc(const SkScaledBitmapSampler::Options& opts) { |
516 // Unpremul not allowed | 516 // Unpremul not allowed |
517 if (!opts.fPremultiplyAlpha) { | 517 if (!opts.fPremultiplyAlpha) { |
518 return NULL; | 518 return nullptr; |
519 } | 519 } |
520 if (opts.fSkipZeros) { | 520 if (opts.fSkipZeros) { |
521 if (opts.fDither) { | 521 if (opts.fDither) { |
522 return Sample_Index_D4444_D_SkipZ; | 522 return Sample_Index_D4444_D_SkipZ; |
523 } | 523 } |
524 return Sample_Index_D4444_SkipZ; | 524 return Sample_Index_D4444_SkipZ; |
525 } | 525 } |
526 if (opts.fDither) { | 526 if (opts.fDither) { |
527 return Sample_Index_D4444_D; | 527 return Sample_Index_D4444_D; |
528 } | 528 } |
(...skipping 12 matching lines...) Expand all Loading... |
541 src += deltaSrc; | 541 src += deltaSrc; |
542 } | 542 } |
543 } | 543 } |
544 return false; | 544 return false; |
545 } | 545 } |
546 | 546 |
547 static SkScaledBitmapSampler::RowProc | 547 static SkScaledBitmapSampler::RowProc |
548 get_index_to_index_proc(const SkScaledBitmapSampler::Options& opts) { | 548 get_index_to_index_proc(const SkScaledBitmapSampler::Options& opts) { |
549 // Unpremul not allowed | 549 // Unpremul not allowed |
550 if (!opts.fPremultiplyAlpha) { | 550 if (!opts.fPremultiplyAlpha) { |
551 return NULL; | 551 return nullptr; |
552 } | 552 } |
553 // Ignore dither and skip zeroes | 553 // Ignore dither and skip zeroes |
554 return Sample_Index_DI; | 554 return Sample_Index_DI; |
555 } | 555 } |
556 | 556 |
557 // A8 | 557 // A8 |
558 static bool Sample_Gray_DA8(void* SK_RESTRICT dstRow, | 558 static bool Sample_Gray_DA8(void* SK_RESTRICT dstRow, |
559 const uint8_t* SK_RESTRICT src, | 559 const uint8_t* SK_RESTRICT src, |
560 int width, int deltaSrc, int, | 560 int width, int deltaSrc, int, |
561 const SkPMColor[]) { | 561 const SkPMColor[]) { |
562 // Sampling Gray to A8 uses the same function as Index to Index8, | 562 // Sampling Gray to A8 uses the same function as Index to Index8, |
563 // except we assume that there is alpha for speed, since an A8 | 563 // except we assume that there is alpha for speed, since an A8 |
564 // bitmap with no alpha is not interesting. | 564 // bitmap with no alpha is not interesting. |
565 (void) Sample_Index_DI(dstRow, src, width, deltaSrc, /* y unused */ 0, | 565 (void) Sample_Index_DI(dstRow, src, width, deltaSrc, /* y unused */ 0, |
566 /* ctable unused */ NULL); | 566 /* ctable unused */ nullptr); |
567 return true; | 567 return true; |
568 } | 568 } |
569 | 569 |
570 static SkScaledBitmapSampler::RowProc | 570 static SkScaledBitmapSampler::RowProc |
571 get_gray_to_A8_proc(const SkScaledBitmapSampler::Options& opts) { | 571 get_gray_to_A8_proc(const SkScaledBitmapSampler::Options& opts) { |
572 if (!opts.fPremultiplyAlpha) { | 572 if (!opts.fPremultiplyAlpha) { |
573 return NULL; | 573 return nullptr; |
574 } | 574 } |
575 // Ignore skip and dither. | 575 // Ignore skip and dither. |
576 return Sample_Gray_DA8; | 576 return Sample_Gray_DA8; |
577 } | 577 } |
578 | 578 |
579 typedef SkScaledBitmapSampler::RowProc (*RowProcChooser)(const SkScaledBitmapSam
pler::Options&); | 579 typedef SkScaledBitmapSampler::RowProc (*RowProcChooser)(const SkScaledBitmapSam
pler::Options&); |
580 /////////////////////////////////////////////////////////////////////////////// | 580 /////////////////////////////////////////////////////////////////////////////// |
581 | 581 |
582 #include "SkScaledBitmapSampler.h" | 582 #include "SkScaledBitmapSampler.h" |
583 | 583 |
584 SkScaledBitmapSampler::SkScaledBitmapSampler(int width, int height, | 584 SkScaledBitmapSampler::SkScaledBitmapSampler(int width, int height, |
585 int sampleSize) { | 585 int sampleSize) { |
586 fCTable = NULL; | 586 fCTable = nullptr; |
587 fDstRow = NULL; | 587 fDstRow = nullptr; |
588 fRowProc = NULL; | 588 fRowProc = nullptr; |
589 | 589 |
590 if (width <= 0 || height <= 0) { | 590 if (width <= 0 || height <= 0) { |
591 sk_throw(); | 591 sk_throw(); |
592 } | 592 } |
593 | 593 |
594 SkDEBUGCODE(fSampleMode = kUninitialized_SampleMode); | 594 SkDEBUGCODE(fSampleMode = kUninitialized_SampleMode); |
595 | 595 |
596 if (sampleSize <= 1) { | 596 if (sampleSize <= 1) { |
597 fScaledWidth = width; | 597 fScaledWidth = width; |
598 fScaledHeight = height; | 598 fScaledHeight = height; |
(...skipping 25 matching lines...) Expand all Loading... |
624 } | 624 } |
625 | 625 |
626 bool SkScaledBitmapSampler::begin(SkBitmap* dst, SrcConfig sc, | 626 bool SkScaledBitmapSampler::begin(SkBitmap* dst, SrcConfig sc, |
627 const Options& opts, | 627 const Options& opts, |
628 const SkPMColor ctable[]) { | 628 const SkPMColor ctable[]) { |
629 static const RowProcChooser gProcChoosers[] = { | 629 static const RowProcChooser gProcChoosers[] = { |
630 get_gray_to_8888_proc, | 630 get_gray_to_8888_proc, |
631 get_RGBx_to_8888_proc, | 631 get_RGBx_to_8888_proc, |
632 get_RGBA_to_8888_proc, | 632 get_RGBA_to_8888_proc, |
633 get_index_to_8888_proc, | 633 get_index_to_8888_proc, |
634 NULL, // 565 to 8888 | 634 nullptr, // 565 to 8888 |
635 | 635 |
636 get_gray_to_565_proc, | 636 get_gray_to_565_proc, |
637 get_RGBx_to_565_proc, | 637 get_RGBx_to_565_proc, |
638 get_RGBx_to_565_proc, // The source alpha will be ignored. | 638 get_RGBx_to_565_proc, // The source alpha will be ignored. |
639 get_index_to_565_proc, | 639 get_index_to_565_proc, |
640 get_565_to_565_proc, | 640 get_565_to_565_proc, |
641 | 641 |
642 get_gray_to_4444_proc, | 642 get_gray_to_4444_proc, |
643 get_RGBx_to_4444_proc, | 643 get_RGBx_to_4444_proc, |
644 get_RGBA_to_4444_proc, | 644 get_RGBA_to_4444_proc, |
645 get_index_to_4444_proc, | 645 get_index_to_4444_proc, |
646 NULL, // 565 to 4444 | 646 nullptr, // 565 to 4444 |
647 | 647 |
648 NULL, // gray to index | 648 nullptr, // gray to index |
649 NULL, // rgbx to index | 649 nullptr, // rgbx to index |
650 NULL, // rgba to index | 650 nullptr, // rgba to index |
651 get_index_to_index_proc, | 651 get_index_to_index_proc, |
652 NULL, // 565 to index | 652 nullptr, // 565 to index |
653 | 653 |
654 get_gray_to_A8_proc, | 654 get_gray_to_A8_proc, |
655 NULL, // rgbx to a8 | 655 nullptr, // rgbx to a8 |
656 NULL, // rgba to a8 | 656 nullptr, // rgba to a8 |
657 NULL, // index to a8 | 657 nullptr, // index to a8 |
658 NULL, // 565 to a8 | 658 nullptr, // 565 to a8 |
659 }; | 659 }; |
660 | 660 |
661 // The jump between dst configs in the table | 661 // The jump between dst configs in the table |
662 static const int gProcDstConfigSpan = 5; | 662 static const int gProcDstConfigSpan = 5; |
663 static_assert(SK_ARRAY_COUNT(gProcChoosers) == 5 * gProcDstConfigSpan, | 663 static_assert(SK_ARRAY_COUNT(gProcChoosers) == 5 * gProcDstConfigSpan, |
664 "gProcs_has_the_wrong_number_of_entries"); | 664 "gProcs_has_the_wrong_number_of_entries"); |
665 | 665 |
666 fCTable = ctable; | 666 fCTable = ctable; |
667 | 667 |
668 int index = 0; | 668 int index = 0; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
709 index += 3 * gProcDstConfigSpan; | 709 index += 3 * gProcDstConfigSpan; |
710 break; | 710 break; |
711 case kAlpha_8_SkColorType: | 711 case kAlpha_8_SkColorType: |
712 index += 4 * gProcDstConfigSpan; | 712 index += 4 * gProcDstConfigSpan; |
713 break; | 713 break; |
714 default: | 714 default: |
715 return false; | 715 return false; |
716 } | 716 } |
717 | 717 |
718 RowProcChooser chooser = gProcChoosers[index]; | 718 RowProcChooser chooser = gProcChoosers[index]; |
719 if (NULL == chooser) { | 719 if (nullptr == chooser) { |
720 fRowProc = NULL; | 720 fRowProc = nullptr; |
721 } else { | 721 } else { |
722 fRowProc = chooser(opts); | 722 fRowProc = chooser(opts); |
723 } | 723 } |
724 fDstRow = (char*)dst->getPixels(); | 724 fDstRow = (char*)dst->getPixels(); |
725 fDstRowBytes = dst->rowBytes(); | 725 fDstRowBytes = dst->rowBytes(); |
726 fCurrY = 0; | 726 fCurrY = 0; |
727 return fRowProc != NULL; | 727 return fRowProc != nullptr; |
728 } | 728 } |
729 | 729 |
730 bool SkScaledBitmapSampler::begin(SkBitmap* dst, SrcConfig sc, | 730 bool SkScaledBitmapSampler::begin(SkBitmap* dst, SrcConfig sc, |
731 const SkImageDecoder& decoder, | 731 const SkImageDecoder& decoder, |
732 const SkPMColor ctable[]) { | 732 const SkPMColor ctable[]) { |
733 return this->begin(dst, sc, Options(decoder), ctable); | 733 return this->begin(dst, sc, Options(decoder), ctable); |
734 } | 734 } |
735 | 735 |
736 bool SkScaledBitmapSampler::next(const uint8_t* SK_RESTRICT src) { | 736 bool SkScaledBitmapSampler::next(const uint8_t* SK_RESTRICT src) { |
737 SkASSERT(kInterlaced_SampleMode != fSampleMode); | 737 SkASSERT(kInterlaced_SampleMode != fSampleMode); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
787 // Table formated as follows: | 787 // Table formated as follows: |
788 // Each group of 5 consecutive rows represents sampling from a single | 788 // Each group of 5 consecutive rows represents sampling from a single |
789 // SkScaledBitmapSampler::SrcConfig. | 789 // SkScaledBitmapSampler::SrcConfig. |
790 // Within each set, each row represents a different destination SkBitmap::Config | 790 // Within each set, each row represents a different destination SkBitmap::Config |
791 // Each column represents a different combination of dither and unpremul. | 791 // Each column represents a different combination of dither and unpremul. |
792 // D = dither ~D = no dither | 792 // D = dither ~D = no dither |
793 // U = unpremul ~U = no unpremul | 793 // U = unpremul ~U = no unpremul |
794 // ~D~U D~U ~DU DU | 794 // ~D~U D~U ~DU DU |
795 SkScaledBitmapSampler::RowProc gTestProcs[] = { | 795 SkScaledBitmapSampler::RowProc gTestProcs[] = { |
796 // Gray | 796 // Gray |
797 Sample_Gray_DA8, Sample_Gray_DA8, NULL, NULL
, // to A8 | 797 Sample_Gray_DA8, Sample_Gray_DA8, nullptr, n
ullptr, // to A8 |
798 NULL, NULL, NULL, NULL
, // to Index8 | 798 nullptr, nullptr, nullptr,
nullptr, // to Index8 |
799 Sample_Gray_D565, Sample_Gray_D565_D, Sample_Gray_D565, Samp
le_Gray_D565_D, // to 565 | 799 Sample_Gray_D565, Sample_Gray_D565_D, Sample_Gray_D565, Samp
le_Gray_D565_D, // to 565 |
800 Sample_Gray_D4444, Sample_Gray_D4444_D, Sample_Gray_D4444, Samp
le_Gray_D4444_D, // to 4444 | 800 Sample_Gray_D4444, Sample_Gray_D4444_D, Sample_Gray_D4444, Samp
le_Gray_D4444_D, // to 4444 |
801 Sample_Gray_D8888, Sample_Gray_D8888, Sample_Gray_D8888, Samp
le_Gray_D8888, // to 8888 | 801 Sample_Gray_D8888, Sample_Gray_D8888, Sample_Gray_D8888, Samp
le_Gray_D8888, // to 8888 |
802 // Index | 802 // Index |
803 NULL, NULL, NULL, NULL
, // to A8 | 803 nullptr, nullptr, nullptr,
nullptr, // to A8 |
804 Sample_Index_DI, Sample_Index_DI, NULL, NULL
, // to Index8 | 804 Sample_Index_DI, Sample_Index_DI, nullptr, n
ullptr, // to Index8 |
805 Sample_Index_D565, Sample_Index_D565_D, Sample_Index_D565, Samp
le_Index_D565_D, // to 565 | 805 Sample_Index_D565, Sample_Index_D565_D, Sample_Index_D565, Samp
le_Index_D565_D, // to 565 |
806 Sample_Index_D4444, Sample_Index_D4444_D, NULL, NULL
, // to 4444 | 806 Sample_Index_D4444, Sample_Index_D4444_D, nullptr, n
ullptr, // to 4444 |
807 Sample_Index_D8888, Sample_Index_D8888, Sample_Index_D8888, Samp
le_Index_D8888, // to 8888 | 807 Sample_Index_D8888, Sample_Index_D8888, Sample_Index_D8888, Samp
le_Index_D8888, // to 8888 |
808 // RGB | 808 // RGB |
809 NULL, NULL, NULL, NULL
, // to A8 | 809 nullptr, nullptr, nullptr,
nullptr, // to A8 |
810 NULL, NULL, NULL, NULL
, // to Index8 | 810 nullptr, nullptr, nullptr,
nullptr, // to Index8 |
811 Sample_RGBx_D565, Sample_RGBx_D565_D, Sample_RGBx_D565, Samp
le_RGBx_D565_D, // to 565 | 811 Sample_RGBx_D565, Sample_RGBx_D565_D, Sample_RGBx_D565, Samp
le_RGBx_D565_D, // to 565 |
812 Sample_RGBx_D4444, Sample_RGBx_D4444_D, Sample_RGBx_D4444, Samp
le_RGBx_D4444_D, // to 4444 | 812 Sample_RGBx_D4444, Sample_RGBx_D4444_D, Sample_RGBx_D4444, Samp
le_RGBx_D4444_D, // to 4444 |
813 Sample_RGBx_D8888, Sample_RGBx_D8888, Sample_RGBx_D8888, Samp
le_RGBx_D8888, // to 8888 | 813 Sample_RGBx_D8888, Sample_RGBx_D8888, Sample_RGBx_D8888, Samp
le_RGBx_D8888, // to 8888 |
814 // RGBx is the same as RGB | 814 // RGBx is the same as RGB |
815 NULL, NULL, NULL, NULL
, // to A8 | 815 nullptr, nullptr, nullptr,
nullptr, // to A8 |
816 NULL, NULL, NULL, NULL
, // to Index8 | 816 nullptr, nullptr, nullptr,
nullptr, // to Index8 |
817 Sample_RGBx_D565, Sample_RGBx_D565_D, Sample_RGBx_D565, Samp
le_RGBx_D565_D, // to 565 | 817 Sample_RGBx_D565, Sample_RGBx_D565_D, Sample_RGBx_D565, Samp
le_RGBx_D565_D, // to 565 |
818 Sample_RGBx_D4444, Sample_RGBx_D4444_D, Sample_RGBx_D4444, Samp
le_RGBx_D4444_D, // to 4444 | 818 Sample_RGBx_D4444, Sample_RGBx_D4444_D, Sample_RGBx_D4444, Samp
le_RGBx_D4444_D, // to 4444 |
819 Sample_RGBx_D8888, Sample_RGBx_D8888, Sample_RGBx_D8888, Samp
le_RGBx_D8888, // to 8888 | 819 Sample_RGBx_D8888, Sample_RGBx_D8888, Sample_RGBx_D8888, Samp
le_RGBx_D8888, // to 8888 |
820 // RGBA | 820 // RGBA |
821 NULL, NULL, NULL, NULL
, // to A8 | 821 nullptr, nullptr, nullptr,
nullptr, // to A8 |
822 NULL, NULL, NULL, NULL
, // to Index8 | 822 nullptr, nullptr, nullptr,
nullptr, // to Index8 |
823 Sample_RGBx_D565, Sample_RGBx_D565_D, Sample_RGBx_D565, Samp
le_RGBx_D565_D, // to 565 | 823 Sample_RGBx_D565, Sample_RGBx_D565_D, Sample_RGBx_D565, Samp
le_RGBx_D565_D, // to 565 |
824 Sample_RGBA_D4444, Sample_RGBA_D4444_D, NULL, NULL
, // to 4444 | 824 Sample_RGBA_D4444, Sample_RGBA_D4444_D, nullptr, n
ullptr, // to 4444 |
825 Sample_RGBA_D8888, Sample_RGBA_D8888, Sample_RGBA_D8888_Unpremul, Samp
le_RGBA_D8888_Unpremul, // to 8888 | 825 Sample_RGBA_D8888, Sample_RGBA_D8888, Sample_RGBA_D8888_Unpremul, Samp
le_RGBA_D8888_Unpremul, // to 8888 |
826 // RGB_565 | 826 // RGB_565 |
827 NULL, NULL, NULL, NULL
, // to A8 | 827 nullptr, nullptr, nullptr,
nullptr, // to A8 |
828 NULL, NULL, NULL, NULL
, // to Index8 | 828 nullptr, nullptr, nullptr,
nullptr, // to Index8 |
829 Sample_D565_D565, Sample_D565_D565, Sample_D565_D565, Samp
le_D565_D565, // to 565 | 829 Sample_D565_D565, Sample_D565_D565, Sample_D565_D565, Samp
le_D565_D565, // to 565 |
830 NULL, NULL, NULL, NULL
, // to 4444 | 830 nullptr, nullptr, nullptr,
nullptr, // to 4444 |
831 NULL, NULL, NULL, NULL
, // to 8888 | 831 nullptr, nullptr, nullptr,
nullptr, // to 8888 |
832 }; | 832 }; |
833 | 833 |
834 // Dummy class that allows instantiation of an ImageDecoder, so begin can query
its fields. | 834 // Dummy class that allows instantiation of an ImageDecoder, so begin can query
its fields. |
835 class DummyDecoder : public SkImageDecoder { | 835 class DummyDecoder : public SkImageDecoder { |
836 public: | 836 public: |
837 DummyDecoder() {} | 837 DummyDecoder() {} |
838 protected: | 838 protected: |
839 Result onDecode(SkStream*, SkBitmap*, SkImageDecoder::Mode) override { | 839 Result onDecode(SkStream*, SkBitmap*, SkImageDecoder::Mode) override { |
840 return kFailure; | 840 return kFailure; |
841 } | 841 } |
(...skipping 26 matching lines...) Expand all Loading... |
868 SkScaledBitmapSampler::RowProc actual = RowProcTester::getRo
wProc(sampler); | 868 SkScaledBitmapSampler::RowProc actual = RowProcTester::getRo
wProc(sampler); |
869 SkASSERT(expected == actual); | 869 SkASSERT(expected == actual); |
870 procCounter++; | 870 procCounter++; |
871 } | 871 } |
872 } | 872 } |
873 } | 873 } |
874 } | 874 } |
875 SkASSERT(SK_ARRAY_COUNT(gTestProcs) == procCounter); | 875 SkASSERT(SK_ARRAY_COUNT(gTestProcs) == procCounter); |
876 } | 876 } |
877 #endif // SK_DEBUG | 877 #endif // SK_DEBUG |
OLD | NEW |