Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 40f1fa6e authored by Jason Sams's avatar Jason Sams
Browse files

Add 3D LUT intrinsic java class

Add test for 3D LUT

Change-Id: I52bc20fd5458afda6de0a6015e9c8bc6a4970055
parent 3d516104
Loading
Loading
Loading
Loading
+90 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.renderscript;

import android.util.Log;

/**
 *
 * @hide
 **/
public final class ScriptIntrinsic3DLUT extends ScriptIntrinsic {
    private Allocation mLUT;
    private Element mElement;

    private ScriptIntrinsic3DLUT(int id, RenderScript rs, Element e) {
        super(id, rs);
        mElement = e;
    }

    /**
     * Supported elements types are {@link Element#U8_4}
     *
     * The defaults tables are identity.
     *
     * @param rs The Renderscript context
     * @param e Element type for intputs and outputs
     *
     * @return ScriptIntrinsic3DLUT
     */
    public static ScriptIntrinsic3DLUT create(RenderScript rs, Element e) {
        int id = rs.nScriptIntrinsicCreate(8, e.getID(rs));

        if (!e.isCompatible(Element.U8_4(rs))) {
            throw new RSIllegalArgumentException("Element must be compatibile with uchar4.");
        }

        return new ScriptIntrinsic3DLUT(id, rs, e);
    }

    public void setLUT(Allocation lut) {
        final Type t = lut.getType();

        if (t.getZ() == 0) {
            throw new RSIllegalArgumentException("LUT must be 3d.");
        }

        if (!t.getElement().isCompatible(mElement)) {
            throw new RSIllegalArgumentException("LUT element type must match.");
        }

        mLUT = lut;
        setVar(0, mLUT);
    }


    /**
     * Invoke the kernel and apply the lookup to each cell of ain
     * and copy to aout.
     *
     * @param ain Input allocation
     * @param aout Output allocation
     */
    public void forEach(Allocation ain, Allocation aout) {
        forEach(0, ain, aout, null);
    }

    /**
     * Get a KernelID for this intrinsic kernel.
     *
     * @return Script.KernelID The KernelID object.
     */
    public Script.KernelID getKernelID() {
        return createKernelID(0, 3, null, null);
    }
}
+12 −5
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.renderscript.RenderScript;
import android.renderscript.Script;
import android.renderscript.ScriptC;
import android.renderscript.ScriptGroup;
import android.renderscript.ScriptIntrinsic3DLUT;
import android.renderscript.ScriptIntrinsicColorMatrix;
import android.renderscript.Type;
import android.util.Log;
@@ -32,8 +33,11 @@ import android.util.Log;
public class ColorCube extends TestBase {
    private Allocation mCube;
    private ScriptC_colorcube mScript;
    private ScriptIntrinsic3DLUT mIntrinsic;
    private boolean mUseIntrinsic;

    public ColorCube() {
    public ColorCube(boolean useIntrinsic) {
        mUseIntrinsic = useIntrinsic;
    }

    private void initCube() {
@@ -66,16 +70,19 @@ public class ColorCube extends TestBase {

    public void createTest(android.content.res.Resources res) {
        mScript = new ScriptC_colorcube(mRS, res, R.raw.colorcube);
        mIntrinsic = ScriptIntrinsic3DLUT.create(mRS, Element.U8_4(mRS));

        initCube();
        mScript.invoke_setCube(mCube);


        //mScript.invoke_setMatrix(m);
        mIntrinsic.setLUT(mCube);
    }

    public void runTest() {
        if (mUseIntrinsic) {
            mIntrinsic.forEach(mInPixelsAllocation, mOutPixelsAllocation);
        } else {
            mScript.forEach_root(mInPixelsAllocation, mOutPixelsAllocation);
        }
    }

}
+6 −2
Original line number Diff line number Diff line
@@ -292,7 +292,10 @@ public class ImageProcessingActivity extends Activity
            mTest = new WhiteBalance();
            break;
        case 36:
            mTest = new ColorCube();
            mTest = new ColorCube(false);
            break;
        case 37:
            mTest = new ColorCube(true);
            break;
        }

@@ -305,7 +308,7 @@ public class ImageProcessingActivity extends Activity
    }

    void setupTests() {
        mTestNames = new String[37];
        mTestNames = new String[38];
        mTestNames[0] = "Levels Vec3 Relaxed";
        mTestNames[1] = "Levels Vec4 Relaxed";
        mTestNames[2] = "Levels Vec3 Full";
@@ -343,6 +346,7 @@ public class ImageProcessingActivity extends Activity
        mTestNames[34] = "Exposure";
        mTestNames[35] = "White Balance";
        mTestNames[36] = "Color Cube";
        mTestNames[37] = "Color Cube (3D LUT intrinsic)";

        mTestSpinner.setAdapter(new ArrayAdapter<String>(
            this, R.layout.spinner_layout, mTestNames));