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
19import android.support.v8.renderscript.RenderScript;
20
21/**
22 * Utility class for packing arguments and structures from Android system objects to
23 * RenderScript objects.
24 *
25 * 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 *
29 **/
30public class FieldPackerThunker {
31    private android.renderscript.FieldPacker mN;
32    private int mPos;
33
34    public FieldPackerThunker(int len) {
35        mN = new android.renderscript.FieldPacker(len);
36        mPos = 0;
37    }
38
39    void align(int v) {
40        mN.align(v);
41        while ((mPos & (v - 1)) != 0) {
42            mPos++;
43        }
44    }
45
46    void reset() {
47        mN.reset();
48        mPos = 0;
49    }
50
51    void reset(int i) {
52        mN.reset(i);
53        mPos = i;
54    }
55
56    public void skip(int i) {
57        mN.skip(i);
58        mPos += i;
59    }
60
61    public void addI8(byte v) {
62        mN.addI8(v);
63        mPos++;
64    }
65
66    public void addI16(short v) {
67        mN.addI16(v);
68        mPos += 2;
69    }
70
71    public void addI32(int v) {
72        mN.addI32(v);
73        mPos += 4;
74    }
75
76    public void addI64(long v) {
77        mN.addI64(v);
78        mPos += 8;
79    }
80
81    public void addU8(short v) {
82        mN.addU8(v);
83        mPos++;
84    }
85
86    public void addU16(int v) {
87        mN.addU16(v);
88        mPos += 2;
89    }
90
91    public void addU32(long v) {
92        mN.addU32(v);
93        mPos += 4;
94    }
95
96    public void addU64(long v) {
97        mN.addU64(v);
98        mPos += 8;
99    }
100
101    public void addF32(float v) {
102        mN.addF32(v);
103        mPos += 4;
104    }
105
106    public void addF64(double v) {
107        mN.addF64(v);
108        mPos += 8;
109    }
110
111    public void addObj(BaseObj obj) {
112        if (obj != null) {
113            mN.addObj(obj.getNObj());
114        } else {
115            mN.addObj(null);
116        }
117        mPos += 4;  // Compat lib only works in 32-bit mode, so objects are 4 bytes.
118    }
119
120    public void addF32(Float2 v) {
121        mN.addF32(new android.renderscript.Float2(v.x, v.y));
122        mPos += 8;
123    }
124    public void addF32(Float3 v) {
125        mN.addF32(new android.renderscript.Float3(v.x, v.y, v.z));
126        mPos += 12;
127    }
128    public void addF32(Float4 v) {
129        mN.addF32(new android.renderscript.Float4(v.x, v.y, v.z, v.w));
130        mPos += 16;
131    }
132
133    public void addF64(Double2 v) {
134        mN.addF64(new android.renderscript.Double2(v.x, v.y));
135        mPos += 16;
136    }
137    public void addF64(Double3 v) {
138        mN.addF64(new android.renderscript.Double3(v.x, v.y, v.z));
139        mPos += 24;
140    }
141    public void addF64(Double4 v) {
142        mN.addF64(new android.renderscript.Double4(v.x, v.y, v.z, v.w));
143        mPos += 32;
144    }
145
146    public void addI8(Byte2 v) {
147        mN.addI8(new android.renderscript.Byte2(v.x, v.y));
148        mPos += 2;
149    }
150    public void addI8(Byte3 v) {
151        mN.addI8(new android.renderscript.Byte3(v.x, v.y, v.z));
152        mPos += 3;
153    }
154    public void addI8(Byte4 v) {
155        mN.addI8(new android.renderscript.Byte4(v.x, v.y, v.z, v.w));
156        mPos += 4;
157    }
158
159    public void addU8(Short2 v) {
160        mN.addU8(new android.renderscript.Short2(v.x, v.y));
161        mPos += 2;
162    }
163    public void addU8(Short3 v) {
164        mN.addU8(new android.renderscript.Short3(v.x, v.y, v.z));
165        mPos += 3;
166    }
167    public void addU8(Short4 v) {
168        mN.addU8(new android.renderscript.Short4(v.x, v.y, v.z, v.w));
169        mPos += 4;
170    }
171
172    public void addI16(Short2 v) {
173        mN.addI16(new android.renderscript.Short2(v.x, v.y));
174        mPos += 4;
175    }
176    public void addI16(Short3 v) {
177        mN.addI16(new android.renderscript.Short3(v.x, v.y, v.z));
178        mPos += 6;
179    }
180    public void addI16(Short4 v) {
181        mN.addI16(new android.renderscript.Short4(v.x, v.y, v.z, v.w));
182        mPos += 8;
183    }
184
185    public void addU16(Int2 v) {
186        mN.addU16(new android.renderscript.Int2(v.x, v.y));
187        mPos += 4;
188    }
189    public void addU16(Int3 v) {
190        mN.addU16(new android.renderscript.Int3(v.x, v.y, v.z));
191        mPos += 6;
192    }
193    public void addU16(Int4 v) {
194        mN.addU16(new android.renderscript.Int4(v.x, v.y, v.z, v.w));
195        mPos += 8;
196    }
197
198    public void addI32(Int2 v) {
199        mN.addI32(new android.renderscript.Int2(v.x, v.y));
200        mPos += 8;
201    }
202    public void addI32(Int3 v) {
203        mN.addI32(new android.renderscript.Int3(v.x, v.y, v.z));
204        mPos += 12;
205    }
206    public void addI32(Int4 v) {
207        mN.addI32(new android.renderscript.Int4(v.x, v.y, v.z, v.w));
208        mPos += 16;
209    }
210
211    public void addU32(Long2 v) {
212        mN.addU32(new android.renderscript.Long2(v.x, v.y));
213        mPos += 8;
214    }
215    public void addU32(Long3 v) {
216        mN.addU32(new android.renderscript.Long3(v.x, v.y, v.z));
217        mPos += 12;
218    }
219    public void addU32(Long4 v) {
220        mN.addU32(new android.renderscript.Long4(v.x, v.y, v.z, v.w));
221        mPos += 16;
222    }
223
224    public void addI64(Long2 v) {
225        mN.addI64(new android.renderscript.Long2(v.x, v.y));
226        mPos += 16;
227    }
228    public void addI64(Long3 v) {
229        mN.addI64(new android.renderscript.Long3(v.x, v.y, v.z));
230        mPos += 24;
231    }
232    public void addI64(Long4 v) {
233        mN.addI64(new android.renderscript.Long4(v.x, v.y, v.z, v.w));
234        mPos += 32;
235    }
236
237    public void addU64(Long2 v) {
238        mN.addU64(new android.renderscript.Long2(v.x, v.y));
239        mPos += 16;
240    }
241    public void addU64(Long3 v) {
242        mN.addU64(new android.renderscript.Long3(v.x, v.y, v.z));
243        mPos += 24;
244    }
245    public void addU64(Long4 v) {
246        mN.addU64(new android.renderscript.Long4(v.x, v.y, v.z, v.w));
247        mPos += 32;
248    }
249
250    public void addMatrix(Matrix4f v) {
251        mN.addMatrix(new android.renderscript.Matrix4f(v.getArray()));
252        mPos += (4 * 4 * 4);
253    }
254
255    public void addMatrix(Matrix3f v) {
256        mN.addMatrix(new android.renderscript.Matrix3f(v.getArray()));
257        mPos += (3 * 3 * 4);
258    }
259
260    public void addMatrix(Matrix2f v) {
261        mN.addMatrix(new android.renderscript.Matrix2f(v.getArray()));
262        mPos += (2 * 2 * 4);
263    }
264
265    public void addBoolean(boolean v) {
266        mN.addBoolean(v);
267        mPos++;
268    }
269
270    public final byte[] getData() {
271        return mN.getData();
272    }
273
274    // We must compute our own mPos, since this API is not available in older target APIs.
275    public int getPos() {
276        return mPos;
277    }
278}
279
280
281