1 /* 2 * Copyright (C) 2013 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.renderscript.cts; 18 19 import android.renderscript.*; 20 import android.util.Log; 21 22 public class IntrinsicHistogram extends IntrinsicBase { 23 private Allocation mAin; 24 private Allocation mAout; 25 26 @Override tearDown()27 protected void tearDown() throws Exception { 28 if (mAin != null) { 29 mAin.destroy(); 30 } 31 if (mAout != null) { 32 mAout.destroy(); 33 } 34 super.tearDown(); 35 } 36 createAllocations(int inVSize, int outVSize, int w, int h)37 private void createAllocations(int inVSize, int outVSize, int w, int h) { 38 Element e1; 39 Element e2; 40 41 switch (inVSize) { 42 case 4: e1 = Element.U8_4(mRS); break; 43 case 3: e1 = Element.U8_3(mRS); break; 44 case 2: e1 = Element.U8_2(mRS); break; 45 default: e1 = Element.U8(mRS); break; 46 } 47 48 switch (outVSize) { 49 case 4: e2 = Element.I32_4(mRS); break; 50 case 3: e2 = Element.I32_3(mRS); break; 51 case 2: e2 = Element.I32_2(mRS); break; 52 default: e2 = Element.I32(mRS); break; 53 } 54 55 Type.Builder tb = new Type.Builder(mRS, e1); 56 tb.setX(w).setY(h); 57 58 mAin = Allocation.createTyped(mRS, tb.create()); 59 mAout = Allocation.createSized(mRS, e2, 256); 60 } 61 testNorm(int inVSize, int outVSize, int w, int h, boolean clip)62 private void testNorm(int inVSize, int outVSize, int w, int h, boolean clip) { 63 createAllocations(inVSize, outVSize, w, h); 64 65 int invs2 = (inVSize != 3) ? inVSize : 4; 66 int outvs2 = (outVSize != 3) ? outVSize : 4; 67 68 byte i[] = new byte[w * h * invs2]; 69 int res[] = new int[256 * outvs2]; 70 int ref[] = new int[256 * outvs2]; 71 72 java.util.Random r = new java.util.Random(); 73 r.nextBytes(i); 74 75 int x1 = 0, y1 = 0, x2 = w, y2 = h; 76 if (clip) { 77 x1 = 11; 78 y1 = 11; 79 x2 = w - 11; 80 y2 = h - 11; 81 } 82 83 for (int y = y1; y < y2; y++) { 84 for (int x = x1; x < x2; x++) { 85 int ct = (y * w + x) * invs2; 86 87 int v = 0; 88 for (int c = 0; c < inVSize; c++) { 89 int t = i[ct + c]; 90 if (t < 0) t = 256 + t; 91 92 if (c < outVSize) { 93 ref[(t * outvs2) + c] ++; 94 } 95 } 96 } 97 } 98 99 mAin.copyFrom(i); 100 ScriptIntrinsicHistogram hist = 101 ScriptIntrinsicHistogram.create(mRS, mAin.getType().getElement()); 102 hist.setOutput(mAout); 103 hist.forEach(mAin, makeClipper(x1, y1, x2, y2)); 104 105 mAin.copyFrom(i); 106 mAout.copyTo(res); 107 for (int ct=0; ct < res.length; ct++) { 108 assertTrue(res[ct] == ref[ct]); 109 } 110 111 hist.destroy(); 112 } 113 test_norm_4_4()114 public void test_norm_4_4() { 115 testNorm(4, 4, 101, 101, false); 116 } test_norm_4_3()117 public void test_norm_4_3() { 118 testNorm(4, 3, 101, 101, false); 119 } test_norm_4_2()120 public void test_norm_4_2() { 121 testNorm(4, 2, 101, 101, false); 122 } test_norm_4_1()123 public void test_norm_4_1() { 124 testNorm(4, 1, 101, 101, false); 125 } 126 test_norm_3_3()127 public void test_norm_3_3() { 128 testNorm(3, 3, 101, 101, false); 129 } test_norm_3_2()130 public void test_norm_3_2() { 131 testNorm(3, 2, 101, 101, false); 132 } test_norm_3_1()133 public void test_norm_3_1() { 134 testNorm(3, 1, 101, 101, false); 135 } 136 test_norm_2_2()137 public void test_norm_2_2() { 138 testNorm(2, 2, 101, 101, false); 139 } test_norm_2_1()140 public void test_norm_2_1() { 141 testNorm(2, 1, 101, 101, false); 142 } 143 test_norm_1_1()144 public void test_norm_1_1() { 145 testNorm(1, 1, 101, 101, false); 146 } 147 148 test_norm_4_4C()149 public void test_norm_4_4C() { 150 testNorm(4, 4, 101, 101, true); 151 } test_norm_4_3C()152 public void test_norm_4_3C() { 153 testNorm(4, 3, 101, 101, true); 154 } test_norm_4_2C()155 public void test_norm_4_2C() { 156 testNorm(4, 2, 101, 101, true); 157 } test_norm_4_1C()158 public void test_norm_4_1C() { 159 testNorm(4, 1, 101, 101, true); 160 } 161 test_norm_3_3C()162 public void test_norm_3_3C() { 163 testNorm(3, 3, 101, 101, true); 164 } test_norm_3_2C()165 public void test_norm_3_2C() { 166 testNorm(3, 2, 101, 101, true); 167 } test_norm_3_1C()168 public void test_norm_3_1C() { 169 testNorm(3, 1, 101, 101, true); 170 } 171 test_norm_2_2C()172 public void test_norm_2_2C() { 173 testNorm(2, 2, 101, 101, true); 174 } test_norm_2_1C()175 public void test_norm_2_1C() { 176 testNorm(2, 1, 101, 101, true); 177 } 178 test_norm_1_1C()179 public void test_norm_1_1C() { 180 testNorm(1, 1, 101, 101, true); 181 } 182 183 184 testDot(int inVSize, int w, int h, boolean clip)185 private void testDot(int inVSize, int w, int h, boolean clip) { 186 createAllocations(inVSize, 1, w, h); 187 188 int invs2 = (inVSize != 3) ? inVSize : 4; 189 190 byte i[] = new byte[w * h * invs2]; 191 int res[] = new int[256]; 192 int ref[] = new int[256]; 193 194 java.util.Random r = new java.util.Random(); 195 r.nextBytes(i); 196 197 float dotVals[] = {0.2501f, 0.1251f, 0.06251f, 0.1251f}; 198 int doti[] = new int[4]; 199 for (int ct=0; ct < 4; ct++) { 200 doti[ct] = (int)((dotVals[ct] * 256.f) + 0.5f); 201 } 202 203 int x1 = 0, y1 = 0, x2 = w, y2 = h; 204 if (clip) { 205 x1 = 11; 206 y1 = 11; 207 x2 = w - 11; 208 y2 = h - 11; 209 } 210 211 for (int y = y1; y < y2; y++) { 212 for (int x = x1; x < x2; x++) { 213 int ct = (y * w + x) * invs2; 214 215 int v = 0; 216 for (int c = 0; c < inVSize; c++) { 217 int t = i[ct + c]; 218 if (t < 0) t = 256 + t; 219 v += doti[c] * t; 220 } 221 ref[(v + 0x7f) >> 8] ++; 222 } 223 } 224 225 mAin.copyFrom(i); 226 ScriptIntrinsicHistogram hist = 227 ScriptIntrinsicHistogram.create(mRS, mAin.getType().getElement()); 228 hist.setOutput(mAout); 229 hist.setDotCoefficients(dotVals[0], dotVals[1], dotVals[2], dotVals[3]); 230 hist.forEach_Dot(mAin, makeClipper(x1, y1, x2, y2)); 231 232 mAin.copyFrom(i); 233 mAout.copyTo(res); 234 for (int ct=0; ct < res.length; ct++) { 235 assertTrue(res[ct] == ref[ct]); 236 } 237 238 hist.destroy(); 239 } 240 test_dot_1()241 public void test_dot_1() { 242 testDot(1, 101, 101, false); 243 } test_dot_2()244 public void test_dot_2() { 245 testDot(2, 101, 101, false); 246 } test_dot_3()247 public void test_dot_3() { 248 testDot(3, 101, 101, false); 249 } test_dot_4()250 public void test_dot_4() { 251 testDot(4, 101, 101, false); 252 } 253 254 test_dot_1C()255 public void test_dot_1C() { 256 testDot(1, 101, 101, true); 257 } test_dot_2C()258 public void test_dot_2C() { 259 testDot(2, 101, 101, true); 260 } test_dot_3C()261 public void test_dot_3C() { 262 testDot(3, 101, 101, true); 263 } test_dot_4C()264 public void test_dot_4C() { 265 testDot(4, 101, 101, true); 266 } 267 268 } 269