ScriptIntrinsic3DLUT.java revision 02d56d90e01e20db8424de94a14fe59dc94f19c0
140f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams/*
240f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams * Copyright (C) 2012 The Android Open Source Project
340f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams *
440f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
540f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams * you may not use this file except in compliance with the License.
640f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams * You may obtain a copy of the License at
740f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams *
840f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
940f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams *
1040f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams * Unless required by applicable law or agreed to in writing, software
1140f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1240f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1340f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams * See the License for the specific language governing permissions and
1440f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams * limitations under the License.
1540f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams */
1640f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams
1740f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Samspackage android.renderscript;
1840f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams
1940f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Samsimport android.util.Log;
2040f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams
2140f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams/**
2240f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams *
2302d56d90e01e20db8424de94a14fe59dc94f19c0Jason Sams * Intrinsic for converting RGB to RGBA by using a 3D lookup table.  The
2402d56d90e01e20db8424de94a14fe59dc94f19c0Jason Sams * incoming r,g,b values are use as normalized x,y,z coordinates into a 3D
2502d56d90e01e20db8424de94a14fe59dc94f19c0Jason Sams * allocation.  The 8 nearest values are sampled and linearly interpolated.  The
2602d56d90e01e20db8424de94a14fe59dc94f19c0Jason Sams * result is placed in the output.
2702d56d90e01e20db8424de94a14fe59dc94f19c0Jason Sams *
2840f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams **/
2940f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Samspublic final class ScriptIntrinsic3DLUT extends ScriptIntrinsic {
3040f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams    private Allocation mLUT;
3140f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams    private Element mElement;
3240f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams
3340f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams    private ScriptIntrinsic3DLUT(int id, RenderScript rs, Element e) {
3440f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams        super(id, rs);
3540f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams        mElement = e;
3640f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams    }
3740f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams
3840f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams    /**
3940f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams     * Supported elements types are {@link Element#U8_4}
4040f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams     *
4140f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams     * The defaults tables are identity.
4240f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams     *
4340f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams     * @param rs The Renderscript context
4440f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams     * @param e Element type for intputs and outputs
4540f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams     *
4640f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams     * @return ScriptIntrinsic3DLUT
4740f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams     */
4840f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams    public static ScriptIntrinsic3DLUT create(RenderScript rs, Element e) {
4940f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams        int id = rs.nScriptIntrinsicCreate(8, e.getID(rs));
5040f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams
5140f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams        if (!e.isCompatible(Element.U8_4(rs))) {
521e645d29250731c6e34040940c59f1033213ad3eJason Sams            throw new RSIllegalArgumentException("Element must be compatible with uchar4.");
5340f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams        }
5440f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams
5540f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams        return new ScriptIntrinsic3DLUT(id, rs, e);
5640f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams    }
5740f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams
5840f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams    public void setLUT(Allocation lut) {
5940f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams        final Type t = lut.getType();
6040f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams
6140f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams        if (t.getZ() == 0) {
6240f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams            throw new RSIllegalArgumentException("LUT must be 3d.");
6340f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams        }
6440f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams
6540f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams        if (!t.getElement().isCompatible(mElement)) {
6640f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams            throw new RSIllegalArgumentException("LUT element type must match.");
6740f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams        }
6840f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams
6940f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams        mLUT = lut;
7040f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams        setVar(0, mLUT);
7140f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams    }
7240f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams
7340f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams
7440f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams    /**
7540f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams     * Invoke the kernel and apply the lookup to each cell of ain
7640f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams     * and copy to aout.
7740f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams     *
7840f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams     * @param ain Input allocation
7940f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams     * @param aout Output allocation
8040f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams     */
8140f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams    public void forEach(Allocation ain, Allocation aout) {
8240f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams        forEach(0, ain, aout, null);
8340f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams    }
8440f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams
8540f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams    /**
8640f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams     * Get a KernelID for this intrinsic kernel.
8740f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams     *
8840f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams     * @return Script.KernelID The KernelID object.
8940f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams     */
9040f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams    public Script.KernelID getKernelID() {
9140f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams        return createKernelID(0, 3, null, null);
9240f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams    }
9340f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams}
9440f1fa6ed699b885e3270faf88085ed78f54a2f4Jason Sams
95