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