| 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 |