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" |
(...skipping 832 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
843 default: | 843 default: |
844 break; | 844 break; |
845 } | 845 } |
846 } | 846 } |
847 return kNormal_XferInterp; | 847 return kNormal_XferInterp; |
848 } | 848 } |
849 | 849 |
850 SkBlitter* SkBlitter::Choose(const SkBitmap& device, | 850 SkBlitter* SkBlitter::Choose(const SkBitmap& device, |
851 const SkMatrix& matrix, | 851 const SkMatrix& matrix, |
852 const SkPaint& origPaint, | 852 const SkPaint& origPaint, |
853 void* storage, size_t storageSize) { | 853 void* storage, size_t storageSize, |
| 854 bool drawCoverage) { |
854 SkASSERT(storageSize == 0 || storage != NULL); | 855 SkASSERT(storageSize == 0 || storage != NULL); |
855 | 856 |
856 SkBlitter* blitter = NULL; | 857 SkBlitter* blitter = NULL; |
857 | 858 |
858 // which check, in case we're being called by a client with a dummy device | 859 // which check, in case we're being called by a client with a dummy device |
859 // (e.g. they have a bounder that always aborts the draw) | 860 // (e.g. they have a bounder that always aborts the draw) |
860 if (SkBitmap::kNo_Config == device.config()) { | 861 if (SkBitmap::kNo_Config == device.config() || |
| 862 (drawCoverage && (SkBitmap::kA8_Config != device.config()))) { |
861 SK_PLACEMENT_NEW(blitter, SkNullBlitter, storage, storageSize); | 863 SK_PLACEMENT_NEW(blitter, SkNullBlitter, storage, storageSize); |
862 return blitter; | 864 return blitter; |
863 } | 865 } |
864 | 866 |
865 SkShader* shader = origPaint.getShader(); | 867 SkShader* shader = origPaint.getShader(); |
866 SkColorFilter* cf = origPaint.getColorFilter(); | 868 SkColorFilter* cf = origPaint.getColorFilter(); |
867 SkXfermode* mode = origPaint.getXfermode(); | 869 SkXfermode* mode = origPaint.getXfermode(); |
868 Sk3DShader* shader3D = NULL; | 870 Sk3DShader* shader3D = NULL; |
869 | 871 |
870 SkTCopyOnFirstWrite<SkPaint> paint(origPaint); | 872 SkTCopyOnFirstWrite<SkPaint> paint(origPaint); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
933 * endContext | 935 * endContext |
934 * We make the first call here, in case it fails we can abort the draw. | 936 * We make the first call here, in case it fails we can abort the draw. |
935 * The endContext() call is made by the blitter (assuming setContext did | 937 * The endContext() call is made by the blitter (assuming setContext did |
936 * not fail) in its destructor. | 938 * not fail) in its destructor. |
937 */ | 939 */ |
938 if (shader && !shader->setContext(device, *paint, matrix)) { | 940 if (shader && !shader->setContext(device, *paint, matrix)) { |
939 SK_PLACEMENT_NEW(blitter, SkNullBlitter, storage, storageSize); | 941 SK_PLACEMENT_NEW(blitter, SkNullBlitter, storage, storageSize); |
940 return blitter; | 942 return blitter; |
941 } | 943 } |
942 | 944 |
| 945 |
943 switch (device.config()) { | 946 switch (device.config()) { |
944 case SkBitmap::kA1_Config: | 947 case SkBitmap::kA1_Config: |
945 SK_PLACEMENT_NEW_ARGS(blitter, SkA1_Blitter, | 948 SK_PLACEMENT_NEW_ARGS(blitter, SkA1_Blitter, |
946 storage, storageSize, (device, *paint)); | 949 storage, storageSize, (device, *paint)); |
947 break; | 950 break; |
948 | 951 |
949 case SkBitmap::kA8_Config: | 952 case SkBitmap::kA8_Config: |
950 if (shader) { | 953 if (drawCoverage) { |
| 954 SkASSERT(NULL == shader); |
| 955 SkASSERT(NULL == paint->getXfermode()); |
| 956 SK_PLACEMENT_NEW_ARGS(blitter, SkA8_Coverage_Blitter, |
| 957 storage, storageSize, (device, *paint)); |
| 958 } else if (shader) { |
951 SK_PLACEMENT_NEW_ARGS(blitter, SkA8_Shader_Blitter, | 959 SK_PLACEMENT_NEW_ARGS(blitter, SkA8_Shader_Blitter, |
952 storage, storageSize, (device, *paint)); | 960 storage, storageSize, (device, *paint)); |
953 } else { | 961 } else { |
954 SK_PLACEMENT_NEW_ARGS(blitter, SkA8_Blitter, | 962 SK_PLACEMENT_NEW_ARGS(blitter, SkA8_Blitter, |
955 storage, storageSize, (device, *paint)); | 963 storage, storageSize, (device, *paint)); |
956 } | 964 } |
957 break; | 965 break; |
958 | 966 |
959 case SkBitmap::kRGB_565_Config: | 967 case SkBitmap::kRGB_565_Config: |
960 blitter = SkBlitter_ChooseD565(device, *paint, storage, storageSize)
; | 968 blitter = SkBlitter_ChooseD565(device, *paint, storage, storageSize)
; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1007 | 1015 |
1008 fShader->ref(); | 1016 fShader->ref(); |
1009 fShaderFlags = fShader->getFlags(); | 1017 fShaderFlags = fShader->getFlags(); |
1010 } | 1018 } |
1011 | 1019 |
1012 SkShaderBlitter::~SkShaderBlitter() { | 1020 SkShaderBlitter::~SkShaderBlitter() { |
1013 SkASSERT(fShader->setContextHasBeenCalled()); | 1021 SkASSERT(fShader->setContextHasBeenCalled()); |
1014 fShader->endContext(); | 1022 fShader->endContext(); |
1015 fShader->unref(); | 1023 fShader->unref(); |
1016 } | 1024 } |
OLD | NEW |