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
19
20/**
21 * Utility class for packing arguments and structures from Android system objects to
22 * Renderscript objects.
23 *
24 **/
25public class FieldPacker {
26    public FieldPacker(int len) {
27        mPos = 0;
28        mLen = len;
29        mData = new byte[len];
30    }
31
32    public void align(int v) {
33        if ((v <= 0) || ((v & (v - 1)) != 0)) {
34            throw new RSIllegalArgumentException("argument must be a non-negative non-zero power of 2: " + v);
35        }
36
37        while ((mPos & (v - 1)) != 0) {
38            mData[mPos++] = 0;
39        }
40    }
41
42    public void reset() {
43        mPos = 0;
44    }
45    public void reset(int i) {
46        if ((i < 0) || (i >= mLen)) {
47            throw new RSIllegalArgumentException("out of range argument: " + i);
48        }
49        mPos = i;
50    }
51
52    public void skip(int i) {
53        int res = mPos + i;
54        if ((res < 0) || (res > mLen)) {
55            throw new RSIllegalArgumentException("out of range argument: " + i);
56        }
57        mPos = res;
58    }
59
60    public void addI8(byte v) {
61        mData[mPos++] = v;
62    }
63
64    public void addI16(short v) {
65        align(2);
66        mData[mPos++] = (byte)(v & 0xff);
67        mData[mPos++] = (byte)(v >> 8);
68    }
69
70    public void addI32(int v) {
71        align(4);
72        mData[mPos++] = (byte)(v & 0xff);
73        mData[mPos++] = (byte)((v >> 8) & 0xff);
74        mData[mPos++] = (byte)((v >> 16) & 0xff);
75        mData[mPos++] = (byte)((v >> 24) & 0xff);
76    }
77
78    public void addI64(long v) {
79        align(8);
80        mData[mPos++] = (byte)(v & 0xff);
81        mData[mPos++] = (byte)((v >> 8) & 0xff);
82        mData[mPos++] = (byte)((v >> 16) & 0xff);
83        mData[mPos++] = (byte)((v >> 24) & 0xff);
84        mData[mPos++] = (byte)((v >> 32) & 0xff);
85        mData[mPos++] = (byte)((v >> 40) & 0xff);
86        mData[mPos++] = (byte)((v >> 48) & 0xff);
87        mData[mPos++] = (byte)((v >> 56) & 0xff);
88    }
89
90    public void addU8(short v) {
91        if ((v < 0) || (v > 0xff)) {
92            android.util.Log.e("rs", "FieldPacker.addU8( " + v + " )");
93            throw new IllegalArgumentException("Saving value out of range for type");
94        }
95        mData[mPos++] = (byte)v;
96    }
97
98    public void addU16(int v) {
99        if ((v < 0) || (v > 0xffff)) {
100            android.util.Log.e("rs", "FieldPacker.addU16( " + v + " )");
101            throw new IllegalArgumentException("Saving value out of range for type");
102        }
103        align(2);
104        mData[mPos++] = (byte)(v & 0xff);
105        mData[mPos++] = (byte)(v >> 8);
106    }
107
108    public void addU32(long v) {
109        if ((v < 0) || (v > 0xffffffffL)) {
110            android.util.Log.e("rs", "FieldPacker.addU32( " + v + " )");
111            throw new IllegalArgumentException("Saving value out of range for type");
112        }
113        align(4);
114        mData[mPos++] = (byte)(v & 0xff);
115        mData[mPos++] = (byte)((v >> 8) & 0xff);
116        mData[mPos++] = (byte)((v >> 16) & 0xff);
117        mData[mPos++] = (byte)((v >> 24) & 0xff);
118    }
119
120    public void addU64(long v) {
121        if (v < 0) {
122            android.util.Log.e("rs", "FieldPacker.addU64( " + v + " )");
123            throw new IllegalArgumentException("Saving value out of range for type");
124        }
125        align(8);
126        mData[mPos++] = (byte)(v & 0xff);
127        mData[mPos++] = (byte)((v >> 8) & 0xff);
128        mData[mPos++] = (byte)((v >> 16) & 0xff);
129        mData[mPos++] = (byte)((v >> 24) & 0xff);
130        mData[mPos++] = (byte)((v >> 32) & 0xff);
131        mData[mPos++] = (byte)((v >> 40) & 0xff);
132        mData[mPos++] = (byte)((v >> 48) & 0xff);
133        mData[mPos++] = (byte)((v >> 56) & 0xff);
134    }
135
136    public void addF32(float v) {
137        addI32(Float.floatToRawIntBits(v));
138    }
139
140    public void addF64(double v) {
141        addI64(Double.doubleToRawLongBits(v));
142    }
143
144    public void addObj(BaseObj obj) {
145        if (obj != null) {
146            addI32(obj.getID(null));
147        } else {
148            addI32(0);
149        }
150    }
151
152    public void addF32(Float2 v) {
153        addF32(v.x);
154        addF32(v.y);
155    }
156    public void addF32(Float3 v) {
157        addF32(v.x);
158        addF32(v.y);
159        addF32(v.z);
160    }
161    public void addF32(Float4 v) {
162        addF32(v.x);
163        addF32(v.y);
164        addF32(v.z);
165        addF32(v.w);
166    }
167
168    public void addF64(Double2 v) {
169        addF64(v.x);
170        addF64(v.y);
171    }
172    public void addF64(Double3 v) {
173        addF64(v.x);
174        addF64(v.y);
175        addF64(v.z);
176    }
177    public void addF64(Double4 v) {
178        addF64(v.x);
179        addF64(v.y);
180        addF64(v.z);
181        addF64(v.w);
182    }
183
184    public void addI8(Byte2 v) {
185        addI8(v.x);
186        addI8(v.y);
187    }
188    public void addI8(Byte3 v) {
189        addI8(v.x);
190        addI8(v.y);
191        addI8(v.z);
192    }
193    public void addI8(Byte4 v) {
194        addI8(v.x);
195        addI8(v.y);
196        addI8(v.z);
197        addI8(v.w);
198    }
199
200    public void addU8(Short2 v) {
201        addU8(v.x);
202        addU8(v.y);
203    }
204    public void addU8(Short3 v) {
205        addU8(v.x);
206        addU8(v.y);
207        addU8(v.z);
208    }
209    public void addU8(Short4 v) {
210        addU8(v.x);
211        addU8(v.y);
212        addU8(v.z);
213        addU8(v.w);
214    }
215
216    public void addI16(Short2 v) {
217        addI16(v.x);
218        addI16(v.y);
219    }
220    public void addI16(Short3 v) {
221        addI16(v.x);
222        addI16(v.y);
223        addI16(v.z);
224    }
225    public void addI16(Short4 v) {
226        addI16(v.x);
227        addI16(v.y);
228        addI16(v.z);
229        addI16(v.w);
230    }
231
232    public void addU16(Int2 v) {
233        addU16(v.x);
234        addU16(v.y);
235    }
236    public void addU16(Int3 v) {
237        addU16(v.x);
238        addU16(v.y);
239        addU16(v.z);
240    }
241    public void addU16(Int4 v) {
242        addU16(v.x);
243        addU16(v.y);
244        addU16(v.z);
245        addU16(v.w);
246    }
247
248    public void addI32(Int2 v) {
249        addI32(v.x);
250        addI32(v.y);
251    }
252    public void addI32(Int3 v) {
253        addI32(v.x);
254        addI32(v.y);
255        addI32(v.z);
256    }
257    public void addI32(Int4 v) {
258        addI32(v.x);
259        addI32(v.y);
260        addI32(v.z);
261        addI32(v.w);
262    }
263
264    public void addU32(Long2 v) {
265        addU32(v.x);
266        addU32(v.y);
267    }
268    public void addU32(Long3 v) {
269        addU32(v.x);
270        addU32(v.y);
271        addU32(v.z);
272    }
273    public void addU32(Long4 v) {
274        addU32(v.x);
275        addU32(v.y);
276        addU32(v.z);
277        addU32(v.w);
278    }
279
280    public void addI64(Long2 v) {
281        addI64(v.x);
282        addI64(v.y);
283    }
284    public void addI64(Long3 v) {
285        addI64(v.x);
286        addI64(v.y);
287        addI64(v.z);
288    }
289    public void addI64(Long4 v) {
290        addI64(v.x);
291        addI64(v.y);
292        addI64(v.z);
293        addI64(v.w);
294    }
295
296    public void addU64(Long2 v) {
297        addU64(v.x);
298        addU64(v.y);
299    }
300    public void addU64(Long3 v) {
301        addU64(v.x);
302        addU64(v.y);
303        addU64(v.z);
304    }
305    public void addU64(Long4 v) {
306        addU64(v.x);
307        addU64(v.y);
308        addU64(v.z);
309        addU64(v.w);
310    }
311
312    public void addMatrix(Matrix4f v) {
313        for (int i=0; i < v.mMat.length; i++) {
314            addF32(v.mMat[i]);
315        }
316    }
317
318    public void addMatrix(Matrix3f v) {
319        for (int i=0; i < v.mMat.length; i++) {
320            addF32(v.mMat[i]);
321        }
322    }
323
324    public void addMatrix(Matrix2f v) {
325        for (int i=0; i < v.mMat.length; i++) {
326            addF32(v.mMat[i]);
327        }
328    }
329
330    public void addBoolean(boolean v) {
331        addI8((byte)(v ? 1 : 0));
332    }
333
334    public final byte[] getData() {
335        return mData;
336    }
337
338    private final byte mData[];
339    private int mPos;
340    private int mLen;
341
342}
343
344
345