blob: d16697202f113b539460974663ae61fa81565f22 [file] [log] [blame]
Jason Sams25430d02010-02-02 15:26:40 -08001/*
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
Jason Sams42d6c9e2010-02-02 15:45:58 -080020/**
21 * @hide
22 *
23 **/
Jason Sams25430d02010-02-02 15:26:40 -080024public class FieldPacker {
25 public FieldPacker(int len) {
26 mPos = 0;
27 mData = new byte[len];
28 }
29
30 public void align(int v) {
31 while ((mPos & (v - 1)) != 0) {
32 mData[mPos++] = 0;
33 }
34 }
35
Jason Samsa70f4162010-03-26 15:33:42 -070036 public void reset() {
Jason Sams25430d02010-02-02 15:26:40 -080037 mPos = 0;
38 }
Jason Samsa70f4162010-03-26 15:33:42 -070039 public void reset(int i) {
40 mPos = i;
41 }
Jason Sams25430d02010-02-02 15:26:40 -080042
Jason Sams020bb7b2010-06-17 15:55:00 -070043 public void skip(int i) {
44 mPos += i;
45 }
46
Jason Samsa70f4162010-03-26 15:33:42 -070047 public void addI8(byte v) {
Jason Sams25430d02010-02-02 15:26:40 -080048 mData[mPos++] = v;
49 }
50
Jason Samsa70f4162010-03-26 15:33:42 -070051 public void addI16(short v) {
Jason Sams25430d02010-02-02 15:26:40 -080052 align(2);
53 mData[mPos++] = (byte)(v & 0xff);
54 mData[mPos++] = (byte)(v >> 8);
55 }
56
Jason Samsa70f4162010-03-26 15:33:42 -070057 public void addI32(int v) {
Jason Sams25430d02010-02-02 15:26:40 -080058 align(4);
59 mData[mPos++] = (byte)(v & 0xff);
60 mData[mPos++] = (byte)((v >> 8) & 0xff);
61 mData[mPos++] = (byte)((v >> 16) & 0xff);
62 mData[mPos++] = (byte)((v >> 24) & 0xff);
63 }
64
Jason Samsa70f4162010-03-26 15:33:42 -070065 public void addI64(long v) {
Jason Sams25430d02010-02-02 15:26:40 -080066 align(8);
67 mData[mPos++] = (byte)(v & 0xff);
68 mData[mPos++] = (byte)((v >> 8) & 0xff);
69 mData[mPos++] = (byte)((v >> 16) & 0xff);
70 mData[mPos++] = (byte)((v >> 24) & 0xff);
71 mData[mPos++] = (byte)((v >> 32) & 0xff);
72 mData[mPos++] = (byte)((v >> 40) & 0xff);
73 mData[mPos++] = (byte)((v >> 48) & 0xff);
74 mData[mPos++] = (byte)((v >> 56) & 0xff);
75 }
76
Jason Samsa70f4162010-03-26 15:33:42 -070077 public void addU8(short v) {
Jason Sams25430d02010-02-02 15:26:40 -080078 if ((v < 0) || (v > 0xff)) {
79 throw new IllegalArgumentException("Saving value out of range for type");
80 }
81 mData[mPos++] = (byte)v;
82 }
83
Jason Samsa70f4162010-03-26 15:33:42 -070084 public void addU16(int v) {
Jason Sams25430d02010-02-02 15:26:40 -080085 if ((v < 0) || (v > 0xffff)) {
86 throw new IllegalArgumentException("Saving value out of range for type");
87 }
88 align(2);
89 mData[mPos++] = (byte)(v & 0xff);
90 mData[mPos++] = (byte)(v >> 8);
91 }
92
Jason Samsa70f4162010-03-26 15:33:42 -070093 public void addU32(long v) {
Jason Sams25430d02010-02-02 15:26:40 -080094 if ((v < 0) || (v > 0xffffffff)) {
95 throw new IllegalArgumentException("Saving value out of range for type");
96 }
97 align(4);
98 mData[mPos++] = (byte)(v & 0xff);
99 mData[mPos++] = (byte)((v >> 8) & 0xff);
100 mData[mPos++] = (byte)((v >> 16) & 0xff);
101 mData[mPos++] = (byte)((v >> 24) & 0xff);
102 }
103
Jason Samsa70f4162010-03-26 15:33:42 -0700104 public void addU64(long v) {
Jason Sams25430d02010-02-02 15:26:40 -0800105 if (v < 0) {
106 throw new IllegalArgumentException("Saving value out of range for type");
107 }
108 align(8);
109 mData[mPos++] = (byte)(v & 0xff);
110 mData[mPos++] = (byte)((v >> 8) & 0xff);
111 mData[mPos++] = (byte)((v >> 16) & 0xff);
112 mData[mPos++] = (byte)((v >> 24) & 0xff);
113 mData[mPos++] = (byte)((v >> 32) & 0xff);
114 mData[mPos++] = (byte)((v >> 40) & 0xff);
115 mData[mPos++] = (byte)((v >> 48) & 0xff);
116 mData[mPos++] = (byte)((v >> 56) & 0xff);
117 }
118
Jason Samsa70f4162010-03-26 15:33:42 -0700119 public void addF32(float v) {
Jason Sams25430d02010-02-02 15:26:40 -0800120 addI32(Float.floatToRawIntBits(v));
121 }
122
Jason Samsa70f4162010-03-26 15:33:42 -0700123 public void addF64(float v) {
Jason Sams25430d02010-02-02 15:26:40 -0800124 addI64(Double.doubleToRawLongBits(v));
125 }
126
Jason Samsa70f4162010-03-26 15:33:42 -0700127 public void addObj(BaseObj obj) {
128 if (obj != null) {
129 addI32(obj.getID());
130 } else {
131 addI32(0);
132 }
133 }
134
135 public void addF32(Float2 v) {
136 addF32(v.x);
137 addF32(v.y);
138 }
139 public void addF32(Float3 v) {
140 addF32(v.x);
141 addF32(v.y);
142 addF32(v.z);
143 }
144 public void addF32(Float4 v) {
145 addF32(v.x);
146 addF32(v.y);
147 addF32(v.z);
148 addF32(v.w);
149 }
150
151 public void addI8(Byte2 v) {
152 addI8(v.x);
153 addI8(v.y);
154 }
155 public void addI8(Byte3 v) {
156 addI8(v.x);
157 addI8(v.y);
158 addI8(v.z);
159 }
160 public void addI8(Byte4 v) {
161 addI8(v.x);
162 addI8(v.y);
163 addI8(v.z);
164 addI8(v.w);
165 }
166
167 public void addU8(Short2 v) {
168 addU8(v.x);
169 addU8(v.y);
170 }
171 public void addU8(Short3 v) {
172 addU8(v.x);
173 addU8(v.y);
174 addU8(v.z);
175 }
176 public void addU8(Short4 v) {
177 addU8(v.x);
178 addU8(v.y);
179 addU8(v.z);
180 addU8(v.w);
181 }
182
183 public void addI16(Short2 v) {
184 addI16(v.x);
185 addI16(v.y);
186 }
187 public void addI16(Short3 v) {
188 addI16(v.x);
189 addI16(v.y);
190 addI16(v.z);
191 }
192 public void addI16(Short4 v) {
193 addI16(v.x);
194 addI16(v.y);
195 addI16(v.z);
196 addI16(v.w);
197 }
198
199 public void addU16(Int2 v) {
200 addU16(v.x);
201 addU16(v.y);
202 }
203 public void addU16(Int3 v) {
204 addU16(v.x);
205 addU16(v.y);
206 addU16(v.z);
207 }
208 public void addU16(Int4 v) {
209 addU16(v.x);
210 addU16(v.y);
211 addU16(v.z);
212 addU16(v.w);
213 }
214
215 public void addI32(Int2 v) {
216 addI32(v.x);
217 addI32(v.y);
218 }
219 public void addI32(Int3 v) {
220 addI32(v.x);
221 addI32(v.y);
222 addI32(v.z);
223 }
224 public void addI32(Int4 v) {
225 addI32(v.x);
226 addI32(v.y);
227 addI32(v.z);
228 addI32(v.w);
229 }
230
231 public void addU32(Int2 v) {
232 addU32(v.x);
233 addU32(v.y);
234 }
235 public void addU32(Int3 v) {
236 addU32(v.x);
237 addU32(v.y);
238 addU32(v.z);
239 }
240 public void addU32(Int4 v) {
241 addU32(v.x);
242 addU32(v.y);
243 addU32(v.z);
244 addU32(v.w);
245 }
246
Jason Samsf110d4b2010-06-21 17:42:41 -0700247 public void addBoolean(Boolean v) {
Jason Sams9e2b0c52010-06-21 18:30:02 -0700248 addI8((byte)(v ? 1 : 0));
Jason Samsf110d4b2010-06-21 17:42:41 -0700249 }
250
Jason Samsa70f4162010-03-26 15:33:42 -0700251 public final byte[] getData() {
Jason Sams25430d02010-02-02 15:26:40 -0800252 return mData;
253 }
254
255 private final byte mData[];
256 private int mPos;
257
258}
259
260