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