FieldPacker.java revision eeb3042428fbe3a3cace554d3aca43b324904ad1
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 FieldPackerThunker 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 FieldPackerThunker(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 mN.addObj(obj); 213 return; 214 } 215 if (obj != null) { 216 addI32(obj.getID(null)); 217 } else { 218 addI32(0); 219 } 220 } 221 222 public void addF32(Float2 v) { 223 if (RenderScript.shouldThunk()) { 224 mN.addF32(v); 225 return; 226 } 227 addF32(v.x); 228 addF32(v.y); 229 } 230 public void addF32(Float3 v) { 231 if (RenderScript.shouldThunk()) { 232 mN.addF32(v); 233 return; 234 } 235 addF32(v.x); 236 addF32(v.y); 237 addF32(v.z); 238 } 239 public void addF32(Float4 v) { 240 if (RenderScript.shouldThunk()) { 241 mN.addF32(v); 242 return; 243 } 244 addF32(v.x); 245 addF32(v.y); 246 addF32(v.z); 247 addF32(v.w); 248 } 249 250 public void addF64(Double2 v) { 251 if (RenderScript.shouldThunk()) { 252 mN.addF64(v); 253 return; 254 } 255 addF64(v.x); 256 addF64(v.y); 257 } 258 public void addF64(Double3 v) { 259 if (RenderScript.shouldThunk()) { 260 mN.addF64(v); 261 return; 262 } 263 addF64(v.x); 264 addF64(v.y); 265 addF64(v.z); 266 } 267 public void addF64(Double4 v) { 268 if (RenderScript.shouldThunk()) { 269 mN.addF64(v); 270 return; 271 } 272 addF64(v.x); 273 addF64(v.y); 274 addF64(v.z); 275 addF64(v.w); 276 } 277 278 public void addI8(Byte2 v) { 279 if (RenderScript.shouldThunk()) { 280 mN.addI8(v); 281 return; 282 } 283 addI8(v.x); 284 addI8(v.y); 285 } 286 public void addI8(Byte3 v) { 287 if (RenderScript.shouldThunk()) { 288 mN.addI8(v); 289 return; 290 } 291 addI8(v.x); 292 addI8(v.y); 293 addI8(v.z); 294 } 295 public void addI8(Byte4 v) { 296 if (RenderScript.shouldThunk()) { 297 mN.addI8(v); 298 return; 299 } 300 addI8(v.x); 301 addI8(v.y); 302 addI8(v.z); 303 addI8(v.w); 304 } 305 306 public void addU8(Short2 v) { 307 if (RenderScript.shouldThunk()) { 308 mN.addU8(v); 309 return; 310 } 311 addU8(v.x); 312 addU8(v.y); 313 } 314 public void addU8(Short3 v) { 315 if (RenderScript.shouldThunk()) { 316 mN.addU8(v); 317 return; 318 } 319 addU8(v.x); 320 addU8(v.y); 321 addU8(v.z); 322 } 323 public void addU8(Short4 v) { 324 if (RenderScript.shouldThunk()) { 325 mN.addU8(v); 326 return; 327 } 328 addU8(v.x); 329 addU8(v.y); 330 addU8(v.z); 331 addU8(v.w); 332 } 333 334 public void addI16(Short2 v) { 335 if (RenderScript.shouldThunk()) { 336 mN.addI16(v); 337 return; 338 } 339 addI16(v.x); 340 addI16(v.y); 341 } 342 public void addI16(Short3 v) { 343 if (RenderScript.shouldThunk()) { 344 mN.addI16(v); 345 return; 346 } 347 addI16(v.x); 348 addI16(v.y); 349 addI16(v.z); 350 } 351 public void addI16(Short4 v) { 352 if (RenderScript.shouldThunk()) { 353 mN.addI16(v); 354 return; 355 } 356 addI16(v.x); 357 addI16(v.y); 358 addI16(v.z); 359 addI16(v.w); 360 } 361 362 public void addU16(Int2 v) { 363 if (RenderScript.shouldThunk()) { 364 mN.addU16(v); 365 return; 366 } 367 addU16(v.x); 368 addU16(v.y); 369 } 370 public void addU16(Int3 v) { 371 if (RenderScript.shouldThunk()) { 372 mN.addU16(v); 373 return; 374 } 375 addU16(v.x); 376 addU16(v.y); 377 addU16(v.z); 378 } 379 public void addU16(Int4 v) { 380 if (RenderScript.shouldThunk()) { 381 mN.addU16(v); 382 return; 383 } 384 addU16(v.x); 385 addU16(v.y); 386 addU16(v.z); 387 addU16(v.w); 388 } 389 390 public void addI32(Int2 v) { 391 if (RenderScript.shouldThunk()) { 392 mN.addI32(v); 393 return; 394 } 395 addI32(v.x); 396 addI32(v.y); 397 } 398 public void addI32(Int3 v) { 399 if (RenderScript.shouldThunk()) { 400 mN.addI32(v); 401 return; 402 } 403 addI32(v.x); 404 addI32(v.y); 405 addI32(v.z); 406 } 407 public void addI32(Int4 v) { 408 if (RenderScript.shouldThunk()) { 409 mN.addI32(v); 410 return; 411 } 412 addI32(v.x); 413 addI32(v.y); 414 addI32(v.z); 415 addI32(v.w); 416 } 417 418 public void addU32(Long2 v) { 419 if (RenderScript.shouldThunk()) { 420 mN.addU32(v); 421 return; 422 } 423 addU32(v.x); 424 addU32(v.y); 425 } 426 public void addU32(Long3 v) { 427 if (RenderScript.shouldThunk()) { 428 mN.addU32(v); 429 return; 430 } 431 addU32(v.x); 432 addU32(v.y); 433 addU32(v.z); 434 } 435 public void addU32(Long4 v) { 436 if (RenderScript.shouldThunk()) { 437 mN.addU32(v); 438 return; 439 } 440 addU32(v.x); 441 addU32(v.y); 442 addU32(v.z); 443 addU32(v.w); 444 } 445 446 public void addI64(Long2 v) { 447 if (RenderScript.shouldThunk()) { 448 mN.addI64(v); 449 return; 450 } 451 addI64(v.x); 452 addI64(v.y); 453 } 454 public void addI64(Long3 v) { 455 if (RenderScript.shouldThunk()) { 456 mN.addI64(v); 457 return; 458 } 459 addI64(v.x); 460 addI64(v.y); 461 addI64(v.z); 462 } 463 public void addI64(Long4 v) { 464 if (RenderScript.shouldThunk()) { 465 mN.addI64(v); 466 return; 467 } 468 addI64(v.x); 469 addI64(v.y); 470 addI64(v.z); 471 addI64(v.w); 472 } 473 474 public void addU64(Long2 v) { 475 if (RenderScript.shouldThunk()) { 476 mN.addU64(v); 477 return; 478 } 479 addU64(v.x); 480 addU64(v.y); 481 } 482 public void addU64(Long3 v) { 483 if (RenderScript.shouldThunk()) { 484 mN.addU64(v); 485 return; 486 } 487 addU64(v.x); 488 addU64(v.y); 489 addU64(v.z); 490 } 491 public void addU64(Long4 v) { 492 if (RenderScript.shouldThunk()) { 493 mN.addU64(v); 494 return; 495 } 496 addU64(v.x); 497 addU64(v.y); 498 addU64(v.z); 499 addU64(v.w); 500 } 501 502 public void addMatrix(Matrix4f v) { 503 if (RenderScript.shouldThunk()) { 504 mN.addMatrix(v); 505 return; 506 } 507 for (int i=0; i < v.mMat.length; i++) { 508 addF32(v.mMat[i]); 509 } 510 } 511 512 public void addMatrix(Matrix3f v) { 513 if (RenderScript.shouldThunk()) { 514 mN.addMatrix(v); 515 return; 516 } 517 for (int i=0; i < v.mMat.length; i++) { 518 addF32(v.mMat[i]); 519 } 520 } 521 522 public void addMatrix(Matrix2f v) { 523 if (RenderScript.shouldThunk()) { 524 mN.addMatrix(v); 525 return; 526 } 527 for (int i=0; i < v.mMat.length; i++) { 528 addF32(v.mMat[i]); 529 } 530 } 531 532 public void addBoolean(boolean v) { 533 if (RenderScript.shouldThunk()) { 534 mN.addBoolean(v); 535 return; 536 } 537 addI8((byte)(v ? 1 : 0)); 538 } 539 540 public final byte[] getData() { 541 if (RenderScript.shouldThunk()) { 542 return mN.getData(); 543 } 544 return mData; 545 } 546 547 private final byte mData[]; 548 private int mPos; 549 private int mLen; 550 551} 552 553 554