blob: aaa0fe8d7e95731d3bd691af6a7a5ca69ba882e5 [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 *
Xusong Wang8b4548c2021-01-05 10:09:52 -080029 * @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.
Jason Sams42d6c9e2010-02-02 15:45:58 -080032 **/
Xusong Wang8b4548c2021-01-05 10:09:52 -080033@Deprecated
Jason Sams25430d02010-02-02 15:26:40 -080034public class FieldPacker {
35 public FieldPacker(int len) {
36 mPos = 0;
Stephen Hinese27832a2011-06-02 19:36:41 -070037 mLen = len;
Jason Sams25430d02010-02-02 15:26:40 -080038 mData = new byte[len];
Tim Murray7c4caad2013-04-10 16:21:40 -070039 mAlignment = new BitSet();
Jason Sams25430d02010-02-02 15:26:40 -080040 }
41
Jason Sams5b08a2d2013-02-08 11:22:17 -080042 public FieldPacker(byte[] data) {
Stephen Hinesfcb31612014-06-23 17:35:04 -070043 // Advance mPos to the end of the buffer, since we are copying in the
44 // full data input.
45 mPos = data.length;
Jason Sams5b08a2d2013-02-08 11:22:17 -080046 mLen = data.length;
47 mData = data;
Tim Murray7c4caad2013-04-10 16:21:40 -070048 mAlignment = new BitSet();
Stephen Hinesfcb31612014-06-23 17:35:04 -070049 // 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.
Jason Sams5b08a2d2013-02-08 11:22:17 -080052 }
53
Yang Ni8bcbf472015-04-01 17:29:14 -070054 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
Jason Sams25430d02010-02-02 15:26:40 -080063 public void align(int v) {
Stephen Hinese27832a2011-06-02 19:36:41 -070064 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
Jason Sams25430d02010-02-02 15:26:40 -080068 while ((mPos & (v - 1)) != 0) {
Tim Murray7c4caad2013-04-10 16:21:40 -070069 mAlignment.flip(mPos);
Jason Sams25430d02010-02-02 15:26:40 -080070 mData[mPos++] = 0;
71 }
72 }
73
Tim Murray7c4caad2013-04-10 16:21:40 -070074 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
Jason Samsa70f4162010-03-26 15:33:42 -070092 public void reset() {
Jason Sams25430d02010-02-02 15:26:40 -080093 mPos = 0;
94 }
Jason Samsa70f4162010-03-26 15:33:42 -070095 public void reset(int i) {
Stephen Hinesfa1275a2014-06-17 17:25:04 -070096 if ((i < 0) || (i > mLen)) {
Stephen Hinese27832a2011-06-02 19:36:41 -070097 throw new RSIllegalArgumentException("out of range argument: " + i);
98 }
Jason Samsa70f4162010-03-26 15:33:42 -070099 mPos = i;
100 }
Jason Sams25430d02010-02-02 15:26:40 -0800101
Jason Sams020bb7b2010-06-17 15:55:00 -0700102 public void skip(int i) {
Stephen Hinese27832a2011-06-02 19:36:41 -0700103 int res = mPos + i;
Shih-wei Liao6e667252011-06-05 00:51:54 -0700104 if ((res < 0) || (res > mLen)) {
Stephen Hinese27832a2011-06-02 19:36:41 -0700105 throw new RSIllegalArgumentException("out of range argument: " + i);
106 }
107 mPos = res;
Jason Sams020bb7b2010-06-17 15:55:00 -0700108 }
109
Jason Samsa70f4162010-03-26 15:33:42 -0700110 public void addI8(byte v) {
Jason Sams25430d02010-02-02 15:26:40 -0800111 mData[mPos++] = v;
112 }
113
Tim Murray7c4caad2013-04-10 16:21:40 -0700114 public byte subI8() {
115 subalign(1);
116 return mData[--mPos];
117 }
118
Jason Samsa70f4162010-03-26 15:33:42 -0700119 public void addI16(short v) {
Jason Sams25430d02010-02-02 15:26:40 -0800120 align(2);
121 mData[mPos++] = (byte)(v & 0xff);
122 mData[mPos++] = (byte)(v >> 8);
123 }
124
Tim Murray7c4caad2013-04-10 16:21:40 -0700125 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
Jason Samsa70f4162010-03-26 15:33:42 -0700134 public void addI32(int v) {
Jason Sams25430d02010-02-02 15:26:40 -0800135 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
Tim Murray7c4caad2013-04-10 16:21:40 -0700142 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
Jason Samsa70f4162010-03-26 15:33:42 -0700153 public void addI64(long v) {
Jason Sams25430d02010-02-02 15:26:40 -0800154 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
Tim Murray7c4caad2013-04-10 16:21:40 -0700165 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
Jason Samsa70f4162010-03-26 15:33:42 -0700188 public void addU8(short v) {
Jason Sams25430d02010-02-02 15:26:40 -0800189 if ((v < 0) || (v > 0xff)) {
Jason Samsee734982010-08-12 12:44:02 -0700190 android.util.Log.e("rs", "FieldPacker.addU8( " + v + " )");
Jason Sams25430d02010-02-02 15:26:40 -0800191 throw new IllegalArgumentException("Saving value out of range for type");
192 }
193 mData[mPos++] = (byte)v;
194 }
195
Jason Samsa70f4162010-03-26 15:33:42 -0700196 public void addU16(int v) {
Jason Sams25430d02010-02-02 15:26:40 -0800197 if ((v < 0) || (v > 0xffff)) {
Jason Samsee734982010-08-12 12:44:02 -0700198 android.util.Log.e("rs", "FieldPacker.addU16( " + v + " )");
Jason Sams25430d02010-02-02 15:26:40 -0800199 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
Jason Samsa70f4162010-03-26 15:33:42 -0700206 public void addU32(long v) {
Jason Samsee734982010-08-12 12:44:02 -0700207 if ((v < 0) || (v > 0xffffffffL)) {
208 android.util.Log.e("rs", "FieldPacker.addU32( " + v + " )");
Jason Sams25430d02010-02-02 15:26:40 -0800209 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
Jason Samsa70f4162010-03-26 15:33:42 -0700218 public void addU64(long v) {
Jason Sams25430d02010-02-02 15:26:40 -0800219 if (v < 0) {
Jason Samsee734982010-08-12 12:44:02 -0700220 android.util.Log.e("rs", "FieldPacker.addU64( " + v + " )");
Jason Sams25430d02010-02-02 15:26:40 -0800221 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
Jason Samsa70f4162010-03-26 15:33:42 -0700234 public void addF32(float v) {
Jason Sams25430d02010-02-02 15:26:40 -0800235 addI32(Float.floatToRawIntBits(v));
236 }
237
Tim Murray7c4caad2013-04-10 16:21:40 -0700238 public float subF32() {
239 return Float.intBitsToFloat(subI32());
240 }
241
Stephen Hines02f417052010-09-30 15:19:22 -0700242 public void addF64(double v) {
Jason Sams25430d02010-02-02 15:26:40 -0800243 addI64(Double.doubleToRawLongBits(v));
244 }
245
Tim Murray7c4caad2013-04-10 16:21:40 -0700246 public double subF64() {
247 return Double.longBitsToDouble(subI64());
248 }
249
Jason Samsa70f4162010-03-26 15:33:42 -0700250 public void addObj(BaseObj obj) {
251 if (obj != null) {
Tim Murray56f9e6f2014-05-16 11:47:26 -0700252 if (RenderScript.sPointerSize == 8) {
253 addI64(obj.getID(null));
Tim Murray4154bbd2014-06-12 14:17:53 -0700254 addI64(0);
255 addI64(0);
256 addI64(0);
Yang Nibe392ad2015-01-23 17:16:02 -0800257 } else {
Tim Murray56f9e6f2014-05-16 11:47:26 -0700258 addI32((int)obj.getID(null));
259 }
Jason Samsa70f4162010-03-26 15:33:42 -0700260 } else {
Tim Murray56f9e6f2014-05-16 11:47:26 -0700261 if (RenderScript.sPointerSize == 8) {
262 addI64(0);
Tim Murray4154bbd2014-06-12 14:17:53 -0700263 addI64(0);
264 addI64(0);
265 addI64(0);
Tim Murray56f9e6f2014-05-16 11:47:26 -0700266 } else {
267 addI32(0);
268 }
Jason Samsa70f4162010-03-26 15:33:42 -0700269 }
270 }
271
272 public void addF32(Float2 v) {
273 addF32(v.x);
274 addF32(v.y);
275 }
276 public void addF32(Float3 v) {
277 addF32(v.x);
278 addF32(v.y);
279 addF32(v.z);
280 }
281 public void addF32(Float4 v) {
282 addF32(v.x);
283 addF32(v.y);
284 addF32(v.z);
285 addF32(v.w);
286 }
287
Stephen Hines79ad3f22011-06-20 17:27:09 -0700288 public void addF64(Double2 v) {
289 addF64(v.x);
290 addF64(v.y);
291 }
292 public void addF64(Double3 v) {
293 addF64(v.x);
294 addF64(v.y);
295 addF64(v.z);
296 }
297 public void addF64(Double4 v) {
298 addF64(v.x);
299 addF64(v.y);
300 addF64(v.z);
301 addF64(v.w);
302 }
303
Jason Samsa70f4162010-03-26 15:33:42 -0700304 public void addI8(Byte2 v) {
305 addI8(v.x);
306 addI8(v.y);
307 }
308 public void addI8(Byte3 v) {
309 addI8(v.x);
310 addI8(v.y);
311 addI8(v.z);
312 }
313 public void addI8(Byte4 v) {
314 addI8(v.x);
315 addI8(v.y);
316 addI8(v.z);
317 addI8(v.w);
318 }
319
320 public void addU8(Short2 v) {
321 addU8(v.x);
322 addU8(v.y);
323 }
324 public void addU8(Short3 v) {
325 addU8(v.x);
326 addU8(v.y);
327 addU8(v.z);
328 }
329 public void addU8(Short4 v) {
330 addU8(v.x);
331 addU8(v.y);
332 addU8(v.z);
333 addU8(v.w);
334 }
335
336 public void addI16(Short2 v) {
337 addI16(v.x);
338 addI16(v.y);
339 }
340 public void addI16(Short3 v) {
341 addI16(v.x);
342 addI16(v.y);
343 addI16(v.z);
344 }
345 public void addI16(Short4 v) {
346 addI16(v.x);
347 addI16(v.y);
348 addI16(v.z);
349 addI16(v.w);
350 }
351
352 public void addU16(Int2 v) {
353 addU16(v.x);
354 addU16(v.y);
355 }
356 public void addU16(Int3 v) {
357 addU16(v.x);
358 addU16(v.y);
359 addU16(v.z);
360 }
361 public void addU16(Int4 v) {
362 addU16(v.x);
363 addU16(v.y);
364 addU16(v.z);
365 addU16(v.w);
366 }
367
368 public void addI32(Int2 v) {
369 addI32(v.x);
370 addI32(v.y);
371 }
372 public void addI32(Int3 v) {
373 addI32(v.x);
374 addI32(v.y);
375 addI32(v.z);
376 }
377 public void addI32(Int4 v) {
378 addI32(v.x);
379 addI32(v.y);
380 addI32(v.z);
381 addI32(v.w);
382 }
383
Stephen Hinese9f5c182011-01-20 18:17:25 -0800384 public void addU32(Long2 v) {
Jason Samsa70f4162010-03-26 15:33:42 -0700385 addU32(v.x);
386 addU32(v.y);
387 }
Stephen Hinese9f5c182011-01-20 18:17:25 -0800388 public void addU32(Long3 v) {
Jason Samsa70f4162010-03-26 15:33:42 -0700389 addU32(v.x);
390 addU32(v.y);
391 addU32(v.z);
392 }
Stephen Hinese9f5c182011-01-20 18:17:25 -0800393 public void addU32(Long4 v) {
Jason Samsa70f4162010-03-26 15:33:42 -0700394 addU32(v.x);
395 addU32(v.y);
396 addU32(v.z);
397 addU32(v.w);
398 }
399
Stephen Hines79ad3f22011-06-20 17:27:09 -0700400 public void addI64(Long2 v) {
401 addI64(v.x);
402 addI64(v.y);
403 }
404 public void addI64(Long3 v) {
405 addI64(v.x);
406 addI64(v.y);
407 addI64(v.z);
408 }
409 public void addI64(Long4 v) {
410 addI64(v.x);
411 addI64(v.y);
412 addI64(v.z);
413 addI64(v.w);
414 }
415
416 public void addU64(Long2 v) {
417 addU64(v.x);
418 addU64(v.y);
419 }
420 public void addU64(Long3 v) {
421 addU64(v.x);
422 addU64(v.y);
423 addU64(v.z);
424 }
425 public void addU64(Long4 v) {
426 addU64(v.x);
427 addU64(v.y);
428 addU64(v.z);
429 addU64(v.w);
430 }
431
Tim Murray7c4caad2013-04-10 16:21:40 -0700432
433 public Float2 subFloat2() {
434 Float2 v = new Float2();
435 v.y = subF32();
436 v.x = subF32();
437 return v;
438 }
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 }
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
455 public Double2 subDouble2() {
456 Double2 v = new Double2();
457 v.y = subF64();
458 v.x = subF64();
459 return v;
460 }
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 }
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
477 public Byte2 subByte2() {
478 Byte2 v = new Byte2();
479 v.y = subI8();
480 v.x = subI8();
481 return v;
482 }
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 }
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
499 public Short2 subShort2() {
500 Short2 v = new Short2();
501 v.y = subI16();
502 v.x = subI16();
503 return v;
504 }
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 }
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
521 public Int2 subInt2() {
522 Int2 v = new Int2();
523 v.y = subI32();
524 v.x = subI32();
525 return v;
526 }
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 }
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
543 public Long2 subLong2() {
544 Long2 v = new Long2();
545 v.y = subI64();
546 v.x = subI64();
547 return v;
548 }
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 }
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
Alex Sakhartchouke27cdee2010-12-17 11:41:08 -0800567 public void addMatrix(Matrix4f v) {
568 for (int i=0; i < v.mMat.length; i++) {
569 addF32(v.mMat[i]);
570 }
571 }
572
Tim Murray7c4caad2013-04-10 16:21:40 -0700573 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
Alex Sakhartchouke27cdee2010-12-17 11:41:08 -0800581 public void addMatrix(Matrix3f v) {
582 for (int i=0; i < v.mMat.length; i++) {
583 addF32(v.mMat[i]);
584 }
585 }
586
Tim Murray7c4caad2013-04-10 16:21:40 -0700587 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
Alex Sakhartchouke27cdee2010-12-17 11:41:08 -0800595 public void addMatrix(Matrix2f v) {
596 for (int i=0; i < v.mMat.length; i++) {
597 addF32(v.mMat[i]);
598 }
599 }
600
Tim Murray7c4caad2013-04-10 16:21:40 -0700601 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
Jason Samsfae3f6b2010-06-24 13:54:11 -0700609 public void addBoolean(boolean v) {
Jason Sams9e2b0c52010-06-21 18:30:02 -0700610 addI8((byte)(v ? 1 : 0));
Jason Samsf110d4b2010-06-21 17:42:41 -0700611 }
612
Tim Murray7c4caad2013-04-10 16:21:40 -0700613 public boolean subBoolean() {
614 byte v = subI8();
615 if (v == 1) {
616 return true;
617 }
618 return false;
619 }
620
Jason Samsa70f4162010-03-26 15:33:42 -0700621 public final byte[] getData() {
Jason Sams25430d02010-02-02 15:26:40 -0800622 return mData;
623 }
624
Stephen Hinesfa1275a2014-06-17 17:25:04 -0700625 /**
626 * Get the actual length used for the FieldPacker.
627 *
628 * @hide
629 */
630 public int getPos() {
631 return mPos;
632 }
633
Yang Ni8bcbf472015-04-01 17:29:14 -0700634 private void add(Object obj) {
Yang Nibe392ad2015-01-23 17:16:02 -0800635 if (obj instanceof Boolean) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700636 addBoolean((Boolean)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800637 return;
638 }
639
640 if (obj instanceof Byte) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700641 addI8((Byte)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800642 return;
643 }
644
645 if (obj instanceof Short) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700646 addI16((Short)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800647 return;
648 }
649
650 if (obj instanceof Integer) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700651 addI32((Integer)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800652 return;
653 }
654
655 if (obj instanceof Long) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700656 addI64((Long)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800657 return;
658 }
659
660 if (obj instanceof Float) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700661 addF32((Float)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800662 return;
663 }
664
665 if (obj instanceof Double) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700666 addF64((Double)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800667 return;
668 }
669
670 if (obj instanceof Byte2) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700671 addI8((Byte2)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800672 return;
673 }
674
675 if (obj instanceof Byte3) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700676 addI8((Byte3)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800677 return;
678 }
679
680 if (obj instanceof Byte4) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700681 addI8((Byte4)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800682 return;
683 }
684
685 if (obj instanceof Short2) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700686 addI16((Short2)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800687 return;
688 }
689
690 if (obj instanceof Short3) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700691 addI16((Short3)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800692 return;
693 }
694
695 if (obj instanceof Short4) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700696 addI16((Short4)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800697 return;
698 }
699
700 if (obj instanceof Int2) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700701 addI32((Int2)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800702 return;
703 }
704
705 if (obj instanceof Int3) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700706 addI32((Int3)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800707 return;
708 }
709
710 if (obj instanceof Int4) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700711 addI32((Int4)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800712 return;
713 }
714
715 if (obj instanceof Long2) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700716 addI64((Long2)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800717 return;
718 }
719
720 if (obj instanceof Long3) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700721 addI64((Long3)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800722 return;
723 }
724
725 if (obj instanceof Long4) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700726 addI64((Long4)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800727 return;
728 }
729
730 if (obj instanceof Float2) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700731 addF32((Float2)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800732 return;
733 }
734
735 if (obj instanceof Float3) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700736 addF32((Float3)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800737 return;
738 }
739
740 if (obj instanceof Float4) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700741 addF32((Float4)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800742 return;
743 }
744
745 if (obj instanceof Double2) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700746 addF64((Double2)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800747 return;
748 }
749
750 if (obj instanceof Double3) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700751 addF64((Double3)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800752 return;
753 }
754
755 if (obj instanceof Double4) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700756 addF64((Double4)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800757 return;
758 }
759
760 if (obj instanceof Matrix2f) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700761 addMatrix((Matrix2f)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800762 return;
763 }
764
765 if (obj instanceof Matrix3f) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700766 addMatrix((Matrix3f)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800767 return;
768 }
769
770 if (obj instanceof Matrix4f) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700771 addMatrix((Matrix4f)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800772 return;
773 }
774
775 if (obj instanceof BaseObj) {
Yang Ni8bcbf472015-04-01 17:29:14 -0700776 addObj((BaseObj)obj);
Yang Nibe392ad2015-01-23 17:16:02 -0800777 return;
778 }
779 }
780
Yang Ni8bcbf472015-04-01 17:29:14 -0700781 private boolean resize(int newSize) {
782 if (newSize == mLen) {
783 return false;
Yang Nibe392ad2015-01-23 17:16:02 -0800784 }
785
Yang Ni8bcbf472015-04-01 17:29:14 -0700786 byte[] newData = new byte[newSize];
787 System.arraycopy(mData, 0, newData, 0, mPos);
788 mData = newData;
789 mLen = newSize;
790 return true;
791 }
Yang Nibe392ad2015-01-23 17:16:02 -0800792
Yang Ni8bcbf472015-04-01 17:29:14 -0700793 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;
Yang Nibe392ad2015-01-23 17:16:02 -0800804 }
Yang Ni8bcbf472015-04-01 17:29:14 -0700805 } while (retry);
Yang Nibe392ad2015-01-23 17:16:02 -0800806 }
807
Yang Ni8bcbf472015-04-01 17:29:14 -0700808 private byte mData[];
Jason Sams25430d02010-02-02 15:26:40 -0800809 private int mPos;
Stephen Hinese27832a2011-06-02 19:36:41 -0700810 private int mLen;
Tim Murray7c4caad2013-04-10 16:21:40 -0700811 private BitSet mAlignment;
Jason Sams25430d02010-02-02 15:26:40 -0800812}