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