rsCpuIntrinsicBlend.cpp revision ebf0eb95cba9579af7cb67205b94b286f221c4ed
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: 369ed79105cc6a8dbfaf959875249f36022cc2c798Chris Wailes static void kernel(const RsExpandKernelParams *p, 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 11280ef693674f69c0343c41564e30f80e7fb513b60Chris Wailesvoid RsdCpuScriptIntrinsicBlend::kernel(const RsExpandKernelParams *p, 113709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t xstart, uint32_t xend, 1149ed79105cc6a8dbfaf959875249f36022cc2c798Chris Wailes uint32_t outstep) { 115709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuScriptIntrinsicBlend *cp = (RsdCpuScriptIntrinsicBlend *)p->usr; 11636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray 11736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray // instep/outstep can be ignored--sizeof(uchar4) known at compile time 118cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams uchar4 *out = (uchar4 *)p->out; 119f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes uchar4 *in = (uchar4 *)p->ins[0]; 120cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams uint32_t x1 = xstart; 121cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams uint32_t x2 = xend; 122cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 123074424a4ac5b093331df2c92e7a5bcbfff136b71Jason Sams#if defined(ARCH_ARM_USE_INTRINSICS) && !defined(ARCH_ARM64_USE_INTRINSICS) 1245d06919bc8019322180ea34768a7a4137fa64d11Simon Hosie if (gArchUseSIMD) { 1255d06919bc8019322180ea34768a7a4137fa64d11Simon Hosie if (rsdIntrinsicBlend_K(out, in, p->slot, x1, x2) >= 0) 1265d06919bc8019322180ea34768a7a4137fa64d11Simon Hosie return; 1275d06919bc8019322180ea34768a7a4137fa64d11Simon Hosie } 1285d06919bc8019322180ea34768a7a4137fa64d11Simon Hosie#endif 129cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams switch (p->slot) { 130cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams case BLEND_CLEAR: 131cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams for (;x1 < x2; x1++, out++) { 132cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams *out = 0; 133cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams } 134cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams break; 135cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams case BLEND_SRC: 136cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams for (;x1 < x2; x1++, out++, in++) { 13736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = *in; 138cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams } 139cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams break; 14036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray //BLEND_DST is a NOP 141cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams case BLEND_DST: 14236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 14336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SRC_OVER: 1447b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #if defined(ARCH_X86_HAVE_SSSE3) 1457b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (gArchUseSIMD) { 1467b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if ((x1 + 8) < x2) { 1477b7060c61e4182b29186849c5a857ea5f0898e56Rose, James uint32_t len = (x2 - x1) >> 3; 1487b7060c61e4182b29186849c5a857ea5f0898e56Rose, James rsdIntrinsicBlendSrcOver_K(out, in, len); 1497b7060c61e4182b29186849c5a857ea5f0898e56Rose, James x1 += len << 3; 1507b7060c61e4182b29186849c5a857ea5f0898e56Rose, James out += len << 3; 1517b7060c61e4182b29186849c5a857ea5f0898e56Rose, James in += len << 3; 1527b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 1537b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 1547b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #endif 155cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams for (;x1 < x2; x1++, out++, in++) { 15636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 in_s = convert_short4(*in); 15736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 out_s = convert_short4(*out); 1580b575de8ed0b628d84d256f5846500b0385979bdTim Murray in_s = in_s + ((out_s * (short4)(255 - in_s.w)) >> (short4)8); 15936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = convert_uchar4(in_s); 160cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams } 161cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams break; 16236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_DST_OVER: 1637b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #if defined(ARCH_X86_HAVE_SSSE3) 1647b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (gArchUseSIMD) { 1657b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if ((x1 + 8) < x2) { 1667b7060c61e4182b29186849c5a857ea5f0898e56Rose, James uint32_t len = (x2 - x1) >> 3; 1677b7060c61e4182b29186849c5a857ea5f0898e56Rose, James rsdIntrinsicBlendDstOver_K(out, in, len); 1687b7060c61e4182b29186849c5a857ea5f0898e56Rose, James x1 += len << 3; 1697b7060c61e4182b29186849c5a857ea5f0898e56Rose, James out += len << 3; 1707b7060c61e4182b29186849c5a857ea5f0898e56Rose, James in += len << 3; 1717b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 1727b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 1737b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #endif 17436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 17536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 in_s = convert_short4(*in); 17636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 out_s = convert_short4(*out); 1770b575de8ed0b628d84d256f5846500b0385979bdTim Murray in_s = out_s + ((in_s * (short4)(255 - out_s.w)) >> (short4)8); 17836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = convert_uchar4(in_s); 17936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 18036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 18136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SRC_IN: 1827b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #if defined(ARCH_X86_HAVE_SSSE3) 1837b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (gArchUseSIMD) { 1847b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if ((x1 + 8) < x2) { 1857b7060c61e4182b29186849c5a857ea5f0898e56Rose, James uint32_t len = (x2 - x1) >> 3; 1867b7060c61e4182b29186849c5a857ea5f0898e56Rose, James rsdIntrinsicBlendSrcIn_K(out, in, len); 1877b7060c61e4182b29186849c5a857ea5f0898e56Rose, James x1 += len << 3; 1887b7060c61e4182b29186849c5a857ea5f0898e56Rose, James out += len << 3; 1897b7060c61e4182b29186849c5a857ea5f0898e56Rose, James in += len << 3; 1907b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 1917b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 1927b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #endif 19336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 19436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 in_s = convert_short4(*in); 1950b575de8ed0b628d84d256f5846500b0385979bdTim Murray in_s = (in_s * out->w) >> (short4)8; 19636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = convert_uchar4(in_s); 19736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 19836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 19936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_DST_IN: 2007b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #if defined(ARCH_X86_HAVE_SSSE3) 2017b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (gArchUseSIMD) { 2027b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if ((x1 + 8) < x2) { 2037b7060c61e4182b29186849c5a857ea5f0898e56Rose, James uint32_t len = (x2 - x1) >> 3; 2047b7060c61e4182b29186849c5a857ea5f0898e56Rose, James rsdIntrinsicBlendDstIn_K(out, in, len); 2057b7060c61e4182b29186849c5a857ea5f0898e56Rose, James x1 += len << 3; 2067b7060c61e4182b29186849c5a857ea5f0898e56Rose, James out += len << 3; 2077b7060c61e4182b29186849c5a857ea5f0898e56Rose, James in += len << 3; 2087b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 2097b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 2107b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #endif 21136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 21236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 out_s = convert_short4(*out); 2130b575de8ed0b628d84d256f5846500b0385979bdTim Murray out_s = (out_s * in->w) >> (short4)8; 21436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = convert_uchar4(out_s); 21536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 21636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 21736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SRC_OUT: 2187b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #if defined(ARCH_X86_HAVE_SSSE3) 2197b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (gArchUseSIMD) { 2207b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if ((x1 + 8) < x2) { 2217b7060c61e4182b29186849c5a857ea5f0898e56Rose, James uint32_t len = (x2 - x1) >> 3; 2227b7060c61e4182b29186849c5a857ea5f0898e56Rose, James rsdIntrinsicBlendSrcOut_K(out, in, len); 2237b7060c61e4182b29186849c5a857ea5f0898e56Rose, James x1 += len << 3; 2247b7060c61e4182b29186849c5a857ea5f0898e56Rose, James out += len << 3; 2257b7060c61e4182b29186849c5a857ea5f0898e56Rose, James in += len << 3; 2267b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 2277b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 2287b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #endif 22936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 23036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 in_s = convert_short4(*in); 2310b575de8ed0b628d84d256f5846500b0385979bdTim Murray in_s = (in_s * (short4)(255 - out->w)) >> (short4)8; 23236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = convert_uchar4(in_s); 23336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 23436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 23536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_DST_OUT: 2367b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #if defined(ARCH_X86_HAVE_SSSE3) 2377b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (gArchUseSIMD) { 2387b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if ((x1 + 8) < x2) { 2397b7060c61e4182b29186849c5a857ea5f0898e56Rose, James uint32_t len = (x2 - x1) >> 3; 2407b7060c61e4182b29186849c5a857ea5f0898e56Rose, James rsdIntrinsicBlendDstOut_K(out, in, len); 2417b7060c61e4182b29186849c5a857ea5f0898e56Rose, James x1 += len << 3; 2427b7060c61e4182b29186849c5a857ea5f0898e56Rose, James out += len << 3; 2437b7060c61e4182b29186849c5a857ea5f0898e56Rose, James in += len << 3; 2447b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 2457b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 2467b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #endif 24736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 24836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 out_s = convert_short4(*out); 2490b575de8ed0b628d84d256f5846500b0385979bdTim Murray out_s = (out_s * (short4)(255 - in->w)) >> (short4)8; 25036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = convert_uchar4(out_s); 25136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 25236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 25336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SRC_ATOP: 2547b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #if defined(ARCH_X86_HAVE_SSSE3) 2557b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (gArchUseSIMD) { 2567b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if ((x1 + 8) < x2) { 2577b7060c61e4182b29186849c5a857ea5f0898e56Rose, James uint32_t len = (x2 - x1) >> 3; 2587b7060c61e4182b29186849c5a857ea5f0898e56Rose, James rsdIntrinsicBlendSrcAtop_K(out, in, len); 2597b7060c61e4182b29186849c5a857ea5f0898e56Rose, James x1 += len << 3; 2607b7060c61e4182b29186849c5a857ea5f0898e56Rose, James out += len << 3; 2617b7060c61e4182b29186849c5a857ea5f0898e56Rose, James in += len << 3; 2627b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 2637b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 2647b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #endif 26536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 26636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 in_s = convert_short4(*in); 26736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 out_s = convert_short4(*out); 2680b575de8ed0b628d84d256f5846500b0385979bdTim Murray out_s.xyz = ((in_s.xyz * out_s.w) + 2690b575de8ed0b628d84d256f5846500b0385979bdTim Murray (out_s.xyz * ((short3)255 - (short3)in_s.w))) >> (short3)8; 27036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = convert_uchar4(out_s); 27136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 27236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 27336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_DST_ATOP: 2747b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #if defined(ARCH_X86_HAVE_SSSE3) 2757b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (gArchUseSIMD) { 2767b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if ((x1 + 8) < x2) { 2777b7060c61e4182b29186849c5a857ea5f0898e56Rose, James uint32_t len = (x2 - x1) >> 3; 2787b7060c61e4182b29186849c5a857ea5f0898e56Rose, James rsdIntrinsicBlendDstAtop_K(out, in, len); 2797b7060c61e4182b29186849c5a857ea5f0898e56Rose, James x1 += len << 3; 2807b7060c61e4182b29186849c5a857ea5f0898e56Rose, James out += len << 3; 2817b7060c61e4182b29186849c5a857ea5f0898e56Rose, James in += len << 3; 2827b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 2837b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 2847b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #endif 28536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 28636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 in_s = convert_short4(*in); 28736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 out_s = convert_short4(*out); 2880b575de8ed0b628d84d256f5846500b0385979bdTim Murray out_s.xyz = ((out_s.xyz * in_s.w) + 2890b575de8ed0b628d84d256f5846500b0385979bdTim Murray (in_s.xyz * ((short3)255 - (short3)out_s.w))) >> (short3)8; 29036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = convert_uchar4(out_s); 29136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 29236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 29336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_XOR: 2947b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #if defined(ARCH_X86_HAVE_SSSE3) 2957b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (gArchUseSIMD) { 2967b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if ((x1 + 8) < x2) { 2977b7060c61e4182b29186849c5a857ea5f0898e56Rose, James uint32_t len = (x2 - x1) >> 3; 2987b7060c61e4182b29186849c5a857ea5f0898e56Rose, James rsdIntrinsicBlendXor_K(out, in, len); 2997b7060c61e4182b29186849c5a857ea5f0898e56Rose, James x1 += len << 3; 3007b7060c61e4182b29186849c5a857ea5f0898e56Rose, James out += len << 3; 3017b7060c61e4182b29186849c5a857ea5f0898e56Rose, James in += len << 3; 3027b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 3037b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 3047b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #endif 30536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 30636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = *in ^ *out; 30736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 30836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 30936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_NORMAL: 31036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_NORMAL"); 31136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 31236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 31336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_AVERAGE: 31436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_AVERAGE"); 31536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 31636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 31736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_MULTIPLY: 3187b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #if defined(ARCH_X86_HAVE_SSSE3) 3197b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (gArchUseSIMD) { 3207b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if ((x1 + 8) < x2) { 3217b7060c61e4182b29186849c5a857ea5f0898e56Rose, James uint32_t len = (x2 - x1) >> 3; 3227b7060c61e4182b29186849c5a857ea5f0898e56Rose, James rsdIntrinsicBlendMultiply_K(out, in, len); 3237b7060c61e4182b29186849c5a857ea5f0898e56Rose, James x1 += len << 3; 3247b7060c61e4182b29186849c5a857ea5f0898e56Rose, James out += len << 3; 3257b7060c61e4182b29186849c5a857ea5f0898e56Rose, James in += len << 3; 3267b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 3277b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 3287b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #endif 32936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 33036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = convert_uchar4((convert_short4(*in) * convert_short4(*out)) 33136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray >> (short4)8); 33236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 33336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 33436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SCREEN: 33536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_SCREEN"); 33636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 33736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 33836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_DARKEN: 33936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_DARKEN"); 34036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 34136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 34236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_LIGHTEN: 34336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_LIGHTEN"); 34436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 34536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 34636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_OVERLAY: 34736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_OVERLAY"); 34836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 34936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 35036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_HARDLIGHT: 35136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_HARDLIGHT"); 35236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 35336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 35436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SOFTLIGHT: 35536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_SOFTLIGHT"); 35636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 35736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 35836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_DIFFERENCE: 35936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_DIFFERENCE"); 36036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 36136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 36236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_NEGATION: 36336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_NEGATION"); 36436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 36536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 36636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_EXCLUSION: 36736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_EXCLUSION"); 36836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 36936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 37036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_COLOR_DODGE: 37136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_COLOR_DODGE"); 37236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 37336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 37436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_INVERSE_COLOR_DODGE: 37536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_INVERSE_COLOR_DODGE"); 37636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 37736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 37836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SOFT_DODGE: 37936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_SOFT_DODGE"); 38036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 38136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 38236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_COLOR_BURN: 38336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_COLOR_BURN"); 38436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 38536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 38636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_INVERSE_COLOR_BURN: 38736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_INVERSE_COLOR_BURN"); 38836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 38936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 39036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SOFT_BURN: 39136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_SOFT_BURN"); 39236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 39336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 39436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_REFLECT: 39536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_REFLECT"); 39636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 39736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 39836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_GLOW: 39936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_GLOW"); 40036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 40136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 40236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_FREEZE: 40336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_FREEZE"); 40436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 40536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 40636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_HEAT: 40736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_HEAT"); 40836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 40936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 41036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_ADD: 4117b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #if defined(ARCH_X86_HAVE_SSSE3) 4127b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (gArchUseSIMD) { 4137b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if((x1 + 8) < x2) { 4147b7060c61e4182b29186849c5a857ea5f0898e56Rose, James uint32_t len = (x2 - x1) >> 3; 4157b7060c61e4182b29186849c5a857ea5f0898e56Rose, James rsdIntrinsicBlendAdd_K(out, in, len); 4167b7060c61e4182b29186849c5a857ea5f0898e56Rose, James x1 += len << 3; 4177b7060c61e4182b29186849c5a857ea5f0898e56Rose, James out += len << 3; 4187b7060c61e4182b29186849c5a857ea5f0898e56Rose, James in += len << 3; 4197b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 4207b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 4217b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #endif 42236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 4230b575de8ed0b628d84d256f5846500b0385979bdTim Murray uint32_t iR = in->x, iG = in->y, iB = in->z, iA = in->w, 4240b575de8ed0b628d84d256f5846500b0385979bdTim Murray oR = out->x, oG = out->y, oB = out->z, oA = out->w; 4250b575de8ed0b628d84d256f5846500b0385979bdTim Murray out->x = (oR + iR) > 255 ? 255 : oR + iR; 4260b575de8ed0b628d84d256f5846500b0385979bdTim Murray out->y = (oG + iG) > 255 ? 255 : oG + iG; 4270b575de8ed0b628d84d256f5846500b0385979bdTim Murray out->z = (oB + iB) > 255 ? 255 : oB + iB; 4280b575de8ed0b628d84d256f5846500b0385979bdTim Murray out->w = (oA + iA) > 255 ? 255 : oA + iA; 42936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 43036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 43136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SUBTRACT: 4327b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #if defined(ARCH_X86_HAVE_SSSE3) 4337b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (gArchUseSIMD) { 4347b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if((x1 + 8) < x2) { 4357b7060c61e4182b29186849c5a857ea5f0898e56Rose, James uint32_t len = (x2 - x1) >> 3; 4367b7060c61e4182b29186849c5a857ea5f0898e56Rose, James rsdIntrinsicBlendSub_K(out, in, len); 4377b7060c61e4182b29186849c5a857ea5f0898e56Rose, James x1 += len << 3; 4387b7060c61e4182b29186849c5a857ea5f0898e56Rose, James out += len << 3; 4397b7060c61e4182b29186849c5a857ea5f0898e56Rose, James in += len << 3; 4407b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 4417b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 4427b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #endif 44336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 4440b575de8ed0b628d84d256f5846500b0385979bdTim Murray int32_t iR = in->x, iG = in->y, iB = in->z, iA = in->w, 4450b575de8ed0b628d84d256f5846500b0385979bdTim Murray oR = out->x, oG = out->y, oB = out->z, oA = out->w; 4460b575de8ed0b628d84d256f5846500b0385979bdTim Murray out->x = (oR - iR) < 0 ? 0 : oR - iR; 4470b575de8ed0b628d84d256f5846500b0385979bdTim Murray out->y = (oG - iG) < 0 ? 0 : oG - iG; 4480b575de8ed0b628d84d256f5846500b0385979bdTim Murray out->z = (oB - iB) < 0 ? 0 : oB - iB; 4490b575de8ed0b628d84d256f5846500b0385979bdTim Murray out->w = (oA - iA) < 0 ? 0 : oA - iA; 45036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 45136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 45236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_STAMP: 45336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_STAMP"); 45436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 45536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 45636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_RED: 45736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_RED"); 45836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 45936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 46036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_GREEN: 46136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_GREEN"); 46236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 46336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 46436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_BLUE: 46536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_BLUE"); 46636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 46736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 46836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_HUE: 46936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_HUE"); 47036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 47136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 47236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SATURATION: 47336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_SATURATION"); 47436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 47536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 47636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_COLOR: 47736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_COLOR"); 47836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 47936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 48036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_LUMINOSITY: 48136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_LUMINOSITY"); 48236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 48336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 484cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 48536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray default: 48636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented value %d", p->slot); 48736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 488cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 489cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams } 490cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams} 491cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 492cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 493c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason SamsRsdCpuScriptIntrinsicBlend::RsdCpuScriptIntrinsicBlend(RsdCpuReferenceImpl *ctx, 494c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams const Script *s, const Element *e) 495c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams : RsdCpuScriptIntrinsic(ctx, s, e, RS_SCRIPT_INTRINSIC_ID_BLEND) { 496cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 497709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mRootPtr = &kernel; 498cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams} 499cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 500709a0978ae141198018ca9769f8d96292a8928e6Jason SamsRsdCpuScriptIntrinsicBlend::~RsdCpuScriptIntrinsicBlend() { 501709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 502709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 503709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicBlend::populateScript(Script *s) { 504709a0978ae141198018ca9769f8d96292a8928e6Jason Sams s->mHal.info.exportedVariableCount = 0; 505709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 506709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 507c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason SamsRsdCpuScriptImpl * rsdIntrinsic_Blend(RsdCpuReferenceImpl *ctx, 508c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams const Script *s, const Element *e) { 509c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams return new RsdCpuScriptIntrinsicBlend(ctx, s, e); 510709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 511