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; 18 19 import java.util.BitSet; 20 21 /** 22 * Utility class for packing arguments and structures from Android system objects to 23 * RenderScript objects. 24 * 25 * This class is only intended to be used to support the 26 * reflected code generated by the RS tool chain. It should not 27 * be called directly. 28 * 29 * @deprecated Renderscript has been deprecated in API level 31. Please refer to the <a 30 * href="https://developer.android.com/guide/topics/renderscript/migration-guide">migration 31 * guide</a> for the proposed alternatives. 32 **/ 33 @Deprecated 34 public class FieldPacker { FieldPacker(int len)35 public FieldPacker(int len) { 36 mPos = 0; 37 mLen = len; 38 mData = new byte[len]; 39 mAlignment = new BitSet(); 40 } 41 FieldPacker(byte[] data)42 public FieldPacker(byte[] data) { 43 // Advance mPos to the end of the buffer, since we are copying in the 44 // full data input. 45 mPos = data.length; 46 mLen = data.length; 47 mData = data; 48 mAlignment = new BitSet(); 49 // TODO: We should either have an actual FieldPacker copy constructor 50 // or drop support for computing alignment like this. As it stands, 51 // subAlign() can never work correctly for copied FieldPacker objects. 52 } 53 createFromArray(Object[] args)54 static FieldPacker createFromArray(Object[] args) { 55 FieldPacker fp = new FieldPacker(RenderScript.sPointerSize * 8); 56 for (Object arg : args) { 57 fp.addSafely(arg); 58 } 59 fp.resize(fp.mPos); 60 return fp; 61 } 62 align(int v)63 public void align(int v) { 64 if ((v <= 0) || ((v & (v - 1)) != 0)) { 65 throw new RSIllegalArgumentException("argument must be a non-negative non-zero power of 2: " + v); 66 } 67 68 while ((mPos & (v - 1)) != 0) { 69 mAlignment.flip(mPos); 70 mData[mPos++] = 0; 71 } 72 } 73 subalign(int v)74 public void subalign(int v) { 75 if ((v & (v - 1)) != 0) { 76 throw new RSIllegalArgumentException("argument must be a non-negative non-zero power of 2: " + v); 77 } 78 79 while ((mPos & (v - 1)) != 0) { 80 mPos--; 81 } 82 83 if (mPos > 0) { 84 while (mAlignment.get(mPos - 1) == true) { 85 mPos--; 86 mAlignment.flip(mPos); 87 } 88 } 89 90 } 91 reset()92 public void reset() { 93 mPos = 0; 94 } reset(int i)95 public void reset(int i) { 96 if ((i < 0) || (i > mLen)) { 97 throw new RSIllegalArgumentException("out of range argument: " + i); 98 } 99 mPos = i; 100 } 101 skip(int i)102 public void skip(int i) { 103 int res = mPos + i; 104 if ((res < 0) || (res > mLen)) { 105 throw new RSIllegalArgumentException("out of range argument: " + i); 106 } 107 mPos = res; 108 } 109 addI8(byte v)110 public void addI8(byte v) { 111 mData[mPos++] = v; 112 } 113 subI8()114 public byte subI8() { 115 subalign(1); 116 return mData[--mPos]; 117 } 118 addI16(short v)119 public void addI16(short v) { 120 align(2); 121 mData[mPos++] = (byte)(v & 0xff); 122 mData[mPos++] = (byte)(v >> 8); 123 } 124 subI16()125 public short subI16() { 126 subalign(2); 127 short v = 0; 128 v = (short)((mData[--mPos] & 0xff) << 8); 129 v = (short)(v | (short)(mData[--mPos] & 0xff)); 130 return v; 131 } 132 133 addI32(int v)134 public void addI32(int v) { 135 align(4); 136 mData[mPos++] = (byte)(v & 0xff); 137 mData[mPos++] = (byte)((v >> 8) & 0xff); 138 mData[mPos++] = (byte)((v >> 16) & 0xff); 139 mData[mPos++] = (byte)((v >> 24) & 0xff); 140 } 141 subI32()142 public int subI32() { 143 subalign(4); 144 int v = 0; 145 v = ((mData[--mPos] & 0xff) << 24); 146 v = v | ((mData[--mPos] & 0xff) << 16); 147 v = v | ((mData[--mPos] & 0xff) << 8); 148 v = v | ((mData[--mPos] & 0xff)); 149 return v; 150 } 151 152 addI64(long v)153 public void addI64(long v) { 154 align(8); 155 mData[mPos++] = (byte)(v & 0xff); 156 mData[mPos++] = (byte)((v >> 8) & 0xff); 157 mData[mPos++] = (byte)((v >> 16) & 0xff); 158 mData[mPos++] = (byte)((v >> 24) & 0xff); 159 mData[mPos++] = (byte)((v >> 32) & 0xff); 160 mData[mPos++] = (byte)((v >> 40) & 0xff); 161 mData[mPos++] = (byte)((v >> 48) & 0xff); 162 mData[mPos++] = (byte)((v >> 56) & 0xff); 163 } 164 subI64()165 public long subI64() { 166 subalign(8); 167 long v = 0; 168 byte x = 0; 169 x = ((mData[--mPos])); 170 v = (long)(v | (((long)x) & 0xff) << 56l); 171 x = ((mData[--mPos])); 172 v = (long)(v | (((long)x) & 0xff) << 48l); 173 x = ((mData[--mPos])); 174 v = (long)(v | (((long)x) & 0xff) << 40l); 175 x = ((mData[--mPos])); 176 v = (long)(v | (((long)x) & 0xff) << 32l); 177 x = ((mData[--mPos])); 178 v = (long)(v | (((long)x) & 0xff) << 24l); 179 x = ((mData[--mPos])); 180 v = (long)(v | (((long)x) & 0xff) << 16l); 181 x = ((mData[--mPos])); 182 v = (long)(v | (((long)x) & 0xff) << 8l); 183 x = ((mData[--mPos])); 184 v = (long)(v | (((long)x) & 0xff)); 185 return v; 186 } 187 addU8(short v)188 public void addU8(short v) { 189 if ((v < 0) || (v > 0xff)) { 190 android.util.Log.e("rs", "FieldPacker.addU8( " + v + " )"); 191 throw new IllegalArgumentException("Saving value out of range for type"); 192 } 193 mData[mPos++] = (byte)v; 194 } 195 addU16(int v)196 public void addU16(int v) { 197 if ((v < 0) || (v > 0xffff)) { 198 android.util.Log.e("rs", "FieldPacker.addU16( " + v + " )"); 199 throw new IllegalArgumentException("Saving value out of range for type"); 200 } 201 align(2); 202 mData[mPos++] = (byte)(v & 0xff); 203 mData[mPos++] = (byte)(v >> 8); 204 } 205 addU32(long v)206 public void addU32(long v) { 207 if ((v < 0) || (v > 0xffffffffL)) { 208 android.util.Log.e("rs", "FieldPacker.addU32( " + v + " )"); 209 throw new IllegalArgumentException("Saving value out of range for type"); 210 } 211 align(4); 212 mData[mPos++] = (byte)(v & 0xff); 213 mData[mPos++] = (byte)((v >> 8) & 0xff); 214 mData[mPos++] = (byte)((v >> 16) & 0xff); 215 mData[mPos++] = (byte)((v >> 24) & 0xff); 216 } 217 addU64(long v)218 public void addU64(long v) { 219 if (v < 0) { 220 android.util.Log.e("rs", "FieldPacker.addU64( " + v + " )"); 221 throw new IllegalArgumentException("Saving value out of range for type"); 222 } 223 align(8); 224 mData[mPos++] = (byte)(v & 0xff); 225 mData[mPos++] = (byte)((v >> 8) & 0xff); 226 mData[mPos++] = (byte)((v >> 16) & 0xff); 227 mData[mPos++] = (byte)((v >> 24) & 0xff); 228 mData[mPos++] = (byte)((v >> 32) & 0xff); 229 mData[mPos++] = (byte)((v >> 40) & 0xff); 230 mData[mPos++] = (byte)((v >> 48) & 0xff); 231 mData[mPos++] = (byte)((v >> 56) & 0xff); 232 } 233 addF32(float v)234 public void addF32(float v) { 235 addI32(Float.floatToRawIntBits(v)); 236 } 237 subF32()238 public float subF32() { 239 return Float.intBitsToFloat(subI32()); 240 } 241 addF64(double v)242 public void addF64(double v) { 243 addI64(Double.doubleToRawLongBits(v)); 244 } 245 subF64()246 public double subF64() { 247 return Double.longBitsToDouble(subI64()); 248 } 249 addObj(BaseObj obj)250 public void addObj(BaseObj obj) { 251 if (obj != null) { 252 if (RenderScript.sPointerSize == 8) { 253 addI64(obj.getID(null)); 254 addI64(0); 255 addI64(0); 256 addI64(0); 257 } else { 258 addI32((int)obj.getID(null)); 259 } 260 } else { 261 if (RenderScript.sPointerSize == 8) { 262 addI64(0); 263 addI64(0); 264 addI64(0); 265 addI64(0); 266 } else { 267 addI32(0); 268 } 269 } 270 } 271 addF32(Float2 v)272 public void addF32(Float2 v) { 273 addF32(v.x); 274 addF32(v.y); 275 } addF32(Float3 v)276 public void addF32(Float3 v) { 277 addF32(v.x); 278 addF32(v.y); 279 addF32(v.z); 280 } addF32(Float4 v)281 public void addF32(Float4 v) { 282 addF32(v.x); 283 addF32(v.y); 284 addF32(v.z); 285 addF32(v.w); 286 } 287 addF64(Double2 v)288 public void addF64(Double2 v) { 289 addF64(v.x); 290 addF64(v.y); 291 } addF64(Double3 v)292 public void addF64(Double3 v) { 293 addF64(v.x); 294 addF64(v.y); 295 addF64(v.z); 296 } addF64(Double4 v)297 public void addF64(Double4 v) { 298 addF64(v.x); 299 addF64(v.y); 300 addF64(v.z); 301 addF64(v.w); 302 } 303 addI8(Byte2 v)304 public void addI8(Byte2 v) { 305 addI8(v.x); 306 addI8(v.y); 307 } addI8(Byte3 v)308 public void addI8(Byte3 v) { 309 addI8(v.x); 310 addI8(v.y); 311 addI8(v.z); 312 } addI8(Byte4 v)313 public void addI8(Byte4 v) { 314 addI8(v.x); 315 addI8(v.y); 316 addI8(v.z); 317 addI8(v.w); 318 } 319 addU8(Short2 v)320 public void addU8(Short2 v) { 321 addU8(v.x); 322 addU8(v.y); 323 } addU8(Short3 v)324 public void addU8(Short3 v) { 325 addU8(v.x); 326 addU8(v.y); 327 addU8(v.z); 328 } addU8(Short4 v)329 public void addU8(Short4 v) { 330 addU8(v.x); 331 addU8(v.y); 332 addU8(v.z); 333 addU8(v.w); 334 } 335 addI16(Short2 v)336 public void addI16(Short2 v) { 337 addI16(v.x); 338 addI16(v.y); 339 } addI16(Short3 v)340 public void addI16(Short3 v) { 341 addI16(v.x); 342 addI16(v.y); 343 addI16(v.z); 344 } addI16(Short4 v)345 public void addI16(Short4 v) { 346 addI16(v.x); 347 addI16(v.y); 348 addI16(v.z); 349 addI16(v.w); 350 } 351 addU16(Int2 v)352 public void addU16(Int2 v) { 353 addU16(v.x); 354 addU16(v.y); 355 } addU16(Int3 v)356 public void addU16(Int3 v) { 357 addU16(v.x); 358 addU16(v.y); 359 addU16(v.z); 360 } addU16(Int4 v)361 public void addU16(Int4 v) { 362 addU16(v.x); 363 addU16(v.y); 364 addU16(v.z); 365 addU16(v.w); 366 } 367 addI32(Int2 v)368 public void addI32(Int2 v) { 369 addI32(v.x); 370 addI32(v.y); 371 } addI32(Int3 v)372 public void addI32(Int3 v) { 373 addI32(v.x); 374 addI32(v.y); 375 addI32(v.z); 376 } addI32(Int4 v)377 public void addI32(Int4 v) { 378 addI32(v.x); 379 addI32(v.y); 380 addI32(v.z); 381 addI32(v.w); 382 } 383 addU32(Long2 v)384 public void addU32(Long2 v) { 385 addU32(v.x); 386 addU32(v.y); 387 } addU32(Long3 v)388 public void addU32(Long3 v) { 389 addU32(v.x); 390 addU32(v.y); 391 addU32(v.z); 392 } addU32(Long4 v)393 public void addU32(Long4 v) { 394 addU32(v.x); 395 addU32(v.y); 396 addU32(v.z); 397 addU32(v.w); 398 } 399 addI64(Long2 v)400 public void addI64(Long2 v) { 401 addI64(v.x); 402 addI64(v.y); 403 } addI64(Long3 v)404 public void addI64(Long3 v) { 405 addI64(v.x); 406 addI64(v.y); 407 addI64(v.z); 408 } addI64(Long4 v)409 public void addI64(Long4 v) { 410 addI64(v.x); 411 addI64(v.y); 412 addI64(v.z); 413 addI64(v.w); 414 } 415 addU64(Long2 v)416 public void addU64(Long2 v) { 417 addU64(v.x); 418 addU64(v.y); 419 } addU64(Long3 v)420 public void addU64(Long3 v) { 421 addU64(v.x); 422 addU64(v.y); 423 addU64(v.z); 424 } addU64(Long4 v)425 public void addU64(Long4 v) { 426 addU64(v.x); 427 addU64(v.y); 428 addU64(v.z); 429 addU64(v.w); 430 } 431 432 subFloat2()433 public Float2 subFloat2() { 434 Float2 v = new Float2(); 435 v.y = subF32(); 436 v.x = subF32(); 437 return v; 438 } subFloat3()439 public Float3 subFloat3() { 440 Float3 v = new Float3(); 441 v.z = subF32(); 442 v.y = subF32(); 443 v.x = subF32(); 444 return v; 445 } subFloat4()446 public Float4 subFloat4() { 447 Float4 v = new Float4(); 448 v.w = subF32(); 449 v.z = subF32(); 450 v.y = subF32(); 451 v.x = subF32(); 452 return v; 453 } 454 subDouble2()455 public Double2 subDouble2() { 456 Double2 v = new Double2(); 457 v.y = subF64(); 458 v.x = subF64(); 459 return v; 460 } subDouble3()461 public Double3 subDouble3() { 462 Double3 v = new Double3(); 463 v.z = subF64(); 464 v.y = subF64(); 465 v.x = subF64(); 466 return v; 467 } subDouble4()468 public Double4 subDouble4() { 469 Double4 v = new Double4(); 470 v.w = subF64(); 471 v.z = subF64(); 472 v.y = subF64(); 473 v.x = subF64(); 474 return v; 475 } 476 subByte2()477 public Byte2 subByte2() { 478 Byte2 v = new Byte2(); 479 v.y = subI8(); 480 v.x = subI8(); 481 return v; 482 } subByte3()483 public Byte3 subByte3() { 484 Byte3 v = new Byte3(); 485 v.z = subI8(); 486 v.y = subI8(); 487 v.x = subI8(); 488 return v; 489 } subByte4()490 public Byte4 subByte4() { 491 Byte4 v = new Byte4(); 492 v.w = subI8(); 493 v.z = subI8(); 494 v.y = subI8(); 495 v.x = subI8(); 496 return v; 497 } 498 subShort2()499 public Short2 subShort2() { 500 Short2 v = new Short2(); 501 v.y = subI16(); 502 v.x = subI16(); 503 return v; 504 } subShort3()505 public Short3 subShort3() { 506 Short3 v = new Short3(); 507 v.z = subI16(); 508 v.y = subI16(); 509 v.x = subI16(); 510 return v; 511 } subShort4()512 public Short4 subShort4() { 513 Short4 v = new Short4(); 514 v.w = subI16(); 515 v.z = subI16(); 516 v.y = subI16(); 517 v.x = subI16(); 518 return v; 519 } 520 subInt2()521 public Int2 subInt2() { 522 Int2 v = new Int2(); 523 v.y = subI32(); 524 v.x = subI32(); 525 return v; 526 } subInt3()527 public Int3 subInt3() { 528 Int3 v = new Int3(); 529 v.z = subI32(); 530 v.y = subI32(); 531 v.x = subI32(); 532 return v; 533 } subInt4()534 public Int4 subInt4() { 535 Int4 v = new Int4(); 536 v.w = subI32(); 537 v.z = subI32(); 538 v.y = subI32(); 539 v.x = subI32(); 540 return v; 541 } 542 subLong2()543 public Long2 subLong2() { 544 Long2 v = new Long2(); 545 v.y = subI64(); 546 v.x = subI64(); 547 return v; 548 } subLong3()549 public Long3 subLong3() { 550 Long3 v = new Long3(); 551 v.z = subI64(); 552 v.y = subI64(); 553 v.x = subI64(); 554 return v; 555 } subLong4()556 public Long4 subLong4() { 557 Long4 v = new Long4(); 558 v.w = subI64(); 559 v.z = subI64(); 560 v.y = subI64(); 561 v.x = subI64(); 562 return v; 563 } 564 565 566 addMatrix(Matrix4f v)567 public void addMatrix(Matrix4f v) { 568 for (int i=0; i < v.mMat.length; i++) { 569 addF32(v.mMat[i]); 570 } 571 } 572 subMatrix4f()573 public Matrix4f subMatrix4f() { 574 Matrix4f v = new Matrix4f(); 575 for (int i = v.mMat.length - 1; i >= 0; i--) { 576 v.mMat[i] = subF32(); 577 } 578 return v; 579 } 580 addMatrix(Matrix3f v)581 public void addMatrix(Matrix3f v) { 582 for (int i=0; i < v.mMat.length; i++) { 583 addF32(v.mMat[i]); 584 } 585 } 586 subMatrix3f()587 public Matrix3f subMatrix3f() { 588 Matrix3f v = new Matrix3f(); 589 for (int i = v.mMat.length - 1; i >= 0; i--) { 590 v.mMat[i] = subF32(); 591 } 592 return v; 593 } 594 addMatrix(Matrix2f v)595 public void addMatrix(Matrix2f v) { 596 for (int i=0; i < v.mMat.length; i++) { 597 addF32(v.mMat[i]); 598 } 599 } 600 subMatrix2f()601 public Matrix2f subMatrix2f() { 602 Matrix2f v = new Matrix2f(); 603 for (int i = v.mMat.length - 1; i >= 0; i--) { 604 v.mMat[i] = subF32(); 605 } 606 return v; 607 } 608 addBoolean(boolean v)609 public void addBoolean(boolean v) { 610 addI8((byte)(v ? 1 : 0)); 611 } 612 subBoolean()613 public boolean subBoolean() { 614 byte v = subI8(); 615 if (v == 1) { 616 return true; 617 } 618 return false; 619 } 620 getData()621 public final byte[] getData() { 622 return mData; 623 } 624 625 /** 626 * Get the actual length used for the FieldPacker. 627 * 628 * @hide 629 */ getPos()630 public int getPos() { 631 return mPos; 632 } 633 add(Object obj)634 private void add(Object obj) { 635 if (obj instanceof Boolean) { 636 addBoolean((Boolean)obj); 637 return; 638 } 639 640 if (obj instanceof Byte) { 641 addI8((Byte)obj); 642 return; 643 } 644 645 if (obj instanceof Short) { 646 addI16((Short)obj); 647 return; 648 } 649 650 if (obj instanceof Integer) { 651 addI32((Integer)obj); 652 return; 653 } 654 655 if (obj instanceof Long) { 656 addI64((Long)obj); 657 return; 658 } 659 660 if (obj instanceof Float) { 661 addF32((Float)obj); 662 return; 663 } 664 665 if (obj instanceof Double) { 666 addF64((Double)obj); 667 return; 668 } 669 670 if (obj instanceof Byte2) { 671 addI8((Byte2)obj); 672 return; 673 } 674 675 if (obj instanceof Byte3) { 676 addI8((Byte3)obj); 677 return; 678 } 679 680 if (obj instanceof Byte4) { 681 addI8((Byte4)obj); 682 return; 683 } 684 685 if (obj instanceof Short2) { 686 addI16((Short2)obj); 687 return; 688 } 689 690 if (obj instanceof Short3) { 691 addI16((Short3)obj); 692 return; 693 } 694 695 if (obj instanceof Short4) { 696 addI16((Short4)obj); 697 return; 698 } 699 700 if (obj instanceof Int2) { 701 addI32((Int2)obj); 702 return; 703 } 704 705 if (obj instanceof Int3) { 706 addI32((Int3)obj); 707 return; 708 } 709 710 if (obj instanceof Int4) { 711 addI32((Int4)obj); 712 return; 713 } 714 715 if (obj instanceof Long2) { 716 addI64((Long2)obj); 717 return; 718 } 719 720 if (obj instanceof Long3) { 721 addI64((Long3)obj); 722 return; 723 } 724 725 if (obj instanceof Long4) { 726 addI64((Long4)obj); 727 return; 728 } 729 730 if (obj instanceof Float2) { 731 addF32((Float2)obj); 732 return; 733 } 734 735 if (obj instanceof Float3) { 736 addF32((Float3)obj); 737 return; 738 } 739 740 if (obj instanceof Float4) { 741 addF32((Float4)obj); 742 return; 743 } 744 745 if (obj instanceof Double2) { 746 addF64((Double2)obj); 747 return; 748 } 749 750 if (obj instanceof Double3) { 751 addF64((Double3)obj); 752 return; 753 } 754 755 if (obj instanceof Double4) { 756 addF64((Double4)obj); 757 return; 758 } 759 760 if (obj instanceof Matrix2f) { 761 addMatrix((Matrix2f)obj); 762 return; 763 } 764 765 if (obj instanceof Matrix3f) { 766 addMatrix((Matrix3f)obj); 767 return; 768 } 769 770 if (obj instanceof Matrix4f) { 771 addMatrix((Matrix4f)obj); 772 return; 773 } 774 775 if (obj instanceof BaseObj) { 776 addObj((BaseObj)obj); 777 return; 778 } 779 } 780 resize(int newSize)781 private boolean resize(int newSize) { 782 if (newSize == mLen) { 783 return false; 784 } 785 786 byte[] newData = new byte[newSize]; 787 System.arraycopy(mData, 0, newData, 0, mPos); 788 mData = newData; 789 mLen = newSize; 790 return true; 791 } 792 addSafely(Object obj)793 private void addSafely(Object obj) { 794 boolean retry; 795 final int oldPos = mPos; 796 do { 797 retry = false; 798 try { 799 add(obj); 800 } catch (ArrayIndexOutOfBoundsException e) { 801 mPos = oldPos; 802 resize(mLen * 2); 803 retry = true; 804 } 805 } while (retry); 806 } 807 808 private byte mData[]; 809 private int mPos; 810 private int mLen; 811 private BitSet mAlignment; 812 } 813