175f0d3110b04346b901771f96ce15cdbe907278fYang Ni/*
275f0d3110b04346b901771f96ce15cdbe907278fYang Ni * Copyright (C) 2016 The Android Open Source Project
375f0d3110b04346b901771f96ce15cdbe907278fYang Ni *
475f0d3110b04346b901771f96ce15cdbe907278fYang Ni * Licensed under the Apache License, Version 2.0 (the "License");
575f0d3110b04346b901771f96ce15cdbe907278fYang Ni * you may not use this file except in compliance with the License.
675f0d3110b04346b901771f96ce15cdbe907278fYang Ni * You may obtain a copy of the License at
775f0d3110b04346b901771f96ce15cdbe907278fYang Ni *
875f0d3110b04346b901771f96ce15cdbe907278fYang Ni *      http://www.apache.org/licenses/LICENSE-2.0
975f0d3110b04346b901771f96ce15cdbe907278fYang Ni *
1075f0d3110b04346b901771f96ce15cdbe907278fYang Ni * Unless required by applicable law or agreed to in writing, software
1175f0d3110b04346b901771f96ce15cdbe907278fYang Ni * distributed under the License is distributed on an "AS IS" BASIS,
1275f0d3110b04346b901771f96ce15cdbe907278fYang Ni * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1375f0d3110b04346b901771f96ce15cdbe907278fYang Ni * See the License for the specific language governing permissions and
1475f0d3110b04346b901771f96ce15cdbe907278fYang Ni * limitations under the License.
1575f0d3110b04346b901771f96ce15cdbe907278fYang Ni */
1675f0d3110b04346b901771f96ce15cdbe907278fYang Ni
1775f0d3110b04346b901771f96ce15cdbe907278fYang Nipackage com.android.rs.rsov.test;
1875f0d3110b04346b901771f96ce15cdbe907278fYang Ni
1975f0d3110b04346b901771f96ce15cdbe907278fYang Niimport android.content.Context;
2075f0d3110b04346b901771f96ce15cdbe907278fYang Niimport android.renderscript.Allocation;
2175f0d3110b04346b901771f96ce15cdbe907278fYang Niimport android.renderscript.Element;
2275f0d3110b04346b901771f96ce15cdbe907278fYang Niimport android.renderscript.RenderScript;
2375f0d3110b04346b901771f96ce15cdbe907278fYang Niimport android.renderscript.Type;
2475f0d3110b04346b901771f96ce15cdbe907278fYang Niimport android.util.Log;
2575f0d3110b04346b901771f96ce15cdbe907278fYang Ni
2675f0d3110b04346b901771f96ce15cdbe907278fYang Nipublic class UT_invert extends UnitTest {
2775f0d3110b04346b901771f96ce15cdbe907278fYang Ni    protected UT_invert(RSoVTestCore rstc, Context ctx) {
2875f0d3110b04346b901771f96ce15cdbe907278fYang Ni        super(rstc, "invert", ctx);
2975f0d3110b04346b901771f96ce15cdbe907278fYang Ni    }
3075f0d3110b04346b901771f96ce15cdbe907278fYang Ni
3175f0d3110b04346b901771f96ce15cdbe907278fYang Ni    private boolean Test(int width, int height, int depth) {
3275f0d3110b04346b901771f96ce15cdbe907278fYang Ni        RenderScript pRS = RenderScript.create(mCtx);
3375f0d3110b04346b901771f96ce15cdbe907278fYang Ni        ScriptC_invert s = new ScriptC_invert(pRS);
3475f0d3110b04346b901771f96ce15cdbe907278fYang Ni
3575f0d3110b04346b901771f96ce15cdbe907278fYang Ni        Type.Builder typeBuilder = new Type.Builder(pRS, Element.F32_4(pRS));
3675f0d3110b04346b901771f96ce15cdbe907278fYang Ni        typeBuilder.setX(width);
3775f0d3110b04346b901771f96ce15cdbe907278fYang Ni        if (height > 0) {
3875f0d3110b04346b901771f96ce15cdbe907278fYang Ni            typeBuilder.setY(height);
3975f0d3110b04346b901771f96ce15cdbe907278fYang Ni            if (depth > 0) {
4075f0d3110b04346b901771f96ce15cdbe907278fYang Ni                typeBuilder.setZ(depth);
4175f0d3110b04346b901771f96ce15cdbe907278fYang Ni            }
4275f0d3110b04346b901771f96ce15cdbe907278fYang Ni        }
4375f0d3110b04346b901771f96ce15cdbe907278fYang Ni
4475f0d3110b04346b901771f96ce15cdbe907278fYang Ni        if (depth < 1) {
4575f0d3110b04346b901771f96ce15cdbe907278fYang Ni            depth = 1;
4675f0d3110b04346b901771f96ce15cdbe907278fYang Ni        }
4775f0d3110b04346b901771f96ce15cdbe907278fYang Ni
4875f0d3110b04346b901771f96ce15cdbe907278fYang Ni        if (height < 1) {
4975f0d3110b04346b901771f96ce15cdbe907278fYang Ni            height = 1;
5075f0d3110b04346b901771f96ce15cdbe907278fYang Ni        }
5175f0d3110b04346b901771f96ce15cdbe907278fYang Ni
5275f0d3110b04346b901771f96ce15cdbe907278fYang Ni        Allocation A = Allocation.createTyped(pRS, typeBuilder.create());
5375f0d3110b04346b901771f96ce15cdbe907278fYang Ni        Allocation B = Allocation.createTyped(pRS, typeBuilder.create());
5475f0d3110b04346b901771f96ce15cdbe907278fYang Ni
5575f0d3110b04346b901771f96ce15cdbe907278fYang Ni        float a[] = new float[width * height * depth * 4];
5675f0d3110b04346b901771f96ce15cdbe907278fYang Ni        float b[] = new float[width * height * depth * 4];
5775f0d3110b04346b901771f96ce15cdbe907278fYang Ni
5875f0d3110b04346b901771f96ce15cdbe907278fYang Ni        java.util.Random rand = new java.util.Random();
5975f0d3110b04346b901771f96ce15cdbe907278fYang Ni
6075f0d3110b04346b901771f96ce15cdbe907278fYang Ni        for (int i = 0; i < width * height * depth * 4; i++) {
6175f0d3110b04346b901771f96ce15cdbe907278fYang Ni            a[i] = rand.nextFloat();
6275f0d3110b04346b901771f96ce15cdbe907278fYang Ni        }
6375f0d3110b04346b901771f96ce15cdbe907278fYang Ni
6475f0d3110b04346b901771f96ce15cdbe907278fYang Ni        A.copyFrom(a);
6575f0d3110b04346b901771f96ce15cdbe907278fYang Ni
6675f0d3110b04346b901771f96ce15cdbe907278fYang Ni        s.forEach_invert(A, B);
6775f0d3110b04346b901771f96ce15cdbe907278fYang Ni
6875f0d3110b04346b901771f96ce15cdbe907278fYang Ni        B.copyTo(b);
6975f0d3110b04346b901771f96ce15cdbe907278fYang Ni
7075f0d3110b04346b901771f96ce15cdbe907278fYang Ni        B.destroy();
7175f0d3110b04346b901771f96ce15cdbe907278fYang Ni        A.destroy();
7275f0d3110b04346b901771f96ce15cdbe907278fYang Ni
7375f0d3110b04346b901771f96ce15cdbe907278fYang Ni        pRS.finish();
7475f0d3110b04346b901771f96ce15cdbe907278fYang Ni        pRS.destroy();
7575f0d3110b04346b901771f96ce15cdbe907278fYang Ni
7675f0d3110b04346b901771f96ce15cdbe907278fYang Ni        boolean failed = false;
7775f0d3110b04346b901771f96ce15cdbe907278fYang Ni        for (int i = 0; i < width * height * depth * 4; i++) {
7875f0d3110b04346b901771f96ce15cdbe907278fYang Ni            if (b[i] != 1.0f - a[i]) {
7975f0d3110b04346b901771f96ce15cdbe907278fYang Ni                Log.e(name, "expects " + (1.0f - a[i]) + " for element " + i +
8075f0d3110b04346b901771f96ce15cdbe907278fYang Ni                      ". got " + b[i]);
8175f0d3110b04346b901771f96ce15cdbe907278fYang Ni                failed = true;
8275f0d3110b04346b901771f96ce15cdbe907278fYang Ni                break;
8375f0d3110b04346b901771f96ce15cdbe907278fYang Ni            }
8475f0d3110b04346b901771f96ce15cdbe907278fYang Ni        }
8575f0d3110b04346b901771f96ce15cdbe907278fYang Ni
8675f0d3110b04346b901771f96ce15cdbe907278fYang Ni        return !failed;
8775f0d3110b04346b901771f96ce15cdbe907278fYang Ni    }
8875f0d3110b04346b901771f96ce15cdbe907278fYang Ni
8975f0d3110b04346b901771f96ce15cdbe907278fYang Ni    public void run() {
9075f0d3110b04346b901771f96ce15cdbe907278fYang Ni        final int X = 96;
9175f0d3110b04346b901771f96ce15cdbe907278fYang Ni        final int Y = 64;
9275f0d3110b04346b901771f96ce15cdbe907278fYang Ni        final int Z = 32;
9375f0d3110b04346b901771f96ce15cdbe907278fYang Ni
9475f0d3110b04346b901771f96ce15cdbe907278fYang Ni        if (Test(X, 0, 0) && Test(X, Y, 0)) {
9575f0d3110b04346b901771f96ce15cdbe907278fYang Ni            passTest();
9675f0d3110b04346b901771f96ce15cdbe907278fYang Ni            return;
9775f0d3110b04346b901771f96ce15cdbe907278fYang Ni        }
9875f0d3110b04346b901771f96ce15cdbe907278fYang Ni
9975f0d3110b04346b901771f96ce15cdbe907278fYang Ni        failTest();
10075f0d3110b04346b901771f96ce15cdbe907278fYang Ni    }
10175f0d3110b04346b901771f96ce15cdbe907278fYang Ni}
102