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