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