OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 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 #include "SkBlitter.h" | 8 #include "SkBlitter.h" |
9 #include "SkAntiRun.h" | 9 #include "SkAntiRun.h" |
10 #include "SkColor.h" | 10 #include "SkColor.h" |
(...skipping 797 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
808 | 808 |
809 // which check, in case we're being called by a client with a dummy device | 809 // which check, in case we're being called by a client with a dummy device |
810 // (e.g. they have a bounder that always aborts the draw) | 810 // (e.g. they have a bounder that always aborts the draw) |
811 if (kUnknown_SkColorType == device.colorType() || | 811 if (kUnknown_SkColorType == device.colorType() || |
812 (drawCoverage && (kAlpha_8_SkColorType != device.colorType()))) { | 812 (drawCoverage && (kAlpha_8_SkColorType != device.colorType()))) { |
813 return allocator->createT<SkNullBlitter>(); | 813 return allocator->createT<SkNullBlitter>(); |
814 } | 814 } |
815 | 815 |
816 SkShader* shader = origPaint.getShader(); | 816 SkShader* shader = origPaint.getShader(); |
817 SkColorFilter* cf = origPaint.getColorFilter(); | 817 SkColorFilter* cf = origPaint.getColorFilter(); |
818 SkXfermode* mode = origPaint.getXfermode(); | 818 SkBlendMode mode = origPaint.getBlendMode(); |
819 sk_sp<Sk3DShader> shader3D; | 819 sk_sp<Sk3DShader> shader3D; |
820 | 820 |
821 SkTCopyOnFirstWrite<SkPaint> paint(origPaint); | 821 SkTCopyOnFirstWrite<SkPaint> paint(origPaint); |
822 | 822 |
823 if (origPaint.getMaskFilter() != nullptr && | 823 if (origPaint.getMaskFilter() != nullptr && |
824 origPaint.getMaskFilter()->getFormat() == SkMask::k3D_Format) { | 824 origPaint.getMaskFilter()->getFormat() == SkMask::k3D_Format) { |
825 shader3D = sk_make_sp<Sk3DShader>(sk_ref_sp(shader)); | 825 shader3D = sk_make_sp<Sk3DShader>(sk_ref_sp(shader)); |
826 // we know we haven't initialized lazyPaint yet, so just do it | 826 // we know we haven't initialized lazyPaint yet, so just do it |
827 paint.writable()->setShader(shader3D); | 827 paint.writable()->setShader(shader3D); |
828 shader = shader3D.get(); | 828 shader = shader3D.get(); |
829 } | 829 } |
830 | 830 |
831 if (mode) { | 831 if (mode != SkBlendMode::kSrcOver) { |
832 bool deviceIsOpaque = kRGB_565_SkColorType == device.colorType(); | 832 bool deviceIsOpaque = kRGB_565_SkColorType == device.colorType(); |
833 switch (SkInterpretXfermode(*paint, deviceIsOpaque)) { | 833 switch (SkInterpretXfermode(*paint, deviceIsOpaque)) { |
834 case kSrcOver_SkXfermodeInterpretation: | 834 case kSrcOver_SkXfermodeInterpretation: |
835 mode = nullptr; | 835 mode = SkBlendMode::kSrcOver; |
836 paint.writable()->setXfermode(nullptr); | 836 paint.writable()->setBlendMode(mode); |
837 break; | 837 break; |
838 case kSkipDrawing_SkXfermodeInterpretation:{ | 838 case kSkipDrawing_SkXfermodeInterpretation:{ |
839 return allocator->createT<SkNullBlitter>(); | 839 return allocator->createT<SkNullBlitter>(); |
840 } | 840 } |
841 default: | 841 default: |
842 break; | 842 break; |
843 } | 843 } |
844 } | 844 } |
845 | 845 |
846 /* | 846 /* |
847 * If the xfermode is CLEAR, then we can completely ignore the installed | 847 * If the xfermode is CLEAR, then we can completely ignore the installed |
848 * color/shader/colorfilter, and just pretend we're SRC + color==0. This | 848 * color/shader/colorfilter, and just pretend we're SRC + color==0. This |
849 * will fall into our optimizations for SRC mode. | 849 * will fall into our optimizations for SRC mode. |
850 */ | 850 */ |
851 if (SkXfermode::IsMode(mode, SkXfermode::kClear_Mode)) { | 851 if (mode == SkBlendMode::kClear) { |
852 SkPaint* p = paint.writable(); | 852 SkPaint* p = paint.writable(); |
853 p->setShader(nullptr); | 853 p->setShader(nullptr); |
854 shader = nullptr; | 854 shader = nullptr; |
855 p->setColorFilter(nullptr); | 855 p->setColorFilter(nullptr); |
856 cf = nullptr; | 856 cf = nullptr; |
857 mode = p->setXfermodeMode(SkXfermode::kSrc_Mode); | 857 p->setBlendMode(mode = SkBlendMode::kSrc); |
858 p->setColor(0); | 858 p->setColor(0); |
859 } | 859 } |
860 | 860 |
861 if (SkBlitter* blitter = SkCreateRasterPipelineBlitter(device, *paint, alloc
ator)) { | 861 if (SkBlitter* blitter = SkCreateRasterPipelineBlitter(device, *paint, alloc
ator)) { |
862 return blitter; | 862 return blitter; |
863 } | 863 } |
864 | 864 |
865 if (nullptr == shader) { | 865 if (nullptr == shader) { |
866 if (mode) { | 866 if (mode != SkBlendMode::kSrcOver) { |
867 // xfermodes (and filters) require shaders for our current blitters | 867 // xfermodes (and filters) require shaders for our current blitters |
868 paint.writable()->setShader(SkShader::MakeColorShader(paint->getColo
r())); | 868 paint.writable()->setShader(SkShader::MakeColorShader(paint->getColo
r())); |
869 paint.writable()->setAlpha(0xFF); | 869 paint.writable()->setAlpha(0xFF); |
870 shader = paint->getShader(); | 870 shader = paint->getShader(); |
871 } else if (cf) { | 871 } else if (cf) { |
872 // if no shader && no xfermode, we just apply the colorfilter to | 872 // if no shader && no xfermode, we just apply the colorfilter to |
873 // our color and move on. | 873 // our color and move on. |
874 SkPaint* writablePaint = paint.writable(); | 874 SkPaint* writablePaint = paint.writable(); |
875 writablePaint->setColor(cf->filterColor(paint->getColor())); | 875 writablePaint->setColor(cf->filterColor(paint->getColor())); |
876 writablePaint->setColorFilter(nullptr); | 876 writablePaint->setColorFilter(nullptr); |
(...skipping 30 matching lines...) Expand all Loading... |
907 } else { | 907 } else { |
908 return allocator->createT<SkNullBlitter>(); | 908 return allocator->createT<SkNullBlitter>(); |
909 } | 909 } |
910 } | 910 } |
911 | 911 |
912 SkBlitter* blitter = nullptr; | 912 SkBlitter* blitter = nullptr; |
913 switch (device.colorType()) { | 913 switch (device.colorType()) { |
914 case kAlpha_8_SkColorType: | 914 case kAlpha_8_SkColorType: |
915 if (drawCoverage) { | 915 if (drawCoverage) { |
916 SkASSERT(nullptr == shader); | 916 SkASSERT(nullptr == shader); |
917 SkASSERT(nullptr == paint->getXfermode()); | 917 SkASSERT(paint->isSrcOver()); |
918 blitter = allocator->createT<SkA8_Coverage_Blitter>(device, *pai
nt); | 918 blitter = allocator->createT<SkA8_Coverage_Blitter>(device, *pai
nt); |
919 } else if (shader) { | 919 } else if (shader) { |
920 blitter = allocator->createT<SkA8_Shader_Blitter>(device, *paint
, shaderContext); | 920 blitter = allocator->createT<SkA8_Shader_Blitter>(device, *paint
, shaderContext); |
921 } else { | 921 } else { |
922 blitter = allocator->createT<SkA8_Blitter>(device, *paint); | 922 blitter = allocator->createT<SkA8_Blitter>(device, *paint); |
923 } | 923 } |
924 break; | 924 break; |
925 | 925 |
926 case kRGB_565_SkColorType: | 926 case kRGB_565_SkColorType: |
927 blitter = SkBlitter_ChooseD565(device, *paint, shaderContext, alloca
tor); | 927 blitter = SkBlitter_ChooseD565(device, *paint, shaderContext, alloca
tor); |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1014 fShaderContext->~Context(); | 1014 fShaderContext->~Context(); |
1015 SkShader::Context* ctx = fShader->createContext(rec, (void*)fShaderContext); | 1015 SkShader::Context* ctx = fShader->createContext(rec, (void*)fShaderContext); |
1016 if (nullptr == ctx) { | 1016 if (nullptr == ctx) { |
1017 // Need a valid context in fShaderContext's storage, so we can later (or
our caller) call | 1017 // Need a valid context in fShaderContext's storage, so we can later (or
our caller) call |
1018 // the in-place destructor. | 1018 // the in-place destructor. |
1019 new (fShaderContext) SkZeroShaderContext(*fShader, rec); | 1019 new (fShaderContext) SkZeroShaderContext(*fShader, rec); |
1020 return false; | 1020 return false; |
1021 } | 1021 } |
1022 return true; | 1022 return true; |
1023 } | 1023 } |
OLD | NEW |