Home | History | Annotate | Download | only in core
      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