blob: a30b76d3b0e3d09dcfd5b45399d9ecdb3a37e214 [file] [log] [blame]
reed@android.com152f7482009-08-07 19:14:34 +00001/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00002 * Copyright 2009 The Android Open Source Project
reed@android.com152f7482009-08-07 19:14:34 +00003 *
epoger@google.comec3ed6a2011-07-28 14:26:00 +00004 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
reed@android.com152f7482009-08-07 19:14:34 +00006 */
7
epoger@google.comec3ed6a2011-07-28 14:26:00 +00008
Cary Clarka4083c92017-09-15 11:59:23 -04009#include "SkColorData.h"
reed@android.com152f7482009-08-07 19:14:34 +000010
reed@android.com879a2522009-10-26 19:15:43 +000011/*
12 Filter_32_opaque
rmistry@google.comfbfcd562012-08-23 18:09:54 +000013
reed@android.com879a2522009-10-26 19:15:43 +000014 There is no hard-n-fast rule that the filtering must produce
15 exact results for the color components, but if the 4 incoming colors are
16 all opaque, then the output color must also be opaque. Subsequent parts of
17 the drawing pipeline may rely on this (e.g. which blitrow proc to use).
18 */
19
digit@google.com3ada0ef2012-08-13 14:06:34 +000020static inline void Filter_32_opaque(unsigned x, unsigned y,
reed@android.com152f7482009-08-07 19:14:34 +000021 SkPMColor a00, SkPMColor a01,
22 SkPMColor a10, SkPMColor a11,
digit@google.com3ada0ef2012-08-13 14:06:34 +000023 SkPMColor* dstColor) {
reed@android.com152f7482009-08-07 19:14:34 +000024 SkASSERT((unsigned)x <= 0xF);
25 SkASSERT((unsigned)y <= 0xF);
rmistry@google.comfbfcd562012-08-23 18:09:54 +000026
reed@android.com152f7482009-08-07 19:14:34 +000027 int xy = x * y;
commit-bot@chromium.orgf31fa242014-05-12 15:38:00 +000028 const uint32_t mask = 0xFF00FF;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000029
reed@android.com152f7482009-08-07 19:14:34 +000030 int scale = 256 - 16*y - 16*x + xy;
31 uint32_t lo = (a00 & mask) * scale;
32 uint32_t hi = ((a00 >> 8) & mask) * scale;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000033
reed@android.com152f7482009-08-07 19:14:34 +000034 scale = 16*x - xy;
35 lo += (a01 & mask) * scale;
36 hi += ((a01 >> 8) & mask) * scale;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000037
reed@android.com152f7482009-08-07 19:14:34 +000038 scale = 16*y - xy;
39 lo += (a10 & mask) * scale;
40 hi += ((a10 >> 8) & mask) * scale;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000041
reed@android.com152f7482009-08-07 19:14:34 +000042 lo += (a11 & mask) * xy;
43 hi += ((a11 >> 8) & mask) * xy;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000044
reed@android.com152f7482009-08-07 19:14:34 +000045 *dstColor = ((lo >> 8) & mask) | (hi & ~mask);
46}
47
digit@google.com3ada0ef2012-08-13 14:06:34 +000048static inline void Filter_32_alpha(unsigned x, unsigned y,
49 SkPMColor a00, SkPMColor a01,
50 SkPMColor a10, SkPMColor a11,
51 SkPMColor* dstColor,
52 unsigned alphaScale) {
reed@android.com152f7482009-08-07 19:14:34 +000053 SkASSERT((unsigned)x <= 0xF);
54 SkASSERT((unsigned)y <= 0xF);
55 SkASSERT(alphaScale <= 256);
rmistry@google.comfbfcd562012-08-23 18:09:54 +000056
reed@android.com152f7482009-08-07 19:14:34 +000057 int xy = x * y;
commit-bot@chromium.orgf31fa242014-05-12 15:38:00 +000058 const uint32_t mask = 0xFF00FF;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000059
reed@android.com152f7482009-08-07 19:14:34 +000060 int scale = 256 - 16*y - 16*x + xy;
61 uint32_t lo = (a00 & mask) * scale;
62 uint32_t hi = ((a00 >> 8) & mask) * scale;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000063
reed@android.com152f7482009-08-07 19:14:34 +000064 scale = 16*x - xy;
65 lo += (a01 & mask) * scale;
66 hi += ((a01 >> 8) & mask) * scale;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000067
reed@android.com152f7482009-08-07 19:14:34 +000068 scale = 16*y - xy;
69 lo += (a10 & mask) * scale;
70 hi += ((a10 >> 8) & mask) * scale;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000071
reed@android.com152f7482009-08-07 19:14:34 +000072 lo += (a11 & mask) * xy;
73 hi += ((a11 >> 8) & mask) * xy;
74
75 lo = ((lo >> 8) & mask) * alphaScale;
76 hi = ((hi >> 8) & mask) * alphaScale;
77
78 *dstColor = ((lo >> 8) & mask) | (hi & ~mask);
79}
reed@android.com152f7482009-08-07 19:14:34 +000080
robertphillips@google.com8b8bf4d2013-01-18 16:38:40 +000081// Two color version, where we filter only along 1 axis
82static inline void Filter_32_opaque(unsigned t,
83 SkPMColor color0,
84 SkPMColor color1,
85 SkPMColor* dstColor) {
86 SkASSERT((unsigned)t <= 0xF);
87
commit-bot@chromium.orgf31fa242014-05-12 15:38:00 +000088 const uint32_t mask = 0xFF00FF;
robertphillips@google.com8b8bf4d2013-01-18 16:38:40 +000089
90 int scale = 256 - 16*t;
91 uint32_t lo = (color0 & mask) * scale;
92 uint32_t hi = ((color0 >> 8) & mask) * scale;
93
94 scale = 16*t;
95 lo += (color1 & mask) * scale;
96 hi += ((color1 >> 8) & mask) * scale;
97
98 *dstColor = ((lo >> 8) & mask) | (hi & ~mask);
99}
100
101// Two color version, where we filter only along 1 axis
102static inline void Filter_32_alpha(unsigned t,
103 SkPMColor color0,
104 SkPMColor color1,
105 SkPMColor* dstColor,
106 unsigned alphaScale) {
107 SkASSERT((unsigned)t <= 0xF);
108 SkASSERT(alphaScale <= 256);
109
commit-bot@chromium.orgf31fa242014-05-12 15:38:00 +0000110 const uint32_t mask = 0xFF00FF;
robertphillips@google.com8b8bf4d2013-01-18 16:38:40 +0000111
112 int scale = 256 - 16*t;
113 uint32_t lo = (color0 & mask) * scale;
114 uint32_t hi = ((color0 >> 8) & mask) * scale;
115
116 scale = 16*t;
117 lo += (color1 & mask) * scale;
118 hi += ((color1 >> 8) & mask) * scale;
119
120 lo = ((lo >> 8) & mask) * alphaScale;
121 hi = ((hi >> 8) & mask) * alphaScale;
122
123 *dstColor = ((lo >> 8) & mask) | (hi & ~mask);
124}