/* * Copyright 2011 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "SkBlitRow.h" #include "SkBlitMask.h" #include "SkColorData.h" #include "SkOpts.h" #include "SkUtils.h" #define UNROLL static void S32_Opaque_BlitRow32(SkPMColor* SK_RESTRICT dst, const SkPMColor* SK_RESTRICT src, int count, U8CPU alpha) { SkASSERT(255 == alpha); memcpy(dst, src, count * 4); } static void S32_Blend_BlitRow32(SkPMColor* SK_RESTRICT dst, const SkPMColor* SK_RESTRICT src, int count, U8CPU alpha) { SkASSERT(alpha <= 255); if (count > 0) { unsigned src_scale = SkAlpha255To256(alpha); #ifdef UNROLL if (count & 1) { *dst = SkPMLerp(*src, *dst, src_scale); src += 1; dst += 1; count -= 1; } const SkPMColor* SK_RESTRICT srcEnd = src + count; while (src != srcEnd) { *dst = SkPMLerp(*src, *dst, src_scale); src += 1; dst += 1; *dst = SkPMLerp(*src, *dst, src_scale); src += 1; dst += 1; } #else do { *dst = SkPMLerp(*src, *dst, src_scale); src += 1; dst += 1; } while (--count > 0); #endif } } static void S32A_Blend_BlitRow32(SkPMColor* SK_RESTRICT dst, const SkPMColor* SK_RESTRICT src, int count, U8CPU alpha) { SkASSERT(alpha <= 255); if (count > 0) { #ifdef UNROLL if (count & 1) { *dst = SkBlendARGB32(*(src++), *dst, alpha); dst += 1; count -= 1; } const SkPMColor* SK_RESTRICT srcEnd = src + count; while (src != srcEnd) { *dst = SkBlendARGB32(*(src++), *dst, alpha); dst += 1; *dst = SkBlendARGB32(*(src++), *dst, alpha); dst += 1; } #else do { *dst = SkBlendARGB32(*src, *dst, alpha); src += 1; dst += 1; } while (--count > 0); #endif } } /////////////////////////////////////////////////////////////////////////////// static const SkBlitRow::Proc32 gDefault_Procs32[] = { S32_Opaque_BlitRow32, S32_Blend_BlitRow32, nullptr, S32A_Blend_BlitRow32 }; SkBlitRow::Proc32 SkBlitRow::Factory32(unsigned flags) { SkASSERT(flags < SK_ARRAY_COUNT(gDefault_Procs32)); // just so we don't crash flags &= kFlags32_Mask; if (flags == 2) { // S32A_Opaque_BlitRow32 has been ported to SkOpts, but not the others yet. return SkOpts::blit_row_s32a_opaque; } SkBlitRow::Proc32 proc = PlatformProcs32(flags); if (nullptr == proc) { proc = gDefault_Procs32[flags]; } SkASSERT(proc); return proc; } void SkBlitRow::Color32(SkPMColor dst[], const SkPMColor src[], int count, SkPMColor color) { switch (SkGetPackedA32(color)) { case 0: memmove(dst, src, count * sizeof(SkPMColor)); return; case 255: sk_memset32(dst, color, count); return; } return SkOpts::blit_row_color32(dst, src, count, color); }