rsCpuIntrinsicBlend.cpp revision 5d06919bc8019322180ea34768a7a4137fa64d11
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: 30709a0978ae141198018ca9769f8d96292a8928e6Jason Sams virtual void populateScript(Script *); 31709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 32709a0978ae141198018ca9769f8d96292a8928e6Jason Sams virtual ~RsdCpuScriptIntrinsicBlend(); 33c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams RsdCpuScriptIntrinsicBlend(RsdCpuReferenceImpl *ctx, const Script *s, const Element *e); 34709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 35709a0978ae141198018ca9769f8d96292a8928e6Jason Samsprotected: 36709a0978ae141198018ca9769f8d96292a8928e6Jason Sams static void kernel(const RsForEachStubParamStruct *p, 37709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t xstart, uint32_t xend, 38709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t instep, uint32_t outstep); 39cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams}; 40cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 41709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 42709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 43709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 44cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 45cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Samsenum { 46cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_CLEAR = 0, 47cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_SRC = 1, 48cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_DST = 2, 49cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_SRC_OVER = 3, 50cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_DST_OVER = 4, 51cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_SRC_IN = 5, 52cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_DST_IN = 6, 53cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_SRC_OUT = 7, 54cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_DST_OUT = 8, 55cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_SRC_ATOP = 9, 56cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_DST_ATOP = 10, 57cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_XOR = 11, 58cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 59cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_NORMAL = 12, 60cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_AVERAGE = 13, 61cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_MULTIPLY = 14, 62cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_SCREEN = 15, 63cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_DARKEN = 16, 64cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_LIGHTEN = 17, 65cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_OVERLAY = 18, 66cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_HARDLIGHT = 19, 67cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_SOFTLIGHT = 20, 68cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_DIFFERENCE = 21, 69cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_NEGATION = 22, 70cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_EXCLUSION = 23, 71cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_COLOR_DODGE = 24, 72cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_INVERSE_COLOR_DODGE = 25, 73cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_SOFT_DODGE = 26, 74cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_COLOR_BURN = 27, 75cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_INVERSE_COLOR_BURN = 28, 76cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_SOFT_BURN = 29, 77cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_REFLECT = 30, 78cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_GLOW = 31, 79cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_FREEZE = 32, 80cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_HEAT = 33, 81cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_ADD = 34, 82cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_SUBTRACT = 35, 83cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_STAMP = 36, 84cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_RED = 37, 85cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_GREEN = 38, 86cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_BLUE = 39, 87cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_HUE = 40, 88cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_SATURATION = 41, 89cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_COLOR = 42, 90cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_LUMINOSITY = 43 91cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams}; 92cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 935d06919bc8019322180ea34768a7a4137fa64d11Simon Hosieextern "C" int rsdIntrinsicBlend_K(uchar4 *out, uchar4 const *in, int slot, 945d06919bc8019322180ea34768a7a4137fa64d11Simon Hosie uint32_t xstart, uint32_t xend); 95fa17cda2d7e0948677035890e40498ad0b639c92Jason Sams 96709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicBlend::kernel(const RsForEachStubParamStruct *p, 97709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t xstart, uint32_t xend, 98709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t instep, uint32_t outstep) { 99709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuScriptIntrinsicBlend *cp = (RsdCpuScriptIntrinsicBlend *)p->usr; 10036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray 10136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray // instep/outstep can be ignored--sizeof(uchar4) known at compile time 102cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams uchar4 *out = (uchar4 *)p->out; 103cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams uchar4 *in = (uchar4 *)p->in; 104cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams uint32_t x1 = xstart; 105cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams uint32_t x2 = xend; 106cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 1075d06919bc8019322180ea34768a7a4137fa64d11Simon Hosie#if defined(ARCH_ARM_HAVE_VFP) 1085d06919bc8019322180ea34768a7a4137fa64d11Simon Hosie if (gArchUseSIMD) { 1095d06919bc8019322180ea34768a7a4137fa64d11Simon Hosie if (rsdIntrinsicBlend_K(out, in, p->slot, x1, x2) >= 0) 1105d06919bc8019322180ea34768a7a4137fa64d11Simon Hosie return; 1115d06919bc8019322180ea34768a7a4137fa64d11Simon Hosie } 1125d06919bc8019322180ea34768a7a4137fa64d11Simon Hosie#endif 113cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams switch (p->slot) { 114cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams case BLEND_CLEAR: 115cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams for (;x1 < x2; x1++, out++) { 116cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams *out = 0; 117cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams } 118cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams break; 119cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams case BLEND_SRC: 120cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams for (;x1 < x2; x1++, out++, in++) { 12136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = *in; 122cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams } 123cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams break; 12436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray //BLEND_DST is a NOP 125cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams case BLEND_DST: 12636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 12736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SRC_OVER: 128cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams for (;x1 < x2; x1++, out++, in++) { 12936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 in_s = convert_short4(*in); 13036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 out_s = convert_short4(*out); 1310b575de8ed0b628d84d256f5846500b0385979bdTim Murray in_s = in_s + ((out_s * (short4)(255 - in_s.w)) >> (short4)8); 13236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = convert_uchar4(in_s); 133cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams } 134cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams break; 13536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_DST_OVER: 13636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 13736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 in_s = convert_short4(*in); 13836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 out_s = convert_short4(*out); 1390b575de8ed0b628d84d256f5846500b0385979bdTim Murray in_s = out_s + ((in_s * (short4)(255 - out_s.w)) >> (short4)8); 14036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = convert_uchar4(in_s); 14136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 14236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 14336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SRC_IN: 14436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 14536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 in_s = convert_short4(*in); 1460b575de8ed0b628d84d256f5846500b0385979bdTim Murray in_s = (in_s * out->w) >> (short4)8; 14736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = convert_uchar4(in_s); 14836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 14936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 15036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_DST_IN: 15136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 15236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 out_s = convert_short4(*out); 1530b575de8ed0b628d84d256f5846500b0385979bdTim Murray out_s = (out_s * in->w) >> (short4)8; 15436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = convert_uchar4(out_s); 15536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 15636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 15736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SRC_OUT: 15836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 15936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 in_s = convert_short4(*in); 1600b575de8ed0b628d84d256f5846500b0385979bdTim Murray in_s = (in_s * (short4)(255 - out->w)) >> (short4)8; 16136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = convert_uchar4(in_s); 16236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 16336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 16436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_DST_OUT: 16536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 16636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 out_s = convert_short4(*out); 1670b575de8ed0b628d84d256f5846500b0385979bdTim Murray out_s = (out_s * (short4)(255 - in->w)) >> (short4)8; 16836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = convert_uchar4(out_s); 16936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 17036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 17136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SRC_ATOP: 17236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 17336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 in_s = convert_short4(*in); 17436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 out_s = convert_short4(*out); 1750b575de8ed0b628d84d256f5846500b0385979bdTim Murray out_s.xyz = ((in_s.xyz * out_s.w) + 1760b575de8ed0b628d84d256f5846500b0385979bdTim Murray (out_s.xyz * ((short3)255 - (short3)in_s.w))) >> (short3)8; 17736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = convert_uchar4(out_s); 17836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 17936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 18036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_DST_ATOP: 18136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 18236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 in_s = convert_short4(*in); 18336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 out_s = convert_short4(*out); 1840b575de8ed0b628d84d256f5846500b0385979bdTim Murray out_s.xyz = ((out_s.xyz * in_s.w) + 1850b575de8ed0b628d84d256f5846500b0385979bdTim Murray (in_s.xyz * ((short3)255 - (short3)out_s.w))) >> (short3)8; 18636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = convert_uchar4(out_s); 18736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 18836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 18936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_XOR: 19036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 19136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = *in ^ *out; 19236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 19336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 19436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_NORMAL: 19536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_NORMAL"); 19636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 19736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 19836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_AVERAGE: 19936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_AVERAGE"); 20036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 20136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 20236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_MULTIPLY: 20336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 20436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = convert_uchar4((convert_short4(*in) * convert_short4(*out)) 20536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray >> (short4)8); 20636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 20736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 20836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SCREEN: 20936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_SCREEN"); 21036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 21136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 21236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_DARKEN: 21336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_DARKEN"); 21436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 21536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 21636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_LIGHTEN: 21736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_LIGHTEN"); 21836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 21936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 22036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_OVERLAY: 22136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_OVERLAY"); 22236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 22336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 22436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_HARDLIGHT: 22536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_HARDLIGHT"); 22636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 22736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 22836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SOFTLIGHT: 22936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_SOFTLIGHT"); 23036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 23136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 23236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_DIFFERENCE: 23336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_DIFFERENCE"); 23436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 23536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 23636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_NEGATION: 23736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_NEGATION"); 23836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 23936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 24036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_EXCLUSION: 24136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_EXCLUSION"); 24236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 24336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 24436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_COLOR_DODGE: 24536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_COLOR_DODGE"); 24636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 24736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 24836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_INVERSE_COLOR_DODGE: 24936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_INVERSE_COLOR_DODGE"); 25036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 25136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 25236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SOFT_DODGE: 25336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_SOFT_DODGE"); 25436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 25536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 25636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_COLOR_BURN: 25736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_COLOR_BURN"); 25836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 25936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 26036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_INVERSE_COLOR_BURN: 26136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_INVERSE_COLOR_BURN"); 26236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 26336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 26436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SOFT_BURN: 26536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_SOFT_BURN"); 26636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 26736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 26836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_REFLECT: 26936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_REFLECT"); 27036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 27136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 27236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_GLOW: 27336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_GLOW"); 27436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 27536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 27636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_FREEZE: 27736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_FREEZE"); 27836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 27936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 28036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_HEAT: 28136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_HEAT"); 28236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 28336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 28436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_ADD: 28536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 2860b575de8ed0b628d84d256f5846500b0385979bdTim Murray uint32_t iR = in->x, iG = in->y, iB = in->z, iA = in->w, 2870b575de8ed0b628d84d256f5846500b0385979bdTim Murray oR = out->x, oG = out->y, oB = out->z, oA = out->w; 2880b575de8ed0b628d84d256f5846500b0385979bdTim Murray out->x = (oR + iR) > 255 ? 255 : oR + iR; 2890b575de8ed0b628d84d256f5846500b0385979bdTim Murray out->y = (oG + iG) > 255 ? 255 : oG + iG; 2900b575de8ed0b628d84d256f5846500b0385979bdTim Murray out->z = (oB + iB) > 255 ? 255 : oB + iB; 2910b575de8ed0b628d84d256f5846500b0385979bdTim Murray out->w = (oA + iA) > 255 ? 255 : oA + iA; 29236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 29336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 29436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SUBTRACT: 29536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 2960b575de8ed0b628d84d256f5846500b0385979bdTim Murray int32_t iR = in->x, iG = in->y, iB = in->z, iA = in->w, 2970b575de8ed0b628d84d256f5846500b0385979bdTim Murray oR = out->x, oG = out->y, oB = out->z, oA = out->w; 2980b575de8ed0b628d84d256f5846500b0385979bdTim Murray out->x = (oR - iR) < 0 ? 0 : oR - iR; 2990b575de8ed0b628d84d256f5846500b0385979bdTim Murray out->y = (oG - iG) < 0 ? 0 : oG - iG; 3000b575de8ed0b628d84d256f5846500b0385979bdTim Murray out->z = (oB - iB) < 0 ? 0 : oB - iB; 3010b575de8ed0b628d84d256f5846500b0385979bdTim Murray out->w = (oA - iA) < 0 ? 0 : oA - iA; 30236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 30336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 30436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_STAMP: 30536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_STAMP"); 30636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 30736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 30836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_RED: 30936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_RED"); 31036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 31136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 31236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_GREEN: 31336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_GREEN"); 31436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 31536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 31636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_BLUE: 31736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_BLUE"); 31836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 31936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 32036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_HUE: 32136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_HUE"); 32236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 32336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 32436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SATURATION: 32536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_SATURATION"); 32636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 32736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 32836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_COLOR: 32936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_COLOR"); 33036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 33136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 33236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_LUMINOSITY: 33336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_LUMINOSITY"); 33436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 33536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 336cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 33736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray default: 33836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented value %d", p->slot); 33936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 340cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 341cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams } 342cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams} 343cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 344cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 345c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason SamsRsdCpuScriptIntrinsicBlend::RsdCpuScriptIntrinsicBlend(RsdCpuReferenceImpl *ctx, 346c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams const Script *s, const Element *e) 347c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams : RsdCpuScriptIntrinsic(ctx, s, e, RS_SCRIPT_INTRINSIC_ID_BLEND) { 348cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 349709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mRootPtr = &kernel; 350cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams} 351cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 352709a0978ae141198018ca9769f8d96292a8928e6Jason SamsRsdCpuScriptIntrinsicBlend::~RsdCpuScriptIntrinsicBlend() { 353709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 354709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 355709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicBlend::populateScript(Script *s) { 356709a0978ae141198018ca9769f8d96292a8928e6Jason Sams s->mHal.info.exportedVariableCount = 0; 357709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 358709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 359c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason SamsRsdCpuScriptImpl * rsdIntrinsic_Blend(RsdCpuReferenceImpl *ctx, 360c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams const Script *s, const Element *e) { 361c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams return new RsdCpuScriptIntrinsicBlend(ctx, s, e); 362709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 363709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 364709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 365cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 366