Home | History | Annotate | Download | only in renderscript
      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 {
     26     public FieldPacker(int len) {
     27         mPos = 0;
     28         mLen = len;
     29         mData = new byte[len];
     30     }
     31 
     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 
     42     public void reset() {
     43         mPos = 0;
     44     }
     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 
     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 
     60     public void addI8(byte v) {
     61         mData[mPos++] = v;
     62     }
     63 
     64     public void addI16(short v) {
     65         align(2);
     66         mData[mPos++] = (byte)(v & 0xff);
     67         mData[mPos++] = (byte)(v >> 8);
     68     }
     69 
     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 
     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 
     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 
     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 
    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 
    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 
    136     public void addF32(float v) {
    137         addI32(Float.floatToRawIntBits(v));
    138     }
    139 
    140     public void addF64(double v) {
    141         addI64(Double.doubleToRawLongBits(v));
    142     }
    143 
    144     public void addObj(BaseObj obj) {
    145         if (obj != null) {
    146             addI32(obj.getID(null));
    147         } else {
    148             addI32(0);
    149         }
    150     }
    151 
    152     public void addF32(Float2 v) {
    153         addF32(v.x);
    154         addF32(v.y);
    155     }
    156     public void addF32(Float3 v) {
    157         addF32(v.x);
    158         addF32(v.y);
    159         addF32(v.z);
    160     }
    161     public void addF32(Float4 v) {
    162         addF32(v.x);
    163         addF32(v.y);
    164         addF32(v.z);
    165         addF32(v.w);
    166     }
    167 
    168     public void addF64(Double2 v) {
    169         addF64(v.x);
    170         addF64(v.y);
    171     }
    172     public void addF64(Double3 v) {
    173         addF64(v.x);
    174         addF64(v.y);
    175         addF64(v.z);
    176     }
    177     public void addF64(Double4 v) {
    178         addF64(v.x);
    179         addF64(v.y);
    180         addF64(v.z);
    181         addF64(v.w);
    182     }
    183 
    184     public void addI8(Byte2 v) {
    185         addI8(v.x);
    186         addI8(v.y);
    187     }
    188     public void addI8(Byte3 v) {
    189         addI8(v.x);
    190         addI8(v.y);
    191         addI8(v.z);
    192     }
    193     public void addI8(Byte4 v) {
    194         addI8(v.x);
    195         addI8(v.y);
    196         addI8(v.z);
    197         addI8(v.w);
    198     }
    199 
    200     public void addU8(Short2 v) {
    201         addU8(v.x);
    202         addU8(v.y);
    203     }
    204     public void addU8(Short3 v) {
    205         addU8(v.x);
    206         addU8(v.y);
    207         addU8(v.z);
    208     }
    209     public void addU8(Short4 v) {
    210         addU8(v.x);
    211         addU8(v.y);
    212         addU8(v.z);
    213         addU8(v.w);
    214     }
    215 
    216     public void addI16(Short2 v) {
    217         addI16(v.x);
    218         addI16(v.y);
    219     }
    220     public void addI16(Short3 v) {
    221         addI16(v.x);
    222         addI16(v.y);
    223         addI16(v.z);
    224     }
    225     public void addI16(Short4 v) {
    226         addI16(v.x);
    227         addI16(v.y);
    228         addI16(v.z);
    229         addI16(v.w);
    230     }
    231 
    232     public void addU16(Int2 v) {
    233         addU16(v.x);
    234         addU16(v.y);
    235     }
    236     public void addU16(Int3 v) {
    237         addU16(v.x);
    238         addU16(v.y);
    239         addU16(v.z);
    240     }
    241     public void addU16(Int4 v) {
    242         addU16(v.x);
    243         addU16(v.y);
    244         addU16(v.z);
    245         addU16(v.w);
    246     }
    247 
    248     public void addI32(Int2 v) {
    249         addI32(v.x);
    250         addI32(v.y);
    251     }
    252     public void addI32(Int3 v) {
    253         addI32(v.x);
    254         addI32(v.y);
    255         addI32(v.z);
    256     }
    257     public void addI32(Int4 v) {
    258         addI32(v.x);
    259         addI32(v.y);
    260         addI32(v.z);
    261         addI32(v.w);
    262     }
    263 
    264     public void addU32(Long2 v) {
    265         addU32(v.x);
    266         addU32(v.y);
    267     }
    268     public void addU32(Long3 v) {
    269         addU32(v.x);
    270         addU32(v.y);
    271         addU32(v.z);
    272     }
    273     public void addU32(Long4 v) {
    274         addU32(v.x);
    275         addU32(v.y);
    276         addU32(v.z);
    277         addU32(v.w);
    278     }
    279 
    280     public void addI64(Long2 v) {
    281         addI64(v.x);
    282         addI64(v.y);
    283     }
    284     public void addI64(Long3 v) {
    285         addI64(v.x);
    286         addI64(v.y);
    287         addI64(v.z);
    288     }
    289     public void addI64(Long4 v) {
    290         addI64(v.x);
    291         addI64(v.y);
    292         addI64(v.z);
    293         addI64(v.w);
    294     }
    295 
    296     public void addU64(Long2 v) {
    297         addU64(v.x);
    298         addU64(v.y);
    299     }
    300     public void addU64(Long3 v) {
    301         addU64(v.x);
    302         addU64(v.y);
    303         addU64(v.z);
    304     }
    305     public void addU64(Long4 v) {
    306         addU64(v.x);
    307         addU64(v.y);
    308         addU64(v.z);
    309         addU64(v.w);
    310     }
    311 
    312     public void addMatrix(Matrix4f v) {
    313         for (int i=0; i < v.mMat.length; i++) {
    314             addF32(v.mMat[i]);
    315         }
    316     }
    317 
    318     public void addMatrix(Matrix3f v) {
    319         for (int i=0; i < v.mMat.length; i++) {
    320             addF32(v.mMat[i]);
    321         }
    322     }
    323 
    324     public void addMatrix(Matrix2f v) {
    325         for (int i=0; i < v.mMat.length; i++) {
    326             addF32(v.mMat[i]);
    327         }
    328     }
    329 
    330     public void addBoolean(boolean v) {
    331         addI8((byte)(v ? 1 : 0));
    332     }
    333 
    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