rsCpuIntrinsicBlend.cpp revision 36889a0ecf564e3d47e7f69bb030c6b927061792
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
18cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams#include "rsdCore.h"
19cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams#include "rsdIntrinsics.h"
20cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams#include "rsdAllocation.h"
21cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
22cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams#include "rsdIntrinsicInlines.h"
23cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
24cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Samsusing namespace android;
25cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Samsusing namespace android::renderscript;
26cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
27cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Samsstruct ConvolveParams {
28cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    float f[4];
29cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams};
30cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
31cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
32cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Samsstatic void One(const RsForEachStubParamStruct *p, uchar4 *out,
33cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams                const uchar4 *py, const float* coeff) {
34cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    float4 i = convert_float4(py[0]);
35cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
36cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    float4 sum;
37cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    sum.x = i.x * coeff[0] +
38cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams            i.y * coeff[4] +
39cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams            i.z * coeff[8] +
40cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams            i.w * coeff[12];
41cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    sum.y = i.x * coeff[1] +
42cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams            i.y * coeff[5] +
43cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams            i.z * coeff[9] +
44cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams            i.w * coeff[13];
45cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    sum.z = i.x * coeff[2] +
46cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams            i.y * coeff[6] +
47cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams            i.z * coeff[10] +
48cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams            i.w * coeff[14];
49cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    sum.w = i.x * coeff[3] +
50cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams            i.y * coeff[7] +
51cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams            i.z * coeff[11] +
52cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams            i.w * coeff[15];
53cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
54cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    sum.x = sum.x < 0 ? 0 : (sum.x > 255 ? 255 : sum.x);
55cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    sum.y = sum.y < 0 ? 0 : (sum.y > 255 ? 255 : sum.y);
56cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    sum.z = sum.z < 0 ? 0 : (sum.z > 255 ? 255 : sum.z);
57cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    sum.w = sum.w < 0 ? 0 : (sum.w > 255 ? 255 : sum.w);
58cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
59cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    *out = convert_uchar4(sum);
60cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams}
61cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
62cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Samsenum {
63cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_CLEAR = 0,
64cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_SRC = 1,
65cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_DST = 2,
66cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_SRC_OVER = 3,
67cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_DST_OVER = 4,
68cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_SRC_IN = 5,
69cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_DST_IN = 6,
70cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_SRC_OUT = 7,
71cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_DST_OUT = 8,
72cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_SRC_ATOP = 9,
73cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_DST_ATOP = 10,
74cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_XOR = 11,
75cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
76cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_NORMAL = 12,
77cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_AVERAGE = 13,
78cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_MULTIPLY = 14,
79cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_SCREEN = 15,
80cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_DARKEN = 16,
81cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_LIGHTEN = 17,
82cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_OVERLAY = 18,
83cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_HARDLIGHT = 19,
84cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_SOFTLIGHT = 20,
85cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_DIFFERENCE = 21,
86cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_NEGATION = 22,
87cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_EXCLUSION = 23,
88cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_COLOR_DODGE = 24,
89cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_INVERSE_COLOR_DODGE = 25,
90cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_SOFT_DODGE = 26,
91cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_COLOR_BURN = 27,
92cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_INVERSE_COLOR_BURN = 28,
93cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_SOFT_BURN = 29,
94cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_REFLECT = 30,
95cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_GLOW = 31,
96cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_FREEZE = 32,
97cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_HEAT = 33,
98cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_ADD = 34,
99cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_SUBTRACT = 35,
100cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_STAMP = 36,
101cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_RED = 37,
102cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_GREEN = 38,
103cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_BLUE = 39,
104cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_HUE = 40,
105cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_SATURATION = 41,
106cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_COLOR = 42,
107cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    BLEND_LUMINOSITY = 43
108cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams};
109cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
110cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Samsstatic void ColorMatrix_uchar4(const RsForEachStubParamStruct *p,
111cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams                               uint32_t xstart, uint32_t xend,
112cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams                               uint32_t instep, uint32_t outstep) {
113cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    ConvolveParams *cp = (ConvolveParams *)p->usr;
11436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray
11536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    // instep/outstep can be ignored--sizeof(uchar4) known at compile time
116cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    uchar4 *out = (uchar4 *)p->out;
117cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    uchar4 *in = (uchar4 *)p->in;
118cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    uint32_t x1 = xstart;
119cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    uint32_t x2 = xend;
120cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
121cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    in += xstart;
122cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    out += xstart;
123cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
124cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    switch (p->slot) {
125cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    case BLEND_CLEAR:
126cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams        for (;x1 < x2; x1++, out++) {
127cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams            *out = 0;
128cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams        }
129cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams        break;
130cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    case BLEND_SRC:
131cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams        for (;x1 < x2; x1++, out++, in++) {
13236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray          *out = *in;
133cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams        }
134cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams        break;
13536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    //BLEND_DST is a NOP
136cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    case BLEND_DST:
13736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
13836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_SRC_OVER:
139cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams        for (;x1 < x2; x1++, out++, in++) {
14036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            short4 in_s = convert_short4(*in);
14136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            short4 out_s = convert_short4(*out);
14236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            in_s = in_s + ((out_s * (short4)(255 - in_s.a)) >> (short4)8);
14336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            *out = convert_uchar4(in_s);
144cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams        }
145cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams        break;
14636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_DST_OVER:
14736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        for (;x1 < x2; x1++, out++, in++) {
14836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            short4 in_s = convert_short4(*in);
14936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            short4 out_s = convert_short4(*out);
15036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            in_s = out_s + ((in_s * (short4)(255 - out_s.a)) >> (short4)8);
15136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            *out = convert_uchar4(in_s);
15236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        }
15336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
15436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_SRC_IN:
15536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        for (;x1 < x2; x1++, out++, in++) {
15636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            short4 in_s = convert_short4(*in);
15736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            in_s = (in_s * out->a) >> (short4)8;
15836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            *out = convert_uchar4(in_s);
15936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        }
16036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
16136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_DST_IN:
16236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        for (;x1 < x2; x1++, out++, in++) {
16336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            short4 out_s = convert_short4(*out);
16436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            out_s = (out_s * in->a) >> (short4)8;
16536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            *out = convert_uchar4(out_s);
16636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        }
16736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
16836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_SRC_OUT:
16936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        for (;x1 < x2; x1++, out++, in++) {
17036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            short4 in_s = convert_short4(*in);
17136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            in_s = (in_s * (short4)(255 - out->a)) >> (short4)8;
17236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            *out = convert_uchar4(in_s);
17336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        }
17436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
17536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_DST_OUT:
17636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        for (;x1 < x2; x1++, out++, in++) {
17736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            short4 out_s = convert_short4(*out);
17836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            out_s = (out_s * (short4)(255 - in->a)) >> (short4)8;
17936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            *out = convert_uchar4(out_s);
18036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        }
18136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
18236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_SRC_ATOP:
18336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        for (;x1 < x2; x1++, out++, in++) {
18436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            short4 in_s = convert_short4(*in);
18536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            short4 out_s = convert_short4(*out);
18636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            out_s.rgb = ((in_s.rgb * out_s.a) >> (short3)8) +
18736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray              ((out_s.rgb * ((short3)255 - (short3)in_s.a)) >> (short3)8);
18836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            *out = convert_uchar4(out_s);
18936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        }
19036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
19136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_DST_ATOP:
19236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        for (;x1 < x2; x1++, out++, in++) {
19336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            short4 in_s = convert_short4(*in);
19436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            short4 out_s = convert_short4(*out);
19536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            out_s.rgb = ((out_s.rgb * in_s.a) >> (short3)8) +
19636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray              ((in_s.rgb * ((short3)255 - (short3)out_s.a)) >> (short3)8);
19736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            *out = convert_uchar4(out_s);
19836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        }
19936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
20036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_XOR:
20136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        for (;x1 < x2; x1++, out++, in++) {
20236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            *out = *in ^ *out;
20336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        }
20436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
20536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_NORMAL:
20636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_NORMAL");
20736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
20836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
20936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_AVERAGE:
21036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_AVERAGE");
21136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
21236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
21336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_MULTIPLY:
21436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        for (;x1 < x2; x1++, out++, in++) {
21536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray          *out = convert_uchar4((convert_short4(*in) * convert_short4(*out))
21636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray                                >> (short4)8);
21736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        }
21836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
21936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_SCREEN:
22036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_SCREEN");
22136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
22236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
22336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_DARKEN:
22436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_DARKEN");
22536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
22636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
22736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_LIGHTEN:
22836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_LIGHTEN");
22936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
23036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
23136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_OVERLAY:
23236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_OVERLAY");
23336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
23436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
23536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_HARDLIGHT:
23636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_HARDLIGHT");
23736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
23836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
23936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_SOFTLIGHT:
24036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_SOFTLIGHT");
24136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
24236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
24336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_DIFFERENCE:
24436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_DIFFERENCE");
24536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
24636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
24736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_NEGATION:
24836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_NEGATION");
24936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
25036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
25136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_EXCLUSION:
25236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_EXCLUSION");
25336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
25436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
25536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_COLOR_DODGE:
25636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_COLOR_DODGE");
25736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
25836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
25936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_INVERSE_COLOR_DODGE:
26036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_INVERSE_COLOR_DODGE");
26136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
26236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
26336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_SOFT_DODGE:
26436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_SOFT_DODGE");
26536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
26636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
26736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_COLOR_BURN:
26836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_COLOR_BURN");
26936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
27036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
27136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_INVERSE_COLOR_BURN:
27236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_INVERSE_COLOR_BURN");
27336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
27436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
27536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_SOFT_BURN:
27636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_SOFT_BURN");
27736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
27836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
27936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_REFLECT:
28036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_REFLECT");
28136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
28236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
28336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_GLOW:
28436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_GLOW");
28536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
28636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
28736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_FREEZE:
28836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_FREEZE");
28936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
29036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
29136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_HEAT:
29236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_HEAT");
29336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
29436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
29536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_ADD:
29636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        for (;x1 < x2; x1++, out++, in++) {
29736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            uint32_t iR = in->r, iG = in->g, iB = in->b, iA = in->a,
29836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray                oR = out->r, oG = out->g, oB = out->b, oA = out->a;
29936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            out->r = (oR + iR) > 255 ? 255 : oR + iR;
30036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            out->g = (oG + iG) > 255 ? 255 : oG + iG;
30136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            out->b = (oB + iB) > 255 ? 255 : oB + iB;
30236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            out->a = (oA + iA) > 255 ? 255 : oA + iA;
30336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        }
30436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
30536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_SUBTRACT:
30636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        for (;x1 < x2; x1++, out++, in++) {
30736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            int32_t iR = in->r, iG = in->g, iB = in->b, iA = in->a,
30836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray                oR = out->r, oG = out->g, oB = out->b, oA = out->a;
30936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            out->r = (oR - iR) < 0 ? 0 : oR - iR;
31036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            out->g = (oG - iG) < 0 ? 0 : oG - iG;
31136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            out->b = (oB - iB) < 0 ? 0 : oB - iB;
31236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray            out->a = (oA - iA) < 0 ? 0 : oA - iA;
31336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        }
31436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
31536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_STAMP:
31636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_STAMP");
31736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
31836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
31936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_RED:
32036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_RED");
32136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
32236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
32336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_GREEN:
32436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_GREEN");
32536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
32636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
32736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_BLUE:
32836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_BLUE");
32936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
33036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
33136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_HUE:
33236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_HUE");
33336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
33436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
33536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_SATURATION:
33636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_SATURATION");
33736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
33836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
33936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_COLOR:
34036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_COLOR");
34136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
34236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
34336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    case BLEND_LUMINOSITY:
34436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented blend intrinsic BLEND_LUMINOSITY");
34536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
34636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        break;
347cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
34836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray    default:
34936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        ALOGE("Called unimplemented value %d", p->slot);
35036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray        rsAssert(false);
351cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
352cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    }
353cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
354cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    if(x2 > x1) {
355cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams        while(x1 != x2) {
356cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams            One(p, out++, in++, cp->f);
357cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams            x1++;
358cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams        }
359cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    }
360cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams}
361cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
362cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Samsvoid * rsdIntrinsic_InitBlend(const android::renderscript::Context *dc,
363cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams                              android::renderscript::Script *script,
364cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams                              RsdIntriniscFuncs_t *funcs) {
365cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
366cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    script->mHal.info.exportedVariableCount = 0;
367cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    funcs->root = ColorMatrix_uchar4;
368cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
369cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    ConvolveParams *cp = (ConvolveParams *)calloc(1, sizeof(ConvolveParams));
370cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    return cp;
371cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams}
372cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
373cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
374