| 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 "SkBlitter.h" | 10 #include "SkBlitter.h" |
| 11 #include "SkAntiRun.h" | 11 #include "SkAntiRun.h" |
| 12 #include "SkColor.h" | 12 #include "SkColor.h" |
| 13 #include "SkColorFilter.h" | 13 #include "SkColorFilter.h" |
| 14 #include "SkCoreBlitters.h" |
| 14 #include "SkFilterShader.h" | 15 #include "SkFilterShader.h" |
| 15 #include "SkReadBuffer.h" | 16 #include "SkReadBuffer.h" |
| 16 #include "SkWriteBuffer.h" | 17 #include "SkWriteBuffer.h" |
| 17 #include "SkMask.h" | 18 #include "SkMask.h" |
| 18 #include "SkMaskFilter.h" | 19 #include "SkMaskFilter.h" |
| 19 #include "SkTemplatesPriv.h" | 20 #include "SkString.h" |
| 20 #include "SkTLazy.h" | 21 #include "SkTLazy.h" |
| 21 #include "SkUtils.h" | 22 #include "SkUtils.h" |
| 22 #include "SkXfermode.h" | 23 #include "SkXfermode.h" |
| 23 #include "SkString.h" | |
| 24 | 24 |
| 25 SkBlitter::~SkBlitter() {} | 25 SkBlitter::~SkBlitter() {} |
| 26 | 26 |
| 27 bool SkBlitter::isNullBlitter() const { return false; } | 27 bool SkBlitter::isNullBlitter() const { return false; } |
| 28 | 28 |
| 29 const SkBitmap* SkBlitter::justAnOpaqueColor(uint32_t* value) { | 29 const SkBitmap* SkBlitter::justAnOpaqueColor(uint32_t* value) { |
| 30 return NULL; | 30 return NULL; |
| 31 } | 31 } |
| 32 | 32 |
| 33 void SkBlitter::blitH(int x, int y, int width) { | 33 void SkBlitter::blitH(int x, int y, int width) { |
| (...skipping 664 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 698 private: | 698 private: |
| 699 SkShader* fProxy; | 699 SkShader* fProxy; |
| 700 SkPMColor fPMColor; | 700 SkPMColor fPMColor; |
| 701 const SkMask* fMask; | 701 const SkMask* fMask; |
| 702 | 702 |
| 703 typedef SkShader INHERITED; | 703 typedef SkShader INHERITED; |
| 704 }; | 704 }; |
| 705 | 705 |
| 706 class Sk3DBlitter : public SkBlitter { | 706 class Sk3DBlitter : public SkBlitter { |
| 707 public: | 707 public: |
| 708 Sk3DBlitter(SkBlitter* proxy, Sk3DShader* shader, void (*killProc)(void*)) | 708 Sk3DBlitter(SkBlitter* proxy, Sk3DShader* shader) |
| 709 : fProxy(proxy), f3DShader(shader), fKillProc(killProc) { | 709 : fProxy(proxy) |
| 710 shader->ref(); | 710 , f3DShader(SkRef(shader)) |
| 711 } | 711 {} |
| 712 | |
| 713 virtual ~Sk3DBlitter() { | |
| 714 f3DShader->unref(); | |
| 715 fKillProc(fProxy); | |
| 716 } | |
| 717 | 712 |
| 718 virtual void blitH(int x, int y, int width) { | 713 virtual void blitH(int x, int y, int width) { |
| 719 fProxy->blitH(x, y, width); | 714 fProxy->blitH(x, y, width); |
| 720 } | 715 } |
| 721 | 716 |
| 722 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], | 717 virtual void blitAntiH(int x, int y, const SkAlpha antialias[], |
| 723 const int16_t runs[]) { | 718 const int16_t runs[]) { |
| 724 fProxy->blitAntiH(x, y, antialias, runs); | 719 fProxy->blitAntiH(x, y, antialias, runs); |
| 725 } | 720 } |
| 726 | 721 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 740 fProxy->blitMask(mask, clip); | 735 fProxy->blitMask(mask, clip); |
| 741 ((SkMask*)&mask)->fFormat = SkMask::k3D_Format; | 736 ((SkMask*)&mask)->fFormat = SkMask::k3D_Format; |
| 742 | 737 |
| 743 f3DShader->setMask(NULL); | 738 f3DShader->setMask(NULL); |
| 744 } else { | 739 } else { |
| 745 fProxy->blitMask(mask, clip); | 740 fProxy->blitMask(mask, clip); |
| 746 } | 741 } |
| 747 } | 742 } |
| 748 | 743 |
| 749 private: | 744 private: |
| 750 SkBlitter* fProxy; | 745 // fProxy is unowned. It will be deleted by SkSmallAllocator. |
| 751 Sk3DShader* f3DShader; | 746 SkBlitter* fProxy; |
| 752 void (*fKillProc)(void*); | 747 SkAutoTUnref<Sk3DShader> f3DShader; |
| 753 }; | 748 }; |
| 754 | 749 |
| 755 /////////////////////////////////////////////////////////////////////////////// | 750 /////////////////////////////////////////////////////////////////////////////// |
| 756 | 751 |
| 757 #include "SkCoreBlitters.h" | 752 #include "SkCoreBlitters.h" |
| 758 | 753 |
| 759 class SkAutoCallProc { | |
| 760 public: | |
| 761 typedef void (*Proc)(void*); | |
| 762 | |
| 763 SkAutoCallProc(void* obj, Proc proc) | |
| 764 : fObj(obj), fProc(proc) {} | |
| 765 | |
| 766 ~SkAutoCallProc() { | |
| 767 if (fObj && fProc) { | |
| 768 fProc(fObj); | |
| 769 } | |
| 770 } | |
| 771 | |
| 772 void* get() const { return fObj; } | |
| 773 | |
| 774 void* detach() { | |
| 775 void* obj = fObj; | |
| 776 fObj = NULL; | |
| 777 return obj; | |
| 778 } | |
| 779 | |
| 780 private: | |
| 781 void* fObj; | |
| 782 Proc fProc; | |
| 783 }; | |
| 784 #define SkAutoCallProc(...) SK_REQUIRE_LOCAL_VAR(SkAutoCallProc) | |
| 785 | |
| 786 static void destroy_blitter(void* blitter) { | |
| 787 ((SkBlitter*)blitter)->~SkBlitter(); | |
| 788 } | |
| 789 | |
| 790 static void delete_blitter(void* blitter) { | |
| 791 SkDELETE((SkBlitter*)blitter); | |
| 792 } | |
| 793 | |
| 794 static bool just_solid_color(const SkPaint& paint) { | 754 static bool just_solid_color(const SkPaint& paint) { |
| 795 if (paint.getAlpha() == 0xFF && paint.getColorFilter() == NULL) { | 755 if (paint.getAlpha() == 0xFF && paint.getColorFilter() == NULL) { |
| 796 SkShader* shader = paint.getShader(); | 756 SkShader* shader = paint.getShader(); |
| 797 if (NULL == shader || | 757 if (NULL == shader || |
| 798 (shader->getFlags() & SkShader::kOpaqueAlpha_Flag)) { | 758 (shader->getFlags() & SkShader::kOpaqueAlpha_Flag)) { |
| 799 return true; | 759 return true; |
| 800 } | 760 } |
| 801 } | 761 } |
| 802 return false; | 762 return false; |
| 803 } | 763 } |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 845 default: | 805 default: |
| 846 break; | 806 break; |
| 847 } | 807 } |
| 848 } | 808 } |
| 849 return kNormal_XferInterp; | 809 return kNormal_XferInterp; |
| 850 } | 810 } |
| 851 | 811 |
| 852 SkBlitter* SkBlitter::Choose(const SkBitmap& device, | 812 SkBlitter* SkBlitter::Choose(const SkBitmap& device, |
| 853 const SkMatrix& matrix, | 813 const SkMatrix& matrix, |
| 854 const SkPaint& origPaint, | 814 const SkPaint& origPaint, |
| 855 void* storage, size_t storageSize, | 815 SkTBlitterAllocator* allocator, |
| 856 bool drawCoverage) { | 816 bool drawCoverage) { |
| 857 SkASSERT(storageSize == 0 || storage != NULL); | 817 SkASSERT(allocator != NULL); |
| 858 | 818 |
| 859 SkBlitter* blitter = NULL; | 819 SkBlitter* blitter = NULL; |
| 860 | 820 |
| 861 // which check, in case we're being called by a client with a dummy device | 821 // which check, in case we're being called by a client with a dummy device |
| 862 // (e.g. they have a bounder that always aborts the draw) | 822 // (e.g. they have a bounder that always aborts the draw) |
| 863 if (kUnknown_SkColorType == device.colorType() || | 823 if (kUnknown_SkColorType == device.colorType() || |
| 864 (drawCoverage && (kAlpha_8_SkColorType != device.colorType()))) { | 824 (drawCoverage && (kAlpha_8_SkColorType != device.colorType()))) { |
| 865 SK_PLACEMENT_NEW(blitter, SkNullBlitter, storage, storageSize); | 825 blitter = allocator->createT<SkNullBlitter>(); |
| 866 return blitter; | 826 return blitter; |
| 867 } | 827 } |
| 868 | 828 |
| 869 SkShader* shader = origPaint.getShader(); | 829 SkShader* shader = origPaint.getShader(); |
| 870 SkColorFilter* cf = origPaint.getColorFilter(); | 830 SkColorFilter* cf = origPaint.getColorFilter(); |
| 871 SkXfermode* mode = origPaint.getXfermode(); | 831 SkXfermode* mode = origPaint.getXfermode(); |
| 872 Sk3DShader* shader3D = NULL; | 832 Sk3DShader* shader3D = NULL; |
| 873 | 833 |
| 874 SkTCopyOnFirstWrite<SkPaint> paint(origPaint); | 834 SkTCopyOnFirstWrite<SkPaint> paint(origPaint); |
| 875 | 835 |
| 876 if (origPaint.getMaskFilter() != NULL && | 836 if (origPaint.getMaskFilter() != NULL && |
| 877 origPaint.getMaskFilter()->getFormat() == SkMask::k3D_Format) { | 837 origPaint.getMaskFilter()->getFormat() == SkMask::k3D_Format) { |
| 878 shader3D = SkNEW_ARGS(Sk3DShader, (shader)); | 838 shader3D = SkNEW_ARGS(Sk3DShader, (shader)); |
| 879 // we know we haven't initialized lazyPaint yet, so just do it | 839 // we know we haven't initialized lazyPaint yet, so just do it |
| 880 paint.writable()->setShader(shader3D)->unref(); | 840 paint.writable()->setShader(shader3D)->unref(); |
| 881 shader = shader3D; | 841 shader = shader3D; |
| 882 } | 842 } |
| 883 | 843 |
| 884 if (NULL != mode) { | 844 if (NULL != mode) { |
| 885 switch (interpret_xfermode(*paint, mode, device.colorType())) { | 845 switch (interpret_xfermode(*paint, mode, device.colorType())) { |
| 886 case kSrcOver_XferInterp: | 846 case kSrcOver_XferInterp: |
| 887 mode = NULL; | 847 mode = NULL; |
| 888 paint.writable()->setXfermode(NULL); | 848 paint.writable()->setXfermode(NULL); |
| 889 break; | 849 break; |
| 890 case kSkipDrawing_XferInterp: | 850 case kSkipDrawing_XferInterp:{ |
| 891 SK_PLACEMENT_NEW(blitter, SkNullBlitter, storage, storageSize); | 851 blitter = allocator->createT<SkNullBlitter>(); |
| 892 return blitter; | 852 return blitter; |
| 853 } |
| 893 default: | 854 default: |
| 894 break; | 855 break; |
| 895 } | 856 } |
| 896 } | 857 } |
| 897 | 858 |
| 898 /* | 859 /* |
| 899 * If the xfermode is CLEAR, then we can completely ignore the installed | 860 * If the xfermode is CLEAR, then we can completely ignore the installed |
| 900 * color/shader/colorfilter, and just pretend we're SRC + color==0. This | 861 * color/shader/colorfilter, and just pretend we're SRC + color==0. This |
| 901 * will fall into our optimizations for SRC mode. | 862 * will fall into our optimizations for SRC mode. |
| 902 */ | 863 */ |
| (...skipping 30 matching lines...) Expand all Loading... |
| 933 | 894 |
| 934 /* | 895 /* |
| 935 * We need to have balanced calls to the shader: | 896 * We need to have balanced calls to the shader: |
| 936 * setContext | 897 * setContext |
| 937 * endContext | 898 * endContext |
| 938 * We make the first call here, in case it fails we can abort the draw. | 899 * We make the first call here, in case it fails we can abort the draw. |
| 939 * The endContext() call is made by the blitter (assuming setContext did | 900 * The endContext() call is made by the blitter (assuming setContext did |
| 940 * not fail) in its destructor. | 901 * not fail) in its destructor. |
| 941 */ | 902 */ |
| 942 if (shader && !shader->setContext(device, *paint, matrix)) { | 903 if (shader && !shader->setContext(device, *paint, matrix)) { |
| 943 SK_PLACEMENT_NEW(blitter, SkNullBlitter, storage, storageSize); | 904 blitter = allocator->createT<SkNullBlitter>(); |
| 944 return blitter; | 905 return blitter; |
| 945 } | 906 } |
| 946 | 907 |
| 947 | 908 |
| 948 switch (device.colorType()) { | 909 switch (device.colorType()) { |
| 949 case kAlpha_8_SkColorType: | 910 case kAlpha_8_SkColorType: |
| 950 if (drawCoverage) { | 911 if (drawCoverage) { |
| 951 SkASSERT(NULL == shader); | 912 SkASSERT(NULL == shader); |
| 952 SkASSERT(NULL == paint->getXfermode()); | 913 SkASSERT(NULL == paint->getXfermode()); |
| 953 SK_PLACEMENT_NEW_ARGS(blitter, SkA8_Coverage_Blitter, | 914 blitter = allocator->createT<SkA8_Coverage_Blitter>(device, *pai
nt); |
| 954 storage, storageSize, (device, *paint)); | |
| 955 } else if (shader) { | 915 } else if (shader) { |
| 956 SK_PLACEMENT_NEW_ARGS(blitter, SkA8_Shader_Blitter, | 916 blitter = allocator->createT<SkA8_Shader_Blitter>(device, *paint
); |
| 957 storage, storageSize, (device, *paint)); | |
| 958 } else { | 917 } else { |
| 959 SK_PLACEMENT_NEW_ARGS(blitter, SkA8_Blitter, | 918 blitter = allocator->createT<SkA8_Blitter>(device, *paint); |
| 960 storage, storageSize, (device, *paint)); | |
| 961 } | 919 } |
| 962 break; | 920 break; |
| 963 | 921 |
| 964 case kRGB_565_SkColorType: | 922 case kRGB_565_SkColorType: |
| 965 blitter = SkBlitter_ChooseD565(device, *paint, storage, storageSize)
; | 923 blitter = SkBlitter_ChooseD565(device, *paint, allocator); |
| 966 break; | 924 break; |
| 967 | 925 |
| 968 case kPMColor_SkColorType: | 926 case kPMColor_SkColorType: |
| 969 if (shader) { | 927 if (shader) { |
| 970 SK_PLACEMENT_NEW_ARGS(blitter, SkARGB32_Shader_Blitter, | 928 blitter = allocator->createT<SkARGB32_Shader_Blitter>(device, *p
aint); |
| 971 storage, storageSize, (device, *paint)); | |
| 972 } else if (paint->getColor() == SK_ColorBLACK) { | 929 } else if (paint->getColor() == SK_ColorBLACK) { |
| 973 SK_PLACEMENT_NEW_ARGS(blitter, SkARGB32_Black_Blitter, | 930 blitter = allocator->createT<SkARGB32_Black_Blitter>(device, *pa
int); |
| 974 storage, storageSize, (device, *paint)); | |
| 975 } else if (paint->getAlpha() == 0xFF) { | 931 } else if (paint->getAlpha() == 0xFF) { |
| 976 SK_PLACEMENT_NEW_ARGS(blitter, SkARGB32_Opaque_Blitter, | 932 blitter = allocator->createT<SkARGB32_Opaque_Blitter>(device, *p
aint); |
| 977 storage, storageSize, (device, *paint)); | |
| 978 } else { | 933 } else { |
| 979 SK_PLACEMENT_NEW_ARGS(blitter, SkARGB32_Blitter, | 934 blitter = allocator->createT<SkARGB32_Blitter>(device, *paint); |
| 980 storage, storageSize, (device, *paint)); | |
| 981 } | 935 } |
| 982 break; | 936 break; |
| 983 | 937 |
| 984 default: | 938 default: |
| 985 SkDEBUGFAIL("unsupported device config"); | 939 SkDEBUGFAIL("unsupported device config"); |
| 986 SK_PLACEMENT_NEW(blitter, SkNullBlitter, storage, storageSize); | 940 blitter = allocator->createT<SkNullBlitter>(); |
| 987 break; | 941 break; |
| 988 } | 942 } |
| 989 | 943 |
| 990 if (shader3D) { | 944 if (shader3D) { |
| 991 void (*proc)(void*) = ((void*)storage == (void*)blitter) ? destroy_blitt
er : delete_blitter; | 945 SkBlitter* innerBlitter = blitter; |
| 992 SkAutoCallProc tmp(blitter, proc); | 946 // innerBlitter was allocated by allocator, which will delete it. |
| 993 | 947 blitter = allocator->createT<Sk3DBlitter>(innerBlitter, shader3D); |
| 994 blitter = SkNEW_ARGS(Sk3DBlitter, (blitter, shader3D, proc)); | |
| 995 (void)tmp.detach(); | |
| 996 } | 948 } |
| 997 return blitter; | 949 return blitter; |
| 998 } | 950 } |
| 999 | 951 |
| 1000 /////////////////////////////////////////////////////////////////////////////// | 952 /////////////////////////////////////////////////////////////////////////////// |
| 1001 | 953 |
| 1002 const uint16_t gMask_0F0F = 0xF0F; | 954 const uint16_t gMask_0F0F = 0xF0F; |
| 1003 const uint32_t gMask_00FF00FF = 0xFF00FF; | 955 const uint32_t gMask_00FF00FF = 0xFF00FF; |
| 1004 | 956 |
| 1005 /////////////////////////////////////////////////////////////////////////////// | 957 /////////////////////////////////////////////////////////////////////////////// |
| 1006 | 958 |
| 1007 SkShaderBlitter::SkShaderBlitter(const SkBitmap& device, const SkPaint& paint) | 959 SkShaderBlitter::SkShaderBlitter(const SkBitmap& device, const SkPaint& paint) |
| 1008 : INHERITED(device) { | 960 : INHERITED(device) { |
| 1009 fShader = paint.getShader(); | 961 fShader = paint.getShader(); |
| 1010 SkASSERT(fShader); | 962 SkASSERT(fShader); |
| 1011 SkASSERT(fShader->setContextHasBeenCalled()); | 963 SkASSERT(fShader->setContextHasBeenCalled()); |
| 1012 | 964 |
| 1013 fShader->ref(); | 965 fShader->ref(); |
| 1014 fShaderFlags = fShader->getFlags(); | 966 fShaderFlags = fShader->getFlags(); |
| 1015 } | 967 } |
| 1016 | 968 |
| 1017 SkShaderBlitter::~SkShaderBlitter() { | 969 SkShaderBlitter::~SkShaderBlitter() { |
| 1018 SkASSERT(fShader->setContextHasBeenCalled()); | 970 SkASSERT(fShader->setContextHasBeenCalled()); |
| 1019 fShader->endContext(); | 971 fShader->endContext(); |
| 1020 fShader->unref(); | 972 fShader->unref(); |
| 1021 } | 973 } |
| OLD | NEW |