OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #include "SkBlitRow.h" | 10 #include "SkBlitRow.h" |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
100 virtual void blitAntiH(int x, int y, const SkAlpha* antialias, | 100 virtual void blitAntiH(int x, int y, const SkAlpha* antialias, |
101 const int16_t* runs); | 101 const int16_t* runs); |
102 | 102 |
103 private: | 103 private: |
104 typedef SkRGB16_Opaque_Blitter INHERITED; | 104 typedef SkRGB16_Opaque_Blitter INHERITED; |
105 }; | 105 }; |
106 #endif | 106 #endif |
107 | 107 |
108 class SkRGB16_Shader_Blitter : public SkShaderBlitter { | 108 class SkRGB16_Shader_Blitter : public SkShaderBlitter { |
109 public: | 109 public: |
110 SkRGB16_Shader_Blitter(const SkBitmap& device, const SkPaint& paint, | 110 SkRGB16_Shader_Blitter(const SkBitmap& device, const SkPaint& paint); |
111 SkShader::Context* shaderContext); | |
112 virtual ~SkRGB16_Shader_Blitter(); | 111 virtual ~SkRGB16_Shader_Blitter(); |
113 virtual void blitH(int x, int y, int width); | 112 virtual void blitH(int x, int y, int width); |
114 virtual void blitAntiH(int x, int y, const SkAlpha* antialias, | 113 virtual void blitAntiH(int x, int y, const SkAlpha* antialias, |
115 const int16_t* runs); | 114 const int16_t* runs); |
116 virtual void blitRect(int x, int y, int width, int height); | 115 virtual void blitRect(int x, int y, int width, int height); |
117 | 116 |
118 protected: | 117 protected: |
119 SkPMColor* fBuffer; | 118 SkPMColor* fBuffer; |
120 SkBlitRow::Proc fOpaqueProc; | 119 SkBlitRow::Proc fOpaqueProc; |
121 SkBlitRow::Proc fAlphaProc; | 120 SkBlitRow::Proc fAlphaProc; |
122 | 121 |
123 private: | 122 private: |
124 // illegal | 123 // illegal |
125 SkRGB16_Shader_Blitter& operator=(const SkRGB16_Shader_Blitter&); | 124 SkRGB16_Shader_Blitter& operator=(const SkRGB16_Shader_Blitter&); |
126 | 125 |
127 typedef SkShaderBlitter INHERITED; | 126 typedef SkShaderBlitter INHERITED; |
128 }; | 127 }; |
129 | 128 |
130 // used only if the shader can perform shadSpan16 | 129 // used only if the shader can perform shadSpan16 |
131 class SkRGB16_Shader16_Blitter : public SkRGB16_Shader_Blitter { | 130 class SkRGB16_Shader16_Blitter : public SkRGB16_Shader_Blitter { |
132 public: | 131 public: |
133 SkRGB16_Shader16_Blitter(const SkBitmap& device, const SkPaint& paint, | 132 SkRGB16_Shader16_Blitter(const SkBitmap& device, const SkPaint& paint); |
134 SkShader::Context* shaderContext); | |
135 virtual void blitH(int x, int y, int width); | 133 virtual void blitH(int x, int y, int width); |
136 virtual void blitAntiH(int x, int y, const SkAlpha* antialias, | 134 virtual void blitAntiH(int x, int y, const SkAlpha* antialias, |
137 const int16_t* runs); | 135 const int16_t* runs); |
138 virtual void blitRect(int x, int y, int width, int height); | 136 virtual void blitRect(int x, int y, int width, int height); |
139 | 137 |
140 private: | 138 private: |
141 typedef SkRGB16_Shader_Blitter INHERITED; | 139 typedef SkRGB16_Shader_Blitter INHERITED; |
142 }; | 140 }; |
143 | 141 |
144 class SkRGB16_Shader_Xfermode_Blitter : public SkShaderBlitter { | 142 class SkRGB16_Shader_Xfermode_Blitter : public SkShaderBlitter { |
145 public: | 143 public: |
146 SkRGB16_Shader_Xfermode_Blitter(const SkBitmap& device, const SkPaint& paint
, | 144 SkRGB16_Shader_Xfermode_Blitter(const SkBitmap& device, const SkPaint& paint
); |
147 SkShader::Context* shaderContext); | |
148 virtual ~SkRGB16_Shader_Xfermode_Blitter(); | 145 virtual ~SkRGB16_Shader_Xfermode_Blitter(); |
149 virtual void blitH(int x, int y, int width); | 146 virtual void blitH(int x, int y, int width); |
150 virtual void blitAntiH(int x, int y, const SkAlpha* antialias, | 147 virtual void blitAntiH(int x, int y, const SkAlpha* antialias, |
151 const int16_t* runs); | 148 const int16_t* runs); |
152 | 149 |
153 private: | 150 private: |
154 SkXfermode* fXfermode; | 151 SkXfermode* fXfermode; |
155 SkPMColor* fBuffer; | 152 SkPMColor* fBuffer; |
156 uint8_t* fAAExpand; | 153 uint8_t* fAAExpand; |
157 | 154 |
(...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
675 | 672 |
676 while (--height >= 0) { | 673 while (--height >= 0) { |
677 blend32_16_row(src32, device, width); | 674 blend32_16_row(src32, device, width); |
678 device = (uint16_t*)((char*)device + deviceRB); | 675 device = (uint16_t*)((char*)device + deviceRB); |
679 } | 676 } |
680 } | 677 } |
681 | 678 |
682 /////////////////////////////////////////////////////////////////////////////// | 679 /////////////////////////////////////////////////////////////////////////////// |
683 | 680 |
684 SkRGB16_Shader16_Blitter::SkRGB16_Shader16_Blitter(const SkBitmap& device, | 681 SkRGB16_Shader16_Blitter::SkRGB16_Shader16_Blitter(const SkBitmap& device, |
685 const SkPaint& paint, | 682 const SkPaint& paint) |
686 SkShader::Context* shaderCont
ext) | 683 : SkRGB16_Shader_Blitter(device, paint) { |
687 : SkRGB16_Shader_Blitter(device, paint, shaderContext) { | |
688 SkASSERT(SkShader::CanCallShadeSpan16(fShaderFlags)); | 684 SkASSERT(SkShader::CanCallShadeSpan16(fShaderFlags)); |
689 } | 685 } |
690 | 686 |
691 void SkRGB16_Shader16_Blitter::blitH(int x, int y, int width) { | 687 void SkRGB16_Shader16_Blitter::blitH(int x, int y, int width) { |
692 SkASSERT(x + width <= fDevice.width()); | 688 SkASSERT(x + width <= fDevice.width()); |
693 | 689 |
694 uint16_t* SK_RESTRICT device = fDevice.getAddr16(x, y); | 690 uint16_t* SK_RESTRICT device = fDevice.getAddr16(x, y); |
695 SkShader::Context* shaderContext = fShaderContext; | 691 SkShader* shader = fShader; |
696 | 692 |
697 int alpha = shaderContext->getSpan16Alpha(); | 693 int alpha = shader->getSpan16Alpha(); |
698 if (0xFF == alpha) { | 694 if (0xFF == alpha) { |
699 shaderContext->shadeSpan16(x, y, device, width); | 695 shader->shadeSpan16(x, y, device, width); |
700 } else { | 696 } else { |
701 uint16_t* span16 = (uint16_t*)fBuffer; | 697 uint16_t* span16 = (uint16_t*)fBuffer; |
702 shaderContext->shadeSpan16(x, y, span16, width); | 698 shader->shadeSpan16(x, y, span16, width); |
703 SkBlendRGB16(span16, device, SkAlpha255To256(alpha), width); | 699 SkBlendRGB16(span16, device, SkAlpha255To256(alpha), width); |
704 } | 700 } |
705 } | 701 } |
706 | 702 |
707 void SkRGB16_Shader16_Blitter::blitRect(int x, int y, int width, int height) { | 703 void SkRGB16_Shader16_Blitter::blitRect(int x, int y, int width, int height) { |
708 SkShader::Context* shaderContext = fShaderContext; | 704 SkShader* shader = fShader; |
709 uint16_t* dst = fDevice.getAddr16(x, y); | 705 uint16_t* dst = fDevice.getAddr16(x, y); |
710 size_t dstRB = fDevice.rowBytes(); | 706 size_t dstRB = fDevice.rowBytes(); |
711 int alpha = shaderContext->getSpan16Alpha(); | 707 int alpha = shader->getSpan16Alpha(); |
712 | 708 |
713 if (0xFF == alpha) { | 709 if (0xFF == alpha) { |
714 if (fShaderFlags & SkShader::kConstInY16_Flag) { | 710 if (fShaderFlags & SkShader::kConstInY16_Flag) { |
715 // have the shader blit directly into the device the first time | 711 // have the shader blit directly into the device the first time |
716 shaderContext->shadeSpan16(x, y, dst, width); | 712 shader->shadeSpan16(x, y, dst, width); |
717 // and now just memcpy that line on the subsequent lines | 713 // and now just memcpy that line on the subsequent lines |
718 if (--height > 0) { | 714 if (--height > 0) { |
719 const uint16_t* orig = dst; | 715 const uint16_t* orig = dst; |
720 do { | 716 do { |
721 dst = (uint16_t*)((char*)dst + dstRB); | 717 dst = (uint16_t*)((char*)dst + dstRB); |
722 memcpy(dst, orig, width << 1); | 718 memcpy(dst, orig, width << 1); |
723 } while (--height); | 719 } while (--height); |
724 } | 720 } |
725 } else { // need to call shadeSpan16 for every line | 721 } else { // need to call shadeSpan16 for every line |
726 do { | 722 do { |
727 shaderContext->shadeSpan16(x, y, dst, width); | 723 shader->shadeSpan16(x, y, dst, width); |
728 y += 1; | 724 y += 1; |
729 dst = (uint16_t*)((char*)dst + dstRB); | 725 dst = (uint16_t*)((char*)dst + dstRB); |
730 } while (--height); | 726 } while (--height); |
731 } | 727 } |
732 } else { | 728 } else { |
733 int scale = SkAlpha255To256(alpha); | 729 int scale = SkAlpha255To256(alpha); |
734 uint16_t* span16 = (uint16_t*)fBuffer; | 730 uint16_t* span16 = (uint16_t*)fBuffer; |
735 if (fShaderFlags & SkShader::kConstInY16_Flag) { | 731 if (fShaderFlags & SkShader::kConstInY16_Flag) { |
736 shaderContext->shadeSpan16(x, y, span16, width); | 732 shader->shadeSpan16(x, y, span16, width); |
737 do { | 733 do { |
738 SkBlendRGB16(span16, dst, scale, width); | 734 SkBlendRGB16(span16, dst, scale, width); |
739 dst = (uint16_t*)((char*)dst + dstRB); | 735 dst = (uint16_t*)((char*)dst + dstRB); |
740 } while (--height); | 736 } while (--height); |
741 } else { | 737 } else { |
742 do { | 738 do { |
743 shaderContext->shadeSpan16(x, y, span16, width); | 739 shader->shadeSpan16(x, y, span16, width); |
744 SkBlendRGB16(span16, dst, scale, width); | 740 SkBlendRGB16(span16, dst, scale, width); |
745 y += 1; | 741 y += 1; |
746 dst = (uint16_t*)((char*)dst + dstRB); | 742 dst = (uint16_t*)((char*)dst + dstRB); |
747 } while (--height); | 743 } while (--height); |
748 } | 744 } |
749 } | 745 } |
750 } | 746 } |
751 | 747 |
752 void SkRGB16_Shader16_Blitter::blitAntiH(int x, int y, | 748 void SkRGB16_Shader16_Blitter::blitAntiH(int x, int y, |
753 const SkAlpha* SK_RESTRICT antialias, | 749 const SkAlpha* SK_RESTRICT antialias, |
754 const int16_t* SK_RESTRICT runs) { | 750 const int16_t* SK_RESTRICT runs) { |
755 SkShader::Context* shaderContext = fShaderContext; | 751 SkShader* shader = fShader; |
756 SkPMColor* SK_RESTRICT span = fBuffer; | 752 SkPMColor* SK_RESTRICT span = fBuffer; |
757 uint16_t* SK_RESTRICT device = fDevice.getAddr16(x, y); | 753 uint16_t* SK_RESTRICT device = fDevice.getAddr16(x, y); |
758 | 754 |
759 int alpha = shaderContext->getSpan16Alpha(); | 755 int alpha = shader->getSpan16Alpha(); |
760 uint16_t* span16 = (uint16_t*)span; | 756 uint16_t* span16 = (uint16_t*)span; |
761 | 757 |
762 if (0xFF == alpha) { | 758 if (0xFF == alpha) { |
763 for (;;) { | 759 for (;;) { |
764 int count = *runs; | 760 int count = *runs; |
765 if (count <= 0) { | 761 if (count <= 0) { |
766 break; | 762 break; |
767 } | 763 } |
768 SkASSERT(count <= fDevice.width()); // don't overrun fBuffer | 764 SkASSERT(count <= fDevice.width()); // don't overrun fBuffer |
769 | 765 |
770 int aa = *antialias; | 766 int aa = *antialias; |
771 if (aa == 255) { | 767 if (aa == 255) { |
772 // go direct to the device! | 768 // go direct to the device! |
773 shaderContext->shadeSpan16(x, y, device, count); | 769 shader->shadeSpan16(x, y, device, count); |
774 } else if (aa) { | 770 } else if (aa) { |
775 shaderContext->shadeSpan16(x, y, span16, count); | 771 shader->shadeSpan16(x, y, span16, count); |
776 SkBlendRGB16(span16, device, SkAlpha255To256(aa), count); | 772 SkBlendRGB16(span16, device, SkAlpha255To256(aa), count); |
777 } | 773 } |
778 device += count; | 774 device += count; |
779 runs += count; | 775 runs += count; |
780 antialias += count; | 776 antialias += count; |
781 x += count; | 777 x += count; |
782 } | 778 } |
783 } else { // span alpha is < 255 | 779 } else { // span alpha is < 255 |
784 alpha = SkAlpha255To256(alpha); | 780 alpha = SkAlpha255To256(alpha); |
785 for (;;) { | 781 for (;;) { |
786 int count = *runs; | 782 int count = *runs; |
787 if (count <= 0) { | 783 if (count <= 0) { |
788 break; | 784 break; |
789 } | 785 } |
790 SkASSERT(count <= fDevice.width()); // don't overrun fBuffer | 786 SkASSERT(count <= fDevice.width()); // don't overrun fBuffer |
791 | 787 |
792 int aa = SkAlphaMul(*antialias, alpha); | 788 int aa = SkAlphaMul(*antialias, alpha); |
793 if (aa) { | 789 if (aa) { |
794 shaderContext->shadeSpan16(x, y, span16, count); | 790 shader->shadeSpan16(x, y, span16, count); |
795 SkBlendRGB16(span16, device, SkAlpha255To256(aa), count); | 791 SkBlendRGB16(span16, device, SkAlpha255To256(aa), count); |
796 } | 792 } |
797 | 793 |
798 device += count; | 794 device += count; |
799 runs += count; | 795 runs += count; |
800 antialias += count; | 796 antialias += count; |
801 x += count; | 797 x += count; |
802 } | 798 } |
803 } | 799 } |
804 } | 800 } |
805 | 801 |
806 /////////////////////////////////////////////////////////////////////////////// | 802 /////////////////////////////////////////////////////////////////////////////// |
807 | 803 |
808 SkRGB16_Shader_Blitter::SkRGB16_Shader_Blitter(const SkBitmap& device, | 804 SkRGB16_Shader_Blitter::SkRGB16_Shader_Blitter(const SkBitmap& device, |
809 const SkPaint& paint, | 805 const SkPaint& paint) |
810 SkShader::Context* shaderContext) | 806 : INHERITED(device, paint) { |
811 : INHERITED(device, paint, shaderContext) { | |
812 SkASSERT(paint.getXfermode() == NULL); | 807 SkASSERT(paint.getXfermode() == NULL); |
813 | 808 |
814 fBuffer = (SkPMColor*)sk_malloc_throw(device.width() * sizeof(SkPMColor)); | 809 fBuffer = (SkPMColor*)sk_malloc_throw(device.width() * sizeof(SkPMColor)); |
815 | 810 |
816 // compute SkBlitRow::Procs | 811 // compute SkBlitRow::Procs |
817 unsigned flags = 0; | 812 unsigned flags = 0; |
818 | 813 |
819 uint32_t shaderFlags = fShaderFlags; | 814 uint32_t shaderFlags = fShaderFlags; |
820 // shaders take care of global alpha, so we never set it in SkBlitRow | 815 // shaders take care of global alpha, so we never set it in SkBlitRow |
821 if (!(shaderFlags & SkShader::kOpaqueAlpha_Flag)) { | 816 if (!(shaderFlags & SkShader::kOpaqueAlpha_Flag)) { |
(...skipping 10 matching lines...) Expand all Loading... |
832 SkBitmap::kRGB_565_Config); | 827 SkBitmap::kRGB_565_Config); |
833 } | 828 } |
834 | 829 |
835 SkRGB16_Shader_Blitter::~SkRGB16_Shader_Blitter() { | 830 SkRGB16_Shader_Blitter::~SkRGB16_Shader_Blitter() { |
836 sk_free(fBuffer); | 831 sk_free(fBuffer); |
837 } | 832 } |
838 | 833 |
839 void SkRGB16_Shader_Blitter::blitH(int x, int y, int width) { | 834 void SkRGB16_Shader_Blitter::blitH(int x, int y, int width) { |
840 SkASSERT(x + width <= fDevice.width()); | 835 SkASSERT(x + width <= fDevice.width()); |
841 | 836 |
842 fShaderContext->shadeSpan(x, y, fBuffer, width); | 837 fShader->shadeSpan(x, y, fBuffer, width); |
843 // shaders take care of global alpha, so we pass 0xFF (should be ignored) | 838 // shaders take care of global alpha, so we pass 0xFF (should be ignored) |
844 fOpaqueProc(fDevice.getAddr16(x, y), fBuffer, width, 0xFF, x, y); | 839 fOpaqueProc(fDevice.getAddr16(x, y), fBuffer, width, 0xFF, x, y); |
845 } | 840 } |
846 | 841 |
847 void SkRGB16_Shader_Blitter::blitRect(int x, int y, int width, int height) { | 842 void SkRGB16_Shader_Blitter::blitRect(int x, int y, int width, int height) { |
848 SkShader::Context* shaderContext = fShaderContext; | 843 SkShader* shader = fShader; |
849 SkBlitRow::Proc proc = fOpaqueProc; | 844 SkBlitRow::Proc proc = fOpaqueProc; |
850 SkPMColor* buffer = fBuffer; | 845 SkPMColor* buffer = fBuffer; |
851 uint16_t* dst = fDevice.getAddr16(x, y); | 846 uint16_t* dst = fDevice.getAddr16(x, y); |
852 size_t dstRB = fDevice.rowBytes(); | 847 size_t dstRB = fDevice.rowBytes(); |
853 | 848 |
854 if (fShaderFlags & SkShader::kConstInY32_Flag) { | 849 if (fShaderFlags & SkShader::kConstInY32_Flag) { |
855 shaderContext->shadeSpan(x, y, buffer, width); | 850 shader->shadeSpan(x, y, buffer, width); |
856 do { | 851 do { |
857 proc(dst, buffer, width, 0xFF, x, y); | 852 proc(dst, buffer, width, 0xFF, x, y); |
858 y += 1; | 853 y += 1; |
859 dst = (uint16_t*)((char*)dst + dstRB); | 854 dst = (uint16_t*)((char*)dst + dstRB); |
860 } while (--height); | 855 } while (--height); |
861 } else { | 856 } else { |
862 do { | 857 do { |
863 shaderContext->shadeSpan(x, y, buffer, width); | 858 shader->shadeSpan(x, y, buffer, width); |
864 proc(dst, buffer, width, 0xFF, x, y); | 859 proc(dst, buffer, width, 0xFF, x, y); |
865 y += 1; | 860 y += 1; |
866 dst = (uint16_t*)((char*)dst + dstRB); | 861 dst = (uint16_t*)((char*)dst + dstRB); |
867 } while (--height); | 862 } while (--height); |
868 } | 863 } |
869 } | 864 } |
870 | 865 |
871 static inline int count_nonzero_span(const int16_t runs[], const SkAlpha aa[]) { | 866 static inline int count_nonzero_span(const int16_t runs[], const SkAlpha aa[]) { |
872 int count = 0; | 867 int count = 0; |
873 for (;;) { | 868 for (;;) { |
874 int n = *runs; | 869 int n = *runs; |
875 if (n == 0 || *aa == 0) { | 870 if (n == 0 || *aa == 0) { |
876 break; | 871 break; |
877 } | 872 } |
878 runs += n; | 873 runs += n; |
879 aa += n; | 874 aa += n; |
880 count += n; | 875 count += n; |
881 } | 876 } |
882 return count; | 877 return count; |
883 } | 878 } |
884 | 879 |
885 void SkRGB16_Shader_Blitter::blitAntiH(int x, int y, | 880 void SkRGB16_Shader_Blitter::blitAntiH(int x, int y, |
886 const SkAlpha* SK_RESTRICT antialias, | 881 const SkAlpha* SK_RESTRICT antialias, |
887 const int16_t* SK_RESTRICT runs) { | 882 const int16_t* SK_RESTRICT runs) { |
888 SkShader::Context* shaderContext = fShaderContext; | 883 SkShader* shader = fShader; |
889 SkPMColor* SK_RESTRICT span = fBuffer; | 884 SkPMColor* SK_RESTRICT span = fBuffer; |
890 uint16_t* SK_RESTRICT device = fDevice.getAddr16(x, y); | 885 uint16_t* SK_RESTRICT device = fDevice.getAddr16(x, y); |
891 | 886 |
892 for (;;) { | 887 for (;;) { |
893 int count = *runs; | 888 int count = *runs; |
894 if (count <= 0) { | 889 if (count <= 0) { |
895 break; | 890 break; |
896 } | 891 } |
897 int aa = *antialias; | 892 int aa = *antialias; |
898 if (0 == aa) { | 893 if (0 == aa) { |
899 device += count; | 894 device += count; |
900 runs += count; | 895 runs += count; |
901 antialias += count; | 896 antialias += count; |
902 x += count; | 897 x += count; |
903 continue; | 898 continue; |
904 } | 899 } |
905 | 900 |
906 int nonZeroCount = count + count_nonzero_span(runs + count, antialias +
count); | 901 int nonZeroCount = count + count_nonzero_span(runs + count, antialias +
count); |
907 | 902 |
908 SkASSERT(nonZeroCount <= fDevice.width()); // don't overrun fBuffer | 903 SkASSERT(nonZeroCount <= fDevice.width()); // don't overrun fBuffer |
909 shaderContext->shadeSpan(x, y, span, nonZeroCount); | 904 shader->shadeSpan(x, y, span, nonZeroCount); |
910 | 905 |
911 SkPMColor* localSpan = span; | 906 SkPMColor* localSpan = span; |
912 for (;;) { | 907 for (;;) { |
913 SkBlitRow::Proc proc = (aa == 0xFF) ? fOpaqueProc : fAlphaProc; | 908 SkBlitRow::Proc proc = (aa == 0xFF) ? fOpaqueProc : fAlphaProc; |
914 proc(device, localSpan, count, aa, x, y); | 909 proc(device, localSpan, count, aa, x, y); |
915 | 910 |
916 x += count; | 911 x += count; |
917 device += count; | 912 device += count; |
918 runs += count; | 913 runs += count; |
919 antialias += count; | 914 antialias += count; |
920 nonZeroCount -= count; | 915 nonZeroCount -= count; |
921 if (nonZeroCount == 0) { | 916 if (nonZeroCount == 0) { |
922 break; | 917 break; |
923 } | 918 } |
924 localSpan += count; | 919 localSpan += count; |
925 SkASSERT(nonZeroCount > 0); | 920 SkASSERT(nonZeroCount > 0); |
926 count = *runs; | 921 count = *runs; |
927 SkASSERT(count > 0); | 922 SkASSERT(count > 0); |
928 aa = *antialias; | 923 aa = *antialias; |
929 } | 924 } |
930 } | 925 } |
931 } | 926 } |
932 | 927 |
933 /////////////////////////////////////////////////////////////////////// | 928 /////////////////////////////////////////////////////////////////////// |
934 | 929 |
935 SkRGB16_Shader_Xfermode_Blitter::SkRGB16_Shader_Xfermode_Blitter( | 930 SkRGB16_Shader_Xfermode_Blitter::SkRGB16_Shader_Xfermode_Blitter( |
936 const SkBitmap& device, const SkPaint& paint, | 931 const SkBitmap& device, const SkPaint& paint) |
937 SkShader::Context* shaderContext) | 932 : INHERITED(device, paint) { |
938 : INHERITED(device, paint, shaderContext) { | |
939 fXfermode = paint.getXfermode(); | 933 fXfermode = paint.getXfermode(); |
940 SkASSERT(fXfermode); | 934 SkASSERT(fXfermode); |
941 fXfermode->ref(); | 935 fXfermode->ref(); |
942 | 936 |
943 int width = device.width(); | 937 int width = device.width(); |
944 fBuffer = (SkPMColor*)sk_malloc_throw((width + (SkAlign4(width) >> 2)) * siz
eof(SkPMColor)); | 938 fBuffer = (SkPMColor*)sk_malloc_throw((width + (SkAlign4(width) >> 2)) * siz
eof(SkPMColor)); |
945 fAAExpand = (uint8_t*)(fBuffer + width); | 939 fAAExpand = (uint8_t*)(fBuffer + width); |
946 } | 940 } |
947 | 941 |
948 SkRGB16_Shader_Xfermode_Blitter::~SkRGB16_Shader_Xfermode_Blitter() { | 942 SkRGB16_Shader_Xfermode_Blitter::~SkRGB16_Shader_Xfermode_Blitter() { |
949 fXfermode->unref(); | 943 fXfermode->unref(); |
950 sk_free(fBuffer); | 944 sk_free(fBuffer); |
951 } | 945 } |
952 | 946 |
953 void SkRGB16_Shader_Xfermode_Blitter::blitH(int x, int y, int width) { | 947 void SkRGB16_Shader_Xfermode_Blitter::blitH(int x, int y, int width) { |
954 SkASSERT(x + width <= fDevice.width()); | 948 SkASSERT(x + width <= fDevice.width()); |
955 | 949 |
956 uint16_t* device = fDevice.getAddr16(x, y); | 950 uint16_t* device = fDevice.getAddr16(x, y); |
957 SkPMColor* span = fBuffer; | 951 SkPMColor* span = fBuffer; |
958 | 952 |
959 fShaderContext->shadeSpan(x, y, span, width); | 953 fShader->shadeSpan(x, y, span, width); |
960 fXfermode->xfer16(device, span, width, NULL); | 954 fXfermode->xfer16(device, span, width, NULL); |
961 } | 955 } |
962 | 956 |
963 void SkRGB16_Shader_Xfermode_Blitter::blitAntiH(int x, int y, | 957 void SkRGB16_Shader_Xfermode_Blitter::blitAntiH(int x, int y, |
964 const SkAlpha* SK_RESTRICT antialias, | 958 const SkAlpha* SK_RESTRICT antialias, |
965 const int16_t* SK_RESTRICT runs) { | 959 const int16_t* SK_RESTRICT runs) { |
966 SkShader::Context* shaderContext = fShaderContext; | 960 SkShader* shader = fShader; |
967 SkXfermode* mode = fXfermode; | 961 SkXfermode* mode = fXfermode; |
968 SkPMColor* SK_RESTRICT span = fBuffer; | 962 SkPMColor* SK_RESTRICT span = fBuffer; |
969 uint8_t* SK_RESTRICT aaExpand = fAAExpand; | 963 uint8_t* SK_RESTRICT aaExpand = fAAExpand; |
970 uint16_t* SK_RESTRICT device = fDevice.getAddr16(x, y); | 964 uint16_t* SK_RESTRICT device = fDevice.getAddr16(x, y); |
971 | 965 |
972 for (;;) { | 966 for (;;) { |
973 int count = *runs; | 967 int count = *runs; |
974 if (count <= 0) { | 968 if (count <= 0) { |
975 break; | 969 break; |
976 } | 970 } |
977 int aa = *antialias; | 971 int aa = *antialias; |
978 if (0 == aa) { | 972 if (0 == aa) { |
979 device += count; | 973 device += count; |
980 runs += count; | 974 runs += count; |
981 antialias += count; | 975 antialias += count; |
982 x += count; | 976 x += count; |
983 continue; | 977 continue; |
984 } | 978 } |
985 | 979 |
986 int nonZeroCount = count + count_nonzero_span(runs + count, | 980 int nonZeroCount = count + count_nonzero_span(runs + count, |
987 antialias + count); | 981 antialias + count); |
988 | 982 |
989 SkASSERT(nonZeroCount <= fDevice.width()); // don't overrun fBuffer | 983 SkASSERT(nonZeroCount <= fDevice.width()); // don't overrun fBuffer |
990 shaderContext->shadeSpan(x, y, span, nonZeroCount); | 984 shader->shadeSpan(x, y, span, nonZeroCount); |
991 | 985 |
992 x += nonZeroCount; | 986 x += nonZeroCount; |
993 SkPMColor* localSpan = span; | 987 SkPMColor* localSpan = span; |
994 for (;;) { | 988 for (;;) { |
995 if (aa == 0xFF) { | 989 if (aa == 0xFF) { |
996 mode->xfer16(device, localSpan, count, NULL); | 990 mode->xfer16(device, localSpan, count, NULL); |
997 } else { | 991 } else { |
998 SkASSERT(aa); | 992 SkASSERT(aa); |
999 memset(aaExpand, aa, count); | 993 memset(aaExpand, aa, count); |
1000 mode->xfer16(device, localSpan, count, aaExpand); | 994 mode->xfer16(device, localSpan, count, aaExpand); |
(...skipping 10 matching lines...) Expand all Loading... |
1011 count = *runs; | 1005 count = *runs; |
1012 SkASSERT(count > 0); | 1006 SkASSERT(count > 0); |
1013 aa = *antialias; | 1007 aa = *antialias; |
1014 } | 1008 } |
1015 } | 1009 } |
1016 } | 1010 } |
1017 | 1011 |
1018 /////////////////////////////////////////////////////////////////////////////// | 1012 /////////////////////////////////////////////////////////////////////////////// |
1019 | 1013 |
1020 SkBlitter* SkBlitter_ChooseD565(const SkBitmap& device, const SkPaint& paint, | 1014 SkBlitter* SkBlitter_ChooseD565(const SkBitmap& device, const SkPaint& paint, |
1021 SkShader::Context* shaderContext, | |
1022 SkTBlitterAllocator* allocator) { | 1015 SkTBlitterAllocator* allocator) { |
1023 SkASSERT(allocator != NULL); | 1016 SkASSERT(allocator != NULL); |
1024 | 1017 |
1025 SkBlitter* blitter; | 1018 SkBlitter* blitter; |
1026 SkShader* shader = paint.getShader(); | 1019 SkShader* shader = paint.getShader(); |
1027 SkXfermode* mode = paint.getXfermode(); | 1020 SkXfermode* mode = paint.getXfermode(); |
1028 | 1021 |
1029 // we require a shader if there is an xfermode, handled by our caller | 1022 // we require a shader if there is an xfermode, handled by our caller |
1030 SkASSERT(NULL == mode || NULL != shader); | 1023 SkASSERT(NULL == mode || NULL != shader); |
1031 | 1024 |
1032 if (shader) { | 1025 if (shader) { |
1033 SkASSERT(shaderContext != NULL); | |
1034 if (mode) { | 1026 if (mode) { |
1035 blitter = allocator->createT<SkRGB16_Shader_Xfermode_Blitter>(device
, paint, | 1027 blitter = allocator->createT<SkRGB16_Shader_Xfermode_Blitter>(device
, paint); |
1036 shader
Context); | 1028 } else if (shader->canCallShadeSpan16()) { |
1037 } else if (shaderContext->canCallShadeSpan16()) { | 1029 blitter = allocator->createT<SkRGB16_Shader16_Blitter>(device, paint
); |
1038 blitter = allocator->createT<SkRGB16_Shader16_Blitter>(device, paint
, shaderContext); | |
1039 } else { | 1030 } else { |
1040 blitter = allocator->createT<SkRGB16_Shader_Blitter>(device, paint,
shaderContext); | 1031 blitter = allocator->createT<SkRGB16_Shader_Blitter>(device, paint); |
1041 } | 1032 } |
1042 } else { | 1033 } else { |
1043 // no shader, no xfermode, (and we always ignore colorfilter) | 1034 // no shader, no xfermode, (and we always ignore colorfilter) |
1044 SkColor color = paint.getColor(); | 1035 SkColor color = paint.getColor(); |
1045 if (0 == SkColorGetA(color)) { | 1036 if (0 == SkColorGetA(color)) { |
1046 blitter = allocator->createT<SkNullBlitter>(); | 1037 blitter = allocator->createT<SkNullBlitter>(); |
1047 #ifdef USE_BLACK_BLITTER | 1038 #ifdef USE_BLACK_BLITTER |
1048 } else if (SK_ColorBLACK == color) { | 1039 } else if (SK_ColorBLACK == color) { |
1049 blitter = allocator->createT<SkRGB16_Black_Blitter>(device, paint); | 1040 blitter = allocator->createT<SkRGB16_Black_Blitter>(device, paint); |
1050 #endif | 1041 #endif |
1051 } else if (0xFF == SkColorGetA(color)) { | 1042 } else if (0xFF == SkColorGetA(color)) { |
1052 blitter = allocator->createT<SkRGB16_Opaque_Blitter>(device, paint); | 1043 blitter = allocator->createT<SkRGB16_Opaque_Blitter>(device, paint); |
1053 } else { | 1044 } else { |
1054 blitter = allocator->createT<SkRGB16_Blitter>(device, paint); | 1045 blitter = allocator->createT<SkRGB16_Blitter>(device, paint); |
1055 } | 1046 } |
1056 } | 1047 } |
1057 | 1048 |
1058 return blitter; | 1049 return blitter; |
1059 } | 1050 } |
OLD | NEW |