| 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 "SkBlitRow.h" | 8 #include "SkBlitRow.h" |
| 9 #include "SkCoreBlitters.h" | 9 #include "SkCoreBlitters.h" |
| 10 #include "SkColorPriv.h" | 10 #include "SkColorPriv.h" |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 | 153 |
| 154 typedef SkShaderBlitter INHERITED; | 154 typedef SkShaderBlitter INHERITED; |
| 155 }; | 155 }; |
| 156 | 156 |
| 157 /////////////////////////////////////////////////////////////////////////////// | 157 /////////////////////////////////////////////////////////////////////////////// |
| 158 #ifdef USE_BLACK_BLITTER | 158 #ifdef USE_BLACK_BLITTER |
| 159 SkRGB16_Black_Blitter::SkRGB16_Black_Blitter(const SkPixmap& device, const SkPai
nt& paint) | 159 SkRGB16_Black_Blitter::SkRGB16_Black_Blitter(const SkPixmap& device, const SkPai
nt& paint) |
| 160 : INHERITED(device, paint) { | 160 : INHERITED(device, paint) { |
| 161 SkASSERT(paint.getShader() == nullptr); | 161 SkASSERT(paint.getShader() == nullptr); |
| 162 SkASSERT(paint.getColorFilter() == nullptr); | 162 SkASSERT(paint.getColorFilter() == nullptr); |
| 163 SkASSERT(paint.getXfermode() == nullptr); | 163 SkASSERT(paint.isSrcOver()); |
| 164 SkASSERT(paint.getColor() == SK_ColorBLACK); | 164 SkASSERT(paint.getColor() == SK_ColorBLACK); |
| 165 } | 165 } |
| 166 | 166 |
| 167 #if 1 | 167 #if 1 |
| 168 #define black_8_pixels(mask, dst) \ | 168 #define black_8_pixels(mask, dst) \ |
| 169 do { \ | 169 do { \ |
| 170 if (mask & 0x80) dst[0] = 0; \ | 170 if (mask & 0x80) dst[0] = 0; \ |
| 171 if (mask & 0x40) dst[1] = 0; \ | 171 if (mask & 0x40) dst[1] = 0; \ |
| 172 if (mask & 0x20) dst[2] = 0; \ | 172 if (mask & 0x20) dst[2] = 0; \ |
| 173 if (mask & 0x10) dst[3] = 0; \ | 173 if (mask & 0x10) dst[3] = 0; \ |
| (...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 676 } | 676 } |
| 677 } | 677 } |
| 678 | 678 |
| 679 /////////////////////////////////////////////////////////////////////////////// | 679 /////////////////////////////////////////////////////////////////////////////// |
| 680 | 680 |
| 681 SkRGB16_Shader_Blitter::SkRGB16_Shader_Blitter(const SkPixmap& device, | 681 SkRGB16_Shader_Blitter::SkRGB16_Shader_Blitter(const SkPixmap& device, |
| 682 const SkPaint& paint, | 682 const SkPaint& paint, |
| 683 SkShader::Context* shaderContext) | 683 SkShader::Context* shaderContext) |
| 684 : INHERITED(device, paint, shaderContext) | 684 : INHERITED(device, paint, shaderContext) |
| 685 { | 685 { |
| 686 SkASSERT(paint.getXfermode() == nullptr); | 686 SkASSERT(paint.isSrcOver()); |
| 687 | 687 |
| 688 fBuffer = (SkPMColor*)sk_malloc_throw(device.width() * sizeof(SkPMColor)); | 688 fBuffer = (SkPMColor*)sk_malloc_throw(device.width() * sizeof(SkPMColor)); |
| 689 | 689 |
| 690 // compute SkBlitRow::Procs | 690 // compute SkBlitRow::Procs |
| 691 unsigned flags = 0; | 691 unsigned flags = 0; |
| 692 | 692 |
| 693 uint32_t shaderFlags = fShaderFlags; | 693 uint32_t shaderFlags = fShaderFlags; |
| 694 // shaders take care of global alpha, so we never set it in SkBlitRow | 694 // shaders take care of global alpha, so we never set it in SkBlitRow |
| 695 if (!(shaderFlags & SkShader::kOpaqueAlpha_Flag)) { | 695 if (!(shaderFlags & SkShader::kOpaqueAlpha_Flag)) { |
| 696 flags |= SkBlitRow::kSrcPixelAlpha_Flag; | 696 flags |= SkBlitRow::kSrcPixelAlpha_Flag; |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 802 } | 802 } |
| 803 } | 803 } |
| 804 | 804 |
| 805 /////////////////////////////////////////////////////////////////////// | 805 /////////////////////////////////////////////////////////////////////// |
| 806 | 806 |
| 807 SkRGB16_Shader_Xfermode_Blitter::SkRGB16_Shader_Xfermode_Blitter( | 807 SkRGB16_Shader_Xfermode_Blitter::SkRGB16_Shader_Xfermode_Blitter( |
| 808 const SkPixmap& device, const SkPaint& paint, | 808 const SkPixmap& device, const SkPaint& paint, |
| 809 SkShader::Context* shaderContext) | 809 SkShader::Context* shaderContext) |
| 810 : INHERITED(device, paint, shaderContext) | 810 : INHERITED(device, paint, shaderContext) |
| 811 { | 811 { |
| 812 fXfermode = paint.getXfermode(); | 812 fXfermode = SkXfermode::Peek(paint.getBlendMode()); |
| 813 SkASSERT(fXfermode); | 813 SkASSERT(fXfermode); |
| 814 fXfermode->ref(); | |
| 815 | 814 |
| 816 int width = device.width(); | 815 int width = device.width(); |
| 817 fBuffer = (SkPMColor*)sk_malloc_throw((width + (SkAlign4(width) >> 2)) * siz
eof(SkPMColor)); | 816 fBuffer = (SkPMColor*)sk_malloc_throw((width + (SkAlign4(width) >> 2)) * siz
eof(SkPMColor)); |
| 818 fAAExpand = (uint8_t*)(fBuffer + width); | 817 fAAExpand = (uint8_t*)(fBuffer + width); |
| 819 } | 818 } |
| 820 | 819 |
| 821 SkRGB16_Shader_Xfermode_Blitter::~SkRGB16_Shader_Xfermode_Blitter() { | 820 SkRGB16_Shader_Xfermode_Blitter::~SkRGB16_Shader_Xfermode_Blitter() { |
| 822 fXfermode->unref(); | |
| 823 sk_free(fBuffer); | 821 sk_free(fBuffer); |
| 824 } | 822 } |
| 825 | 823 |
| 826 void SkRGB16_Shader_Xfermode_Blitter::blitH(int x, int y, int width) { | 824 void SkRGB16_Shader_Xfermode_Blitter::blitH(int x, int y, int width) { |
| 827 SkASSERT(x + width <= fDevice.width()); | 825 SkASSERT(x + width <= fDevice.width()); |
| 828 | 826 |
| 829 uint16_t* device = fDevice.writable_addr16(x, y); | 827 uint16_t* device = fDevice.writable_addr16(x, y); |
| 830 SkPMColor* span = fBuffer; | 828 SkPMColor* span = fBuffer; |
| 831 | 829 |
| 832 fShaderContext->shadeSpan(x, y, span, width); | 830 fShaderContext->shadeSpan(x, y, span, width); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 890 | 888 |
| 891 /////////////////////////////////////////////////////////////////////////////// | 889 /////////////////////////////////////////////////////////////////////////////// |
| 892 | 890 |
| 893 SkBlitter* SkBlitter_ChooseD565(const SkPixmap& device, const SkPaint& paint, | 891 SkBlitter* SkBlitter_ChooseD565(const SkPixmap& device, const SkPaint& paint, |
| 894 SkShader::Context* shaderContext, | 892 SkShader::Context* shaderContext, |
| 895 SkTBlitterAllocator* allocator) { | 893 SkTBlitterAllocator* allocator) { |
| 896 SkASSERT(allocator != nullptr); | 894 SkASSERT(allocator != nullptr); |
| 897 | 895 |
| 898 SkBlitter* blitter; | 896 SkBlitter* blitter; |
| 899 SkShader* shader = paint.getShader(); | 897 SkShader* shader = paint.getShader(); |
| 900 SkXfermode* mode = paint.getXfermode(); | 898 bool is_srcover = paint.isSrcOver(); |
| 901 | 899 |
| 902 // we require a shader if there is an xfermode, handled by our caller | 900 // we require a shader if there is an xfermode, handled by our caller |
| 903 SkASSERT(nullptr == mode || shader); | 901 SkASSERT(is_srcover || shader); |
| 904 | 902 |
| 905 if (shader) { | 903 if (shader) { |
| 906 SkASSERT(shaderContext != nullptr); | 904 SkASSERT(shaderContext != nullptr); |
| 907 if (mode) { | 905 if (!is_srcover) { |
| 908 blitter = allocator->createT<SkRGB16_Shader_Xfermode_Blitter>(device
, paint, | 906 blitter = allocator->createT<SkRGB16_Shader_Xfermode_Blitter>(device
, paint, |
| 909 shader
Context); | 907 shader
Context); |
| 910 } else { | 908 } else { |
| 911 blitter = allocator->createT<SkRGB16_Shader_Blitter>(device, paint,
shaderContext); | 909 blitter = allocator->createT<SkRGB16_Shader_Blitter>(device, paint,
shaderContext); |
| 912 } | 910 } |
| 913 } else { | 911 } else { |
| 914 // no shader, no xfermode, (and we always ignore colorfilter) | 912 // no shader, no xfermode, (and we always ignore colorfilter) |
| 915 SkColor color = paint.getColor(); | 913 SkColor color = paint.getColor(); |
| 916 if (0 == SkColorGetA(color)) { | 914 if (0 == SkColorGetA(color)) { |
| 917 blitter = allocator->createT<SkNullBlitter>(); | 915 blitter = allocator->createT<SkNullBlitter>(); |
| 918 #ifdef USE_BLACK_BLITTER | 916 #ifdef USE_BLACK_BLITTER |
| 919 } else if (SK_ColorBLACK == color) { | 917 } else if (SK_ColorBLACK == color) { |
| 920 blitter = allocator->createT<SkRGB16_Black_Blitter>(device, paint); | 918 blitter = allocator->createT<SkRGB16_Black_Blitter>(device, paint); |
| 921 #endif | 919 #endif |
| 922 } else if (0xFF == SkColorGetA(color)) { | 920 } else if (0xFF == SkColorGetA(color)) { |
| 923 blitter = allocator->createT<SkRGB16_Opaque_Blitter>(device, paint); | 921 blitter = allocator->createT<SkRGB16_Opaque_Blitter>(device, paint); |
| 924 } else { | 922 } else { |
| 925 blitter = allocator->createT<SkRGB16_Blitter>(device, paint); | 923 blitter = allocator->createT<SkRGB16_Blitter>(device, paint); |
| 926 } | 924 } |
| 927 } | 925 } |
| 928 | 926 |
| 929 return blitter; | 927 return blitter; |
| 930 } | 928 } |
| OLD | NEW |