• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
17 package android.renderscript;
18 
19 
20 /**
21  * Utility class for packing arguments and structures from Android system objects to
22  * Renderscript objects.
23  *
24  **/
25 public class FieldPacker {
FieldPacker(int len)26     public FieldPacker(int len) {
27         mPos = 0;
28         mLen = len;
29         mData = new byte[len];
30     }
31 
align(int v)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 
reset()42     public void reset() {
43         mPos = 0;
44     }
reset(int i)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 
skip(int i)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 
addI8(byte v)60     public void addI8(byte v) {
61         mData[mPos++] = v;
62     }
63 
addI16(short v)64     public void addI16(short v) {
65         align(2);
66         mData[mPos++] = (byte)(v & 0xff);
67         mData[mPos++] = (byte)(v >> 8);
68     }
69 
addI32(int v)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 
addI64(long v)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 
addU8(short v)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 
addU16(int v)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 
addU32(long v)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 
addU64(long v)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 
addF32(float v)136     public void addF32(float v) {
137         addI32(Float.floatToRawIntBits(v));
138     }
139 
addF64(double v)140     public void addF64(double v) {
141         addI64(Double.doubleToRawLongBits(v));
142     }
143 
addObj(BaseObj obj)144     public void addObj(BaseObj obj) {
145         if (obj != null) {
146             addI32(obj.getID(null));
147         } else {
148             addI32(0);
149         }
150     }
151 
addF32(Float2 v)152     public void addF32(Float2 v) {
153         addF32(v.x);
154         addF32(v.y);
155     }
addF32(Float3 v)156     public void addF32(Float3 v) {
157         addF32(v.x);
158         addF32(v.y);
159         addF32(v.z);
160     }
addF32(Float4 v)161     public void addF32(Float4 v) {
162         addF32(v.x);
163         addF32(v.y);
164         addF32(v.z);
165         addF32(v.w);
166     }
167 
addF64(Double2 v)168     public void addF64(Double2 v) {
169         addF64(v.x);
170         addF64(v.y);
171     }
addF64(Double3 v)172     public void addF64(Double3 v) {
173         addF64(v.x);
174         addF64(v.y);
175         addF64(v.z);
176     }
addF64(Double4 v)177     public void addF64(Double4 v) {
178         addF64(v.x);
179         addF64(v.y);
180         addF64(v.z);
181         addF64(v.w);
182     }
183 
addI8(Byte2 v)184     public void addI8(Byte2 v) {
185         addI8(v.x);
186         addI8(v.y);
187     }
addI8(Byte3 v)188     public void addI8(Byte3 v) {
189         addI8(v.x);
190         addI8(v.y);
191         addI8(v.z);
192     }
addI8(Byte4 v)193     public void addI8(Byte4 v) {
194         addI8(v.x);
195         addI8(v.y);
196         addI8(v.z);
197         addI8(v.w);
198     }
199 
addU8(Short2 v)200     public void addU8(Short2 v) {
201         addU8(v.x);
202         addU8(v.y);
203     }
addU8(Short3 v)204     public void addU8(Short3 v) {
205         addU8(v.x);
206         addU8(v.y);
207         addU8(v.z);
208     }
addU8(Short4 v)209     public void addU8(Short4 v) {
210         addU8(v.x);
211         addU8(v.y);
212         addU8(v.z);
213         addU8(v.w);
214     }
215 
addI16(Short2 v)216     public void addI16(Short2 v) {
217         addI16(v.x);
218         addI16(v.y);
219     }
addI16(Short3 v)220     public void addI16(Short3 v) {
221         addI16(v.x);
222         addI16(v.y);
223         addI16(v.z);
224     }
addI16(Short4 v)225     public void addI16(Short4 v) {
226         addI16(v.x);
227         addI16(v.y);
228         addI16(v.z);
229         addI16(v.w);
230     }
231 
addU16(Int2 v)232     public void addU16(Int2 v) {
233         addU16(v.x);
234         addU16(v.y);
235     }
addU16(Int3 v)236     public void addU16(Int3 v) {
237         addU16(v.x);
238         addU16(v.y);
239         addU16(v.z);
240     }
addU16(Int4 v)241     public void addU16(Int4 v) {
242         addU16(v.x);
243         addU16(v.y);
244         addU16(v.z);
245         addU16(v.w);
246     }
247 
addI32(Int2 v)248     public void addI32(Int2 v) {
249         addI32(v.x);
250         addI32(v.y);
251     }
addI32(Int3 v)252     public void addI32(Int3 v) {
253         addI32(v.x);
254         addI32(v.y);
255         addI32(v.z);
256     }
addI32(Int4 v)257     public void addI32(Int4 v) {
258         addI32(v.x);
259         addI32(v.y);
260         addI32(v.z);
261         addI32(v.w);
262     }
263 
addU32(Long2 v)264     public void addU32(Long2 v) {
265         addU32(v.x);
266         addU32(v.y);
267     }
addU32(Long3 v)268     public void addU32(Long3 v) {
269         addU32(v.x);
270         addU32(v.y);
271         addU32(v.z);
272     }
addU32(Long4 v)273     public void addU32(Long4 v) {
274         addU32(v.x);
275         addU32(v.y);
276         addU32(v.z);
277         addU32(v.w);
278     }
279 
addI64(Long2 v)280     public void addI64(Long2 v) {
281         addI64(v.x);
282         addI64(v.y);
283     }
addI64(Long3 v)284     public void addI64(Long3 v) {
285         addI64(v.x);
286         addI64(v.y);
287         addI64(v.z);
288     }
addI64(Long4 v)289     public void addI64(Long4 v) {
290         addI64(v.x);
291         addI64(v.y);
292         addI64(v.z);
293         addI64(v.w);
294     }
295 
addU64(Long2 v)296     public void addU64(Long2 v) {
297         addU64(v.x);
298         addU64(v.y);
299     }
addU64(Long3 v)300     public void addU64(Long3 v) {
301         addU64(v.x);
302         addU64(v.y);
303         addU64(v.z);
304     }
addU64(Long4 v)305     public void addU64(Long4 v) {
306         addU64(v.x);
307         addU64(v.y);
308         addU64(v.z);
309         addU64(v.w);
310     }
311 
addMatrix(Matrix4f v)312     public void addMatrix(Matrix4f v) {
313         for (int i=0; i < v.mMat.length; i++) {
314             addF32(v.mMat[i]);
315         }
316     }
317 
addMatrix(Matrix3f v)318     public void addMatrix(Matrix3f v) {
319         for (int i=0; i < v.mMat.length; i++) {
320             addF32(v.mMat[i]);
321         }
322     }
323 
addMatrix(Matrix2f v)324     public void addMatrix(Matrix2f v) {
325         for (int i=0; i < v.mMat.length; i++) {
326             addF32(v.mMat[i]);
327         }
328     }
329 
addBoolean(boolean v)330     public void addBoolean(boolean v) {
331         addI8((byte)(v ? 1 : 0));
332     }
333 
getData()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