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 21709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace android { 22709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace renderscript { 23709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 24709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 25709a0978ae141198018ca9769f8d96292a8928e6Jason Samsclass RsdCpuScriptIntrinsicBlend : public RsdCpuScriptIntrinsic { 26709a0978ae141198018ca9769f8d96292a8928e6Jason Samspublic: 27c060f1435e7b9405f3be8974417fa6f410f03753Stephen Hines void populateScript(Script *) override; 28709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 29c060f1435e7b9405f3be8974417fa6f410f03753Stephen Hines ~RsdCpuScriptIntrinsicBlend() override; 30c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams RsdCpuScriptIntrinsicBlend(RsdCpuReferenceImpl *ctx, const Script *s, const Element *e); 31709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 32709a0978ae141198018ca9769f8d96292a8928e6Jason Samsprotected: 33b0abb140ac51b93d1a85aadaa63fe057f2d29850David Gross static void kernel(const RsExpandKernelDriverInfo *info, uint32_t xstart, 349ed79105cc6a8dbfaf959875249f36022cc2c798Chris Wailes uint32_t xend, uint32_t outstep); 35cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams}; 36cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 377974fc03e11f3a8dd40f794f3b33b4889483090cRahul Chaudhry} // namespace renderscript 387974fc03e11f3a8dd40f794f3b33b4889483090cRahul Chaudhry} // namespace android 39709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 40cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 41cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Samsenum { 42cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_CLEAR = 0, 43cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_SRC = 1, 44cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_DST = 2, 45cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_SRC_OVER = 3, 46cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_DST_OVER = 4, 47cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_SRC_IN = 5, 48cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_DST_IN = 6, 49cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_SRC_OUT = 7, 50cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_DST_OUT = 8, 51cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_SRC_ATOP = 9, 52cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_DST_ATOP = 10, 53cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_XOR = 11, 54cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 55cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_NORMAL = 12, 56cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_AVERAGE = 13, 57cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_MULTIPLY = 14, 58cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_SCREEN = 15, 59cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_DARKEN = 16, 60cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_LIGHTEN = 17, 61cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_OVERLAY = 18, 62cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_HARDLIGHT = 19, 63cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_SOFTLIGHT = 20, 64cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_DIFFERENCE = 21, 65cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_NEGATION = 22, 66cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_EXCLUSION = 23, 67cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_COLOR_DODGE = 24, 68cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_INVERSE_COLOR_DODGE = 25, 69cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_SOFT_DODGE = 26, 70cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_COLOR_BURN = 27, 71cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_INVERSE_COLOR_BURN = 28, 72cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_SOFT_BURN = 29, 73cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_REFLECT = 30, 74cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_GLOW = 31, 75cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_FREEZE = 32, 76cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_HEAT = 33, 77cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_ADD = 34, 78cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_SUBTRACT = 35, 79cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_STAMP = 36, 80cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_RED = 37, 81cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_GREEN = 38, 82cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_BLUE = 39, 83cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_HUE = 40, 84cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_SATURATION = 41, 85cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_COLOR = 42, 86cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams BLEND_LUMINOSITY = 43 87cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams}; 88cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 89074424a4ac5b093331df2c92e7a5bcbfff136b71Jason Sams#if defined(ARCH_ARM_USE_INTRINSICS) 905d06919bc8019322180ea34768a7a4137fa64d11Simon Hosieextern "C" int rsdIntrinsicBlend_K(uchar4 *out, uchar4 const *in, int slot, 915d06919bc8019322180ea34768a7a4137fa64d11Simon Hosie uint32_t xstart, uint32_t xend); 927b7060c61e4182b29186849c5a857ea5f0898e56Rose, James#endif 937b7060c61e4182b29186849c5a857ea5f0898e56Rose, James 947b7060c61e4182b29186849c5a857ea5f0898e56Rose, James#if defined(ARCH_X86_HAVE_SSSE3) 95ebf0eb95cba9579af7cb67205b94b286f221c4edDan Albertextern void rsdIntrinsicBlendSrcOver_K(void *dst, const void *src, uint32_t count8); 96ebf0eb95cba9579af7cb67205b94b286f221c4edDan Albertextern void rsdIntrinsicBlendDstOver_K(void *dst, const void *src, uint32_t count8); 97ebf0eb95cba9579af7cb67205b94b286f221c4edDan Albertextern void rsdIntrinsicBlendSrcIn_K(void *dst, const void *src, uint32_t count8); 98ebf0eb95cba9579af7cb67205b94b286f221c4edDan Albertextern void rsdIntrinsicBlendDstIn_K(void *dst, const void *src, uint32_t count8); 99ebf0eb95cba9579af7cb67205b94b286f221c4edDan Albertextern void rsdIntrinsicBlendSrcOut_K(void *dst, const void *src, uint32_t count8); 100ebf0eb95cba9579af7cb67205b94b286f221c4edDan Albertextern void rsdIntrinsicBlendDstOut_K(void *dst, const void *src, uint32_t count8); 101ebf0eb95cba9579af7cb67205b94b286f221c4edDan Albertextern void rsdIntrinsicBlendSrcAtop_K(void *dst, const void *src, uint32_t count8); 102ebf0eb95cba9579af7cb67205b94b286f221c4edDan Albertextern void rsdIntrinsicBlendDstAtop_K(void *dst, const void *src, uint32_t count8); 103ebf0eb95cba9579af7cb67205b94b286f221c4edDan Albertextern void rsdIntrinsicBlendXor_K(void *dst, const void *src, uint32_t count8); 104ebf0eb95cba9579af7cb67205b94b286f221c4edDan Albertextern void rsdIntrinsicBlendMultiply_K(void *dst, const void *src, uint32_t count8); 105ebf0eb95cba9579af7cb67205b94b286f221c4edDan Albertextern void rsdIntrinsicBlendAdd_K(void *dst, const void *src, uint32_t count8); 106ebf0eb95cba9579af7cb67205b94b286f221c4edDan Albertextern void rsdIntrinsicBlendSub_K(void *dst, const void *src, uint32_t count8); 1077b7060c61e4182b29186849c5a857ea5f0898e56Rose, James#endif 108fa17cda2d7e0948677035890e40498ad0b639c92Jason Sams 109462de21ac2e1773b99aedee012adb374e476ae36Chih-Hung Hsiehnamespace android { 110462de21ac2e1773b99aedee012adb374e476ae36Chih-Hung Hsiehnamespace renderscript { 111462de21ac2e1773b99aedee012adb374e476ae36Chih-Hung Hsieh 112b0abb140ac51b93d1a85aadaa63fe057f2d29850David Grossvoid RsdCpuScriptIntrinsicBlend::kernel(const RsExpandKernelDriverInfo *info, 113709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t xstart, uint32_t xend, 1149ed79105cc6a8dbfaf959875249f36022cc2c798Chris Wailes uint32_t outstep) { 11536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray // instep/outstep can be ignored--sizeof(uchar4) known at compile time 116b0abb140ac51b93d1a85aadaa63fe057f2d29850David Gross uchar4 *out = (uchar4 *)info->outPtr[0]; 117b0abb140ac51b93d1a85aadaa63fe057f2d29850David Gross uchar4 *in = (uchar4 *)info->inPtr[0]; 118cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams uint32_t x1 = xstart; 119cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams uint32_t x2 = xend; 120cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 121a615daa9604a6687e389bfc9c31d793d1b963455Miao Wang#if defined(ARCH_ARM_USE_INTRINSICS) 122e0c6f1d59fa8e995cdd80a41cc8ed1d6af35652eI-Jui (Ray) Sung if (gArchUseSIMD) { 123b0abb140ac51b93d1a85aadaa63fe057f2d29850David Gross if (rsdIntrinsicBlend_K(out, in, info->slot, x1, x2) >= 0) 1245d06919bc8019322180ea34768a7a4137fa64d11Simon Hosie return; 1255d06919bc8019322180ea34768a7a4137fa64d11Simon Hosie } 1265d06919bc8019322180ea34768a7a4137fa64d11Simon Hosie#endif 127b0abb140ac51b93d1a85aadaa63fe057f2d29850David Gross switch (info->slot) { 128cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams case BLEND_CLEAR: 129cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams for (;x1 < x2; x1++, out++) { 130cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams *out = 0; 131cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams } 132cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams break; 133cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams case BLEND_SRC: 134cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams for (;x1 < x2; x1++, out++, in++) { 13536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = *in; 136cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams } 137cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams break; 13836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray //BLEND_DST is a NOP 139cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams case BLEND_DST: 14036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 14136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SRC_OVER: 1427b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #if defined(ARCH_X86_HAVE_SSSE3) 1437b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (gArchUseSIMD) { 1447b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if ((x1 + 8) < x2) { 1457b7060c61e4182b29186849c5a857ea5f0898e56Rose, James uint32_t len = (x2 - x1) >> 3; 1467b7060c61e4182b29186849c5a857ea5f0898e56Rose, James rsdIntrinsicBlendSrcOver_K(out, in, len); 1477b7060c61e4182b29186849c5a857ea5f0898e56Rose, James x1 += len << 3; 1487b7060c61e4182b29186849c5a857ea5f0898e56Rose, James out += len << 3; 1497b7060c61e4182b29186849c5a857ea5f0898e56Rose, James in += len << 3; 1507b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 1517b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 1527b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #endif 153cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams for (;x1 < x2; x1++, out++, in++) { 15436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 in_s = convert_short4(*in); 15536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 out_s = convert_short4(*out); 1560b575de8ed0b628d84d256f5846500b0385979bdTim Murray in_s = in_s + ((out_s * (short4)(255 - in_s.w)) >> (short4)8); 15736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = convert_uchar4(in_s); 158cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams } 159cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams break; 16036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_DST_OVER: 1617b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #if defined(ARCH_X86_HAVE_SSSE3) 1627b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (gArchUseSIMD) { 1637b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if ((x1 + 8) < x2) { 1647b7060c61e4182b29186849c5a857ea5f0898e56Rose, James uint32_t len = (x2 - x1) >> 3; 1657b7060c61e4182b29186849c5a857ea5f0898e56Rose, James rsdIntrinsicBlendDstOver_K(out, in, len); 1667b7060c61e4182b29186849c5a857ea5f0898e56Rose, James x1 += len << 3; 1677b7060c61e4182b29186849c5a857ea5f0898e56Rose, James out += len << 3; 1687b7060c61e4182b29186849c5a857ea5f0898e56Rose, James in += len << 3; 1697b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 1707b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 1717b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #endif 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 in_s = out_s + ((in_s * (short4)(255 - out_s.w)) >> (short4)8); 17636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = convert_uchar4(in_s); 17736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 17836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 17936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SRC_IN: 1807b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #if defined(ARCH_X86_HAVE_SSSE3) 1817b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (gArchUseSIMD) { 1827b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if ((x1 + 8) < x2) { 1837b7060c61e4182b29186849c5a857ea5f0898e56Rose, James uint32_t len = (x2 - x1) >> 3; 1847b7060c61e4182b29186849c5a857ea5f0898e56Rose, James rsdIntrinsicBlendSrcIn_K(out, in, len); 1857b7060c61e4182b29186849c5a857ea5f0898e56Rose, James x1 += len << 3; 1867b7060c61e4182b29186849c5a857ea5f0898e56Rose, James out += len << 3; 1877b7060c61e4182b29186849c5a857ea5f0898e56Rose, James in += len << 3; 1887b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 1897b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 1907b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #endif 19136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 19236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 in_s = convert_short4(*in); 1930b575de8ed0b628d84d256f5846500b0385979bdTim Murray in_s = (in_s * out->w) >> (short4)8; 19436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = convert_uchar4(in_s); 19536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 19636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 19736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_DST_IN: 1987b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #if defined(ARCH_X86_HAVE_SSSE3) 1997b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (gArchUseSIMD) { 2007b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if ((x1 + 8) < x2) { 2017b7060c61e4182b29186849c5a857ea5f0898e56Rose, James uint32_t len = (x2 - x1) >> 3; 2027b7060c61e4182b29186849c5a857ea5f0898e56Rose, James rsdIntrinsicBlendDstIn_K(out, in, len); 2037b7060c61e4182b29186849c5a857ea5f0898e56Rose, James x1 += len << 3; 2047b7060c61e4182b29186849c5a857ea5f0898e56Rose, James out += len << 3; 2057b7060c61e4182b29186849c5a857ea5f0898e56Rose, James in += len << 3; 2067b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 2077b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 2087b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #endif 20936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 21036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 out_s = convert_short4(*out); 2110b575de8ed0b628d84d256f5846500b0385979bdTim Murray out_s = (out_s * in->w) >> (short4)8; 21236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = convert_uchar4(out_s); 21336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 21436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 21536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SRC_OUT: 2167b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #if defined(ARCH_X86_HAVE_SSSE3) 2177b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (gArchUseSIMD) { 2187b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if ((x1 + 8) < x2) { 2197b7060c61e4182b29186849c5a857ea5f0898e56Rose, James uint32_t len = (x2 - x1) >> 3; 2207b7060c61e4182b29186849c5a857ea5f0898e56Rose, James rsdIntrinsicBlendSrcOut_K(out, in, len); 2217b7060c61e4182b29186849c5a857ea5f0898e56Rose, James x1 += len << 3; 2227b7060c61e4182b29186849c5a857ea5f0898e56Rose, James out += len << 3; 2237b7060c61e4182b29186849c5a857ea5f0898e56Rose, James in += len << 3; 2247b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 2257b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 2267b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #endif 22736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 22836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 in_s = convert_short4(*in); 2290b575de8ed0b628d84d256f5846500b0385979bdTim Murray in_s = (in_s * (short4)(255 - out->w)) >> (short4)8; 23036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = convert_uchar4(in_s); 23136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 23236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 23336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_DST_OUT: 2347b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #if defined(ARCH_X86_HAVE_SSSE3) 2357b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (gArchUseSIMD) { 2367b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if ((x1 + 8) < x2) { 2377b7060c61e4182b29186849c5a857ea5f0898e56Rose, James uint32_t len = (x2 - x1) >> 3; 2387b7060c61e4182b29186849c5a857ea5f0898e56Rose, James rsdIntrinsicBlendDstOut_K(out, in, len); 2397b7060c61e4182b29186849c5a857ea5f0898e56Rose, James x1 += len << 3; 2407b7060c61e4182b29186849c5a857ea5f0898e56Rose, James out += len << 3; 2417b7060c61e4182b29186849c5a857ea5f0898e56Rose, James in += len << 3; 2427b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 2437b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 2447b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #endif 24536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 24636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 out_s = convert_short4(*out); 2470b575de8ed0b628d84d256f5846500b0385979bdTim Murray out_s = (out_s * (short4)(255 - in->w)) >> (short4)8; 24836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = convert_uchar4(out_s); 24936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 25036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 25136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SRC_ATOP: 2527b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #if defined(ARCH_X86_HAVE_SSSE3) 2537b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (gArchUseSIMD) { 2547b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if ((x1 + 8) < x2) { 2557b7060c61e4182b29186849c5a857ea5f0898e56Rose, James uint32_t len = (x2 - x1) >> 3; 2567b7060c61e4182b29186849c5a857ea5f0898e56Rose, James rsdIntrinsicBlendSrcAtop_K(out, in, len); 2577b7060c61e4182b29186849c5a857ea5f0898e56Rose, James x1 += len << 3; 2587b7060c61e4182b29186849c5a857ea5f0898e56Rose, James out += len << 3; 2597b7060c61e4182b29186849c5a857ea5f0898e56Rose, James in += len << 3; 2607b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 2617b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 2627b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #endif 26336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 26436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 in_s = convert_short4(*in); 26536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 out_s = convert_short4(*out); 2660b575de8ed0b628d84d256f5846500b0385979bdTim Murray out_s.xyz = ((in_s.xyz * out_s.w) + 2670b575de8ed0b628d84d256f5846500b0385979bdTim Murray (out_s.xyz * ((short3)255 - (short3)in_s.w))) >> (short3)8; 26836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = convert_uchar4(out_s); 26936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 27036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 27136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_DST_ATOP: 2727b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #if defined(ARCH_X86_HAVE_SSSE3) 2737b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (gArchUseSIMD) { 2747b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if ((x1 + 8) < x2) { 2757b7060c61e4182b29186849c5a857ea5f0898e56Rose, James uint32_t len = (x2 - x1) >> 3; 2767b7060c61e4182b29186849c5a857ea5f0898e56Rose, James rsdIntrinsicBlendDstAtop_K(out, in, len); 2777b7060c61e4182b29186849c5a857ea5f0898e56Rose, James x1 += len << 3; 2787b7060c61e4182b29186849c5a857ea5f0898e56Rose, James out += len << 3; 2797b7060c61e4182b29186849c5a857ea5f0898e56Rose, James in += len << 3; 2807b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 2817b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 2827b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #endif 28336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 28436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 in_s = convert_short4(*in); 28536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray short4 out_s = convert_short4(*out); 2860b575de8ed0b628d84d256f5846500b0385979bdTim Murray out_s.xyz = ((out_s.xyz * in_s.w) + 2870b575de8ed0b628d84d256f5846500b0385979bdTim Murray (in_s.xyz * ((short3)255 - (short3)out_s.w))) >> (short3)8; 288820e22b13fb48bc4719fa606ee4bc47e184970e0Stephen Hines out_s.w = in_s.w; 28936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = convert_uchar4(out_s); 29036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 29136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 29236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_XOR: 2937b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #if defined(ARCH_X86_HAVE_SSSE3) 2947b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (gArchUseSIMD) { 2957b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if ((x1 + 8) < x2) { 2967b7060c61e4182b29186849c5a857ea5f0898e56Rose, James uint32_t len = (x2 - x1) >> 3; 2977b7060c61e4182b29186849c5a857ea5f0898e56Rose, James rsdIntrinsicBlendXor_K(out, in, len); 2987b7060c61e4182b29186849c5a857ea5f0898e56Rose, James x1 += len << 3; 2997b7060c61e4182b29186849c5a857ea5f0898e56Rose, James out += len << 3; 3007b7060c61e4182b29186849c5a857ea5f0898e56Rose, James in += len << 3; 3017b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 3027b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 3037b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #endif 30436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 30536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = *in ^ *out; 30636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 30736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 30836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_NORMAL: 30936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_NORMAL"); 31036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 31136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 31236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_AVERAGE: 31336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_AVERAGE"); 31436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 31536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 31636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_MULTIPLY: 3177b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #if defined(ARCH_X86_HAVE_SSSE3) 3187b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (gArchUseSIMD) { 3197b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if ((x1 + 8) < x2) { 3207b7060c61e4182b29186849c5a857ea5f0898e56Rose, James uint32_t len = (x2 - x1) >> 3; 3217b7060c61e4182b29186849c5a857ea5f0898e56Rose, James rsdIntrinsicBlendMultiply_K(out, in, len); 3227b7060c61e4182b29186849c5a857ea5f0898e56Rose, James x1 += len << 3; 3237b7060c61e4182b29186849c5a857ea5f0898e56Rose, James out += len << 3; 3247b7060c61e4182b29186849c5a857ea5f0898e56Rose, James in += len << 3; 3257b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 3267b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 3277b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #endif 32836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 32936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray *out = convert_uchar4((convert_short4(*in) * convert_short4(*out)) 33036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray >> (short4)8); 33136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 33236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 33336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SCREEN: 33436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_SCREEN"); 33536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 33636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 33736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_DARKEN: 33836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_DARKEN"); 33936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 34036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 34136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_LIGHTEN: 34236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_LIGHTEN"); 34336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 34436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 34536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_OVERLAY: 34636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_OVERLAY"); 34736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 34836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 34936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_HARDLIGHT: 35036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_HARDLIGHT"); 35136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 35236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 35336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SOFTLIGHT: 35436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_SOFTLIGHT"); 35536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 35636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 35736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_DIFFERENCE: 35836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_DIFFERENCE"); 35936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 36036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 36136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_NEGATION: 36236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_NEGATION"); 36336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 36436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 36536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_EXCLUSION: 36636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_EXCLUSION"); 36736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 36836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 36936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_COLOR_DODGE: 37036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_COLOR_DODGE"); 37136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 37236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 37336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_INVERSE_COLOR_DODGE: 37436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_INVERSE_COLOR_DODGE"); 37536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 37636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 37736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SOFT_DODGE: 37836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_SOFT_DODGE"); 37936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 38036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 38136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_COLOR_BURN: 38236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_COLOR_BURN"); 38336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 38436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 38536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_INVERSE_COLOR_BURN: 38636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_INVERSE_COLOR_BURN"); 38736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 38836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 38936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SOFT_BURN: 39036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_SOFT_BURN"); 39136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 39236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 39336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_REFLECT: 39436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_REFLECT"); 39536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 39636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 39736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_GLOW: 39836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_GLOW"); 39936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 40036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 40136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_FREEZE: 40236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_FREEZE"); 40336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 40436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 40536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_HEAT: 40636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_HEAT"); 40736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 40836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 40936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_ADD: 4107b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #if defined(ARCH_X86_HAVE_SSSE3) 4117b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (gArchUseSIMD) { 4127b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if((x1 + 8) < x2) { 4137b7060c61e4182b29186849c5a857ea5f0898e56Rose, James uint32_t len = (x2 - x1) >> 3; 4147b7060c61e4182b29186849c5a857ea5f0898e56Rose, James rsdIntrinsicBlendAdd_K(out, in, len); 4157b7060c61e4182b29186849c5a857ea5f0898e56Rose, James x1 += len << 3; 4167b7060c61e4182b29186849c5a857ea5f0898e56Rose, James out += len << 3; 4177b7060c61e4182b29186849c5a857ea5f0898e56Rose, James in += len << 3; 4187b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 4197b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 4207b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #endif 42136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 4220b575de8ed0b628d84d256f5846500b0385979bdTim Murray uint32_t iR = in->x, iG = in->y, iB = in->z, iA = in->w, 4230b575de8ed0b628d84d256f5846500b0385979bdTim Murray oR = out->x, oG = out->y, oB = out->z, oA = out->w; 4240b575de8ed0b628d84d256f5846500b0385979bdTim Murray out->x = (oR + iR) > 255 ? 255 : oR + iR; 4250b575de8ed0b628d84d256f5846500b0385979bdTim Murray out->y = (oG + iG) > 255 ? 255 : oG + iG; 4260b575de8ed0b628d84d256f5846500b0385979bdTim Murray out->z = (oB + iB) > 255 ? 255 : oB + iB; 4270b575de8ed0b628d84d256f5846500b0385979bdTim Murray out->w = (oA + iA) > 255 ? 255 : oA + iA; 42836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 42936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 43036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SUBTRACT: 4317b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #if defined(ARCH_X86_HAVE_SSSE3) 4327b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if (gArchUseSIMD) { 4337b7060c61e4182b29186849c5a857ea5f0898e56Rose, James if((x1 + 8) < x2) { 4347b7060c61e4182b29186849c5a857ea5f0898e56Rose, James uint32_t len = (x2 - x1) >> 3; 4357b7060c61e4182b29186849c5a857ea5f0898e56Rose, James rsdIntrinsicBlendSub_K(out, in, len); 4367b7060c61e4182b29186849c5a857ea5f0898e56Rose, James x1 += len << 3; 4377b7060c61e4182b29186849c5a857ea5f0898e56Rose, James out += len << 3; 4387b7060c61e4182b29186849c5a857ea5f0898e56Rose, James in += len << 3; 4397b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 4407b7060c61e4182b29186849c5a857ea5f0898e56Rose, James } 4417b7060c61e4182b29186849c5a857ea5f0898e56Rose, James #endif 44236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray for (;x1 < x2; x1++, out++, in++) { 4430b575de8ed0b628d84d256f5846500b0385979bdTim Murray int32_t iR = in->x, iG = in->y, iB = in->z, iA = in->w, 4440b575de8ed0b628d84d256f5846500b0385979bdTim Murray oR = out->x, oG = out->y, oB = out->z, oA = out->w; 4450b575de8ed0b628d84d256f5846500b0385979bdTim Murray out->x = (oR - iR) < 0 ? 0 : oR - iR; 4460b575de8ed0b628d84d256f5846500b0385979bdTim Murray out->y = (oG - iG) < 0 ? 0 : oG - iG; 4470b575de8ed0b628d84d256f5846500b0385979bdTim Murray out->z = (oB - iB) < 0 ? 0 : oB - iB; 4480b575de8ed0b628d84d256f5846500b0385979bdTim Murray out->w = (oA - iA) < 0 ? 0 : oA - iA; 44936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray } 45036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 45136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_STAMP: 45236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_STAMP"); 45336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 45436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 45536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_RED: 45636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_RED"); 45736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 45836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 45936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_GREEN: 46036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_GREEN"); 46136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 46236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 46336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_BLUE: 46436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_BLUE"); 46536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 46636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 46736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_HUE: 46836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_HUE"); 46936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 47036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 47136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_SATURATION: 47236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_SATURATION"); 47336889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 47436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 47536889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_COLOR: 47636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_COLOR"); 47736889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 47836889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 47936889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray case BLEND_LUMINOSITY: 48036889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray ALOGE("Called unimplemented blend intrinsic BLEND_LUMINOSITY"); 48136889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 48236889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray break; 483cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 48436889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray default: 485b0abb140ac51b93d1a85aadaa63fe057f2d29850David Gross ALOGE("Called unimplemented value %d", info->slot); 48636889a0ecf564e3d47e7f69bb030c6b927061792Tim Murray rsAssert(false); 487cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 488cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams } 489cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams} 490cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 491cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 492c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason SamsRsdCpuScriptIntrinsicBlend::RsdCpuScriptIntrinsicBlend(RsdCpuReferenceImpl *ctx, 493c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams const Script *s, const Element *e) 494c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams : RsdCpuScriptIntrinsic(ctx, s, e, RS_SCRIPT_INTRINSIC_ID_BLEND) { 495cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 496709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mRootPtr = &kernel; 497cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams} 498cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams 499709a0978ae141198018ca9769f8d96292a8928e6Jason SamsRsdCpuScriptIntrinsicBlend::~RsdCpuScriptIntrinsicBlend() { 500709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 501709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 502709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicBlend::populateScript(Script *s) { 503709a0978ae141198018ca9769f8d96292a8928e6Jason Sams s->mHal.info.exportedVariableCount = 0; 504709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 505709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 506c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason SamsRsdCpuScriptImpl * rsdIntrinsic_Blend(RsdCpuReferenceImpl *ctx, 507c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams const Script *s, const Element *e) { 508c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams return new RsdCpuScriptIntrinsicBlend(ctx, s, e); 509709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 510462de21ac2e1773b99aedee012adb374e476ae36Chih-Hung Hsieh 511462de21ac2e1773b99aedee012adb374e476ae36Chih-Hung Hsieh} // namespace renderscript 512462de21ac2e1773b99aedee012adb374e476ae36Chih-Hung Hsieh} // namespace android 513