blob: 9494557d92401a76be1048667b77415e38f54de2 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001/*
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 */
reed@google.com58af9a62011-10-12 13:43:52 +00007
reed@android.comc4cae852009-09-23 15:06:10 +00008#include "SkBlitRow.h"
reed@google.com58af9a62011-10-12 13:43:52 +00009#include "SkBlitMask.h"
reed@android.comc4cae852009-09-23 15:06:10 +000010#include "SkColorPriv.h"
mtklein4a37d082015-09-10 10:38:02 -070011#include "SkOpts.h"
reed@android.comc4cae852009-09-23 15:06:10 +000012#include "SkUtils.h"
13
djsollen@google.com57f49692011-02-23 20:46:31 +000014#define UNROLL
15
reed@android.comc4cae852009-09-23 15:06:10 +000016static void S32_Opaque_BlitRow32(SkPMColor* SK_RESTRICT dst,
17 const SkPMColor* SK_RESTRICT src,
18 int count, U8CPU alpha) {
19 SkASSERT(255 == alpha);
mtklein58fd2c82015-07-27 11:08:28 -070020 memcpy(dst, src, count * 4);
reed@android.comc4cae852009-09-23 15:06:10 +000021}
22
23static 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);
djsollen@google.com57f49692011-02-23 20:46:31 +000029
30#ifdef UNROLL
31 if (count & 1) {
lsalzman40254c22016-08-05 11:48:45 -070032 *dst = SkPMLerp(*src, *dst, src_scale);
33 src += 1;
djsollen@google.com57f49692011-02-23 20:46:31 +000034 dst += 1;
35 count -= 1;
36 }
37
38 const SkPMColor* SK_RESTRICT srcEnd = src + count;
39 while (src != srcEnd) {
lsalzman40254c22016-08-05 11:48:45 -070040 *dst = SkPMLerp(*src, *dst, src_scale);
41 src += 1;
djsollen@google.com57f49692011-02-23 20:46:31 +000042 dst += 1;
lsalzman40254c22016-08-05 11:48:45 -070043 *dst = SkPMLerp(*src, *dst, src_scale);
44 src += 1;
djsollen@google.com57f49692011-02-23 20:46:31 +000045 dst += 1;
46 }
47#else
reed@android.comc4cae852009-09-23 15:06:10 +000048 do {
lsalzman40254c22016-08-05 11:48:45 -070049 *dst = SkPMLerp(*src, *dst, src_scale);
reed@android.comc4cae852009-09-23 15:06:10 +000050 src += 1;
51 dst += 1;
52 } while (--count > 0);
djsollen@google.com57f49692011-02-23 20:46:31 +000053#endif
reed@android.comc4cae852009-09-23 15:06:10 +000054 }
55}
56
reed@android.comc4cae852009-09-23 15:06:10 +000057static 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) {
djsollen@google.com57f49692011-02-23 20:46:31 +000062#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
reed@android.comc4cae852009-09-23 15:06:10 +000077 do {
78 *dst = SkBlendARGB32(*src, *dst, alpha);
79 src += 1;
80 dst += 1;
81 } while (--count > 0);
djsollen@google.com57f49692011-02-23 20:46:31 +000082#endif
reed@android.comc4cae852009-09-23 15:06:10 +000083 }
84}
85
86///////////////////////////////////////////////////////////////////////////////
87
88static const SkBlitRow::Proc32 gDefault_Procs32[] = {
89 S32_Opaque_BlitRow32,
90 S32_Blend_BlitRow32,
mtkleinb4a7dc92016-03-23 06:29:12 -070091 nullptr,
reed@android.comc4cae852009-09-23 15:06:10 +000092 S32A_Blend_BlitRow32
93};
94
95SkBlitRow::Proc32 SkBlitRow::Factory32(unsigned flags) {
96 SkASSERT(flags < SK_ARRAY_COUNT(gDefault_Procs32));
97 // just so we don't crash
98 flags &= kFlags32_Mask;
reed@google.com981d4792011-03-09 12:55:47 +000099
mtkleinb4a7dc92016-03-23 06:29:12 -0700100 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
senorblanco@chromium.org92727612009-11-04 20:51:06 +0000105 SkBlitRow::Proc32 proc = PlatformProcs32(flags);
halcanary96fcdcc2015-08-27 07:41:13 -0700106 if (nullptr == proc) {
reed@android.comc4cae852009-09-23 15:06:10 +0000107 proc = gDefault_Procs32[flags];
108 }
109 SkASSERT(proc);
110 return proc;
111}
112
mtklein95cc0122015-04-27 15:11:01 -0700113void SkBlitRow::Color32(SkPMColor dst[], const SkPMColor src[], int count, SkPMColor color) {
mtkleinafe2ffb2015-04-17 11:00:54 -0700114 switch (SkGetPackedA32(color)) {
115 case 0: memmove(dst, src, count * sizeof(SkPMColor)); return;
116 case 255: sk_memset32(dst, color, count); return;
117 }
mtklein4a37d082015-09-10 10:38:02 -0700118 return SkOpts::blit_row_color32(dst, src, count, color);
reed@android.comc4cae852009-09-23 15:06:10 +0000119}