1/* 2 * Copyright (C) 2012 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 17package android.support.v8.renderscript; 18 19import android.os.SystemProperties; 20import android.support.v8.renderscript.RenderScript; 21 22/** 23 * Utility class for packing arguments and structures from Android system objects to 24 * RenderScript objects. 25 * 26 * This class is only intended to be used to support the 27 * reflected code generated by the RS tool chain. It should not 28 * be called directly. 29 * 30 **/ 31public class FieldPacker { 32 private android.renderscript.FieldPacker mN; 33 34 public FieldPacker(int len) { 35 mPos = 0; 36 mLen = len; 37 mData = new byte[len]; 38 if (RenderScript.shouldThunk()) { 39 mN = new android.renderscript.FieldPacker(len); 40 } 41 } 42 43 public void align(int v) { 44 if (RenderScript.shouldThunk()) { 45 mN.align(v); 46 return; 47 } 48 if ((v <= 0) || ((v & (v - 1)) != 0)) { 49 throw new RSIllegalArgumentException("argument must be a non-negative non-zero power of 2: " + v); 50 } 51 52 while ((mPos & (v - 1)) != 0) { 53 mData[mPos++] = 0; 54 } 55 } 56 57 public void reset() { 58 if (RenderScript.shouldThunk()) { 59 mN.reset(); 60 return; 61 } 62 mPos = 0; 63 } 64 public void reset(int i) { 65 if (RenderScript.shouldThunk()) { 66 mN.reset(i); 67 return; 68 } 69 if ((i < 0) || (i >= mLen)) { 70 throw new RSIllegalArgumentException("out of range argument: " + i); 71 } 72 mPos = i; 73 } 74 75 public void skip(int i) { 76 if (RenderScript.shouldThunk()) { 77 mN.skip(i); 78 return; 79 } 80 int res = mPos + i; 81 if ((res < 0) || (res > mLen)) { 82 throw new RSIllegalArgumentException("out of range argument: " + i); 83 } 84 mPos = res; 85 } 86 87 public void addI8(byte v) { 88 if (RenderScript.shouldThunk()) { 89 mN.addI8(v); 90 return; 91 } 92 mData[mPos++] = v; 93 } 94 95 public void addI16(short v) { 96 if (RenderScript.shouldThunk()) { 97 mN.addI16(v); 98 return; 99 } 100 align(2); 101 mData[mPos++] = (byte)(v & 0xff); 102 mData[mPos++] = (byte)(v >> 8); 103 } 104 105 public void addI32(int v) { 106 if (RenderScript.shouldThunk()) { 107 mN.addI32(v); 108 return; 109 } 110 align(4); 111 mData[mPos++] = (byte)(v & 0xff); 112 mData[mPos++] = (byte)((v >> 8) & 0xff); 113 mData[mPos++] = (byte)((v >> 16) & 0xff); 114 mData[mPos++] = (byte)((v >> 24) & 0xff); 115 } 116 117 public void addI64(long v) { 118 if (RenderScript.shouldThunk()) { 119 mN.addI64(v); 120 return; 121 } 122 align(8); 123 mData[mPos++] = (byte)(v & 0xff); 124 mData[mPos++] = (byte)((v >> 8) & 0xff); 125 mData[mPos++] = (byte)((v >> 16) & 0xff); 126 mData[mPos++] = (byte)((v >> 24) & 0xff); 127 mData[mPos++] = (byte)((v >> 32) & 0xff); 128 mData[mPos++] = (byte)((v >> 40) & 0xff); 129 mData[mPos++] = (byte)((v >> 48) & 0xff); 130 mData[mPos++] = (byte)((v >> 56) & 0xff); 131 } 132 133 public void addU8(short v) { 134 if (RenderScript.shouldThunk()) { 135 mN.addU8(v); 136 return; 137 } 138 if ((v < 0) || (v > 0xff)) { 139 throw new IllegalArgumentException("Saving value out of range for type"); 140 } 141 mData[mPos++] = (byte)v; 142 } 143 144 public void addU16(int v) { 145 if (RenderScript.shouldThunk()) { 146 mN.addU16(v); 147 return; 148 } 149 if ((v < 0) || (v > 0xffff)) { 150 android.util.Log.e("rs", "FieldPacker.addU16( " + v + " )"); 151 throw new IllegalArgumentException("Saving value out of range for type"); 152 } 153 align(2); 154 mData[mPos++] = (byte)(v & 0xff); 155 mData[mPos++] = (byte)(v >> 8); 156 } 157 158 public void addU32(long v) { 159 if (RenderScript.shouldThunk()) { 160 mN.addU32(v); 161 return; 162 } 163 if ((v < 0) || (v > 0xffffffffL)) { 164 android.util.Log.e("rs", "FieldPacker.addU32( " + v + " )"); 165 throw new IllegalArgumentException("Saving value out of range for type"); 166 } 167 align(4); 168 mData[mPos++] = (byte)(v & 0xff); 169 mData[mPos++] = (byte)((v >> 8) & 0xff); 170 mData[mPos++] = (byte)((v >> 16) & 0xff); 171 mData[mPos++] = (byte)((v >> 24) & 0xff); 172 } 173 174 public void addU64(long v) { 175 if (RenderScript.shouldThunk()) { 176 mN.addU64(v); 177 return; 178 } 179 if (v < 0) { 180 android.util.Log.e("rs", "FieldPacker.addU64( " + v + " )"); 181 throw new IllegalArgumentException("Saving value out of range for type"); 182 } 183 align(8); 184 mData[mPos++] = (byte)(v & 0xff); 185 mData[mPos++] = (byte)((v >> 8) & 0xff); 186 mData[mPos++] = (byte)((v >> 16) & 0xff); 187 mData[mPos++] = (byte)((v >> 24) & 0xff); 188 mData[mPos++] = (byte)((v >> 32) & 0xff); 189 mData[mPos++] = (byte)((v >> 40) & 0xff); 190 mData[mPos++] = (byte)((v >> 48) & 0xff); 191 mData[mPos++] = (byte)((v >> 56) & 0xff); 192 } 193 194 public void addF32(float v) { 195 if (RenderScript.shouldThunk()) { 196 mN.addF32(v); 197 return; 198 } 199 addI32(Float.floatToRawIntBits(v)); 200 } 201 202 public void addF64(double v) { 203 if (RenderScript.shouldThunk()) { 204 mN.addF64(v); 205 return; 206 } 207 addI64(Double.doubleToRawLongBits(v)); 208 } 209 210 public void addObj(BaseObj obj) { 211 if (RenderScript.shouldThunk()) { 212 if (obj != null) { 213 mN.addObj(obj.getNObj()); 214 } else { 215 mN.addObj(null); 216 } 217 return; 218 } 219 if (obj != null) { 220 addI32(obj.getID(null)); 221 } else { 222 addI32(0); 223 } 224 } 225 226 public void addF32(Float2 v) { 227 if (RenderScript.shouldThunk()) { 228 mN.addF32(new android.renderscript.Float2(v.x, v.y)); 229 return; 230 } 231 addF32(v.x); 232 addF32(v.y); 233 } 234 public void addF32(Float3 v) { 235 if (RenderScript.shouldThunk()) { 236 mN.addF32(new android.renderscript.Float3(v.x, v.y, v.z)); 237 return; 238 } 239 addF32(v.x); 240 addF32(v.y); 241 addF32(v.z); 242 } 243 public void addF32(Float4 v) { 244 if (RenderScript.shouldThunk()) { 245 mN.addF32(new android.renderscript.Float4(v.x, v.y, v.z, v.w)); 246 return; 247 } 248 addF32(v.x); 249 addF32(v.y); 250 addF32(v.z); 251 addF32(v.w); 252 } 253 254 public void addF64(Double2 v) { 255 if (RenderScript.shouldThunk()) { 256 mN.addF64(new android.renderscript.Double2(v.x, v.y)); 257 return; 258 } 259 addF64(v.x); 260 addF64(v.y); 261 } 262 public void addF64(Double3 v) { 263 if (RenderScript.shouldThunk()) { 264 mN.addF64(new android.renderscript.Double3(v.x, v.y, v.z)); 265 return; 266 } 267 addF64(v.x); 268 addF64(v.y); 269 addF64(v.z); 270 } 271 public void addF64(Double4 v) { 272 if (RenderScript.shouldThunk()) { 273 mN.addF64(new android.renderscript.Double4(v.x, v.y, v.z, v.w)); 274 return; 275 } 276 addF64(v.x); 277 addF64(v.y); 278 addF64(v.z); 279 addF64(v.w); 280 } 281 282 public void addI8(Byte2 v) { 283 if (RenderScript.shouldThunk()) { 284 mN.addI8(new android.renderscript.Byte2(v.x, v.y)); 285 return; 286 } 287 addI8(v.x); 288 addI8(v.y); 289 } 290 public void addI8(Byte3 v) { 291 if (RenderScript.shouldThunk()) { 292 mN.addI8(new android.renderscript.Byte3(v.x, v.y, v.z)); 293 return; 294 } 295 addI8(v.x); 296 addI8(v.y); 297 addI8(v.z); 298 } 299 public void addI8(Byte4 v) { 300 if (RenderScript.shouldThunk()) { 301 mN.addI8(new android.renderscript.Byte4(v.x, v.y, v.z, v.w)); 302 return; 303 } 304 addI8(v.x); 305 addI8(v.y); 306 addI8(v.z); 307 addI8(v.w); 308 } 309 310 public void addU8(Short2 v) { 311 if (RenderScript.shouldThunk()) { 312 mN.addU8(new android.renderscript.Short2(v.x, v.y)); 313 return; 314 } 315 addU8(v.x); 316 addU8(v.y); 317 } 318 public void addU8(Short3 v) { 319 if (RenderScript.shouldThunk()) { 320 mN.addU8(new android.renderscript.Short3(v.x, v.y, v.z)); 321 return; 322 } 323 addU8(v.x); 324 addU8(v.y); 325 addU8(v.z); 326 } 327 public void addU8(Short4 v) { 328 if (RenderScript.shouldThunk()) { 329 mN.addU8(new android.renderscript.Short4(v.x, v.y, v.z, v.w)); 330 return; 331 } 332 addU8(v.x); 333 addU8(v.y); 334 addU8(v.z); 335 addU8(v.w); 336 } 337 338 public void addI16(Short2 v) { 339 if (RenderScript.shouldThunk()) { 340 mN.addI16(new android.renderscript.Short2(v.x, v.y)); 341 return; 342 } 343 addI16(v.x); 344 addI16(v.y); 345 } 346 public void addI16(Short3 v) { 347 if (RenderScript.shouldThunk()) { 348 mN.addI16(new android.renderscript.Short3(v.x, v.y, v.z)); 349 return; 350 } 351 addI16(v.x); 352 addI16(v.y); 353 addI16(v.z); 354 } 355 public void addI16(Short4 v) { 356 if (RenderScript.shouldThunk()) { 357 mN.addI16(new android.renderscript.Short4(v.x, v.y, v.z, v.w)); 358 return; 359 } 360 addI16(v.x); 361 addI16(v.y); 362 addI16(v.z); 363 addI16(v.w); 364 } 365 366 public void addU16(Int2 v) { 367 if (RenderScript.shouldThunk()) { 368 mN.addU16(new android.renderscript.Int2(v.x, v.y)); 369 return; 370 } 371 addU16(v.x); 372 addU16(v.y); 373 } 374 public void addU16(Int3 v) { 375 if (RenderScript.shouldThunk()) { 376 mN.addU16(new android.renderscript.Int3(v.x, v.y, v.z)); 377 return; 378 } 379 addU16(v.x); 380 addU16(v.y); 381 addU16(v.z); 382 } 383 public void addU16(Int4 v) { 384 if (RenderScript.shouldThunk()) { 385 mN.addU16(new android.renderscript.Int4(v.x, v.y, v.z, v.w)); 386 return; 387 } 388 addU16(v.x); 389 addU16(v.y); 390 addU16(v.z); 391 addU16(v.w); 392 } 393 394 public void addI32(Int2 v) { 395 if (RenderScript.shouldThunk()) { 396 mN.addI32(new android.renderscript.Int2(v.x, v.y)); 397 return; 398 } 399 addI32(v.x); 400 addI32(v.y); 401 } 402 public void addI32(Int3 v) { 403 if (RenderScript.shouldThunk()) { 404 mN.addI32(new android.renderscript.Int3(v.x, v.y, v.z)); 405 return; 406 } 407 addI32(v.x); 408 addI32(v.y); 409 addI32(v.z); 410 } 411 public void addI32(Int4 v) { 412 if (RenderScript.shouldThunk()) { 413 mN.addI32(new android.renderscript.Int4(v.x, v.y, v.z, v.w)); 414 return; 415 } 416 addI32(v.x); 417 addI32(v.y); 418 addI32(v.z); 419 addI32(v.w); 420 } 421 422 public void addU32(Long2 v) { 423 if (RenderScript.shouldThunk()) { 424 mN.addU32(new android.renderscript.Long2(v.x, v.y)); 425 return; 426 } 427 addU32(v.x); 428 addU32(v.y); 429 } 430 public void addU32(Long3 v) { 431 if (RenderScript.shouldThunk()) { 432 mN.addU32(new android.renderscript.Long3(v.x, v.y, v.z)); 433 return; 434 } 435 addU32(v.x); 436 addU32(v.y); 437 addU32(v.z); 438 } 439 public void addU32(Long4 v) { 440 if (RenderScript.shouldThunk()) { 441 mN.addU32(new android.renderscript.Long4(v.x, v.y, v.z, v.w)); 442 return; 443 } 444 addU32(v.x); 445 addU32(v.y); 446 addU32(v.z); 447 addU32(v.w); 448 } 449 450 public void addI64(Long2 v) { 451 if (RenderScript.shouldThunk()) { 452 mN.addI64(new android.renderscript.Long2(v.x, v.y)); 453 return; 454 } 455 addI64(v.x); 456 addI64(v.y); 457 } 458 public void addI64(Long3 v) { 459 if (RenderScript.shouldThunk()) { 460 mN.addI64(new android.renderscript.Long3(v.x, v.y, v.z)); 461 return; 462 } 463 addI64(v.x); 464 addI64(v.y); 465 addI64(v.z); 466 } 467 public void addI64(Long4 v) { 468 if (RenderScript.shouldThunk()) { 469 mN.addI64(new android.renderscript.Long4(v.x, v.y, v.z, v.w)); 470 return; 471 } 472 addI64(v.x); 473 addI64(v.y); 474 addI64(v.z); 475 addI64(v.w); 476 } 477 478 public void addU64(Long2 v) { 479 if (RenderScript.shouldThunk()) { 480 mN.addU64(new android.renderscript.Long2(v.x, v.y)); 481 return; 482 } 483 addU64(v.x); 484 addU64(v.y); 485 } 486 public void addU64(Long3 v) { 487 if (RenderScript.shouldThunk()) { 488 mN.addU64(new android.renderscript.Long3(v.x, v.y, v.z)); 489 return; 490 } 491 addU64(v.x); 492 addU64(v.y); 493 addU64(v.z); 494 } 495 public void addU64(Long4 v) { 496 if (RenderScript.shouldThunk()) { 497 mN.addU64(new android.renderscript.Long4(v.x, v.y, v.z, v.w)); 498 return; 499 } 500 addU64(v.x); 501 addU64(v.y); 502 addU64(v.z); 503 addU64(v.w); 504 } 505 506 public void addMatrix(Matrix4f v) { 507 if (RenderScript.shouldThunk()) { 508 mN.addMatrix(new android.renderscript.Matrix4f(v.getArray())); 509 return; 510 } 511 for (int i=0; i < v.mMat.length; i++) { 512 addF32(v.mMat[i]); 513 } 514 } 515 516 public void addMatrix(Matrix3f v) { 517 if (RenderScript.shouldThunk()) { 518 mN.addMatrix(new android.renderscript.Matrix3f(v.getArray())); 519 return; 520 } 521 for (int i=0; i < v.mMat.length; i++) { 522 addF32(v.mMat[i]); 523 } 524 } 525 526 public void addMatrix(Matrix2f v) { 527 if (RenderScript.shouldThunk()) { 528 mN.addMatrix(new android.renderscript.Matrix2f(v.getArray())); 529 return; 530 } 531 for (int i=0; i < v.mMat.length; i++) { 532 addF32(v.mMat[i]); 533 } 534 } 535 536 public void addBoolean(boolean v) { 537 if (RenderScript.shouldThunk()) { 538 mN.addBoolean(v); 539 return; 540 } 541 addI8((byte)(v ? 1 : 0)); 542 } 543 544 public final byte[] getData() { 545 if (RenderScript.shouldThunk()) { 546 return mN.getData(); 547 } 548 return mData; 549 } 550 551 private final byte mData[]; 552 private int mPos; 553 private int mLen; 554 555} 556 557 558