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