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 import android.content.Context;
     20 import android.content.res.Resources;
     21 import android.util.Log;
     22 
     23 import java.io.File;
     24 import java.io.IOException;
     25 import java.io.InputStream;
     26 import java.util.Map.Entry;
     27 import java.util.HashMap;
     28 
     29 import java.lang.reflect.Field;
     30 import java.lang.reflect.Modifier;
     31 
     32 /**
     33  *
     34  **/
     35 public class ScriptC extends Script {
     36     private static final String TAG = "ScriptC";
     37 
     38     /**
     39      * Only intended for use by the generated derived classes.
     40      *
     41      * @param id
     42      * @param rs
     43      */
     44     protected ScriptC(int id, RenderScript rs) {
     45         super(id, rs);
     46     }
     47 
     48     /**
     49      * Only intended for use by the generated derived classes.
     50      *
     51      *
     52      * @param rs
     53      * @param resources
     54      * @param resourceID
     55      */
     56     protected ScriptC(RenderScript rs, Resources resources, int resourceID) {
     57         super(0, rs);
     58         int id = internalCreate(rs, resources, resourceID);
     59         if (id == 0) {
     60             throw new RSRuntimeException("Loading of ScriptC script failed.");
     61         }
     62         setID(id);
     63     }
     64 
     65 
     66     private static synchronized int internalCreate(RenderScript rs, Resources resources, int resourceID) {
     67         byte[] pgm;
     68         int pgmLength;
     69         InputStream is = resources.openRawResource(resourceID);
     70         try {
     71             try {
     72                 pgm = new byte[1024];
     73                 pgmLength = 0;
     74                 while(true) {
     75                     int bytesLeft = pgm.length - pgmLength;
     76                     if (bytesLeft == 0) {
     77                         byte[] buf2 = new byte[pgm.length * 2];
     78                         System.arraycopy(pgm, 0, buf2, 0, pgm.length);
     79                         pgm = buf2;
     80                         bytesLeft = pgm.length - pgmLength;
     81                     }
     82                     int bytesRead = is.read(pgm, pgmLength, bytesLeft);
     83                     if (bytesRead <= 0) {
     84                         break;
     85                     }
     86                     pgmLength += bytesRead;
     87                 }
     88             } finally {
     89                 is.close();
     90             }
     91         } catch(IOException e) {
     92             throw new Resources.NotFoundException();
     93         }
     94 
     95         String resName = resources.getResourceEntryName(resourceID);
     96 
     97         Log.v(TAG, "Create script for resource = " + resName);
     98         return rs.nScriptCCreate(resName, rs.mCachePath, pgm, pgmLength);
     99     }
    100 }
    101