Let java put #defines into renderscript
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index 8fc5ad5..9840bbb 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -68,6 +68,8 @@
     native void nContextBindProgramFragmentStore(int pfs);
     native void nContextBindProgramFragment(int pf);
     native void nContextBindProgramVertex(int pf);
+    native void nContextAddDefineI32(String name, int value);
+    native void nContextAddDefineF(String name, float value);
 
     native void nAssignName(int obj, byte[] name);
     native int  nFileOpen(byte[] name);
@@ -139,6 +141,8 @@
     native void nScriptCSetRoot(boolean isRoot);
     native void nScriptCSetScript(byte[] script, int offset, int length);
     native int  nScriptCCreate();
+    native void nScriptCAddDefineI32(String name, int value);
+    native void nScriptCAddDefineF(String name, float value);
 
     native void nSamplerDestroy(int sampler);
     native void nSamplerBegin();
diff --git a/graphics/java/android/renderscript/ScriptC.java b/graphics/java/android/renderscript/ScriptC.java
index 0592f5d..0f231d6 100644
--- a/graphics/java/android/renderscript/ScriptC.java
+++ b/graphics/java/android/renderscript/ScriptC.java
@@ -16,11 +16,13 @@
 
 package android.renderscript;
 
+import android.content.res.Resources;
+import android.util.Log;
+
 import java.io.IOException;
 import java.io.InputStream;
