FieldPacker.java revision a70f416c9cf2fc6cc5e132c1d656ce07441d6b82
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 17package android.renderscript; 18 19 20/** 21 * @hide 22 * 23 **/ 24public 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 36 public void reset() { 37 mPos = 0; 38 } 39 public void reset(int i) { 40 mPos = i; 41 } 42 43 public void addI8(byte v) { 44 mData[mPos++] = v; 45 } 46 47 public void addI16(short v) { 48 align(2); 49 mData[mPos++] = (byte)(v & 0xff); 50 mData[mPos++] = (byte)(v >> 8); 51 } 52 53 public void addI32(int v) { 54 align(4); 55 mData[mPos++] = (byte)(v & 0xff); 56 mData[mPos++] = (byte)((v >> 8) & 0xff); 57 mData[mPos++] = (byte)((v >> 16) & 0xff); 58 mData[mPos++] = (byte)((v >> 24) & 0xff); 59 } 60 61 public void addI64(long v) { 62 align(8); 63 mData[mPos++] = (byte)(v & 0xff); 64 mData[mPos++] = (byte)((v >> 8) & 0xff); 65 mData[mPos++] = (byte)((v >> 16) & 0xff); 66 mData[mPos++] = (byte)((v >> 24) & 0xff); 67 mData[mPos++] = (byte)((v >> 32) & 0xff); 68 mData[mPos++] = (byte)((v >> 40) & 0xff); 69 mData[mPos++] = (byte)((v >> 48) & 0xff); 70 mData[mPos++] = (byte)((v >> 56) & 0xff); 71 } 72 73 public void addU8(short v) { 74 if ((v < 0) || (v > 0xff)) { 75 throw new IllegalArgumentException("Saving value out of range for type"); 76 } 77 mData[mPos++] = (byte)v; 78 } 79 80 public void addU16(int v) { 81 if ((v < 0) || (v > 0xffff)) { 82 throw new IllegalArgumentException("Saving value out of range for type"); 83 } 84 align(2); 85 mData[mPos++] = (byte)(v & 0xff); 86 mData[mPos++] = (byte)(v >> 8); 87 } 88 89 public void addU32(long v) { 90 if ((v < 0) || (v > 0xffffffff)) { 91 throw new IllegalArgumentException("Saving value out of range for type"); 92 } 93 align(4); 94 mData[mPos++] = (byte)(v & 0xff); 95 mData[mPos++] = (byte)((v >> 8) & 0xff); 96 mData[mPos++] = (byte)((v >> 16) & 0xff); 97 mData[mPos++] = (byte)((v >> 24) & 0xff); 98 } 99 100 public void addU64(long v) { 101 if (v < 0) { 102 throw new IllegalArgumentException("Saving value out of range for type"); 103 } 104 align(8); 105 mData[mPos++] = (byte)(v & 0xff); 106 mData[mPos++] = (byte)((v >> 8) & 0xff); 107 mData[mPos++] = (byte)((v >> 16) & 0xff); 108 mData[mPos++] = (byte)((v >> 24) & 0xff); 109 mData[mPos++] = (byte)((v >> 32) & 0xff); 110 mData[mPos++] = (byte)((v >> 40) & 0xff); 111 mData[mPos++] = (byte)((v >> 48) & 0xff); 112 mData[mPos++] = (byte)((v >> 56) & 0xff); 113 } 114 115 public void addF32(float v) { 116 addI32(Float.floatToRawIntBits(v)); 117 } 118 119 public void addF64(float v) { 120 addI64(Double.doubleToRawLongBits(v)); 121 } 122 123 public void addObj(BaseObj obj) { 124 if (obj != null) { 125 addI32(obj.getID()); 126 } else { 127 addI32(0); 128 } 129 } 130 131 public void addF32(Float2 v) { 132 addF32(v.x); 133 addF32(v.y); 134 } 135 public void addF32(Float3 v) { 136 addF32(v.x); 137 addF32(v.y); 138 addF32(v.z); 139 } 140 public void addF32(Float4 v) { 141 addF32(v.x); 142 addF32(v.y); 143 addF32(v.z); 144 addF32(v.w); 145 } 146 147 public void addI8(Byte2 v) { 148 addI8(v.x); 149 addI8(v.y); 150 } 151 public void addI8(Byte3 v) { 152 addI8(v.x); 153 addI8(v.y); 154 addI8(v.z); 155 } 156 public void addI8(Byte4 v) { 157 addI8(v.x); 158 addI8(v.y); 159 addI8(v.z); 160 addI8(v.w); 161 } 162 163 public void addU8(Short2 v) { 164 addU8(v.x); 165 addU8(v.y); 166 } 167 public void addU8(Short3 v) { 168 addU8(v.x); 169 addU8(v.y); 170 addU8(v.z); 171 } 172 public void addU8(Short4 v) { 173 addU8(v.x); 174 addU8(v.y); 175 addU8(v.z); 176 addU8(v.w); 177 } 178 179 public void addI16(Short2 v) { 180 addI16(v.x); 181 addI16(v.y); 182 } 183 public void addI16(Short3 v) { 184 addI16(v.x); 185 addI16(v.y); 186 addI16(v.z); 187 } 188 public void addI16(Short4 v) { 189 addI16(v.x); 190 addI16(v.y); 191 addI16(v.z); 192 addI16(v.w); 193 } 194 195 public void addU16(Int2 v) { 196 addU16(v.x); 197 addU16(v.y); 198 } 199 public void addU16(Int3 v) { 200 addU16(v.x); 201 addU16(v.y); 202 addU16(v.z); 203 } 204 public void addU16(Int4 v) { 205 addU16(v.x); 206 addU16(v.y); 207 addU16(v.z); 208 addU16(v.w); 209 } 210 211 public void addI32(Int2 v) { 212 addI32(v.x); 213 addI32(v.y); 214 } 215 public void addI32(Int3 v) { 216 addI32(v.x); 217 addI32(v.y); 218 addI32(v.z); 219 } 220 public void addI32(Int4 v) { 221 addI32(v.x); 222 addI32(v.y); 223 addI32(v.z); 224 addI32(v.w); 225 } 226 227 public void addU32(Int2 v) { 228 addU32(v.x); 229 addU32(v.y); 230 } 231 public void addU32(Int3 v) { 232 addU32(v.x); 233 addU32(v.y); 234 addU32(v.z); 235 } 236 public void addU32(Int4 v) { 237 addU32(v.x); 238 addU32(v.y); 239 addU32(v.z); 240 addU32(v.w); 241 } 242 243 public final byte[] getData() { 244 return mData; 245 } 246 247 private final byte mData[]; 248 private int mPos; 249 250} 251 252 253