blob: 0f967fcae26a079b0a53522e6ece12c94236f428 [file] [log] [blame]
Jason Sams25430d02010-02-02 15:26:40 -08001/*
Jason Sams5b08a2d2013-02-08 11:22:17 -08002 * Copyright (C) 2013 The Android Open Source Project
Jason Sams25430d02010-02-02 15:26:40 -08003 *
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.renderscript;
18
Tim Murray7c4caad2013-04-10 16:21:40 -070019import java.util.BitSet;
Jason Sams25430d02010-02-02 15:26:40 -080020
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -070021/**
Robert Ly11518ac2011-02-09 13:57:06 -080022 * Utility class for packing arguments and structures from Android system objects to
Tim Murrayc11e25c2013-04-09 11:01:01 -070023 * RenderScript objects.
Jason Sams42d6c9e2010-02-02 15:45:58 -080024 *
Jason Samsf64cca92013-04-19 12:56:37 -070025 * 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 *
Jason Sams42d6c9e2010-02-02 15:45:58 -080029 **/
Jason Sams25430d02010-02-02 15:26:40 -080030public class FieldPacker {
31 public FieldPacker(int len) {
32 mPos = 0;
Stephen Hinese27832a2011-06-02 19:36:41 -070033 mLen = len;
Jason Sams25430d02010-02-02 15:26:40 -080034 mData = new byte[len];
Tim Murray7c4caad2013-04-10 16:21:40 -070035 mAlignment = new BitSet();
Jason Sams25430d02010-02-02 15:26:40 -080036 }
37
Jason Sams5b08a2d2013-02-08 11:22:17 -080038 public FieldPacker(byte[] data) {
Stephen Hinesfcb31612014-06-23 17:35:04 -070039 // Advance mPos to the end of the buffer, since we are copying in the
40 // full data input.
41 mPos = data.length;
Jason Sams5b08a2d2013-02-08 11:22:17 -080042 mLen = data.length;
43 mData = data;
Tim Murray7c4caad2013-04-10 16:21:40 -070044 mAlignment = new BitSet();
Stephen Hinesfcb31612014-06-23 17:35:04 -070045 // TODO: We should either have an actual FieldPacker copy constructor
46 // or drop support for computing alignment like this. As it stands,
47 // subAlign() can never work correctly for copied FieldPacker objects.
Jason Sams5b08a2d2013-02-08 11:22:17 -080048 }
49
Jason Sams25430d02010-02-02 15:26:40 -080050 public void align(int v) {
Stephen Hinese27832a2011-06-02 19:36:41 -070051 if ((v <= 0) || ((v & (v - 1)) != 0)) {
52 throw new RSIllegalArgumentException("argument must be a non-negative non-zero power of 2: " + v);
53 }
54
Jason Sams25430d02010-02-02 15:26:40 -080055 while ((mPos & (v - 1)) != 0) {
Tim Murray7c4caad2013-04-10 16:21:40 -070056 mAlignment.flip(mPos);
Jason Sams25430d02010-02-02 15:26:40 -080057 mData[mPos++] = 0;
58 }
59 }
60
Tim Murray7c4caad2013-04-10 16:21:40 -070061 public void subalign(int v) {
62 if ((v & (v - 1)) != 0) {
63 throw new RSIllegalArgumentException("argument must be a non-negative non-zero power of 2: " + v);
64 }
65
66 while ((mPos & (v - 1)) != 0) {
67 mPos--;
68 }
69
70 if (mPos > 0) {
71 while (mAlignment.get(mPos - 1) == true) {
72 mPos--;
73 mAlignment.flip(mPos);
74 }
75 }
76
77 }
78
Jason Samsa70f4162010-03-26 15:33:42 -070079 public void reset() {
Jason Sams25430d02010-02-02 15:26:40 -080080 mPos = 0;
81 }
Jason Samsa70f4162010-03-26 15:33:42 -070082 public void reset(int i) {
Stephen Hinesfa1275a2014-06-17 17:25:04 -070083 if ((i < 0) || (i > mLen)) {
Stephen Hinese27832a2011-06-02 19:36:41 -070084 throw new RSIllegalArgumentException("out of range argument: " + i);
85 }
Jason Samsa70f4162010-03-26 15:33:42 -070086 mPos = i;
87 }
Jason Sams25430d02010-02-02 15:26:40 -080088
Jason Sams020bb7b2010-06-17 15:55:00 -070089 public void skip(int i) {
Stephen Hinese27832a2011-06-02 19:36:41 -070090 int res = mPos + i;
Shih-wei Liao6e667252011-06-05 00:51:54 -070091 if ((res < 0) || (res > mLen)) {
Stephen Hinese27832a2011-06-02 19:36:41 -070092 throw new RSIllegalArgumentException("out of range argument: " + i);
93 }
94 mPos = res;
Jason Sams020bb7b2010-06-17 15:55:00 -070095 }
96
Jason Samsa70f4162010-03-26 15:33:42 -070097 public void addI8(byte v) {
Jason Sams25430d02010-02-02 15:26:40 -080098 mData[mPos++] = v;
99 }
100
Tim Murray7c4caad2013-04-10 16:21:40 -0700101 public byte subI8() {
102 subalign(1);
103 return mData[--mPos];
104 }
105
Jason Samsa70f4162010-03-26 15:33:42 -0700106 public void addI16(short v) {
Jason Sams25430d02010-02-02 15:26:40 -0800107 align(2);
108 mData[mPos++] = (byte)(v & 0xff);
109 mData[mPos++] = (byte)(v >> 8);
110 }
111
Tim Murray7c4caad2013-04-10 16:21:40 -0700112 public short subI16() {
113 subalign(2);
114 short v = 0;
115 v = (short)((mData[--mPos] & 0xff) << 8);
116 v = (short)(v | (short)(mData[--mPos] & 0xff));
117 return v;
118 }
119
120
Jason Samsa70f4162010-03-26 15:33:42 -0700121 public void addI32(int v) {
Jason Sams25430d02010-02-02 15:26:40 -0800122 align(4);
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 }
128
Tim Murray7c4caad2013-04-10 16:21:40 -0700129 public int subI32() {
130 subalign(4);
131 int v = 0;
132 v = ((mData[--mPos] & 0xff) << 24);
133 v = v | ((mData[--mPos] & 0xff) << 16);
134 v = v | ((mData[--mPos] & 0xff) << 8);
135 v = v | ((mData[--mPos] & 0xff));
136 return v;
137 }
138
139
Jason Samsa70f4162010-03-26 15:33:42 -0700140 public void addI64(long v) {
Jason Sams25430d02010-02-02 15:26:40 -0800141 align(8);
142 mData[mPos++] = (byte)(v & 0xff);
143 mData[mPos++] = (byte)((v >> 8) & 0xff);
144 mData[mPos++] = (byte)((v >> 16) & 0xff);
145 mData[mPos++] = (byte)((v >> 24) & 0xff);
146 mData[mPos++] = (byte)((v >> 32) & 0xff);
147 mData[mPos++] = (byte)((v >> 40) & 0xff);
148 mData[mPos++] = (byte)((v >> 48) & 0xff);
149 mData[mPos++] = (byte)((v >> 56) & 0xff);
150 }
151
Tim Murray7c4caad2013-04-10 16:21:40 -0700152 public long subI64() {
153 subalign(8);
154 long v = 0;
155 byte x = 0;
156 x = ((mData[--mPos]));
157 v = (long)(v | (((long)x) & 0xff) << 56l);
158 x = ((mData[--mPos]));
159 v = (long)(v | (((long)x) & 0xff) << 48l);
160 x = ((mData[--mPos]));
161 v = (long)(v | (((long)x) & 0xff) << 40l);
162 x = ((mData[--mPos]));
163 v = (long)(v | (((long)x) & 0xff) << 32l);
164 x = ((mData[--mPos]));
165 v = (long)(v | (((long)x) & 0xff) << 24l);
166 x = ((mData[--mPos]));
167 v = (long)(v | (((long)x) & 0xff) << 16l);
168 x = ((mData[--mPos]));
169 v = (long)(v | (((long)x) & 0xff) << 8l);
170 x = ((mData[--mPos]));
171 v = (long)(v | (((long)x) & 0xff));
172 return v;
173 }
174
Jason Samsa70f4162010-03-26 15:33:42 -0700175 public void addU8(short v) {
Jason Sams25430d02010-02-02 15:26:40 -0800176 if ((v < 0) || (v > 0xff)) {
Jason Samsee734982010-08-12 12:44:02 -0700177 android.util.Log.e("rs", "FieldPacker.addU8( " + v + " )");
Jason Sams25430d02010-02-02 15:26:40 -0800178 throw new IllegalArgumentException("Saving value out of range for type");
179 }
180 mData[mPos++] = (byte)v;
181 }
182
Jason Samsa70f4162010-03-26 15:33:42 -0700183 public void addU16(int v) {
Jason Sams25430d02010-02-02 15:26:40 -0800184 if ((v < 0) || (v > 0xffff)) {
Jason Samsee734982010-08-12 12:44:02 -0700185 android.util.Log.e("rs", "FieldPacker.addU16( " + v + " )");
Jason Sams25430d02010-02-02 15:26:40 -0800186 throw new IllegalArgumentException("Saving value out of range for type");
187 }
188 align(2);
189 mData[mPos++] = (byte)(v & 0xff);
190 mData[mPos++] = (byte)(v >> 8);
191 }
192
Jason Samsa70f4162010-03-26 15:33:42 -0700193 public void addU32(long v) {
Jason Samsee734982010-08-12 12:44:02 -0700194 if ((v < 0) || (v > 0xffffffffL)) {
195 android.util.Log.e("rs", "FieldPacker.addU32( " + v + " )");
Jason Sams25430d02010-02-02 15:26:40 -0800196 throw new IllegalArgumentException("Saving value out of range for type");
197 }
198 align(4);
199 mData[mPos++] = (byte)(v & 0xff);
200 mData[mPos++] = (byte)((v >> 8) & 0xff);
201 mData[mPos++] = (byte)((v >> 16) & 0xff);
202 mData[mPos++] = (byte)((v >> 24) & 0xff);
203 }
204
Jason Samsa70f4162010-03-26 15:33:42 -0700205 public void addU64(long v) {
Jason Sams25430d02010-02-02 15:26:40 -0800206 if (v < 0) {
Jason Samsee734982010-08-12 12:44:02 -0700207 android.util.Log.e("rs", "FieldPacker.addU64( " + v + " )");
Jason Sams25430d02010-02-02 15:26:40 -0800208 throw new IllegalArgumentException("Saving value out of range for type");
209 }
210 align(8);
211 mData[mPos++] = (byte)(v & 0xff);
212 mData[mPos++] = (byte)((v >> 8) & 0xff);
213 mData[mPos++] = (byte)((v >> 16) & 0xff);
214 mData[mPos++] = (byte)((v >> 24) & 0xff);
215 mData[mPos++] = (byte)((v >> 32) & 0xff);
216 mData[mPos++] = (byte)((v >> 40) & 0xff);
217 mData[mPos++] = (byte)((v >> 48) & 0xff);
218 mData[mPos++] = (byte)((v >> 56) & 0xff);
219 }
220
Jason Samsa70f4162010-03-26 15:33:42 -0700221 public void addF32(float v) {
Jason Sams25430d02010-02-02 15:26:40 -0800222 addI32(Float.floatToRawIntBits(v));
223 }
224
Tim Murray7c4caad2013-04-10 16:21:40 -0700225 public float subF32() {
226 return Float.intBitsToFloat(subI32());
227 }
228
Stephen Hines02f417052010-09-30 15:19:22 -0700229 public void addF64(double v) {
Jason Sams25430d02010-02-02 15:26:40 -0800230 addI64(Double.doubleToRawLongBits(v));
231 }
232
Tim Murray7c4caad2013-04-10 16:21:40 -0700233 public double subF64() {
234 return Double.longBitsToDouble(subI64());
235 }
236
Jason Samsa70f4162010-03-26 15:33:42 -0700237 public void addObj(BaseObj obj) {
238 if (obj != null) {
Tim Murray56f9e6f2014-05-16 11:47:26 -0700239 if (RenderScript.sPointerSize == 8) {
240 addI64(obj.getID(null));
Tim Murray4154bbd2014-06-12 14:17:53 -0700241 addI64(0);
242 addI64(0);
243 addI64(0);
Yang Nibe392ad2015-01-23 17:16:02 -0800244 } else {
Tim Murray56f9e6f2014-05-16 11:47:26 -0700245 addI32((int)obj.getID(null));
246 }
Jason Samsa70f4162010-03-26 15:33:42 -0700247 } else {
Tim Murray56f9e6f2014-05-16 11:47:26 -0700248 if (RenderScript.sPointerSize == 8) {
249 addI64(0);
Tim Murray4154bbd2014-06-12 14:17:53 -0700250 addI64(0);
251 addI64(0);
252 addI64(0);
Tim Murray56f9e6f2014-05-16 11:47:26 -0700253 } else {
254 addI32(0);
255 }
Jason Samsa70f4162010-03-26 15:33:42 -0700256 }
257 }
258
259 public void addF32(Float2 v) {
260 addF32(v.x);
261 addF32(v.y);
262 }
263 public void addF32(Float3 v) {
264 addF32(v.x);
265 addF32(v.y);
266 addF32(v.z);
267 }
268 public void addF32(Float4 v) {
269 addF32(v.x);
270 addF32(v.y);
271 addF32(v.z);
272 addF32(v.w);
273 }
274
Stephen Hines79ad3f22011-06-20 17:27:09 -0700275 public void addF64(Double2 v) {
276 addF64(v.x);
277 addF64(v.y);
278 }
279 public void addF64(Double3 v) {
280 addF64(v.x);
281 addF64(v.y);
282 addF64(v.z);
283 }
284 public void addF64(Double4 v) {
285 addF64(v.x);
286 addF64(v.y);
287 addF64(v.z);
288 addF64(v.w);
289 }
290
Jason Samsa70f4162010-03-26 15:33:42 -0700291 public void addI8(Byte2 v) {
292 addI8(v.x);
293 addI8(v.y);
294 }
295 public void addI8(Byte3 v) {
296 addI8(v.x);
297 addI8(v.y);
298 addI8(v.z);
299 }
300 public void addI8(Byte4 v) {
301 addI8(v.x);
302 addI8(v.y);
303 addI8(v.z);
304 addI8(v.w);
305 }
306
307 public void addU8(Short2 v) {
308 addU8(v.x);
309 addU8(v.y);
310 }
311 public void addU8(Short3 v) {
312 addU8(v.x);
313 addU8(v.y);
314 addU8(v.z);
315 }
316 public void addU8(Short4 v) {
317 addU8(v.x);
318 addU8(v.y);
319 addU8(v.z);
320 addU8(v.w);
321 }
322
323 public void addI16(Short2 v) {
324 addI16(v.x);
325 addI16(v.y);
326 }
327 public void addI16(Short3 v) {
328 addI16(v.x);
329 addI16(v.y);
330 addI16(v.z);
331 }
332 public void addI16(Short4 v) {
333 addI16(v.x);
334 addI16(v.y);
335 addI16(v.z);
336 addI16(v.w);
337 }
338
339 public void addU16(Int2 v) {
340 addU16(v.x);
341 addU16(v.y);
342 }
343 public void addU16(Int3 v) {
344 addU16(v.x);
345 addU16(v.y);
346 addU16(v.z);
347 }
348 public void addU16(Int4 v) {
349 addU16(v.x);
350 addU16(v.y);
351 addU16(v.z);
352 addU16(v.w);
353 }
354
355 public void addI32(Int2 v) {
356 addI32(v.x);
357 addI32(v.y);
358 }
359 public void addI32(Int3 v) {
360 addI32(v.x);
361 addI32(v.y);
362 addI32(v.z);
363 }
364 public void addI32(Int4 v) {
365 addI32(v.x);
366 addI32(v.y);
367 addI32(v.z);
368 addI32(v.w);
369 }
370
Stephen Hinese9f5c182011-01-20 18:17:25 -0800371 public void addU32(Long2 v) {
Jason Samsa70f4162010-03-26 15:33:42 -0700372 addU32(v.x);
373 addU32(v.y);
374 }
Stephen Hinese9f5c182011-01-20 18:17:25 -0800375 public void addU32(Long3 v) {
Jason Samsa70f4162010-03-26 15:33:42 -0700376 addU32(v.x);
377 addU32(v.y);
378 addU32(v.z);
379 }
Stephen Hinese9f5c182011-01-20 18:17:25 -0800380 public void addU32(Long4 v) {
Jason Samsa70f4162010-03-26 15:33:42 -0700381 addU32(v.x);
382 addU32(v.y);
383 addU32(v.z);
384 addU32(v.w);
385 }
386
Stephen Hines79ad3f22011-06-20 17:27:09 -0700387 public void addI64(Long2 v) {
388 addI64(v.x);
389 addI64(v.y);
390 }
391 public void addI64(Long3 v) {
392 addI64(v.x);
393 addI64(v.y);
394 addI64(v.z);
395 }
396 public void addI64(Long4 v) {
397 addI64(v.x);
398 addI64(v.y);
399 addI64(v.z);
400 addI64(v.w);
401 }
402
403 public void addU64(Long2 v) {
404 addU64(v.x);
405 addU64(v.y);
406 }
407 public void addU64(Long3 v) {
408 addU64(v.x);
409 addU64(v.y);
410 addU64(v.z);
411 }
412 public void addU64(Long4 v) {
413 addU64(v.x);
414 addU64(v.y);
415 addU64(v.z);
416 addU64(v.w);
417 }
418
Tim Murray7c4caad2013-04-10 16:21:40 -0700419
420 public Float2 subFloat2() {
421 Float2 v = new Float2();
422 v.y = subF32();
423 v.x = subF32();
424 return v;
425 }
426 public Float3 subFloat3() {
427 Float3 v = new Float3();
428 v.z = subF32();
429 v.y = subF32();
430 v.x = subF32();
431 return v;
432 }
433 public Float4 subFloat4() {
434 Float4 v = new Float4();
435 v.w = subF32();
436 v.z = subF32();
437 v.y = subF32();
438 v.x = subF32();
439 return v;
440 }
441
442 public Double2 subDouble2() {
443 Double2 v = new Double2();
444 v.y = subF64();
445 v.x = subF64();
446 return v;
447 }
448 public Double3 subDouble3() {
449 Double3 v = new Double3();
450 v.z = subF64();
451 v.y = subF64();
452 v.x = subF64();
453 return v;
454 }
455 public Double4 subDouble4() {
456 Double4 v = new Double4();
457 v.w = subF64();
458 v.z = subF64();
459 v.y = subF64();
460 v.x = subF64();
461 return v;
462 }
463
464 public Byte2 subByte2() {
465 Byte2 v = new Byte2();
466 v.y = subI8();
467 v.x = subI8();
468 return v;
469 }
470 public Byte3 subByte3() {
471 Byte3 v = new Byte3();
472 v.z = subI8();
473 v.y = subI8();
474 v.x = subI8();
475 return v;
476 }
477 public Byte4 subByte4() {
478 Byte4 v = new Byte4();
479 v.w = subI8();
480 v.z = subI8();
481 v.y = subI8();
482 v.x = subI8();
483 return v;
484 }
485
486 public Short2 subShort2() {
487 Short2 v = new Short2();
488 v.y = subI16();
489 v.x = subI16();
490 return v;
491 }
492 public Short3 subShort3() {
493 Short3 v = new Short3();
494 v.z = subI16();
495 v.y = subI16();
496 v.x = subI16();
497 return v;
498 }
499 public Short4 subShort4() {
500 Short4 v = new Short4();
501 v.w = subI16();
502 v.z = subI16();
503 v.y = subI16();
504 v.x = subI16();
505 return v;
506 }
507
508 public Int2 subInt2() {
509 Int2 v = new Int2();
510 v.y = subI32();
511 v.x = subI32();
512 return v;
513 }
514 public Int3 subInt3() {
515 Int3 v = new Int3();
516 v.z = subI32();
517 v.y = subI32();
518 v.x = subI32();
519 return v;
520 }
521 public Int4 subInt4() {
522 Int4 v = new Int4();
523 v.w = subI32();
524 v.z = subI32();
525 v.y = subI32();
526 v.x = subI32();
527 return v;
528 }
529
530 public Long2 subLong2() {
531 Long2 v = new Long2();
532 v.y = subI64();
533 v.x = subI64();
534 return v;
535 }
536 public Long3 subLong3() {
537 Long3 v = new Long3();
538 v.z = subI64();
539 v.y = subI64();
540 v.x = subI64();
541 return v;
542 }
543 public Long4 subLong4() {
544 Long4 v = new Long4();
545 v.w = subI64();
546 v.z = subI64();
547 v.y = subI64();
548 v.x = subI64();
549 return v;
550 }
551
552
553
Alex Sakhartchouke27cdee2010-12-17 11:41:08 -0800554 public void addMatrix(Matrix4f v) {
555 for (int i=0; i < v.mMat.length; i++) {
556 addF32(v.mMat[i]);
557 }
558 }
559
Tim Murray7c4caad2013-04-10 16:21:40 -0700560 public Matrix4f subMatrix4f() {
561 Matrix4f v = new Matrix4f();
562 for (int i = v.mMat.length - 1; i >= 0; i--) {
563 v.mMat[i] = subF32();
564 }
565 return v;
566 }
567
Alex Sakhartchouke27cdee2010-12-17 11:41:08 -0800568 public void addMatrix(Matrix3f v) {
569 for (int i=0; i < v.mMat.length; i++) {
570 addF32(v.mMat[i]);
571 }
572 }
573
Tim Murray7c4caad2013-04-10 16:21:40 -0700574 public Matrix3f subMatrix3f() {
575 Matrix3f v = new Matrix3f();
576 for (int i = v.mMat.length - 1; i >= 0; i--) {
577 v.mMat[i] = subF32();
578 }
579 return v;
580 }
581
Alex Sakhartchouke27cdee2010-12-17 11:41:08 -0800582 public void addMatrix(Matrix2f v) {
583 for (int i=0; i < v.mMat.length; i++) {
584 addF32(v.mMat[i]);
585 }
586 }
587
Tim Murray7c4caad2013-04-10 16:21:40 -0700588 public Matrix2f subMatrix2f() {
589 Matrix2f v = new Matrix2f();
590 for (int i = v.mMat.length - 1; i >= 0; i--) {
591 v.mMat[i] = subF32();
592 }
593 return v;
594 }
595
Jason Samsfae3f6b2010-06-24 13:54:11 -0700596 public void addBoolean(boolean v) {
Jason Sams9e2b0c52010-06-21 18:30:02 -0700597 addI8((byte)(v ? 1 : 0));
Jason Samsf110d4b2010-06-21 17:42:41 -0700598 }
599
Tim Murray7c4caad2013-04-10 16:21:40 -0700600 public boolean subBoolean() {
601 byte v = subI8();
602 if (v == 1) {
603 return true;
604 }
605 return false;
606 }
607
Jason Samsa70f4162010-03-26 15:33:42 -0700608 public final byte[] getData() {
Jason Sams25430d02010-02-02 15:26:40 -0800609 return mData;
610 }
611
Stephen Hinesfa1275a2014-06-17 17:25:04 -0700612 /**
613 * Get the actual length used for the FieldPacker.
614 *
615 * @hide
616 */
617 public int getPos() {
618 return mPos;
619 }
620
Yang Nibe392ad2015-01-23 17:16:02 -0800621 private static void addToPack(FieldPacker fp, Object obj) {
622 if (obj instanceof Boolean) {
623 fp.addBoolean(((Boolean)obj).booleanValue());
624 return;
625 }
626
627 if (obj instanceof Byte) {
628 fp.addI8(((Byte)obj).byteValue());
629 return;
630 }
631
632 if (obj instanceof Short) {
633 fp.addI16(((Short)obj).shortValue());
634 return;
635 }
636
637 if (obj instanceof Integer) {
638 fp.addI32(((Integer)obj).intValue());
639 return;
640 }
641
642 if (obj instanceof Long) {
643 fp.addI64(((Long)obj).longValue());
644 return;
645 }
646
647 if (obj instanceof Float) {
648 fp.addF32(((Float)obj).floatValue());
649 return;
650 }
651
652 if (obj instanceof Double) {
653 fp.addF64(((Double)obj).doubleValue());
654 return;
655 }
656
657 if (obj instanceof Byte2) {
658 fp.addI8((Byte2)obj);
659 return;
660 }
661
662 if (obj instanceof Byte3) {
663 fp.addI8((Byte3)obj);
664 return;
665 }
666
667 if (obj instanceof Byte4) {
668 fp.addI8((Byte4)obj);
669 return;
670 }
671
672 if (obj instanceof Short2) {
673 fp.addI16((Short2)obj);
674 return;
675 }
676
677 if (obj instanceof Short3) {
678 fp.addI16((Short3)obj);
679 return;
680 }
681
682 if (obj instanceof Short4) {
683 fp.addI16((Short4)obj);
684 return;
685 }
686
687 if (obj instanceof Int2) {
688 fp.addI32((Int2)obj);
689 return;
690 }
691
692 if (obj instanceof Int3) {
693 fp.addI32((Int3)obj);
694 return;
695 }
696
697 if (obj instanceof Int4) {
698 fp.addI32((Int4)obj);
699 return;
700 }
701
702 if (obj instanceof Long2) {
703 fp.addI64((Long2)obj);
704 return;
705 }
706
707 if (obj instanceof Long3) {
708 fp.addI64((Long3)obj);
709 return;
710 }
711
712 if (obj instanceof Long4) {
713 fp.addI64((Long4)obj);
714 return;
715 }
716
717 if (obj instanceof Float2) {
718 fp.addF32((Float2)obj);
719 return;
720 }
721
722 if (obj instanceof Float3) {
723 fp.addF32((Float3)obj);
724 return;
725 }
726
727 if (obj instanceof Float4) {
728 fp.addF32((Float4)obj);
729 return;
730 }
731
732 if (obj instanceof Double2) {
733 fp.addF64((Double2)obj);
734 return;
735 }
736
737 if (obj instanceof Double3) {
738 fp.addF64((Double3)obj);
739 return;
740 }
741
742 if (obj instanceof Double4) {
743 fp.addF64((Double4)obj);
744 return;
745 }
746
747 if (obj instanceof Matrix2f) {
748 fp.addMatrix((Matrix2f)obj);
749 return;
750 }
751
752 if (obj instanceof Matrix3f) {
753 fp.addMatrix((Matrix3f)obj);
754 return;
755 }
756
757 if (obj instanceof Matrix4f) {
758 fp.addMatrix((Matrix4f)obj);
759 return;
760 }
761
762 if (obj instanceof BaseObj) {
763 fp.addObj((BaseObj)obj);
764 return;
765 }
766 }
767
768 private static int getPackedSize(Object obj) {
769 if (obj instanceof Boolean) {
770 return 1;
771 }
772
773 if (obj instanceof Byte) {
774 return 1;
775 }
776
777 if (obj instanceof Short) {
778 return 2;
779 }
780
781 if (obj instanceof Integer) {
782 return 4;
783 }
784
785 if (obj instanceof Long) {
786 return 8;
787 }
788
789 if (obj instanceof Float) {
790 return 4;
791 }
792
793 if (obj instanceof Double) {
794 return 8;
795 }
796
797 if (obj instanceof Byte2) {
798 return 2;
799 }
800
801 if (obj instanceof Byte3) {
802 return 3;
803 }
804
805 if (obj instanceof Byte4) {
806 return 4;
807 }
808
809 if (obj instanceof Short2) {
810 return 4;
811 }
812
813 if (obj instanceof Short3) {
814 return 6;
815 }
816
817 if (obj instanceof Short4) {
818 return 8;
819 }
820
821 if (obj instanceof Int2) {
822 return 8;
823 }
824
825 if (obj instanceof Int3) {
826 return 12;
827 }
828
829 if (obj instanceof Int4) {
830 return 16;
831 }
832
833 if (obj instanceof Long2) {
834 return 16;
835 }
836
837 if (obj instanceof Long3) {
838 return 24;
839 }
840
841 if (obj instanceof Long4) {
842 return 32;
843 }
844
845 if (obj instanceof Float2) {
846 return 8;
847 }
848
849 if (obj instanceof Float3) {
850 return 12;
851 }
852
853 if (obj instanceof Float4) {
854 return 16;
855 }
856
857 if (obj instanceof Double2) {
858 return 16;
859 }
860
861 if (obj instanceof Double3) {
862 return 24;
863 }
864
865 if (obj instanceof Double4) {
866 return 32;
867 }
868
869 if (obj instanceof Matrix2f) {
870 return 16;
871 }
872
873 if (obj instanceof Matrix3f) {
874 return 36;
875 }
876
877 if (obj instanceof Matrix4f) {
878 return 64;
879 }
880
881 if (obj instanceof BaseObj) {
882 if (RenderScript.sPointerSize == 8) {
883 return 32;
884 } else {
885 return 4;
886 }
887 }
888
889 return 0;
890 }
891
892 static FieldPacker createFieldPack(Object[] args) {
893 int len = 0;
894 for (Object arg : args) {
895 len += getPackedSize(arg);
896 }
897 FieldPacker fp = new FieldPacker(len);
898 for (Object arg : args) {
899 addToPack(fp, arg);
900 }
901 return fp;
902 }
903
Jason Sams25430d02010-02-02 15:26:40 -0800904 private final byte mData[];
905 private int mPos;
Stephen Hinese27832a2011-06-02 19:36:41 -0700906 private int mLen;
Tim Murray7c4caad2013-04-10 16:21:40 -0700907 private BitSet mAlignment;
Jason Sams25430d02010-02-02 15:26:40 -0800908
909}
910
911