1cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams/*
2cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams * Copyright (C) 2012 The Android Open Source Project
3cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams *
4cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams * you may not use this file except in compliance with the License.
6cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams * You may obtain a copy of the License at
7cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams *
8cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams *
10cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams * Unless required by applicable law or agreed to in writing, software
11cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams * See the License for the specific language governing permissions and
14cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams * limitations under the License.
15cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams */
16cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
17cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
18709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "rsCpuIntrinsic.h"
19709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "rsCpuIntrinsicInlines.h"
20cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
21cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Samsusing namespace android;
22cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Samsusing namespace android::renderscript;
23cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
24709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace android {
25709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace renderscript {
26709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
27709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
28709a0978ae141198018ca9769f8d96292a8928e6Jason Samsclass RsdCpuScriptIntrinsicBlend : public RsdCpuScriptIntrinsic {
29709a0978ae141198018ca9769f8d96292a8928e6Jason Samspublic:
30c060f1435e7b9405f3be8974417fa6f410f03753Stephen Hines    void populateScript(Script *) override;
31709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
32c060f1435e7b9405f3be8974417fa6f410f03753Stephen Hines    ~RsdCpuScriptIntrinsicBlend() override;
33c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams    RsdCpuScriptIntrinsicBlend(RsdCpuReferenceImpl *ctx, const Script *s, const Element *e);
34709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
35709a0978ae141198018ca9769f8d96292a8928e6Jason Samsprotected:
36b0abb140ac51b93d1a85aadaa63fe057f2d29850David Gross    static void kernel(const RsExpandKernelDriverInfo *info, uint32_t xstart,
379ed79105cc6a8dbfaf959875249f36022cc2c798Chris Wailes                       uint32_t xend, uint32_t outstep);
38cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams};
39cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
40709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
41709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
42709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
43cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
44cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Samsenum {
45cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_CLEAR = 0,
46cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_SRC = 1,
47cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_DST = 2,
48cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_SRC_OVER = 3,
49cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_DST_OVER = 4,
50cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_SRC_IN = 5,
51cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_DST_IN = 6,
52cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_SRC_OUT = 7,
53cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_DST_OUT = 8,
54cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_SRC_ATOP = 9,
55cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_DST_ATOP = 10,
56cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_XOR = 11,
57cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
58cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_NORMAL = 12,
59cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_AVERAGE = 13,
60cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_MULTIPLY = 14,
61cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_SCREEN = 15,
62cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_DARKEN = 16,
63cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_LIGHTEN = 17,
64cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_OVERLAY = 18,
65cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_HARDLIGHT = 19,
66cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_SOFTLIGHT = 20,
67cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_DIFFERENCE = 21,
68cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_NEGATION = 22,
69cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_EXCLUSION = 23,
70cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_COLOR_DODGE = 24,
71cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_INVERSE_COLOR_DODGE = 25,
72cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_SOFT_DODGE = 26,
73cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_COLOR_BURN = 27,
74cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_INVERSE_COLOR_BURN = 28,
75cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_SOFT_BURN = 29,
76cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_REFLECT = 30,
77cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_GLOW = 31,
78cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_FREEZE = 32,
79cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_HEAT = 33,
80cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_ADD = 34,
81cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_SUBTRACT = 35,
82cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_STAMP = 36,
83cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_RED = 37,
84cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_GREEN = 38,
85cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_BLUE = 39,
86cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_HUE = 40,
87cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_SATURATION = 41,
88cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_COLOR = 42,
89cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_LUMINOSITY = 43
90cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams};
91cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
92074424a4ac5b093331df2c92e7a5bcbfff136b71Jason Sams#if defined(ARCH_ARM_USE_INTRINSICS)
935d06919bc8019322180ea34768a7a4137fa64d11Simon Hosieextern "C" int rsdIntrinsicBlend_K(uchar4 *out, uchar4 const *in, int slot,
945d06919bc8019322180ea34768a7a4137fa64d11Simon Hosie                    uint32_t xstart, uint32_t xend);
957b7060c61e4182b29186849c5a857ea5f0898e56Rose, James#endif
967b7060c61e4182b29186849c5a857ea5f0898e56Rose, James
977b7060c61e4182b29186849c5a857ea5f0898e56Rose, James#if defined(ARCH_X86_HAVE_SSSE3)
98ebf0eb95cba9579af7cb67205b94b286f221c4edDan Albertextern void rsdIntrinsicBlendSrcOver_K(void *dst, const void *src, uint32_t count8);
99ebf0eb95cba9579af7cb67205b94b286f221c4edDan Albertextern void rsdIntrinsicBlendDstOver_K(void *dst, const void *src, uint32_t count8);
100ebf0eb95cba9579af7cb67205b94b286f221c4edDan Albertextern void rsdIntrinsicBlendSrcIn_K(void *dst, const void *src, uint32_t count8);
101ebf0eb95cba9579af7cb67205b94b286f221c4edDan Albertextern void rsdIntrinsicBlendDstIn_K(void *dst, const void *src, uint32_t count8);
102ebf0eb95cba9579af7cb67205b94b286f221c4edDan Albertextern void rsdIntrinsicBlendSrcOut_K(void *dst, const void *src, uint32_t count8);
103ebf0eb95cba9579af7cb67205b94b286f221c4edDan Albertextern void rsdIntrinsicBlendDstOut_K(void *dst, const void *src, uint32_t count8);
104ebf0eb95cba9579af7cb67205b94b286f221c4edDan Albertextern void rsdIntrinsicBlendSrcAtop_K(void *dst, const void *src, uint32_t count8);
105ebf0eb95cba9579af7cb67205b94b286f221c4edDan Albertextern void rsdIntrinsicBlendDstAtop_K(void *dst, const void *src, uint32_t count8);
106ebf0eb95cba9579af7cb67205b94b286f221c4edDan Albertextern void rsdIntrinsicBlendXor_K(void *dst, const void *src, uint32_t count8);
107ebf0eb95cba9579af7cb67205b94b286f221c4edDan Albertextern void rsdIntrinsicBlendMultiply_K(void *dst, const void *src, uint32_t count8);
108ebf0eb95cba9579af7cb67205b94b286f221c4edDan Albertextern void rsdIntrinsicBlendAdd_K(void *dst, const void *src, uint32_t count8);
109ebf0eb95cba9579af7cb67205b94b286f221c4edDan Albertextern void rsdIntrinsicBlendSub_K(void *dst, const void *src, uint32_t count8);
1107b7060c61e4182b29186849c5a857ea5f0898e56Rose, James#endif
111fa17cda2d7e0948677035890e40498ad0b639c92Jason Sams
112b0abb140ac51b93d1a85aadaa63fe057f2d29850David Grossvoid RsdCpuScriptIntrinsicBlend::kernel(const RsExpandKernelDriverInfo *info,
113709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                        uint32_t xstart, uint32_t xend,
1149ed79105cc6a8dbfaf959875249f36022cc2c798Chris Wailes                                        uint32_t outstep) {
115b0abb140ac51b93d1a85aadaa63fe057f2d29850David Gross    RsdCpuScriptIntrinsicBlend *cp = (RsdCpuScriptIntrinsicBlend *)info->usr;
11636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray
11736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    // instep/outstep can be ignored--sizeof(uchar4) known at compile time
118b0abb140ac51b93d1a85aadaa63fe057f2d29850David Gross    uchar4 *out = (uchar4 *)info->outPtr[0];
119b0abb140ac51b93d1a85aadaa63fe057f2d29850David Gross    uchar4 *in = (uchar4 *)info->inPtr[0];
120cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    uint32_t x1 = xstart;
121cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    uint32_t x2 = xend;
122cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
123644d5943a78b3d84a21a617e7fd7fcd8cff4500aMiao Wang#if defined(ARCH_ARM_USE_INTRINSICS)
124820e22b13fb48bc4719fa606ee4bc47e184970e0Stephen Hines    // Bug: 22047392 - Skip optimized version for BLEND_DST_ATOP until this
125820e22b13fb48bc4719fa606ee4bc47e184970e0Stephen Hines    // been fixed.
126820e22b13fb48bc4719fa606ee4bc47e184970e0Stephen Hines    if (gArchUseSIMD && info->slot != BLEND_DST_ATOP) {
127b0abb140ac51b93d1a85aadaa63fe057f2d29850David Gross        if (rsdIntrinsicBlend_K(out, in, info->slot, x1, x2) >= 0)
1285d06919bc8019322180ea34768a7a4137fa64d11Simon Hosie            return;
1295d06919bc8019322180ea34768a7a4137fa64d11Simon Hosie    }
1305d06919bc8019322180ea34768a7a4137fa64d11Simon Hosie#endif
131b0abb140ac51b93d1a85aadaa63fe057f2d29850David Gross    switch (info->slot) {
132cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    case BLEND_CLEAR:
133cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams        for (;x1 < x2; x1++, out++) {
134cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams            *out = 0;
135cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams        }
136cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams        break;
137cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    case BLEND_SRC:
138cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams        for (;x1 < x2; x1++, out++, in++) {
13936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray          *out = *in;
140cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams        }
141cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams        break;
14236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    //BLEND_DST is a NOP
143cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    case BLEND_DST:
14436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
14536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_SRC_OVER:
1467b7060c61e4182b29186849c5a857ea5f0898e56Rose, James    #if defined(ARCH_X86_HAVE_SSSE3)
1477b7060c61e4182b29186849c5a857ea5f0898e56Rose, James        if (gArchUseSIMD) {
1487b7060c61e4182b29186849c5a857ea5f0898e56Rose, James            if ((x1 + 8) < x2) {
1497b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                uint32_t len = (x2 - x1) >> 3;
1507b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                rsdIntrinsicBlendSrcOver_K(out, in, len);
1517b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                x1 += len << 3;
1527b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                out += len << 3;
1537b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                in += len << 3;
1547b7060c61e4182b29186849c5a857ea5f0898e56Rose, James            }
1557b7060c61e4182b29186849c5a857ea5f0898e56Rose, James        }
1567b7060c61e4182b29186849c5a857ea5f0898e56Rose, James    #endif
157cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams        for (;x1 < x2; x1++, out++, in++) {
15836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            short4 in_s = convert_short4(*in);
15936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            short4 out_s = convert_short4(*out);
1600b575de8ed0b628d84d256f5846500b0385979bdTim Murray            in_s = in_s + ((out_s * (short4)(255 - in_s.w)) >> (short4)8);
16136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            *out = convert_uchar4(in_s);
162cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams        }
163cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams        break;
16436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_DST_OVER:
1657b7060c61e4182b29186849c5a857ea5f0898e56Rose, James    #if defined(ARCH_X86_HAVE_SSSE3)
1667b7060c61e4182b29186849c5a857ea5f0898e56Rose, James        if (gArchUseSIMD) {
1677b7060c61e4182b29186849c5a857ea5f0898e56Rose, James            if ((x1 + 8) < x2) {
1687b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                uint32_t len = (x2 - x1) >> 3;
1697b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                rsdIntrinsicBlendDstOver_K(out, in, len);
1707b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                x1 += len << 3;
1717b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                out += len << 3;
1727b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                in += len << 3;
1737b7060c61e4182b29186849c5a857ea5f0898e56Rose, James            }
1747b7060c61e4182b29186849c5a857ea5f0898e56Rose, James        }
1757b7060c61e4182b29186849c5a857ea5f0898e56Rose, James     #endif
17636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        for (;x1 < x2; x1++, out++, in++) {
17736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            short4 in_s = convert_short4(*in);
17836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            short4 out_s = convert_short4(*out);
1790b575de8ed0b628d84d256f5846500b0385979bdTim Murray            in_s = out_s + ((in_s * (short4)(255 - out_s.w)) >> (short4)8);
18036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            *out = convert_uchar4(in_s);
18136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        }
18236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
18336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_SRC_IN:
1847b7060c61e4182b29186849c5a857ea5f0898e56Rose, James    #if defined(ARCH_X86_HAVE_SSSE3)
1857b7060c61e4182b29186849c5a857ea5f0898e56Rose, James        if (gArchUseSIMD) {
1867b7060c61e4182b29186849c5a857ea5f0898e56Rose, James            if ((x1 + 8) < x2) {
1877b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                uint32_t len = (x2 - x1) >> 3;
1887b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                rsdIntrinsicBlendSrcIn_K(out, in, len);
1897b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                x1 += len << 3;
1907b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                out += len << 3;
1917b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                in += len << 3;
1927b7060c61e4182b29186849c5a857ea5f0898e56Rose, James            }
1937b7060c61e4182b29186849c5a857ea5f0898e56Rose, James        }
1947b7060c61e4182b29186849c5a857ea5f0898e56Rose, James    #endif
19536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        for (;x1 < x2; x1++, out++, in++) {
19636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            short4 in_s = convert_short4(*in);
1970b575de8ed0b628d84d256f5846500b0385979bdTim Murray            in_s = (in_s * out->w) >> (short4)8;
19836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            *out = convert_uchar4(in_s);
19936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        }
20036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
20136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_DST_IN:
2027b7060c61e4182b29186849c5a857ea5f0898e56Rose, James    #if defined(ARCH_X86_HAVE_SSSE3)
2037b7060c61e4182b29186849c5a857ea5f0898e56Rose, James        if (gArchUseSIMD) {
2047b7060c61e4182b29186849c5a857ea5f0898e56Rose, James            if ((x1 + 8) < x2) {
2057b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                uint32_t len = (x2 - x1) >> 3;
2067b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                rsdIntrinsicBlendDstIn_K(out, in, len);
2077b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                x1 += len << 3;
2087b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                out += len << 3;
2097b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                in += len << 3;
2107b7060c61e4182b29186849c5a857ea5f0898e56Rose, James            }
2117b7060c61e4182b29186849c5a857ea5f0898e56Rose, James        }
2127b7060c61e4182b29186849c5a857ea5f0898e56Rose, James     #endif
21336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        for (;x1 < x2; x1++, out++, in++) {
21436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            short4 out_s = convert_short4(*out);
2150b575de8ed0b628d84d256f5846500b0385979bdTim Murray            out_s = (out_s * in->w) >> (short4)8;
21636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            *out = convert_uchar4(out_s);
21736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        }
21836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
21936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_SRC_OUT:
2207b7060c61e4182b29186849c5a857ea5f0898e56Rose, James    #if defined(ARCH_X86_HAVE_SSSE3)
2217b7060c61e4182b29186849c5a857ea5f0898e56Rose, James        if (gArchUseSIMD) {
2227b7060c61e4182b29186849c5a857ea5f0898e56Rose, James            if ((x1 + 8) < x2) {
2237b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                uint32_t len = (x2 - x1) >> 3;
2247b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                rsdIntrinsicBlendSrcOut_K(out, in, len);
2257b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                x1 += len << 3;
2267b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                out += len << 3;
2277b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                in += len << 3;
2287b7060c61e4182b29186849c5a857ea5f0898e56Rose, James            }
2297b7060c61e4182b29186849c5a857ea5f0898e56Rose, James        }
2307b7060c61e4182b29186849c5a857ea5f0898e56Rose, James    #endif
23136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        for (;x1 < x2; x1++, out++, in++) {
23236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            short4 in_s = convert_short4(*in);
2330b575de8ed0b628d84d256f5846500b0385979bdTim Murray            in_s = (in_s * (short4)(255 - out->w)) >> (short4)8;
23436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            *out = convert_uchar4(in_s);
23536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        }
23636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
23736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_DST_OUT:
2387b7060c61e4182b29186849c5a857ea5f0898e56Rose, James    #if defined(ARCH_X86_HAVE_SSSE3)
2397b7060c61e4182b29186849c5a857ea5f0898e56Rose, James        if (gArchUseSIMD) {
2407b7060c61e4182b29186849c5a857ea5f0898e56Rose, James            if ((x1 + 8) < x2) {
2417b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                uint32_t len = (x2 - x1) >> 3;
2427b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                rsdIntrinsicBlendDstOut_K(out, in, len);
2437b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                x1 += len << 3;
2447b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                out += len << 3;
2457b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                in += len << 3;
2467b7060c61e4182b29186849c5a857ea5f0898e56Rose, James            }
2477b7060c61e4182b29186849c5a857ea5f0898e56Rose, James        }
2487b7060c61e4182b29186849c5a857ea5f0898e56Rose, James    #endif
24936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        for (;x1 < x2; x1++, out++, in++) {
25036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            short4 out_s = convert_short4(*out);
2510b575de8ed0b628d84d256f5846500b0385979bdTim Murray            out_s = (out_s * (short4)(255 - in->w)) >> (short4)8;
25236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            *out = convert_uchar4(out_s);
25336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        }
25436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
25536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_SRC_ATOP:
2567b7060c61e4182b29186849c5a857ea5f0898e56Rose, James    #if defined(ARCH_X86_HAVE_SSSE3)
2577b7060c61e4182b29186849c5a857ea5f0898e56Rose, James        if (gArchUseSIMD) {
2587b7060c61e4182b29186849c5a857ea5f0898e56Rose, James            if ((x1 + 8) < x2) {
2597b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                uint32_t len = (x2 - x1) >> 3;
2607b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                rsdIntrinsicBlendSrcAtop_K(out, in, len);
2617b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                x1 += len << 3;
2627b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                out += len << 3;
2637b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                in += len << 3;
2647b7060c61e4182b29186849c5a857ea5f0898e56Rose, James            }
2657b7060c61e4182b29186849c5a857ea5f0898e56Rose, James        }
2667b7060c61e4182b29186849c5a857ea5f0898e56Rose, James    #endif
26736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        for (;x1 < x2; x1++, out++, in++) {
26836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            short4 in_s = convert_short4(*in);
26936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            short4 out_s = convert_short4(*out);
2700b575de8ed0b628d84d256f5846500b0385979bdTim Murray            out_s.xyz = ((in_s.xyz * out_s.w) +
2710b575de8ed0b628d84d256f5846500b0385979bdTim Murray              (out_s.xyz * ((short3)255 - (short3)in_s.w))) >> (short3)8;
27236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            *out = convert_uchar4(out_s);
27336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        }
27436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
27536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_DST_ATOP:
2767b7060c61e4182b29186849c5a857ea5f0898e56Rose, James    #if defined(ARCH_X86_HAVE_SSSE3)
2777b7060c61e4182b29186849c5a857ea5f0898e56Rose, James        if (gArchUseSIMD) {
2787b7060c61e4182b29186849c5a857ea5f0898e56Rose, James            if ((x1 + 8) < x2) {
2797b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                uint32_t len = (x2 - x1) >> 3;
2807b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                rsdIntrinsicBlendDstAtop_K(out, in, len);
2817b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                x1 += len << 3;
2827b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                out += len << 3;
2837b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                in += len << 3;
2847b7060c61e4182b29186849c5a857ea5f0898e56Rose, James            }
2857b7060c61e4182b29186849c5a857ea5f0898e56Rose, James        }
2867b7060c61e4182b29186849c5a857ea5f0898e56Rose, James     #endif
28736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        for (;x1 < x2; x1++, out++, in++) {
28836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            short4 in_s = convert_short4(*in);
28936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            short4 out_s = convert_short4(*out);
2900b575de8ed0b628d84d256f5846500b0385979bdTim Murray            out_s.xyz = ((out_s.xyz * in_s.w) +
2910b575de8ed0b628d84d256f5846500b0385979bdTim Murray              (in_s.xyz * ((short3)255 - (short3)out_s.w))) >> (short3)8;
292820e22b13fb48bc4719fa606ee4bc47e184970e0Stephen Hines            out_s.w = in_s.w;
29336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            *out = convert_uchar4(out_s);
29436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        }
29536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
29636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_XOR:
2977b7060c61e4182b29186849c5a857ea5f0898e56Rose, James    #if defined(ARCH_X86_HAVE_SSSE3)
2987b7060c61e4182b29186849c5a857ea5f0898e56Rose, James        if (gArchUseSIMD) {
2997b7060c61e4182b29186849c5a857ea5f0898e56Rose, James            if ((x1 + 8) < x2) {
3007b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                uint32_t len = (x2 - x1) >> 3;
3017b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                rsdIntrinsicBlendXor_K(out, in, len);
3027b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                x1 += len << 3;
3037b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                out += len << 3;
3047b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                in += len << 3;
3057b7060c61e4182b29186849c5a857ea5f0898e56Rose, James            }
3067b7060c61e4182b29186849c5a857ea5f0898e56Rose, James        }
3077b7060c61e4182b29186849c5a857ea5f0898e56Rose, James    #endif
30836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        for (;x1 < x2; x1++, out++, in++) {
30936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            *out = *in ^ *out;
31036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        }
31136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
31236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_NORMAL:
31336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_NORMAL");
31436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
31536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
31636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_AVERAGE:
31736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_AVERAGE");
31836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
31936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
32036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_MULTIPLY:
3217b7060c61e4182b29186849c5a857ea5f0898e56Rose, James    #if defined(ARCH_X86_HAVE_SSSE3)
3227b7060c61e4182b29186849c5a857ea5f0898e56Rose, James        if (gArchUseSIMD) {
3237b7060c61e4182b29186849c5a857ea5f0898e56Rose, James            if ((x1 + 8) < x2) {
3247b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                uint32_t len = (x2 - x1) >> 3;
3257b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                rsdIntrinsicBlendMultiply_K(out, in, len);
3267b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                x1 += len << 3;
3277b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                out += len << 3;
3287b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                in += len << 3;
3297b7060c61e4182b29186849c5a857ea5f0898e56Rose, James            }
3307b7060c61e4182b29186849c5a857ea5f0898e56Rose, James        }
3317b7060c61e4182b29186849c5a857ea5f0898e56Rose, James    #endif
33236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        for (;x1 < x2; x1++, out++, in++) {
33336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray          *out = convert_uchar4((convert_short4(*in) * convert_short4(*out))
33436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray                                >> (short4)8);
33536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        }
33636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
33736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_SCREEN:
33836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_SCREEN");
33936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
34036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
34136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_DARKEN:
34236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_DARKEN");
34336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
34436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
34536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_LIGHTEN:
34636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_LIGHTEN");
34736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
34836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
34936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_OVERLAY:
35036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_OVERLAY");
35136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
35236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
35336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_HARDLIGHT:
35436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_HARDLIGHT");
35536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
35636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
35736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_SOFTLIGHT:
35836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_SOFTLIGHT");
35936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
36036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
36136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_DIFFERENCE:
36236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_DIFFERENCE");
36336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
36436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
36536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_NEGATION:
36636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_NEGATION");
36736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
36836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
36936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_EXCLUSION:
37036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_EXCLUSION");
37136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
37236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
37336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_COLOR_DODGE:
37436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_COLOR_DODGE");
37536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
37636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
37736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_INVERSE_COLOR_DODGE:
37836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_INVERSE_COLOR_DODGE");
37936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
38036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
38136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_SOFT_DODGE:
38236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_SOFT_DODGE");
38336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
38436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
38536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_COLOR_BURN:
38636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_COLOR_BURN");
38736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
38836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
38936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_INVERSE_COLOR_BURN:
39036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_INVERSE_COLOR_BURN");
39136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
39236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
39336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_SOFT_BURN:
39436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_SOFT_BURN");
39536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
39636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
39736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_REFLECT:
39836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_REFLECT");
39936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
40036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
40136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_GLOW:
40236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_GLOW");
40336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
40436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
40536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_FREEZE:
40636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_FREEZE");
40736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
40836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
40936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_HEAT:
41036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_HEAT");
41136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
41236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
41336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_ADD:
4147b7060c61e4182b29186849c5a857ea5f0898e56Rose, James    #if defined(ARCH_X86_HAVE_SSSE3)
4157b7060c61e4182b29186849c5a857ea5f0898e56Rose, James        if (gArchUseSIMD) {
4167b7060c61e4182b29186849c5a857ea5f0898e56Rose, James            if((x1 + 8) < x2) {
4177b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                uint32_t len = (x2 - x1) >> 3;
4187b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                rsdIntrinsicBlendAdd_K(out, in, len);
4197b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                x1 += len << 3;
4207b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                out += len << 3;
4217b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                in += len << 3;
4227b7060c61e4182b29186849c5a857ea5f0898e56Rose, James            }
4237b7060c61e4182b29186849c5a857ea5f0898e56Rose, James        }
4247b7060c61e4182b29186849c5a857ea5f0898e56Rose, James    #endif
42536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        for (;x1 < x2; x1++, out++, in++) {
4260b575de8ed0b628d84d256f5846500b0385979bdTim Murray            uint32_t iR = in->x, iG = in->y, iB = in->z, iA = in->w,
4270b575de8ed0b628d84d256f5846500b0385979bdTim Murray                oR = out->x, oG = out->y, oB = out->z, oA = out->w;
4280b575de8ed0b628d84d256f5846500b0385979bdTim Murray            out->x = (oR + iR) > 255 ? 255 : oR + iR;
4290b575de8ed0b628d84d256f5846500b0385979bdTim Murray            out->y = (oG + iG) > 255 ? 255 : oG + iG;
4300b575de8ed0b628d84d256f5846500b0385979bdTim Murray            out->z = (oB + iB) > 255 ? 255 : oB + iB;
4310b575de8ed0b628d84d256f5846500b0385979bdTim Murray            out->w = (oA + iA) > 255 ? 255 : oA + iA;
43236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        }
43336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
43436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_SUBTRACT:
4357b7060c61e4182b29186849c5a857ea5f0898e56Rose, James    #if defined(ARCH_X86_HAVE_SSSE3)
4367b7060c61e4182b29186849c5a857ea5f0898e56Rose, James        if (gArchUseSIMD) {
4377b7060c61e4182b29186849c5a857ea5f0898e56Rose, James            if((x1 + 8) < x2) {
4387b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                uint32_t len = (x2 - x1) >> 3;
4397b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                rsdIntrinsicBlendSub_K(out, in, len);
4407b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                x1 += len << 3;
4417b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                out += len << 3;
4427b7060c61e4182b29186849c5a857ea5f0898e56Rose, James                in += len << 3;
4437b7060c61e4182b29186849c5a857ea5f0898e56Rose, James            }
4447b7060c61e4182b29186849c5a857ea5f0898e56Rose, James        }
4457b7060c61e4182b29186849c5a857ea5f0898e56Rose, James    #endif
44636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        for (;x1 < x2; x1++, out++, in++) {
4470b575de8ed0b628d84d256f5846500b0385979bdTim Murray            int32_t iR = in->x, iG = in->y, iB = in->z, iA = in->w,
4480b575de8ed0b628d84d256f5846500b0385979bdTim Murray                oR = out->x, oG = out->y, oB = out->z, oA = out->w;
4490b575de8ed0b628d84d256f5846500b0385979bdTim Murray            out->x = (oR - iR) < 0 ? 0 : oR - iR;
4500b575de8ed0b628d84d256f5846500b0385979bdTim Murray            out->y = (oG - iG) < 0 ? 0 : oG - iG;
4510b575de8ed0b628d84d256f5846500b0385979bdTim Murray            out->z = (oB - iB) < 0 ? 0 : oB - iB;
4520b575de8ed0b628d84d256f5846500b0385979bdTim Murray            out->w = (oA - iA) < 0 ? 0 : oA - iA;
45336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        }
45436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
45536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_STAMP:
45636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_STAMP");
45736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
45836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
45936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_RED:
46036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_RED");
46136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
46236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
46336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_GREEN:
46436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_GREEN");
46536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
46636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
46736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_BLUE:
46836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_BLUE");
46936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
47036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
47136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_HUE:
47236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_HUE");
47336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
47436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
47536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_SATURATION:
47636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_SATURATION");
47736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
47836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
47936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_COLOR:
48036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_COLOR");
48136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
48236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
48336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_LUMINOSITY:
48436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_LUMINOSITY");
48536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
48636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
487cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
48836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    default:
489b0abb140ac51b93d1a85aadaa63fe057f2d29850David Gross        ALOGE("Called unimplemented value %d", info->slot);
49036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
491cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
492cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    }
493cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams}
494cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
495cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
496c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason SamsRsdCpuScriptIntrinsicBlend::RsdCpuScriptIntrinsicBlend(RsdCpuReferenceImpl *ctx,
497c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams                                                       const Script *s, const Element *e)
498c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams            : RsdCpuScriptIntrinsic(ctx, s, e, RS_SCRIPT_INTRINSIC_ID_BLEND) {
499cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
500709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mRootPtr = &kernel;
501cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams}
502cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
503709a0978ae141198018ca9769f8d96292a8928e6Jason SamsRsdCpuScriptIntrinsicBlend::~RsdCpuScriptIntrinsicBlend() {
504709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
505709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
506709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicBlend::populateScript(Script *s) {
507709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    s->mHal.info.exportedVariableCount = 0;
508709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
509709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
510c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason SamsRsdCpuScriptImpl * rsdIntrinsic_Blend(RsdCpuReferenceImpl *ctx,
511c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams                                      const Script *s, const Element *e) {
512c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams    return new RsdCpuScriptIntrinsicBlend(ctx, s, e);
513709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
514