Home | History | Annotate | Download | only in rscpp
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.cts.rscpp;
     18 
     19 import android.content.Context;
     20 import android.content.res.Resources;
     21 import android.test.AndroidTestCase;
     22 import android.renderscript.*;
     23 import android.util.Log;
     24 import java.lang.Integer;
     25 
     26 public class RSResizeTest extends RSCppTest {
     27     static {
     28         System.loadLibrary("rscpptest_jni");
     29     }
     30 
     31     private final int inX = 307;
     32     private final int inY = 157;
     33 
     34     native boolean resizeTest(String path, int w, int h, float scaleX, float scaleY,
     35                               boolean useByte, int vecSize, byte[] inB, byte[] outB,
     36                               float[] inF, float[] outF);
     37     private void testResize(int w, int h, Element.DataType dt, int vecSize, float scaleX, float scaleY) {
     38 
     39         boolean useByte = false;
     40         if (dt == Element.DataType.UNSIGNED_8) {
     41             useByte = true;
     42         }
     43 
     44         Element e = makeElement(dt, vecSize);
     45         Allocation rsInput = makeAllocation(w, h, e);
     46 
     47         int arrSize = w * h * (vecSize == 3 ? 4 : vecSize);
     48         int[] baseAlloc = new int[arrSize];
     49         byte[] byteAlloc = null;
     50         float[] floatAlloc = null;
     51 
     52         RSUtils.genRandom(0x72727272, 255, 1, -128, baseAlloc);
     53         if (useByte) {
     54             byteAlloc = new byte[arrSize];
     55             for (int i = 0; i < arrSize; i++) {
     56                 byteAlloc[i] = (byte)baseAlloc[i];
     57             }
     58             rsInput.copyFromUnchecked(byteAlloc);
     59         } else {
     60             //Float case
     61             floatAlloc = new float[arrSize];
     62             for (int i = 0; i < arrSize; i++) {
     63                 floatAlloc[i] = (float)baseAlloc[i];
     64             }
     65             rsInput.copyFromUnchecked(floatAlloc);
     66         }
     67 
     68         int outW = (int) (w*scaleX);
     69         int outH = (int) (h*scaleY);
     70 
     71         Allocation rsOutput = makeAllocation(outW, outH, e);
     72         Allocation rsCppOutput = makeAllocation(outW, outH, e);
     73 
     74         ScriptIntrinsicResize resize = ScriptIntrinsicResize.create(mRS);
     75         resize.setInput(rsInput);
     76         resize.forEach_bicubic(rsOutput);
     77 
     78         int outArrSize = outW * outH * (vecSize == 3 ? 4 : vecSize);
     79         byte[] nativeByteAlloc = new byte[outArrSize];
     80         float[] nativeFloatAlloc = new float[outArrSize];
     81         resizeTest(this.getContext().getCacheDir().toString().toString(), w, h, scaleX, scaleY,
     82                    useByte, vecSize, byteAlloc, nativeByteAlloc, floatAlloc, nativeFloatAlloc);
     83 
     84         if (useByte) {
     85             rsCppOutput.copyFromUnchecked(nativeByteAlloc);
     86         } else {
     87             rsCppOutput.copyFromUnchecked(nativeFloatAlloc);
     88         }
     89         mVerify.set_image_tolerance(0.04f); // Kept loose till a better test designed
     90         mVerify.invoke_verify(rsOutput, rsCppOutput, rsInput);
     91         checkForErrors();
     92     }
     93 
     94     public void test_U8_4_SCALE10_10_inSqure() {
     95         testResize(inX, inX, Element.DataType.UNSIGNED_8, 4, 1.f, 1.f);
     96     }
     97     public void test_U8_3_SCALE10_10_inSqure() {
     98         testResize(inX, inX, Element.DataType.UNSIGNED_8, 3, 1.f, 1.f);
     99     }
    100     public void test_U8_2_SCALE10_10_inSqure() {
    101         testResize(inX, inX, Element.DataType.UNSIGNED_8, 2, 1.f, 1.f);
    102     }
    103     public void test_U8_1_SCALE10_10_inSqure() {
    104         testResize(inX, inX, Element.DataType.UNSIGNED_8, 1, 1.f, 1.f);
    105     }
    106 
    107     public void test_U8_4_SCALE20_20_inSqure() {
    108         testResize(inX, inX, Element.DataType.UNSIGNED_8, 4, 2.f, 2.f);
    109     }
    110     public void test_U8_3_SCALE20_20_inSqure() {
    111         testResize(inX, inX, Element.DataType.UNSIGNED_8, 3, 2.f, 2.f);
    112     }
    113     public void test_U8_2_SCALE20_20_inSqure() {
    114         testResize(inX, inX, Element.DataType.UNSIGNED_8, 2, 2.f, 2.f);
    115     }
    116     public void test_U8_1_SCALE20_20_inSqure() {
    117         testResize(inX, inX, Element.DataType.UNSIGNED_8, 1, 2.f, 2.f);
    118     }
    119 
    120     public void test_U8_4_SCALE05_20_inSqure() {
    121         testResize(inX, inX, Element.DataType.UNSIGNED_8, 4, 0.5f, 2.f);
    122     }
    123     public void test_U8_3_SCALE05_20_inSqure() {
    124         testResize(inX, inX, Element.DataType.UNSIGNED_8, 3, 0.5f, 2.f);
    125     }
    126     public void test_U8_2_SCALE05_20_inSqure() {
    127         testResize(inX, inX, Element.DataType.UNSIGNED_8, 2, 0.5f, 2.f);
    128     }
    129     public void test_U8_1_SCALE05_20_inSqure() {
    130         testResize(inX, inX, Element.DataType.UNSIGNED_8, 1, 0.5f, 2.f);
    131     }
    132 
    133     public void test_U8_4_SCALE20_05_inSqure() {
    134         testResize(inX, inX, Element.DataType.UNSIGNED_8, 4, 2.f, 0.5f);
    135     }
    136     public void test_U8_3_SCALE20_05_inSqure() {
    137         testResize(inX, inX, Element.DataType.UNSIGNED_8, 3, 2.f, 0.5f);
    138     }
    139     public void test_U8_2_SCALE20_05_inSqure() {
    140         testResize(inX, inX, Element.DataType.UNSIGNED_8, 2, 2.f, 0.5f);
    141     }
    142     public void test_U8_1_SCALE20_05_inSqure() {
    143         testResize(inX, inX, Element.DataType.UNSIGNED_8, 1, 2.f, 0.5f);
    144     }
    145 
    146     public void test_U8_4_SCALE05_05_inSqure() {
    147         testResize(inX, inX, Element.DataType.UNSIGNED_8, 4, 0.5f, 0.5f);
    148     }
    149     public void test_U8_3_SCALE05_05_inSqure() {
    150         testResize(inX, inX, Element.DataType.UNSIGNED_8, 3, 0.5f, 0.5f);
    151     }
    152     public void test_U8_2_SCALE05_05_inSqure() {
    153         testResize(inX, inX, Element.DataType.UNSIGNED_8, 2, 0.5f, 0.5f);
    154     }
    155     public void test_U8_1_SCALE05_05_inSqure() {
    156         testResize(inX, inX, Element.DataType.UNSIGNED_8, 1, 0.5f, 0.5f);
    157     }
    158 
    159     public void test_U8_4_SCALE10_10_inRectangle() {
    160         testResize(inX, inY, Element.DataType.UNSIGNED_8, 4, 1.f, 1.f);
    161     }
    162     public void test_U8_3_SCALE10_10_inRectangle() {
    163         testResize(inX, inY, Element.DataType.UNSIGNED_8, 3, 1.f, 1.f);
    164     }
    165     public void test_U8_2_SCALE10_10_inRectangle() {
    166         testResize(inX, inY, Element.DataType.UNSIGNED_8, 2, 1.f, 1.f);
    167     }
    168     public void test_U8_1_SCALE10_10_inRectangle() {
    169         testResize(inX, inY, Element.DataType.UNSIGNED_8, 1, 1.f, 1.f);
    170     }
    171 
    172     public void test_U8_4_SCALE20_20_inRectangle() {
    173         testResize(inX, inY, Element.DataType.UNSIGNED_8, 4, 2.f, 2.f);
    174     }
    175     public void test_U8_3_SCALE20_20_inRectangle() {
    176         testResize(inX, inY, Element.DataType.UNSIGNED_8, 3, 2.f, 2.f);
    177     }
    178     public void test_U8_2_SCALE20_20_inRectangle() {
    179         testResize(inX, inY, Element.DataType.UNSIGNED_8, 2, 2.f, 2.f);
    180     }
    181     public void test_U8_1_SCALE20_20_inRectangle() {
    182         testResize(inX, inY, Element.DataType.UNSIGNED_8, 1, 2.f, 2.f);
    183     }
    184 
    185     public void test_U8_4_SCALE05_20_inRectangle() {
    186         testResize(inX, inY, Element.DataType.UNSIGNED_8, 4, 0.5f, 2.f);
    187     }
    188     public void test_U8_3_SCALE05_20_inRectangle() {
    189         testResize(inX, inY, Element.DataType.UNSIGNED_8, 3, 0.5f, 2.f);
    190     }
    191     public void test_U8_2_SCALE05_20_inRectangle() {
    192         testResize(inX, inY, Element.DataType.UNSIGNED_8, 2, 0.5f, 2.f);
    193     }
    194     public void test_U8_1_SCALE05_20_inRectangle() {
    195         testResize(inX, inY, Element.DataType.UNSIGNED_8, 1, 0.5f, 2.f);
    196     }
    197 
    198     public void test_U8_4_SCALE20_05_inRectangle() {
    199         testResize(inX, inY, Element.DataType.UNSIGNED_8, 4, 2.f, 0.5f);
    200     }
    201     public void test_U8_3_SCALE20_05_inRectangle() {
    202         testResize(inX, inY, Element.DataType.UNSIGNED_8, 3, 2.f, 0.5f);
    203     }
    204     public void test_U8_2_SCALE20_05_inRectangle() {
    205         testResize(inX, inY, Element.DataType.UNSIGNED_8, 2, 2.f, 0.5f);
    206     }
    207     public void test_U8_1_SCALE20_05_inRectangle() {
    208         testResize(inX, inY, Element.DataType.UNSIGNED_8, 1, 2.f, 0.5f);
    209     }
    210 
    211     public void test_U8_4_SCALE05_05_inRectangle() {
    212         testResize(inX, inY, Element.DataType.UNSIGNED_8, 4, 0.5f, 0.5f);
    213     }
    214     public void test_U8_3_SCALE05_05_inRectangle() {
    215         testResize(inX, inY, Element.DataType.UNSIGNED_8, 3, 0.5f, 0.5f);
    216     }
    217     public void test_U8_2_SCALE05_05_inRectangle() {
    218         testResize(inX, inY, Element.DataType.UNSIGNED_8, 2, 0.5f, 0.5f);
    219     }
    220     public void test_U8_1_SCALE05_05_inRectangle() {
    221         testResize(inX, inY, Element.DataType.UNSIGNED_8, 1, 0.5f, 0.5f);
    222     }
    223 
    224 
    225     public void test_F32_4_SCALE10_10_inSqure() {
    226         testResize(inX, inX, Element.DataType.FLOAT_32, 4, 1.f, 1.f);
    227     }
    228     public void test_F32_3_SCALE10_10_inSqure() {
    229         testResize(inX, inX, Element.DataType.FLOAT_32, 3, 1.f, 1.f);
    230     }
    231     public void test_F32_2_SCALE10_10_inSqure() {
    232         testResize(inX, inX, Element.DataType.FLOAT_32, 2, 1.f, 1.f);
    233     }
    234     public void test_F32_1_SCALE10_10_inSqure() {
    235         testResize(inX, inX, Element.DataType.FLOAT_32, 1, 1.f, 1.f);
    236     }
    237 
    238     public void test_F32_4_SCALE20_20_inSqure() {
    239         testResize(inX, inX, Element.DataType.FLOAT_32, 4, 2.f, 2.f);
    240     }
    241     public void test_F32_3_SCALE20_20_inSqure() {
    242         testResize(inX, inX, Element.DataType.FLOAT_32, 3, 2.f, 2.f);
    243     }
    244     public void test_F32_2_SCALE20_20_inSqure() {
    245         testResize(inX, inX, Element.DataType.FLOAT_32, 2, 2.f, 2.f);
    246     }
    247     public void test_F32_1_SCALE20_20_inSqure() {
    248         testResize(inX, inX, Element.DataType.FLOAT_32, 1, 2.f, 2.f);
    249     }
    250 
    251     public void test_F32_4_SCALE05_20_inSqure() {
    252         testResize(inX, inX, Element.DataType.FLOAT_32, 4, 0.5f, 2.f);
    253     }
    254     public void test_F32_3_SCALE05_20_inSqure() {
    255         testResize(inX, inX, Element.DataType.FLOAT_32, 3, 0.5f, 2.f);
    256     }
    257     public void test_F32_2_SCALE05_20_inSqure() {
    258         testResize(inX, inX, Element.DataType.FLOAT_32, 2, 0.5f, 2.f);
    259     }
    260     public void test_F32_1_SCALE05_20_inSqure() {
    261         testResize(inX, inX, Element.DataType.FLOAT_32, 1, 0.5f, 2.f);
    262     }
    263 
    264     public void test_F32_4_SCALE20_05_inSqure() {
    265         testResize(inX, inX, Element.DataType.FLOAT_32, 4, 2.f, 0.5f);
    266     }
    267     public void test_F32_3_SCALE20_05_inSqure() {
    268         testResize(inX, inX, Element.DataType.FLOAT_32, 3, 2.f, 0.5f);
    269     }
    270     public void test_F32_2_SCALE20_05_inSqure() {
    271         testResize(inX, inX, Element.DataType.FLOAT_32, 2, 2.f, 0.5f);
    272     }
    273     public void test_F32_1_SCALE20_05_inSqure() {
    274         testResize(inX, inX, Element.DataType.FLOAT_32, 1, 2.f, 0.5f);
    275     }
    276 
    277     public void test_F32_4_SCALE05_05_inSqure() {
    278         testResize(inX, inX, Element.DataType.FLOAT_32, 4, 0.5f, 0.5f);
    279     }
    280     public void test_F32_3_SCALE05_05_inSqure() {
    281         testResize(inX, inX, Element.DataType.FLOAT_32, 3, 0.5f, 0.5f);
    282     }
    283     public void test_F32_2_SCALE05_05_inSqure() {
    284         testResize(inX, inX, Element.DataType.FLOAT_32, 2, 0.5f, 0.5f);
    285     }
    286     public void test_F32_1_SCALE05_05_inSqure() {
    287         testResize(inX, inX, Element.DataType.FLOAT_32, 1, 0.5f, 0.5f);
    288     }
    289 
    290     public void test_F32_4_SCALE10_10_inRectangle() {
    291         testResize(inX, inY, Element.DataType.FLOAT_32, 4, 1.f, 1.f);
    292     }
    293     public void test_F32_3_SCALE10_10_inRectangle() {
    294         testResize(inX, inY, Element.DataType.FLOAT_32, 3, 1.f, 1.f);
    295     }
    296     public void test_F32_2_SCALE10_10_inRectangle() {
    297         testResize(inX, inY, Element.DataType.FLOAT_32, 2, 1.f, 1.f);
    298     }
    299     public void test_F32_1_SCALE10_10_inRectangle() {
    300         testResize(inX, inY, Element.DataType.FLOAT_32, 1, 1.f, 1.f);
    301     }
    302 
    303     public void test_F32_4_SCALE20_20_inRectangle() {
    304         testResize(inX, inY, Element.DataType.FLOAT_32, 4, 2.f, 2.f);
    305     }
    306     public void test_F32_3_SCALE20_20_inRectangle() {
    307         testResize(inX, inY, Element.DataType.FLOAT_32, 3, 2.f, 2.f);
    308     }
    309     public void test_F32_2_SCALE20_20_inRectangle() {
    310         testResize(inX, inY, Element.DataType.FLOAT_32, 2, 2.f, 2.f);
    311     }
    312     public void test_F32_1_SCALE20_20_inRectangle() {
    313         testResize(inX, inY, Element.DataType.FLOAT_32, 1, 2.f, 2.f);
    314     }
    315 
    316     public void test_F32_4_SCALE05_20_inRectangle() {
    317         testResize(inX, inY, Element.DataType.FLOAT_32, 4, 0.5f, 2.f);
    318     }
    319     public void test_F32_3_SCALE05_20_inRectangle() {
    320         testResize(inX, inY, Element.DataType.FLOAT_32, 3, 0.5f, 2.f);
    321     }
    322     public void test_F32_2_SCALE05_20_inRectangle() {
    323         testResize(inX, inY, Element.DataType.FLOAT_32, 2, 0.5f, 2.f);
    324     }
    325     public void test_F32_1_SCALE05_20_inRectangle() {
    326         testResize(inX, inY, Element.DataType.FLOAT_32, 1, 0.5f, 2.f);
    327     }
    328 
    329     public void test_F32_4_SCALE20_05_inRectangle() {
    330         testResize(inX, inY, Element.DataType.FLOAT_32, 4, 2.f, 0.5f);
    331     }
    332     public void test_F32_3_SCALE20_05_inRectangle() {
    333         testResize(inX, inY, Element.DataType.FLOAT_32, 3, 2.f, 0.5f);
    334     }
    335     public void test_F32_2_SCALE20_05_inRectangle() {
    336         testResize(inX, inY, Element.DataType.FLOAT_32, 2, 2.f, 0.5f);
    337     }
    338     public void test_F32_1_SCALE20_05_inRectangle() {
    339         testResize(inX, inY, Element.DataType.FLOAT_32, 1, 2.f, 0.5f);
    340     }
    341 
    342     public void test_F32_4_SCALE05_05_inRectangle() {
    343         testResize(inX, inY, Element.DataType.FLOAT_32, 4, 0.5f, 0.5f);
    344     }
    345     public void test_F32_3_SCALE05_05_inRectangle() {
    346         testResize(inX, inY, Element.DataType.FLOAT_32, 3, 0.5f, 0.5f);
    347     }
    348     public void test_F32_2_SCALE05_05_inRectangle() {
    349         testResize(inX, inY, Element.DataType.FLOAT_32, 2, 0.5f, 0.5f);
    350     }
    351     public void test_F32_1_SCALE05_05_inRectangle() {
    352         testResize(inX, inY, Element.DataType.FLOAT_32, 1, 0.5f, 0.5f);
    353     }
    354 }
    355