15bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni/*
25bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni * Copyright (C) 2017 The Android Open Source Project
35bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni *
45bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
55bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni * in compliance with the License. You may obtain a copy of the License at
65bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni *
75bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni * http://www.apache.org/licenses/LICENSE-2.0
85bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni *
95bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni * Unless required by applicable law or agreed to in writing, software distributed under the License
105bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
115bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni * or implied. See the License for the specific language governing permissions and limitations under
125bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni * the License.
135bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni */
145bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni
155bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Nipackage com.android.rs.test;
165bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni
175bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Niimport android.content.Context;
185bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Niimport android.renderscript.Allocation;
195bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Niimport android.renderscript.Element;
205bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Niimport android.renderscript.RenderScript;
215bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Niimport android.renderscript.RSIllegalArgumentException;
225bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Niimport android.renderscript.ScriptIntrinsicBlur;
235bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Niimport android.renderscript.Type;
245bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Niimport android.util.Log;
255bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni
265bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni// Tests that ScriptIntrinsicBlur properly throws exception if input or output
275bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni// are set to 1D Allocations.
285bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Nipublic class UT_blur_validation extends UnitTest {
295bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni    private static final String TAG = "ScriptIntrinsicBlur validation";
305bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni    private RenderScript RS;
315bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni    private Allocation input1D, output1D;
325bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni    private Allocation input2D, output2D;
335bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni    private ScriptIntrinsicBlur scriptBlur;
345bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni
355bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni    protected UT_blur_validation(RSTestCore rstc, Context ctx) {
365bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni        super(rstc, TAG, ctx);
375bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni    }
385bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni
395bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni    private void cleanup() {
405bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni        RS.finish();
415bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni        input1D.destroy();
425bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni        input2D.destroy();
435bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni        output1D.destroy();
445bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni        output2D.destroy();
455bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni        scriptBlur.destroy();
465bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni        RS.destroy();
475bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni    }
485bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni
495bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni    public void run() {
505bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni        RS = RenderScript.create(mCtx);
515bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni
525bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni        final int width  = 100;
535bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni        final int height = 100;
545bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni
555bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni        input1D = Allocation.createSized(RS,
565bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni                                         Element.U8(RS),
575bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni                                         width * height,
585bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni                                         Allocation.USAGE_SCRIPT);
595bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni
605bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni        output1D = Allocation.createTyped(RS, input1D.getType());
615bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni
625bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni        Type.Builder typeBuilder = new Type.Builder(RS, Element.U8(RS));
635bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni        typeBuilder.setX(width);
645bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni        typeBuilder.setY(height);
655bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni        Type ty = typeBuilder.create();
665bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni
675bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni        input2D  = Allocation.createTyped(RS, ty);
685bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni        output2D = Allocation.createTyped(RS, ty);
695bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni
705bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni        scriptBlur = ScriptIntrinsicBlur.create(RS, Element.U8(RS));
715bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni
725bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni        scriptBlur.setRadius(25f);
735bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni        boolean failed = false;
745bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni        try {
755bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni            scriptBlur.setInput(input1D);
765bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni        } catch (RSIllegalArgumentException e) {
775bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni            scriptBlur.setInput(input2D);
785bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni            try {
795bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni                scriptBlur.forEach(output1D);
805bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni            } catch (RSIllegalArgumentException e1) {
815bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni                scriptBlur.forEach(output2D);
825bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni                cleanup();
835bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni                passTest();
845bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni                return;
855bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni            }
865bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni            Log.e(TAG, "setting 1d output does not trigger exception");
875bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni            cleanup();
885bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni            failTest();
895bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni            return;
905bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni        }
915bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni
925bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni        Log.e(TAG, "setting 1d input does not trigger exception");
935bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni        cleanup();
945bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni        failTest();
955bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni    }
965bf533dbfe2dc1c92e2fe3e90776eaa1db03771cYang Ni}
97