15729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams/*
25729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams * Copyright (C) 2012 The Android Open Source Project
35729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams *
45729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
55729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams * you may not use this file except in compliance with the License.
65729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams * You may obtain a copy of the License at
75729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams *
85729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
95729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams *
105729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams * Unless required by applicable law or agreed to in writing, software
115729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
125729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams * See the License for the specific language governing permissions and
145729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams * limitations under the License.
155729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams */
165729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams
175729fcdf950eb909b0ab90a49af58731ed8f92cdJason Samspackage android.renderscript;
185729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams
195729fcdf950eb909b0ab90a49af58731ed8f92cdJason Samsimport android.content.Context;
205729fcdf950eb909b0ab90a49af58731ed8f92cdJason Samsimport android.content.res.Resources;
215729fcdf950eb909b0ab90a49af58731ed8f92cdJason Samsimport android.util.Log;
225729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams
235729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams/**
2480d819033d4687507907f787d47379b7b37eae19Jason Sams * Intrinsic for applying a color matrix to allocations.
2580d819033d4687507907f787d47379b7b37eae19Jason Sams *
2680d819033d4687507907f787d47379b7b37eae19Jason Sams * This has the same effect as loading each element and
2780d819033d4687507907f787d47379b7b37eae19Jason Sams * converting it to a {@link Element#F32_4}, multiplying the
2880d819033d4687507907f787d47379b7b37eae19Jason Sams * result by the 4x4 color matrix as performed by
2980d819033d4687507907f787d47379b7b37eae19Jason Sams * rsMatrixMultiply() and writing it to the output after
3080d819033d4687507907f787d47379b7b37eae19Jason Sams * conversion back to {@link Element#U8_4}.
315729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams **/
3280d819033d4687507907f787d47379b7b37eae19Jason Samspublic final class ScriptIntrinsicColorMatrix extends ScriptIntrinsic {
3380d819033d4687507907f787d47379b7b37eae19Jason Sams    private final Matrix4f mMatrix = new Matrix4f();
345729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams    private Allocation mInput;
355729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams
3680d819033d4687507907f787d47379b7b37eae19Jason Sams    private ScriptIntrinsicColorMatrix(int id, RenderScript rs) {
375729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams        super(id, rs);
385729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams    }
395729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams
405729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams    /**
4180d819033d4687507907f787d47379b7b37eae19Jason Sams     * Create an intrinsic for applying a color matrix to an
4280d819033d4687507907f787d47379b7b37eae19Jason Sams     * allocation.
435729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams     *
4480d819033d4687507907f787d47379b7b37eae19Jason Sams     * Supported elements types are {@link Element#U8_4}
4580d819033d4687507907f787d47379b7b37eae19Jason Sams     *
4680d819033d4687507907f787d47379b7b37eae19Jason Sams     * @param rs The Renderscript context
4780d819033d4687507907f787d47379b7b37eae19Jason Sams     * @param e Element type for intputs and outputs
485729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams     *
495729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams     * @return ScriptIntrinsicColorMatrix
505729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams     */
515729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams    public static ScriptIntrinsicColorMatrix create(RenderScript rs, Element e) {
5280d819033d4687507907f787d47379b7b37eae19Jason Sams        if (e != Element.U8_4(rs)) {
5380d819033d4687507907f787d47379b7b37eae19Jason Sams            throw new RSIllegalArgumentException("Unsuported element type.");
5480d819033d4687507907f787d47379b7b37eae19Jason Sams        }
555729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams        int id = rs.nScriptIntrinsicCreate(2, e.getID(rs));
565729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams        return new ScriptIntrinsicColorMatrix(id, rs);
575729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams
585729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams    }
595729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams
608fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams    private void setMatrix() {
615729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams        FieldPacker fp = new FieldPacker(16*4);
628fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        fp.addMatrix(mMatrix);
635729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams        setVar(0, fp);
645729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams    }
655729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams
668fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams    /**
6780d819033d4687507907f787d47379b7b37eae19Jason Sams     * Set the color matrix which will be applied to each cell of
6880d819033d4687507907f787d47379b7b37eae19Jason Sams     * the image.
698fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams     *
708fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams     * @param m The 4x4 matrix to set.
718fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams     */
728fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams    public void setColorMatrix(Matrix4f m) {
738fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.load(m);
748fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        setMatrix();
758fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams    }
768fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams
778fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams    /**
788fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams     * Set the color matrix which will be applied to each cell of the image.
798fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams     * This will set the alpha channel to be a copy.
808fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams     *
818fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams     * @param m The 3x3 matrix to set.
828fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams     */
838fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams    public void setColorMatrix(Matrix3f m) {
848fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.load(m);
858fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        setMatrix();
868fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams    }
878fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams
888fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams    /**
8917fec32bba9da8df2062b52e414435574652ad50Jason Sams     * Set a color matrix to convert from RGB to luminance. The alpha channel
908fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams     * will be a copy.
918fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams     *
928fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams     */
938fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams    public void setGreyscale() {
948fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.loadIdentity();
958fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.set(0, 0, 0.299f);
968fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.set(1, 0, 0.587f);
978fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.set(2, 0, 0.114f);
988fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.set(0, 1, 0.299f);
998fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.set(1, 1, 0.587f);
1008fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.set(2, 1, 0.114f);
1018fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.set(0, 2, 0.299f);
1028fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.set(1, 2, 0.587f);
1038fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.set(2, 2, 0.114f);
1048fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        setMatrix();
1058fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams    }
1068fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams
1078fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams    /**
1088fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams     * Set the matrix to convert from YUV to RGB with a direct copy of the 4th
1098fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams     * channel.
1108fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams     *
1118fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams     */
1128fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams    public void setYUVtoRGB() {
1138fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.loadIdentity();
1148fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.set(0, 0, 1.f);
1158fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.set(1, 0, 0.f);
1168fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.set(2, 0, 1.13983f);
1178fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.set(0, 1, 1.f);
1188fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.set(1, 1, -0.39465f);
1198fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.set(2, 1, -0.5806f);
1208fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.set(0, 2, 1.f);
1218fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.set(1, 2, 2.03211f);
1228fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.set(2, 2, 0.f);
1238fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        setMatrix();
1248fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams    }
1258fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams
1268fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams    /**
1278fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams     * Set the matrix to convert from RGB to YUV with a direct copy of the 4th
1288fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams     * channel.
1298fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams     *
1308fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams     */
1318fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams    public void setRGBtoYUV() {
1328fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.loadIdentity();
1338fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.set(0, 0, 0.299f);
1348fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.set(1, 0, 0.587f);
1358fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.set(2, 0, 0.114f);
1368fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.set(0, 1, -0.14713f);
1378fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.set(1, 1, -0.28886f);
1388fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.set(2, 1, 0.436f);
1398fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.set(0, 2, 0.615f);
1408fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.set(1, 2, -0.51499f);
1418fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mMatrix.set(2, 2, -0.10001f);
1428fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        setMatrix();
1438fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams    }
1448fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams
1458fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams
1468fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams    /**
1478fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams     * Invoke the kernel and apply the matrix to each cell of ain and copy to
1488fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams     * aout.
1498fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams     *
1508fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams     * @param ain Input allocation
1518fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams     * @param aout Output allocation
1528fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams     */
1535729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams    public void forEach(Allocation ain, Allocation aout) {
1545729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams        forEach(0, ain, aout, null);
1555729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams    }
1565729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams
15708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    /**
15808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     * Get a KernelID for this intrinsic kernel.
15908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     *
16008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     * @return Script.KernelID The KernelID object.
16108a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     */
16208a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    public Script.KernelID getKernelID() {
16308a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        return createKernelID(0, 3, null, null);
16408a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    }
16508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
1665729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams}
1675729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams
168