1 /* 2 * Copyright 2011 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "SkBlitRow.h" 9 #include "SkBlitMask.h" 10 #include "SkColorData.h" 11 #include "SkOpts.h" 12 #include "SkUtils.h" 13 14 #define UNROLL 15 16 static void S32_Opaque_BlitRow32(SkPMColor* SK_RESTRICT dst, 17 const SkPMColor* SK_RESTRICT src, 18 int count, U8CPU alpha) { 19 SkASSERT(255 == alpha); 20 memcpy(dst, src, count * 4); 21 } 22 23 static void S32_Blend_BlitRow32(SkPMColor* SK_RESTRICT dst, 24 const SkPMColor* SK_RESTRICT src, 25 int count, U8CPU alpha) { 26 SkASSERT(alpha <= 255); 27 if (count > 0) { 28 unsigned src_scale = SkAlpha255To256(alpha); 29 30 #ifdef UNROLL 31 if (count & 1) { 32 *dst = SkPMLerp(*src, *dst, src_scale); 33 src += 1; 34 dst += 1; 35 count -= 1; 36 } 37 38 const SkPMColor* SK_RESTRICT srcEnd = src + count; 39 while (src != srcEnd) { 40 *dst = SkPMLerp(*src, *dst, src_scale); 41 src += 1; 42 dst += 1; 43 *dst = SkPMLerp(*src, *dst, src_scale); 44 src += 1; 45 dst += 1; 46 } 47 #else 48 do { 49 *dst = SkPMLerp(*src, *dst, src_scale); 50 src += 1; 51 dst += 1; 52 } while (--count > 0); 53 #endif 54 } 55 } 56 57 static void S32A_Blend_BlitRow32(SkPMColor* SK_RESTRICT dst, 58 const SkPMColor* SK_RESTRICT src, 59 int count, U8CPU alpha) { 60 SkASSERT(alpha <= 255); 61 if (count > 0) { 62 #ifdef UNROLL 63 if (count & 1) { 64 *dst = SkBlendARGB32(*(src++), *dst, alpha); 65 dst += 1; 66 count -= 1; 67 } 68 69 const SkPMColor* SK_RESTRICT srcEnd = src + count; 70 while (src != srcEnd) { 71 *dst = SkBlendARGB32(*(src++), *dst, alpha); 72 dst += 1; 73 *dst = SkBlendARGB32(*(src++), *dst, alpha); 74 dst += 1; 75 } 76 #else 77 do { 78 *dst = SkBlendARGB32(*src, *dst, alpha); 79 src += 1; 80 dst += 1; 81 } while (--count > 0); 82 #endif 83 } 84 } 85 86 /////////////////////////////////////////////////////////////////////////////// 87 88 static const SkBlitRow::Proc32 gDefault_Procs32[] = { 89 S32_Opaque_BlitRow32, 90 S32_Blend_BlitRow32, 91 nullptr, 92 S32A_Blend_BlitRow32 93 }; 94 95 SkBlitRow::Proc32 SkBlitRow::Factory32(unsigned flags) { 96 SkASSERT(flags < SK_ARRAY_COUNT(gDefault_Procs32)); 97 // just so we don't crash 98 flags &= kFlags32_Mask; 99 100 if (flags == 2) { 101 // S32A_Opaque_BlitRow32 has been ported to SkOpts, but not the others yet. 102 return SkOpts::blit_row_s32a_opaque; 103 } 104 105 SkBlitRow::Proc32 proc = PlatformProcs32(flags); 106 if (nullptr == proc) { 107 proc = gDefault_Procs32[flags]; 108 } 109 SkASSERT(proc); 110 return proc; 111 } 112 113 void SkBlitRow::Color32(SkPMColor dst[], const SkPMColor src[], int count, SkPMColor color) { 114 switch (SkGetPackedA32(color)) { 115 case 0: memmove(dst, src, count * sizeof(SkPMColor)); return; 116 case 255: sk_memset32(dst, color, count); return; 117 } 118 return SkOpts::blit_row_color32(dst, src, count, color); 119 } 120