-
-import android.content.res.Resources;
-
+import java.util.Map.Entry;
+import java.util.HashMap;
 
 /**
  * @hide
@@ -30,12 +32,11 @@
         super(id, rs);
     }
 
-
-
-
     public static class Builder extends Script.Builder {
         byte[] mProgram;
         int mProgramLength;
+        HashMap<String,Integer> mIntDefines = new HashMap();
+        HashMap<String,Float> mFloatDefines = new HashMap();
 
         public Builder(RenderScript rs) {
             super(rs);
@@ -63,7 +64,7 @@
             }
         }
 
-        public void  setScript(InputStream is) throws IOException {
+        public void setScript(InputStream is) throws IOException {
             byte[] buf = new byte[1024];
             int currentPos = 0;
             while(true) {
@@ -88,19 +89,33 @@
             b.mRS.nScriptCBegin();
             b.transferCreate();
 
-            b.mRS.nScriptCSetScript(b.mProgram, 0, b.mProgramLength);
+            for (Entry<String,Integer> e: b.mIntDefines.entrySet()) {
+                b.mRS.nScriptCAddDefineI32(e.getKey(), e.getValue().intValue());
+            }
+            for (Entry<String,Float> e: b.mFloatDefines.entrySet()) {
+                b.mRS.nScriptCAddDefineF(e.getKey(), e.getValue().floatValue());
+            }
 
+            b.mRS.nScriptCSetScript(b.mProgram, 0, b.mProgramLength);
 
             int id = b.mRS.nScriptCCreate();
             ScriptC obj = new ScriptC(id, b.mRS);
             b.transferObject(obj);
+
             return obj;
         }
 
+        public void addDefine(String name, int value) {
+            mIntDefines.put(name, value);
+        }
+
+        public void addDefine(String name, float value) {
+            mFloatDefines.put(name, value);
+        }
+
         public ScriptC create() {
             return internalCreate(this);
         }
     }
-
 }
 
diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp
index 06525fc..2c3a6cb 100644
--- a/graphics/jni/android_renderscript_RenderScript.cpp
+++ b/graphics/jni/android_renderscript_RenderScript.cpp
@@ -765,6 +765,26 @@
     return (jint)rsScriptCCreate();
 }
 
+static void
+nScriptCAddDefineI32(JNIEnv *_env, jobject _this, jstring name, jint value)
+{
+    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
+    const char* n = _env->GetStringUTFChars(name, NULL);
+    LOG_API("nScriptCAddDefineI32, con(%p) name(%s) value(%d)", con, n, value);
+    rsScriptCSetDefineI32(n, value);
+    _env->ReleaseStringUTFChars(name, n);
+}
+
+static void
+nScriptCAddDefineF(JNIEnv *_env, jobject _this, jstring name, jfloat value)
+{
+    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
+    const char* n = _env->GetStringUTFChars(name, NULL);
+    LOG_API("nScriptCAddDefineF, con(%p) name(%s) value(%f)", con, n, value);
+    rsScriptCSetDefineF(n, value);
+    _env->ReleaseStringUTFChars(name, n);
+}
+
 // ---------------------------------------------------------------------------
 
 static void
@@ -985,6 +1005,27 @@
     rsContextBindProgramVertex((RsProgramVertex)pf);
 }
 
+static void
+nContextAddDefineI32(JNIEnv *_env, jobject _this, jstring name, jint value)
+{
+    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
+    const char* n = _env->GetStringUTFChars(name, NULL);
+    LOG_API("nScriptCAddDefineI32, con(%p) name(%s) value(%d)", con, n, value);
+    rsContextSetDefineI32(n, value);
+    _env->ReleaseStringUTFChars(name, n);
+}
+
+static void
+nContextAddDefineF(JNIEnv *_env, jobject _this, jstring name, jfloat value)
+{
+    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
+    const char* n = _env->GetStringUTFChars(name, NULL);
+    LOG_API("nScriptCAddDefineF, con(%p) name(%s) value(%f)", con, n, value);
+    rsContextSetDefineF(n, value);
+    _env->ReleaseStringUTFChars(name, n);
+}
+
+
 // ---------------------------------------------------------------------------
 
 static void
@@ -1197,6 +1238,8 @@
 {"nScriptCSetRoot",                "(Z)V",                                 (void*)nScriptCSetRoot },
 {"nScriptCSetScript",              "([BII)V",                              (void*)nScriptCSetScript },
 {"nScriptCCreate",                 "()I",                                  (void*)nScriptCCreate },
+{"nScriptCAddDefineI32",           "(Ljava/lang/String;I)V",               (void*)nScriptCAddDefineI32 },
+{"nScriptCAddDefineF",             "(Ljava/lang/String;F)V",               (void*)nScriptCAddDefineF },
 
 {"nProgramFragmentStoreBegin",     "(II)V",                                (void*)nProgramFragmentStoreBegin },
 {"nProgramFragmentStoreDepthFunc", "(I)V",                                 (void*)nProgramFragmentStoreDepthFunc },
diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec
index e5d30e4..b644833 100644
--- a/libs/rs/rs.spec
+++ b/libs/rs/rs.spec
@@ -16,6 +16,16 @@
 	param RsProgramVertex pgm
 	}
 
+ContextSetDefineF {
+    param const char* name
+    param float value
+    }
+
+ContextSetDefineI32 {
+    param const char* name
+    param int32_t value
+    }
+
 AssignName {
 	param void *obj
 	param const char *name
@@ -318,6 +328,15 @@
 	ret RsScript
 	}
 
+ScriptCSetDefineF {
+    param const char* name
+    param float value
+    }
+
+ScriptCSetDefineI32 {
+    param const char* name
+    param int32_t value
+    }
 
 ProgramFragmentStoreBegin {
 	param RsElement in
diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp
index 46bd892..9de23b3 100644
--- a/libs/rs/rsContext.cpp
+++ b/libs/rs/rsContext.cpp
@@ -331,6 +331,26 @@
     }
 }
 
+void Context::appendVarDefines(String8 *str) const
+{
+    char buf[256];
+    for (size_t ct=0; ct < mInt32Defines.size(); ct++) {
+        str->append("#define ");
+        str->append(mInt32Defines.keyAt(ct));
+        str->append(" ");
+        sprintf(buf, "%i\n", (int)mInt32Defines.valueAt(ct));
+        str->append(buf);
+
+    }
+    for (size_t ct=0; ct < mFloatDefines.size(); ct++) {
+        str->append("#define ");
+        str->append(mFloatDefines.keyAt(ct));
+        str->append(" ");
+        sprintf(buf, "%ff\n", mFloatDefines.valueAt(ct));
+        str->append(buf);
+    }
+}
+
 
 ///////////////////////////////////////////////////////////////////////////////////////////
 //
@@ -381,6 +401,15 @@
     rsc->assignName(ob, name, len);
 }
 
+void rsi_ContextSetDefineF(Context *rsc, const char* name, float value)
+{
+    rsc->addInt32Define(name, value);
+}
+
+void rsi_ContextSetDefineI32(Context *rsc, const char* name, int32_t value)
+{
+    rsc->addFloatDefine(name, value);
+}
 
 }
 }
diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h
index 5d41460..799c443 100644
--- a/libs/rs/rsContext.h
+++ b/libs/rs/rsContext.h
@@ -19,6 +19,8 @@
 
 #include "rsUtils.h"
 
+#include <utils/KeyedVector.h>
+#include <utils/String8.h>
 #include <utils/Vector.h>
 #include <ui/Surface.h>
 
@@ -93,7 +95,7 @@
     void removeName(ObjectBase *obj);
     ObjectBase * lookupName(const char *name) const;
     void appendNameDefines(String8 *str) const;
-
+    void appendVarDefines(String8 *str) const;
 
     ProgramFragment * getDefaultProgramFragment() const {
         return mStateFragment.mDefault.get();
@@ -105,6 +107,14 @@
         return mStateFragmentStore.mDefault.get();
     }
 
+    void addInt32Define(const char* name, int32_t value) {
+        mInt32Defines.add(String8(name), value);
+    }
+
+    void addFloatDefine(const char* name, float value) {
+        mFloatDefines.add(String8(name), value);
+    }
+
 protected:
     Device *mDev;
 
@@ -143,6 +153,8 @@
     Surface *mWndSurface;
 
     Vector<ObjectBase *> mNames;
+    KeyedVector<String8,int> mInt32Defines;
+    KeyedVector<String8,float> mFloatDefines;
 };
 
 
diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp
index efe6ff7..3343db5 100644
--- a/libs/rs/rsScriptC.cpp
+++ b/libs/rs/rsScriptC.cpp
@@ -104,6 +104,8 @@
 
     mAccScript = NULL;
 
+    mInt32Defines.clear();
+    mFloatDefines.clear();
 }
 
 static ACCvoid* symbolLookup(ACCvoid* pContext, const ACCchar* name)
@@ -123,6 +125,8 @@
 
     rsc->appendNameDefines(&tmp);
     appendDecls(&tmp);
+    rsc->appendVarDefines(&tmp);
+    appendVarDefines(&tmp);
     tmp.append("#line 1\n");
 
     const char* scriptSource[] = {tmp.string(), mProgram.mScriptText};
@@ -138,7 +142,6 @@
         ACCsizei len;
         accGetScriptInfoLog(mAccScript, sizeof(buf), &len, buf);
         LOGE(buf);
-
     }
 
     mEnviroment.mFragment.set(rsc->getDefaultProgramFragment());
@@ -215,9 +218,31 @@
     } else {
         // Deal with an error.
     }
-
 }
 
+
+void ScriptCState::appendVarDefines(String8 *str)
+{
+    char buf[256];
+    LOGD("appendVarDefines mInt32Defines.size()=%d mFloatDefines.size()=%d\n",
+            mInt32Defines.size(), mFloatDefines.size());
+    for (size_t ct=0; ct < mInt32Defines.size(); ct++) {
+        str->append("#define ");
+        str->append(mInt32Defines.keyAt(ct));
+        str->append(" ");
+        sprintf(buf, "%i\n", (int)mInt32Defines.valueAt(ct));
+        str->append(buf);
+    }
+    for (size_t ct=0; ct < mFloatDefines.size(); ct++) {
+        str->append("#define ");
+        str->append(mFloatDefines.keyAt(ct));
+        str->append(" ");
+        sprintf(buf, "%ff\n", mFloatDefines.valueAt(ct));
+        str->append(buf);
+    }
+}
+
+
 namespace android {
 namespace renderscript {
 
@@ -270,6 +295,18 @@
     return s;
 }
 
+void rsi_ScriptCSetDefineF(Context *rsc, const char* name, float value)
+{
+    ScriptCState *ss = &rsc->mScriptC;
+    ss->mFloatDefines.add(String8(name), value);
+}
+
+void rsi_ScriptCSetDefineI32(Context *rsc, const char* name, int32_t value)
+{
+    ScriptCState *ss = &rsc->mScriptC;
+    ss->mInt32Defines.add(String8(name), value);
+}
+
 }
 }
 
diff --git a/libs/rs/rsScriptC.h b/libs/rs/rsScriptC.h
index 860b4d1..ad0e3ee 100644
--- a/libs/rs/rsScriptC.h
+++ b/libs/rs/rsScriptC.h
@@ -21,6 +21,8 @@
 
 #include "RenderScriptEnv.h"
 
+#include <utils/KeyedVector.h>
+
 struct ACCscript;
 
 // ---------------------------------------------------------------------------
@@ -70,6 +72,7 @@
 
     void clear();
     void runCompiler(Context *rsc);
+    void appendVarDefines(String8 *str);
 
     struct SymbolTable_t {
         const char * mName;
@@ -80,6 +83,9 @@
     static SymbolTable_t gSyms[];
     static const SymbolTable_t * lookupSymbol(const char *);
     static void appendDecls(String8 *str);
+
+    KeyedVector<String8,int> mInt32Defines;
+    KeyedVector<String8,float> mFloatDefines;
 };