blob: 99f40eca56084ab40b6cb2212137ebaab3604c37 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
reed@android.com152f7482009-08-07 19:14:34 +00002/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00003 * Copyright 2009 The Android Open Source Project
reed@android.com152f7482009-08-07 19:14:34 +00004 *
epoger@google.comec3ed6a2011-07-28 14:26:00 +00005 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
reed@android.com152f7482009-08-07 19:14:34 +00007 */
8
epoger@google.comec3ed6a2011-07-28 14:26:00 +00009
reed@android.com152f7482009-08-07 19:14:34 +000010#include "SkColorPriv.h"
11
reed@android.com879a2522009-10-26 19:15:43 +000012/*
13 Filter_32_opaque
rmistry@google.comfbfcd562012-08-23 18:09:54 +000014
reed@android.com879a2522009-10-26 19:15:43 +000015 There is no hard-n-fast rule that the filtering must produce
16 exact results for the color components, but if the 4 incoming colors are
17 all opaque, then the output color must also be opaque. Subsequent parts of
18 the drawing pipeline may rely on this (e.g. which blitrow proc to use).
19 */
20
digit@google.com3ada0ef2012-08-13 14:06:34 +000021static inline void Filter_32_opaque(unsigned x, unsigned y,
reed@android.com152f7482009-08-07 19:14:34 +000022 SkPMColor a00, SkPMColor a01,
23 SkPMColor a10, SkPMColor a11,
digit@google.com3ada0ef2012-08-13 14:06:34 +000024 SkPMColor* dstColor) {
reed@android.com152f7482009-08-07 19:14:34 +000025 SkASSERT((unsigned)x <= 0xF);
26 SkASSERT((unsigned)y <= 0xF);
rmistry@google.comfbfcd562012-08-23 18:09:54 +000027
reed@android.com152f7482009-08-07 19:14:34 +000028 int xy = x * y;
commit-bot@chromium.orgf31fa242014-05-12 15:38:00 +000029 const uint32_t mask = 0xFF00FF;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000030
reed@android.com152f7482009-08-07 19:14:34 +000031 int scale = 256 - 16*y - 16*x + xy;
32 uint32_t lo = (a00 & mask) * scale;
33 uint32_t hi = ((a00 >> 8) & mask) * scale;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000034
reed@android.com152f7482009-08-07 19:14:34 +000035 scale = 16*x - xy;
36 lo += (a01 & mask) * scale;
37 hi += ((a01 >> 8) & mask) * scale;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000038
reed@android.com152f7482009-08-07 19:14:34 +000039 scale = 16*y - xy;
40 lo += (a10 & mask) * scale;
41 hi += ((a10 >> 8) & mask) * scale;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000042
reed@android.com152f7482009-08-07 19:14:34 +000043 lo += (a11 & mask) * xy;
44 hi += ((a11 >> 8) & mask) * xy;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000045
reed@android.com152f7482009-08-07 19:14:34 +000046 *dstColor = ((lo >> 8) & mask) | (hi & ~mask);
47}
48
digit@google.com3ada0ef2012-08-13 14:06:34 +000049static inline void Filter_32_alpha(unsigned x, unsigned y,
50 SkPMColor a00, SkPMColor a01,
51 SkPMColor a10, SkPMColor a11,
52 SkPMColor* dstColor,
53 unsigned alphaScale) {
reed@android.com152f7482009-08-07 19:14:34 +000054 SkASSERT((unsigned)x <= 0xF);
55 SkASSERT((unsigned)y <= 0xF);
56 SkASSERT(alphaScale <= 256);
rmistry@google.comfbfcd562012-08-23 18:09:54 +000057
reed@android.com152f7482009-08-07 19:14:34 +000058 int xy = x * y;
commit-bot@chromium.orgf31fa242014-05-12 15:38:00 +000059 const uint32_t mask = 0xFF00FF;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000060
reed@android.com152f7482009-08-07 19:14:34 +000061 int scale = 256 - 16*y - 16*x + xy;
62 uint32_t lo = (a00 & mask) * scale;
63 uint32_t hi = ((a00 >> 8) & mask) * scale;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000064
reed@android.com152f7482009-08-07 19:14:34 +000065 scale = 16*x - xy;
66 lo += (a01 & mask) * scale;
67 hi += ((a01 >> 8) & mask) * scale;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000068
reed@android.com152f7482009-08-07 19:14:34 +000069 scale = 16*y - xy;
70 lo += (a10 & mask) * scale;
71 hi += ((a10 >> 8) & mask) * scale;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000072
reed@android.com152f7482009-08-07 19:14:34 +000073 lo += (a11 & mask) * xy;
74 hi += ((a11 >> 8) & mask) * xy;
75
76 lo = ((lo >> 8) & mask) * alphaScale;
77 hi = ((hi >> 8) & mask) * alphaScale;
78
79 *dstColor = ((lo >> 8) & mask) | (hi & ~mask);
80}
reed@android.com152f7482009-08-07 19:14:34 +000081
robertphillips@google.com8b8bf4d2013-01-18 16:38:40 +000082// Two color version, where we filter only along 1 axis
83static inline void Filter_32_opaque(unsigned t,
84 SkPMColor color0,
85 SkPMColor color1,
86 SkPMColor* dstColor) {
87 SkASSERT((unsigned)t <= 0xF);
88
commit-bot@chromium.orgf31fa242014-05-12 15:38:00 +000089 const uint32_t mask = 0xFF00FF;
robertphillips@google.com8b8bf4d2013-01-18 16:38:40 +000090
91 int scale = 256 - 16*t;
92 uint32_t lo = (color0 & mask) * scale;
93 uint32_t hi = ((color0 >> 8) & mask) * scale;
94
95 scale = 16*t;
96 lo += (color1 & mask) * scale;
97 hi += ((color1 >> 8) & mask) * scale;
98
99 *dstColor = ((lo >> 8) & mask) | (hi & ~mask);
100}
101
102// Two color version, where we filter only along 1 axis
103static inline void Filter_32_alpha(unsigned t,
104 SkPMColor color0,
105 SkPMColor color1,
106 SkPMColor* dstColor,
107 unsigned alphaScale) {
108 SkASSERT((unsigned)t <= 0xF);
109 SkASSERT(alphaScale <= 256);
110
commit-bot@chromium.orgf31fa242014-05-12 15:38:00 +0000111 const uint32_t mask = 0xFF00FF;
robertphillips@google.com8b8bf4d2013-01-18 16:38:40 +0000112
113 int scale = 256 - 16*t;
114 uint32_t lo = (color0 & mask) * scale;
115 uint32_t hi = ((color0 >> 8) & mask) * scale;
116
117 scale = 16*t;
118 lo += (color1 & mask) * scale;
119 hi += ((color1 >> 8) & mask) * scale;
120
121 lo = ((lo >> 8) & mask) * alphaScale;
122 hi = ((hi >> 8) & mask) * alphaScale;
123
124 *dstColor = ((lo >> 8) & mask) | (hi & ~mask);
125}