FieldPacker.java revision e27832acc083fa889e86b4c629b6aedd8855ceca
1/*
2 * Copyright (C) 2008 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.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());
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 addI8(Byte2 v) {
169        addI8(v.x);
170        addI8(v.y);
171    }
172    public void addI8(Byte3 v) {
173        addI8(v.x);
174        addI8(v.y);
175        addI8(v.z);
176    }
177    public void addI8(Byte4 v) {
178        addI8(v.x);
179        addI8(v.y);
180        addI8(v.z);
181        addI8(v.w);
182    }
183
184    public void addU8(Short2 v) {
185        addU8(v.x);
186        addU8(v.y);
187    }
188    public void addU8(Short3 v) {
189        addU8(v.x);
190        addU8(v.y);
191        addU8(v.z);
192    }
193    public void addU8(Short4 v) {
194        addU8(v.x);
195        addU8(v.y);
196        addU8(v.z);
197        addU8(v.w);
198    }
199
200    public void addI16(Short2 v) {
201        addI16(v.x);
202        addI16(v.y);
203    }
204    public void addI16(Short3 v) {
205        addI16(v.x);
206        addI16(v.y);
207        addI16(v.z);
208    }
209    public void addI16(Short4 v) {
210        addI16(v.x);
211        addI16(v.y);
212        addI16(v.z);
213        addI16(v.w);
214    }
215
216    public void addU16(Int2 v) {
217        addU16(v.x);
218        addU16(v.y);
219    }
220    public void addU16(Int3 v) {
221        addU16(v.x);
222        addU16(v.y);
223        addU16(v.z);
224    }
225    public void addU16(Int4 v) {
226        addU16(v.x);
227        addU16(v.y);
228        addU16(v.z);
229        addU16(v.w);
230    }
231
232    public void addI32(Int2 v) {
233        addI32(v.x);
234        addI32(v.y);
235    }
236    public void addI32(Int3 v) {
237        addI32(v.x);
238        addI32(v.y);
239        addI32(v.z);
240    }
241    public void addI32(Int4 v) {
242        addI32(v.x);
243        addI32(v.y);
244        addI32(v.z);
245        addI32(v.w);
246    }
247
248    public void addU32(Long2 v) {
249        addU32(v.x);
250        addU32(v.y);
251    }
252    public void addU32(Long3 v) {
253        addU32(v.x);
254        addU32(v.y);
255        addU32(v.z);
256    }
257    public void addU32(Long4 v) {
258        addU32(v.x);
259        addU32(v.y);
260        addU32(v.z);
261        addU32(v.w);
262    }
263
264    public void addMatrix(Matrix4f v) {
265        for (int i=0; i < v.mMat.length; i++) {
266            addF32(v.mMat[i]);
267        }
268    }
269
270    public void addMatrix(Matrix3f v) {
271        for (int i=0; i < v.mMat.length; i++) {
272            addF32(v.mMat[i]);
273        }
274    }
275
276    public void addMatrix(Matrix2f v) {
277        for (int i=0; i < v.mMat.length; i++) {
278            addF32(v.mMat[i]);
279        }
280    }
281
282    public void addBoolean(boolean v) {
283        addI8((byte)(v ? 1 : 0));
284    }
285
286    public final byte[] getData() {
287        return mData;
288    }
289
290    private final byte mData[];
291    private int mPos;
292    private int mLen;
293
294}
295
296
297