1a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams/* 2a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * Copyright (C) 2012 The Android Open Source Project 3a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 4a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * you may not use this file except in compliance with the License. 6a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * You may obtain a copy of the License at 7a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 8a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 9a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 10a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * Unless required by applicable law or agreed to in writing, software 11a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * See the License for the specific language governing permissions and 14a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * limitations under the License. 15a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 16a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 17a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Samspackage android.support.v8.renderscript; 18a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 19a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 20a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams/** 212192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * Intrinsic kernels for blending two 222192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines * {@link android.support.v8.renderscript.Allocation} objects. 23a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams **/ 24a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Samspublic class ScriptIntrinsicBlend extends ScriptIntrinsic { 256f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang // API level for the intrinsic 266f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang private static final int INTRINSIC_API_LEVEL = 19; 276f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang 28bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang ScriptIntrinsicBlend(long id, RenderScript rs) { 29a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams super(id, rs); 30a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 31a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 32a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 33032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * Supported elements types are {@link Element#U8_4} 34a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 35032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * @param rs The RenderScript context 36032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * @param e Element type for inputs and outputs 37a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 38a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @return ScriptIntrinsicBlend 39a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 40a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public static ScriptIntrinsicBlend create(RenderScript rs, Element e) { 41a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams // 7 comes from RS_SCRIPT_INTRINSIC_ID_BLEND in rsDefines.h 426f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang long id; 436f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang boolean mUseIncSupp = rs.isUseNative() && 446f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang android.os.Build.VERSION.SDK_INT < INTRINSIC_API_LEVEL; 456f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang 466f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang id = rs.nScriptIntrinsicCreate(7, e.getID(rs), mUseIncSupp); 476f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang 486f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang ScriptIntrinsicBlend si = new ScriptIntrinsicBlend(id, rs); 496f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang si.setIncSupp(mUseIncSupp); 506f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang return si; 51a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 52a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 53a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 54a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams private void blend(int id, Allocation ain, Allocation aout) { 55a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams if (!ain.getElement().isCompatible(Element.U8_4(mRS))) { 56a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams throw new RSIllegalArgumentException("Input is not of expected format."); 57a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 58a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams if (!aout.getElement().isCompatible(Element.U8_4(mRS))) { 59a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams throw new RSIllegalArgumentException("Output is not of expected format."); 60a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 61a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams forEach(id, ain, aout, null); 62a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 63a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 64a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 65032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * Sets dst = {0, 0, 0, 0} 66a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 67a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param ain The source buffer 68a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param aout The destination buffer 69a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 70a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachClear(Allocation ain, Allocation aout) { 71a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(0, ain, aout); 72a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 73a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 74a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 75a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * Get a KernelID for the Clear kernel. 76a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 77a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @return Script.KernelID The KernelID object. 78a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 79a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public Script.KernelID getKernelIDClear() { 80a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams return createKernelID(0, 3, null, null); 81a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 82a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 83a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 84a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 85032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * Sets dst = src 86a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 87a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param ain The source buffer 88a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param aout The destination buffer 89a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 90a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachSrc(Allocation ain, Allocation aout) { 91a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(1, ain, aout); 92a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 93a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 94a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 95a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * Get a KernelID for the Src kernel. 96a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 97a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @return Script.KernelID The KernelID object. 98a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 99a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public Script.KernelID getKernelIDSrc() { 100a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams return createKernelID(1, 3, null, null); 101a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 102a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 103a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 104032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * Sets dst = dst 105032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * 106032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * This is a NOP. 107a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 108a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param ain The source buffer 109a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param aout The destination buffer 110a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 111a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachDst(Allocation ain, Allocation aout) { 112a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams // NOP 113a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 114a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 115a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 116a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * Get a KernelID for the Dst kernel. 117a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 118a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @return Script.KernelID The KernelID object. 119a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 120a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public Script.KernelID getKernelIDDst() { 121a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams return createKernelID(2, 3, null, null); 122a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 123a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 124a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 125032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * Sets dst = src + dst * (1.0 - src.a) 126a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 127a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param ain The source buffer 128a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param aout The destination buffer 129a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 130a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachSrcOver(Allocation ain, Allocation aout) { 131a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(3, ain, aout); 132a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 133a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 134a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 135a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * Get a KernelID for the SrcOver kernel. 136a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 137a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @return Script.KernelID The KernelID object. 138a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 139a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public Script.KernelID getKernelIDSrcOver() { 140a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams return createKernelID(3, 3, null, null); 141a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 142a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 143a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 144032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * Sets dst = dst + src * (1.0 - dst.a) 145a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 146a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param ain The source buffer 147a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param aout The destination buffer 148a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 149a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachDstOver(Allocation ain, Allocation aout) { 150a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(4, ain, aout); 151a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 152a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 153a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 154a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * Get a KernelID for the DstOver kernel. 155a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 156a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @return Script.KernelID The KernelID object. 157a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 158a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public Script.KernelID getKernelIDDstOver() { 159a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams return createKernelID(4, 3, null, null); 160a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 161a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 162a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 163032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * Sets dst = src * dst.a 164a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 165a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param ain The source buffer 166a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param aout The destination buffer 167a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 168a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachSrcIn(Allocation ain, Allocation aout) { 169a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(5, ain, aout); 170a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 171a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 172a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 173a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * Get a KernelID for the SrcIn kernel. 174a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 175a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @return Script.KernelID The KernelID object. 176a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 177a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public Script.KernelID getKernelIDSrcIn() { 178a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams return createKernelID(5, 3, null, null); 179a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 180a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 181a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 182032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * Sets dst = dst * src.a 183a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 184a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param ain The source buffer 185a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param aout The destination buffer 186a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 187a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachDstIn(Allocation ain, Allocation aout) { 188a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(6, ain, aout); 189a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 190a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 191a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 192a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * Get a KernelID for the DstIn kernel. 193a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 194a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @return Script.KernelID The KernelID object. 195a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 196a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public Script.KernelID getKernelIDDstIn() { 197a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams return createKernelID(6, 3, null, null); 198a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 199a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 200a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 201032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * Sets dst = src * (1.0 - dst.a) 202a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 203a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param ain The source buffer 204a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param aout The destination buffer 205a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 206a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachSrcOut(Allocation ain, Allocation aout) { 207a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(7, ain, aout); 208a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 209a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 210a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 211a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * Get a KernelID for the SrcOut kernel. 212a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 213a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @return Script.KernelID The KernelID object. 214a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 215a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public Script.KernelID getKernelIDSrcOut() { 216a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams return createKernelID(7, 3, null, null); 217a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 218a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 219a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 220032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * Sets dst = dst * (1.0 - src.a) 221a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 222a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param ain The source buffer 223a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param aout The destination buffer 224a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 225a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachDstOut(Allocation ain, Allocation aout) { 226a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(8, ain, aout); 227a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 228a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 229a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 230a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * Get a KernelID for the DstOut kernel. 231a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 232a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @return Script.KernelID The KernelID object. 233a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 234a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public Script.KernelID getKernelIDDstOut() { 235a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams return createKernelID(8, 3, null, null); 236a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 237a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 238a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 239a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * dst.rgb = src.rgb * dst.a + (1.0 - src.a) * dst.rgb 240a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * dst.a = dst.a 241a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 242a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param ain The source buffer 243a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param aout The destination buffer 244a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 245a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachSrcAtop(Allocation ain, Allocation aout) { 246a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(9, ain, aout); 247a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 248a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 249a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 250a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * Get a KernelID for the SrcAtop kernel. 251a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 252a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @return Script.KernelID The KernelID object. 253a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 254a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public Script.KernelID getKernelIDSrcAtop() { 255a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams return createKernelID(9, 3, null, null); 256a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 257a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 258a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 259a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * dst = dst.rgb * src.a + (1.0 - dst.a) * src.rgb 260a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * dst.a = src.a 261f53ee7c9d004304ffc22ad25320d34dde650aed7Miao Wang * Note: Before API 23, the alpha channel was not correctly set. 262f53ee7c9d004304ffc22ad25320d34dde650aed7Miao Wang * Please use with caution when targeting older APIs. 263a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 264a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param ain The source buffer 265a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param aout The destination buffer 266a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 267a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachDstAtop(Allocation ain, Allocation aout) { 268a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(10, ain, aout); 269a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 270a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 271a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 272a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * Get a KernelID for the DstAtop kernel. 273a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 274a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @return Script.KernelID The KernelID object. 275a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 276a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public Script.KernelID getKernelIDDstAtop() { 277a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams return createKernelID(10, 3, null, null); 278a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 279a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 280a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 281032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * Sets dst = {src.r ^ dst.r, src.g ^ dst.g, src.b ^ dst.b, src.a ^ dst.a} 282a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 283a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param ain The source buffer 284a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param aout The destination buffer 285a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 286a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachXor(Allocation ain, Allocation aout) { 287a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(11, ain, aout); 288a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 289a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 290a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 291a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * Get a KernelID for the Xor kernel. 292a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 293a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @return Script.KernelID The KernelID object. 294a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 295a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public Script.KernelID getKernelIDXor() { 296a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams return createKernelID(11, 3, null, null); 297a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 298a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 299a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams //////// 300a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams/* 301a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachNormal(Allocation ain, Allocation aout) { 302a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(12, ain, aout); 303a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 304a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 305a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachAverage(Allocation ain, Allocation aout) { 306a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(13, ain, aout); 307a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 308a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams*/ 309a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 310032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * Sets dst = src * dst 311a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 312a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param ain The source buffer 313a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param aout The destination buffer 314a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 315a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachMultiply(Allocation ain, Allocation aout) { 316a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(14, ain, aout); 317a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 318a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 319a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 320a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * Get a KernelID for the Multiply kernel. 321a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 322a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @return Script.KernelID The KernelID object. 323a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 324a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public Script.KernelID getKernelIDMultiply() { 325a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams return createKernelID(14, 3, null, null); 326a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 327a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 328a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams/* 329a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachScreen(Allocation ain, Allocation aout) { 330a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(15, ain, aout); 331a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 332a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 333a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachDarken(Allocation ain, Allocation aout) { 334a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(16, ain, aout); 335a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 336a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 337a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachLighten(Allocation ain, Allocation aout) { 338a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(17, ain, aout); 339a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 340a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 341a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachOverlay(Allocation ain, Allocation aout) { 342a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(18, ain, aout); 343a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 344a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 345a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachHardlight(Allocation ain, Allocation aout) { 346a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(19, ain, aout); 347a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 348a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 349a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachSoftlight(Allocation ain, Allocation aout) { 350a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(20, ain, aout); 351a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 352a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 353a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachDifference(Allocation ain, Allocation aout) { 354a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(21, ain, aout); 355a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 356a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 357a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachNegation(Allocation ain, Allocation aout) { 358a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(22, ain, aout); 359a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 360a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 361a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachExclusion(Allocation ain, Allocation aout) { 362a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(23, ain, aout); 363a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 364a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 365a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachColorDodge(Allocation ain, Allocation aout) { 366a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(24, ain, aout); 367a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 368a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 369a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachInverseColorDodge(Allocation ain, Allocation aout) { 370a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(25, ain, aout); 371a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 372a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 373a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachSoftDodge(Allocation ain, Allocation aout) { 374a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(26, ain, aout); 375a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 376a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 377a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachColorBurn(Allocation ain, Allocation aout) { 378a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(27, ain, aout); 379a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 380a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 381a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachInverseColorBurn(Allocation ain, Allocation aout) { 382a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(28, ain, aout); 383a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 384a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 385a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachSoftBurn(Allocation ain, Allocation aout) { 386a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(29, ain, aout); 387a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 388a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 389a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachReflect(Allocation ain, Allocation aout) { 390a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(30, ain, aout); 391a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 392a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 393a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachGlow(Allocation ain, Allocation aout) { 394a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(31, ain, aout); 395a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 396a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 397a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachFreeze(Allocation ain, Allocation aout) { 398a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(32, ain, aout); 399a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 400a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 401a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachHeat(Allocation ain, Allocation aout) { 402a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(33, ain, aout); 403a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 404a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams*/ 405a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 406032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * Sets dst = min(src + dst, 1.0) 407a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 408a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param ain The source buffer 409a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param aout The destination buffer 410a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 411a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachAdd(Allocation ain, Allocation aout) { 412a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(34, ain, aout); 413a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 414a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 415a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 416a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * Get a KernelID for the Add kernel. 417a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 418a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @return Script.KernelID The KernelID object. 419a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 420a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public Script.KernelID getKernelIDAdd() { 421a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams return createKernelID(34, 3, null, null); 422a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 423a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 424a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 425032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * Sets dst = max(dst - src, 0.0) 426a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 427a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param ain The source buffer 428a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @param aout The destination buffer 429a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 430a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachSubtract(Allocation ain, Allocation aout) { 431a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(35, ain, aout); 432a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 433a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 434a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams /** 435a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * Get a KernelID for the Subtract kernel. 436a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * 437a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * @return Script.KernelID The KernelID object. 438a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */ 439a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public Script.KernelID getKernelIDSubtract() { 440a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams return createKernelID(35, 3, null, null); 441a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 442a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 443a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams/* 444a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachStamp(Allocation ain, Allocation aout) { 445a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(36, ain, aout); 446a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 447a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 448a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachRed(Allocation ain, Allocation aout) { 449a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(37, ain, aout); 450a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 451a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 452a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachGreen(Allocation ain, Allocation aout) { 453a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(38, ain, aout); 454a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 455a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 456a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachBlue(Allocation ain, Allocation aout) { 457a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(39, ain, aout); 458a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 459a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 460a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachHue(Allocation ain, Allocation aout) { 461a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(40, ain, aout); 462a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 463a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 464a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachSaturation(Allocation ain, Allocation aout) { 465a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(41, ain, aout); 466a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 467a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 468a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachColor(Allocation ain, Allocation aout) { 469a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(42, ain, aout); 470a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 471a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 472a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams public void forEachLuminosity(Allocation ain, Allocation aout) { 473a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams blend(43, ain, aout); 474a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams } 475a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams*/ 476a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams} 477a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams 478