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