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