Split ProgramFragment and ProgramStore from RenderScript.java.  Update Element and Type to new cached builder for easier app developement.
diff --git a/graphics/java/android/renderscript/Element.java b/graphics/java/android/renderscript/Element.java
index 8e0a7a1..409d267 100644
--- a/graphics/java/android/renderscript/Element.java
+++ b/graphics/java/android/renderscript/Element.java
@@ -146,58 +146,75 @@
 
     public static class Builder {
         RenderScript mRS;
-        boolean mActive = true;
+        Entry[] mEntries;
+        int mEntryCount;
 
-        Builder(RenderScript rs) {
+        private class Entry {
+            Element mElement;
+            Element.DataType mType;
+            Element.DataKind mKind;
+            boolean mIsNormalized;
+            int mBits;
+        }
+
+        public Builder(RenderScript rs) {
             mRS = rs;
+            mEntryCount = 0;
+            mEntries = new Entry[8];
         }
 
-        void begin() throws IllegalStateException {
-            if (mActive) {
-                throw new IllegalStateException("Element builder already active.");
+        void addEntry(Entry e) {
+            if(mEntries.length >= mEntryCount) {
+                Entry[] en = new Entry[mEntryCount + 8];
+                for(int ct=0; ct < mEntries.length; ct++) {
+                    en[ct] = mEntries[ct];
+                }
+                mEntries = en;
             }
-            mRS.nElementBegin();
-            mActive = true;
+            mEntries[mEntryCount] = e;
+            mEntryCount++;
         }
 
-        public Builder add(Element e) throws IllegalArgumentException, IllegalStateException {
-            if(!mActive) {
-                throw new IllegalStateException("Element builder not active.");
-            }
+        public Builder add(Element e) throws IllegalArgumentException {
             if(!e.mIsPredefined) {
                 throw new IllegalArgumentException("add requires a predefined Element.");
             }
-            mRS.nElementAddPredefined(e.mID);
+            Entry en = new Entry();
+            en.mElement = e;
+            addEntry(en);
             return this;
         }
 
-        public Builder add(Element.DataType dt, Element.DataKind dk, boolean isNormalized, int bits)
-            throws IllegalStateException {
-            if(!mActive) {
-                throw new IllegalStateException("Element builder not active.");
-            }
-            int norm = 0;
-            if (isNormalized) {
-                norm = 1;
-            }
-            mRS.nElementAdd(dt.mID, dk.mID, norm, bits);
+        public Builder add(Element.DataType dt, Element.DataKind dk, boolean isNormalized, int bits) {
+            Entry en = new Entry();
+            en.mType = dt;
+            en.mKind = dk;
+            en.mIsNormalized = isNormalized;
+            en.mBits = bits;
+            addEntry(en);
             return this;
         }
 
-        public void abort() throws IllegalStateException {
-            if(!mActive) {
-                throw new IllegalStateException("Element builder not active.");
+        static synchronized Element internalCreate(RenderScript rs, Builder b) {
+            rs.nElementBegin();
+            for (int ct=0; ct < b.mEntryCount; ct++) {
+                Entry en = b.mEntries[ct];
+                if(en.mElement !=  null) {
+                    rs.nElementAddPredefined(en.mElement.mPredefinedID);
+                } else {
+                    int norm = 0;
+                    if (en.mIsNormalized) {
+                        norm = 1;
+                    }
+                    rs.nElementAdd(en.mType.mID, en.mKind.mID, norm, en.mBits);
+                }
             }
-            mActive = false;
+            int id = rs.nElementCreate();
+            return new Element(id, rs);
         }
 
-        public Element create() throws IllegalStateException {
-            if(!mActive) {
-                throw new IllegalStateException("Element builder not active.");
-            }
-            int id = mRS.nElementCreate();
-            mActive = false;
-            return new Element(id, mRS);
+        public Element create() {
+            return internalCreate(mRS, this);
         }
     }
 
diff --git a/graphics/java/android/renderscript/ProgramFragment.java b/graphics/java/android/renderscript/ProgramFragment.java
new file mode 100644
index 0000000..d98fe03
--- /dev/null
+++ b/graphics/java/android/renderscript/ProgramFragment.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.renderscript;
+
+
+import android.util.Config;
+import android.util.Log;
+
+
+/**
+ * @hide
+ *
+ **/
+public class ProgramFragment extends BaseObj {
+    public enum EnvMode {
+        REPLACE (0),
+        MODULATE (1),
+        DECAL (2);
+
+        int mID;
+        EnvMode(int id) {
+            mID = id;
+        }
+    }
+
+
+    ProgramFragment(int id, RenderScript rs) {
+        super(rs);
+        mID = id;
+    }
+
+    public void destroy() {
+        mRS.nProgramFragmentStoreDestroy(mID);
+        mID = 0;
+    }
+
+    public void bindTexture(Allocation va, int slot) {
+        mRS.nProgramFragmentBindTexture(mID, slot, va.mID);
+    }
+
+    public void bindSampler(RenderScript.Sampler vs, int slot) {
+        mRS.nProgramFragmentBindSampler(mID, slot, vs.mID);
+    }
+
+
+    public static class Builder {
+        public static final int MAX_SLOT = 2;
+        RenderScript mRS;
+        Element mIn;
+        Element mOut;
+
+        private class Slot {
+            Type mType;
+            EnvMode mEnv;
+            boolean mTexEnable;
+
+            Slot() {
+                mTexEnable = false;
+            }
+        }
+        Slot[] mSlots;
+
+        public Builder(RenderScript rs, Element in, Element out) {
+            mRS = rs;
+            mIn = in;
+            mOut = out;
+            mSlots = new Slot[MAX_SLOT];
+            for(int ct=0; ct < MAX_SLOT; ct++) {
+                mSlots[ct] = new Slot();
+            }
+        }
+
+        public void setType(int slot, Type t)
+            throws IllegalArgumentException {
+            if((slot < 0) || (slot >= MAX_SLOT)) {
+                throw new IllegalArgumentException("Slot ID out of range.");
+            }
+
+            mSlots[slot].mType = t;
+        }
+
+        public void setTexEnable(boolean enable, int slot)
+            throws IllegalArgumentException {
+            if((slot < 0) || (slot >= MAX_SLOT)) {
+                throw new IllegalArgumentException("Slot ID out of range.");
+            }
+
+            mSlots[slot].mTexEnable = enable;
+        }
+
+        public void setTexEnvMode(EnvMode env, int slot)
+            throws IllegalArgumentException {
+            if((slot < 0) || (slot >= MAX_SLOT)) {
+                throw new IllegalArgumentException("Slot ID out of range.");
+            }
+
+            mSlots[slot].mEnv = env;
+        }
+
+
+        static synchronized ProgramFragment internalCreate(RenderScript rs, Builder b) {
+            int inID = 0;
+            int outID = 0;
+            if (b.mIn != null) {
+                inID = b.mIn.mID;
+            }
+            if (b.mOut != null) {
+                outID = b.mOut.mID;
+            }
+            rs.nProgramFragmentBegin(inID, outID);
+            for(int ct=0; ct < MAX_SLOT; ct++) {
+                if(b.mSlots[ct].mTexEnable) {
+                    Slot s = b.mSlots[ct];
+                    if(s.mType != null) {
+                        rs.nProgramFragmentSetType(ct, s.mType.mID);
+                    }
+                    rs.nProgramFragmentSetTexEnable(ct, true);
+                    if(s.mEnv != null) {
+                        rs.nProgramFragmentSetEnvMode(ct, s.mEnv.mID);
+                    }
+                }
+            }
+
+
+            int id = rs.nProgramFragmentCreate();
+            return new ProgramFragment(id, rs);
+        }
+
+        public ProgramFragment create() {
+            return internalCreate(mRS, this);
+        }
+    }
+}
+
+
+
diff --git a/graphics/java/android/renderscript/ProgramStore.java b/graphics/java/android/renderscript/ProgramStore.java
new file mode 100644
index 0000000..9039621
--- /dev/null
+++ b/graphics/java/android/renderscript/ProgramStore.java
@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.renderscript;
+
+
+import android.util.Config;
+import android.util.Log;
+
+
+/**
+ * @hide
+ *
+ **/
+public class ProgramStore extends BaseObj {
+        public enum DepthFunc {
+        ALWAYS (0),
+        LESS (1),
+        LEQUAL (2),
+        GREATER (3),
+        GEQUAL (4),
+        EQUAL (5),
+        NOTEQUAL (6);
+
+        int mID;
+        DepthFunc(int id) {
+            mID = id;
+        }
+    }
+
+    public enum BlendSrcFunc {
+        ZERO (0),
+        ONE (1),
+        DST_COLOR (2),
+        ONE_MINUS_DST_COLOR (3),
+        SRC_ALPHA (4),
+        ONE_MINUS_SRC_ALPHA (5),
+        DST_ALPHA (6),
+        ONE_MINUS_DST_ALPA (7),
+        SRC_ALPHA_SATURATE (8);
+
+        int mID;
+        BlendSrcFunc(int id) {
+            mID = id;
+        }
+    }
+
+    public enum BlendDstFunc {
+        ZERO (0),
+        ONE (1),
+        SRC_COLOR (2),
+        ONE_MINUS_SRC_COLOR (3),
+        SRC_ALPHA (4),
+        ONE_MINUS_SRC_ALPHA (5),
+        DST_ALPHA (6),
+        ONE_MINUS_DST_ALPA (7);
+
+        int mID;
+        BlendDstFunc(int id) {
+            mID = id;
+        }
+    }
+
+
+    ProgramStore(int id, RenderScript rs) {
+        super(rs);
+        mID = id;
+    }
+
+    public void destroy() {
+        mRS.nProgramFragmentStoreDestroy(mID);
+        mID = 0;
+    }
+
+
+
+    public static class Builder {
+        RenderScript mRS;
+        Element mIn;
+        Element mOut;
+        DepthFunc mDepthFunc;
+        boolean mDepthMask;
+        boolean mColorMaskR;
+        boolean mColorMaskG;
+        boolean mColorMaskB;
+        boolean mColorMaskA;
+        BlendSrcFunc mBlendSrc;
+        BlendDstFunc mBlendDst;
+        boolean mDither;
+
+
+
+        public Builder(RenderScript rs, Element in, Element out) {
+            mRS = rs;
+            mIn = in;
+            mOut = out;
+            mDepthFunc = DepthFunc.ALWAYS;
+            mDepthMask = false;
+            mColorMaskR = true;
+            mColorMaskG = true;
+            mColorMaskB = true;
+            mColorMaskA = true;
+            mBlendSrc = BlendSrcFunc.ONE;
+            mBlendDst = BlendDstFunc.ZERO;
+
+
+        }
+
+        public void setDepthFunc(DepthFunc func) {
+            mDepthFunc = func;
+        }
+
+        public void setDepthMask(boolean enable) {
+            mDepthMask = enable;
+        }
+
+        public void setColorMask(boolean r, boolean g, boolean b, boolean a) {
+            mColorMaskR = r;
+            mColorMaskG = g;
+            mColorMaskB = b;
+            mColorMaskA = a;
+        }
+
+        public void setBlendFunc(BlendSrcFunc src, BlendDstFunc dst) {
+            mBlendSrc = src;
+            mBlendDst = dst;
+        }
+
+        public void setDitherEnable(boolean enable) {
+            mDither = enable;
+        }
+
+        static synchronized ProgramStore internalCreate(RenderScript rs, Builder b) {
+            int inID = 0;
+            int outID = 0;
+            if (b.mIn != null) {
+                inID = b.mIn.mID;
+            }
+            if (b.mOut != null) {
+                outID = b.mOut.mID;
+            }
+            rs.nProgramFragmentStoreBegin(inID, outID);
+            rs.nProgramFragmentStoreDepthFunc(b.mDepthFunc.mID);
+            rs.nProgramFragmentStoreDepthMask(b.mDepthMask);
+            rs.nProgramFragmentStoreColorMask(b.mColorMaskR,
+                                              b.mColorMaskG,
+                                              b.mColorMaskB,
+                                              b.mColorMaskA);
+            rs.nProgramFragmentStoreBlendFunc(b.mBlendSrc.mID, b.mBlendDst.mID);
+            rs.nProgramFragmentStoreDither(b.mDither);
+
+            int id = rs.nProgramFragmentStoreCreate();
+            return new ProgramStore(id, rs);
+        }
+
+        public ProgramStore create() {
+            return internalCreate(mRS, this);
+        }
+    }
+
+}
+
+
+
+
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index 365d053..50a4494 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -128,12 +128,13 @@
     native int  nAdapter2DCreate();
 
     native void nScriptDestroy(int script);
-    native void nScriptBindAllocation(int vtm, int alloc, int slot);
+    native void nScriptBindAllocation(int script, int alloc, int slot);
+    native void nScriptSetClearColor(int script, float r, float g, float b, float a);
+    native void nScriptSetClearDepth(int script, float depth);
+    native void nScriptSetClearStencil(int script, int stencil);
+    native void nScriptSetTimeZone(int script, byte[] timeZone);
+
     native void nScriptCBegin();
-    native void nScriptCSetClearColor(float r, float g, float b, float a);
-    native void nScriptCSetClearDepth(float depth);
-    native void nScriptCSetClearStencil(int stencil);
-    native void nScriptCSetTimeZone(byte[] timeZone);
     native void nScriptCAddType(int type);
     native void nScriptCSetRoot(boolean isRoot);
     native void nScriptCSetScript(byte[] script, int offset, int length);
@@ -203,77 +204,6 @@
     //////////////////////////////////////////////////////////////////////////////////
     // Element
 
-    Element.Builder mElementBuilder = new Element.Builder(this);
-    public Element.Builder elementBuilderCreate() throws IllegalStateException {
-        mElementBuilder.begin();
-        return mElementBuilder;
-    }
-
-    Type.Builder mTypeBuilder = new Type.Builder(this);
-    public Type.Builder typeBuilderCreate(Element e) throws IllegalStateException {
-        mTypeBuilder.begin(e);
-        return mTypeBuilder;
-    }
-
-
-    public enum DepthFunc {
-        ALWAYS (0),
-        LESS (1),
-        LEQUAL (2),
-        GREATER (3),
-        GEQUAL (4),
-        EQUAL (5),
-        NOTEQUAL (6);
-
-        int mID;
-        DepthFunc(int id) {
-            mID = id;
-        }
-    }
-
-    public enum BlendSrcFunc {
-        ZERO (0),
-        ONE (1),
-        DST_COLOR (2),
-        ONE_MINUS_DST_COLOR (3),
-        SRC_ALPHA (4),
-        ONE_MINUS_SRC_ALPHA (5),
-        DST_ALPHA (6),
-        ONE_MINUS_DST_ALPA (7),
-        SRC_ALPHA_SATURATE (8);
-
-        int mID;
-        BlendSrcFunc(int id) {
-            mID = id;
-        }
-    }
-
-    public enum BlendDstFunc {
-        ZERO (0),
-        ONE (1),
-        SRC_COLOR (2),
-        ONE_MINUS_SRC_COLOR (3),
-        SRC_ALPHA (4),
-        ONE_MINUS_SRC_ALPHA (5),
-        DST_ALPHA (6),
-        ONE_MINUS_DST_ALPA (7);
-
-        int mID;
-        BlendDstFunc(int id) {
-            mID = id;
-        }
-    }
-
-    public enum EnvMode {
-        REPLACE (0),
-        MODULATE (1),
-        DECAL (2);
-
-        int mID;
-        EnvMode(int id) {
-            mID = id;
-        }
-    }
 
     public enum SamplerParam {
         FILTER_MIN (0),
@@ -402,111 +332,9 @@
     //////////////////////////////////////////////////////////////////////////////////
     // ProgramFragmentStore
 
-    public class ProgramFragmentStore extends BaseObj {
-        ProgramFragmentStore(int id) {
-            super(RenderScript.this);
-            mID = id;
-        }
-
-        public void destroy() {
-            nProgramFragmentStoreDestroy(mID);
-            mID = 0;
-        }
-    }
-
-    public void programFragmentStoreBegin(Element in, Element out) {
-        int inID = 0;
-        int outID = 0;
-        if (in != null) {
-            inID = in.mID;
-        }
-        if (out != null) {
-            outID = out.mID;
-        }
-        nProgramFragmentStoreBegin(inID, outID);
-    }
-
-    public void programFragmentStoreDepthFunc(DepthFunc func) {
-        nProgramFragmentStoreDepthFunc(func.mID);
-    }
-
-    public void programFragmentStoreDepthMask(boolean enable) {
-        nProgramFragmentStoreDepthMask(enable);
-    }
-
-    public void programFragmentStoreColorMask(boolean r, boolean g, boolean b, boolean a) {
-        nProgramFragmentStoreColorMask(r,g,b,a);
-    }
-
-    public void programFragmentStoreBlendFunc(BlendSrcFunc src, BlendDstFunc dst) {
-        nProgramFragmentStoreBlendFunc(src.mID, dst.mID);
-    }
-
-    public void programFragmentStoreDitherEnable(boolean enable) {
-        nProgramFragmentStoreDither(enable);
-    }
-
-    public ProgramFragmentStore programFragmentStoreCreate() {
-        int id = nProgramFragmentStoreCreate();
-        return new ProgramFragmentStore(id);
-    }
-
     //////////////////////////////////////////////////////////////////////////////////
     // ProgramFragment
 
-    public class ProgramFragment extends BaseObj {
-        ProgramFragment(int id) {
-            super(RenderScript.this);
-            mID = id;
-        }
-
-        public void destroy() {
-            nProgramFragmentDestroy(mID);
-            mID = 0;
-        }
-
-        public void bindTexture(Allocation va, int slot) {
-            nProgramFragmentBindTexture(mID, slot, va.mID);
-        }
-
-        public void bindSampler(Sampler vs, int slot) {
-            nProgramFragmentBindSampler(mID, slot, vs.mID);
-        }
-    }
-
-    public void programFragmentBegin(Element in, Element out) {
-        int inID = 0;
-        int outID = 0;
-        if (in != null) {
-            inID = in.mID;
-        }
-        if (out != null) {
-            outID = out.mID;
-        }
-        nProgramFragmentBegin(inID, outID);
-    }
-
-    public void programFragmentSetType(int slot, Type t) {
-        nProgramFragmentSetType(slot, t.mID);
-    }
-
-    public void programFragmentSetType(int slot, EnvMode t) {
-        nProgramFragmentSetEnvMode(slot, t.mID);
-    }
-
-    public void programFragmentSetTexEnable(int slot, boolean enable) {
-        nProgramFragmentSetTexEnable(slot, enable);
-    }
-
-    public void programFragmentSetTexEnvMode(int slot, EnvMode env) {
-        nProgramFragmentSetEnvMode(slot, env.mID);
-    }
-
-    public ProgramFragment programFragmentCreate() {
-        int id = nProgramFragmentCreate();
-        return new ProgramFragment(id);
-    }
-
     //////////////////////////////////////////////////////////////////////////////////
     // Sampler
 
@@ -617,7 +445,7 @@
         //nContextBindSampler(s.mID);
     //}
 
-    public void contextBindProgramFragmentStore(ProgramFragmentStore pfs) {
+    public void contextBindProgramFragmentStore(ProgramStore pfs) {
         nContextBindProgramFragmentStore(pfs.mID);
     }
 
diff --git a/graphics/java/android/renderscript/Script.java b/graphics/java/android/renderscript/Script.java
index e7bb7a5..9696cea 100644
--- a/graphics/java/android/renderscript/Script.java
+++ b/graphics/java/android/renderscript/Script.java
@@ -37,22 +37,28 @@
     }
 
     public void setClearColor(float r, float g, float b, float a) {
-        //mRS.nScriptCSetClearColor(r, g, b, a);
+        mRS.nScriptSetClearColor(mID, r, g, b, a);
     }
 
     public void setClearDepth(float d) {
-        //mRS.nScriptCSetClearDepth(d);
+        mRS.nScriptSetClearDepth(mID, d);
     }
 
     public void setClearStencil(int stencil) {
-        //mRS.nScriptCSetClearStencil(stencil);
+        mRS.nScriptSetClearStencil(mID, stencil);
     }
 
+    public void setTimeZone(String timeZone) {
+        try {
+            mRS.nScriptSetTimeZone(mID, timeZone.getBytes("UTF-8"));
+        } catch (java.io.UnsupportedEncodingException e) {
+            throw new RuntimeException(e);
+        }
+    }
 
     public static class Builder {
         RenderScript mRS;
         boolean mIsRoot = false;
-        byte[] mTimeZone;
 
         Builder(RenderScript rs) {
             mRS = rs;
@@ -63,9 +69,6 @@
         }
 
         void transferCreate() {
-            if(mTimeZone != null) {
-                mRS.nScriptCSetTimeZone(mTimeZone);
-            }
             mRS.nScriptCSetRoot(mIsRoot);
         }
 
@@ -73,14 +76,6 @@
             s.mIsRoot = mIsRoot;
         }
 
-        public void setTimeZone(String timeZone) {
-            try {
-                mTimeZone = timeZone.getBytes("UTF-8");
-            } catch (java.io.UnsupportedEncodingException e) {
-                throw new RuntimeException(e);
-            }
-        }
-
         public void setRoot(boolean r) {
             mIsRoot = r;
         }
diff --git a/graphics/java/android/renderscript/Type.java b/graphics/java/android/renderscript/Type.java
index 86932c4..4078c8a 100644
--- a/graphics/java/android/renderscript/Type.java
+++ b/graphics/java/android/renderscript/Type.java
@@ -45,23 +45,47 @@
 
     public static class Builder {
         RenderScript mRS;
-        boolean mActive = true;
+        Entry[] mEntries;
+        int mEntryCount;
+        Element mElement;
 
-        Builder(RenderScript rs) {
-            mRS = rs;
+        class Entry {
+            Dimension mDim;
+            int mValue;
         }
 
-        public void begin(Element e) {
-            mRS.nTypeBegin(e.mID);
+        public Builder(RenderScript rs, Element e) {
+            mRS = rs;
+            mEntries = new Entry[4];
+            mElement = e;
         }
 
         public void add(Dimension d, int value) {
-            mRS.nTypeAdd(d.mID, value);
+            if(mEntries.length >= mEntryCount) {
+                Entry[] en = new Entry[mEntryCount + 8];
+                for(int ct=0; ct < mEntries.length; ct++) {
+                    en[ct] = mEntries[ct];
+                }
+                mEntries = en;
+            }
+            mEntries[mEntryCount] = new Entry();
+            mEntries[mEntryCount].mDim = d;
+            mEntries[mEntryCount].mValue = value;
+            mEntryCount++;
+        }
+
+        static synchronized Type internalCreate(RenderScript rs, Builder b) {
+            rs.nTypeBegin(b.mElement.mID);
+            for (int ct=0; ct < b.mEntryCount; ct++) {
+                Entry en = b.mEntries[ct];
+                rs.nTypeAdd(en.mDim.mID, en.mValue);
+            }
+            int id = rs.nTypeCreate();
+            return new Type(id, rs);
         }
 
         public Type create() {
-            int id = mRS.nTypeCreate();
-            return new Type(id, mRS);
+            return internalCreate(mRS, this);
         }
     }
 
diff --git a/graphics/jni/android_renderscript_RenderScript.cpp b/graphics/jni/android_renderscript_RenderScript.cpp
index f5227a0..73380b8 100644
--- a/graphics/jni/android_renderscript_RenderScript.cpp
+++ b/graphics/jni/android_renderscript_RenderScript.cpp
@@ -647,54 +647,56 @@
 }
 
 static void
-nScriptCBegin(JNIEnv *_env, jobject _this)
+nScriptSetClearColor(JNIEnv *_env, jobject _this, jint script, jfloat r, jfloat g, jfloat b, jfloat a)
 {
     RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nScriptCBegin, con(%p)", con);
-    rsScriptCBegin();
+    LOG_API("nScriptSetClearColor, con(%p), s(%p), r(%f), g(%f), b(%f), a(%f)", con, script, r, g, b, a);
+    rsScriptSetClearColor((RsScript)script, r, g, b, a);
 }
 
 static void
-nScriptCSetClearColor(JNIEnv *_env, jobject _this, jfloat r, jfloat g, jfloat b, jfloat a)
+nScriptSetClearDepth(JNIEnv *_env, jobject _this, jint script, jfloat d)
 {
     RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nScriptCSetClearColor, con(%p), r(%f), g(%f), b(%f), a(%f)", con, r, g, b, a);
-    rsScriptCSetClearColor(r, g, b, a);
+    LOG_API("nScriptCSetClearDepth, con(%p), s(%p), depth(%f)", con, script, d);
+    rsScriptSetClearDepth((RsScript)script, d);
 }
 
 static void
-nScriptCSetClearDepth(JNIEnv *_env, jobject _this, jfloat d)
+nScriptSetClearStencil(JNIEnv *_env, jobject _this, jint script, jint stencil)
 {
     RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nScriptCSetClearDepth, con(%p), depth(%f)", con, d);
-    rsScriptCSetClearDepth(d);
+    LOG_API("nScriptCSetClearStencil, con(%p), s(%p), stencil(%i)", con, script, stencil);
+    rsScriptSetClearStencil((RsScript)script, stencil);
 }
 
 static void
-nScriptCSetClearStencil(JNIEnv *_env, jobject _this, jint stencil)
+nScriptSetTimeZone(JNIEnv *_env, jobject _this, jint script, jbyteArray timeZone)
 {
     RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nScriptCSetClearStencil, con(%p), stencil(%i)", con, stencil);
-    rsScriptCSetClearStencil(stencil);
-}
-
-static void
-nScriptCSetTimeZone(JNIEnv *_env, jobject _this, jbyteArray timeZone)
-{
-    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
-    LOG_API("nScriptCSetTimeZone, con(%p), timeZone(%s)", con, timeZone);
+    LOG_API("nScriptCSetTimeZone, con(%p), s(%p), timeZone(%s)", con, script, timeZone);
 
     jint length = _env->GetArrayLength(timeZone);
     jbyte* timeZone_ptr;
     timeZone_ptr = (jbyte *) _env->GetPrimitiveArrayCritical(timeZone, (jboolean *)0);
 
-    rsScriptCSetTimeZone((const char *)timeZone_ptr, length);
+    rsScriptSetTimeZone((RsScript)script, (const char *)timeZone_ptr, length);
 
     if (timeZone_ptr) {
         _env->ReleasePrimitiveArrayCritical(timeZone, timeZone_ptr, 0);
     }
 }
 
+// -----------------------------------
+
+static void
+nScriptCBegin(JNIEnv *_env, jobject _this)
+{
+    RsContext con = (RsContext)(_env->GetIntField(_this, gContextId));
+    LOG_API("nScriptCBegin, con(%p)", con);
+    rsScriptCBegin();
+}
+
 static void
 nScriptCAddType(JNIEnv *_env, jobject _this, jint type)
 {
@@ -1154,11 +1156,12 @@
 
 {"nScriptDestroy",                 "(I)V",                                 (void*)nScriptDestroy },
 {"nScriptBindAllocation",          "(III)V",                               (void*)nScriptBindAllocation },
+{"nScriptSetClearColor",           "(IFFFF)V",                             (void*)nScriptSetClearColor },
+{"nScriptSetClearDepth",           "(IF)V",                                (void*)nScriptSetClearDepth },
+{"nScriptSetClearStencil",         "(II)V",                                (void*)nScriptSetClearStencil },
+{"nScriptSetTimeZone",             "(I[B)V",                               (void*)nScriptSetTimeZone },
+
 {"nScriptCBegin",                  "()V",                                  (void*)nScriptCBegin },
-{"nScriptCSetClearColor",          "(FFFF)V",                              (void*)nScriptCSetClearColor },
-{"nScriptCSetClearDepth",          "(F)V",                                 (void*)nScriptCSetClearDepth },
-{"nScriptCSetClearStencil",        "(I)V",                                 (void*)nScriptCSetClearStencil },
-{"nScriptCSetTimeZone",            "([B)V",                                (void*)nScriptCSetTimeZone },
 {"nScriptCAddType",                "(I)V",                                 (void*)nScriptCAddType },
 {"nScriptCSetRoot",                "(Z)V",                                 (void*)nScriptCSetRoot },
 {"nScriptCSetScript",              "([BII)V",                              (void*)nScriptCSetScript },
diff --git a/libs/rs/java/Film/res/raw/filmstrip.c b/libs/rs/java/Film/res/raw/filmstrip.c
index ac694ab..e9c7f28 100644
--- a/libs/rs/java/Film/res/raw/filmstrip.c
+++ b/libs/rs/java/Film/res/raw/filmstrip.c
@@ -3,7 +3,7 @@
 #pragma version(1)
 #pragma stateVertex(PVBackground)
 #pragma stateFragment(PFBackground)
-#pragma stateFragmentStore(PFSBackground)
+#pragma stateFragmentStore(PSBackground)
 
 /*
 typedef struct FilmScriptUserEnvRec {
@@ -29,16 +29,15 @@
 
 int main(int index)
 {
-    int f1,f2,f3,f4, f5,f6,f7,f8, f9,f10,f11,f12, f13,f14,f15,f16;
-    int g1,g2,g3,g4, g5,g6,g7,g8, g9,g10,g11,g12, g13,g14,g15,g16;
+    float mat1[16];
 
     float trans = loadF(1, POS_TRANSLATE);
     float rot = loadF(1, POS_ROTATE);
-    matrixLoadScale(&f16, 2.f, 2.f, 2.f);
-    matrixTranslate(&f16, 0.f, 0.f, trans);
-    matrixRotate(&f16, 90.f, 0.f, 0.f, 1.f);
-    matrixRotate(&f16, rot, 1.f, 0.f, 0.f);
-    storeMatrix(3, 0, &f16);
+    matrixLoadScale(mat1, 2.f, 2.f, 2.f);
+    matrixTranslate(mat1, 0.f, 0.f, trans);
+    matrixRotate(mat1, 90.f, 0.f, 0.f, 1.f);
+    matrixRotate(mat1, rot, 1.f, 0.f, 0.f);
+    storeMatrix(3, 0, mat1);
 
     //materialDiffuse(con, 0.0f, 0.0f, 0.0f, 1.0f);
     //materialSpecular(con, 0.5f, 0.5f, 0.5f, 0.5f);
@@ -47,7 +46,7 @@
 
 
     // Start of images.
-    bindProgramFragmentStore(NAMED_PFSImages);
+    bindProgramFragmentStore(NAMED_PSImages);
     bindProgramFragment(NAMED_PFImages);
     bindProgramVertex(NAMED_PVImages);
 
@@ -108,8 +107,8 @@
             }
 
             bindTexture(NAMED_PFImages, 0, loadI32(0, imgId - 1));
-            matrixLoadTranslate(&f16, -pos - loadF(5, triangleOffsetsCount / 2), 0, 0);
-            vpLoadTextureMatrix(&f16);
+            matrixLoadTranslate(mat1, -pos - loadF(5, triangleOffsetsCount / 2), 0, 0);
+            vpLoadTextureMatrix(mat1);
             drawTriangleMeshRange(NAMED_mesh, loadI32(4, start), loadI32(4, end) - loadI32(4, start));
         }
     }
diff --git a/libs/rs/java/Film/src/com/android/film/FilmRS.java b/libs/rs/java/Film/src/com/android/film/FilmRS.java
index a9eaead..760beb8 100644
--- a/libs/rs/java/Film/src/com/android/film/FilmRS.java
+++ b/libs/rs/java/Film/src/com/android/film/FilmRS.java
@@ -31,6 +31,8 @@
 import android.renderscript.Dimension;
 import android.renderscript.ScriptC;
 import android.renderscript.Script;
+import android.renderscript.ProgramFragment;
+import android.renderscript.ProgramStore;
 
 public class FilmRS {
     private final int POS_TRANSLATE = 0;
@@ -73,10 +75,10 @@
     private Element mElementVertex;
     private Element mElementIndex;
     private RenderScript.Sampler mSampler;
-    private RenderScript.ProgramFragmentStore mPFSBackground;
-    private RenderScript.ProgramFragmentStore mPFSImages;
-    private RenderScript.ProgramFragment mPFBackground;
-    private RenderScript.ProgramFragment mPFImages;
+    private ProgramStore mPSBackground;
+    private ProgramStore mPSImages;
+    private ProgramFragment mPFBackground;
+    private ProgramFragment mPFImages;
     private RenderScript.ProgramVertex mPVBackground;
     private RenderScript.ProgramVertex mPVImages;
     private ProgramVertexAlloc mPVA;
@@ -99,21 +101,21 @@
     private int[] mBufferState;
 
     private void initPFS() {
-        mRS.programFragmentStoreBegin(null, null);
-        mRS.programFragmentStoreDepthFunc(RenderScript.DepthFunc.LESS);
-        mRS.programFragmentStoreDitherEnable(true);
-        mRS.programFragmentStoreDepthMask(true);
-        mPFSBackground = mRS.programFragmentStoreCreate();
-        mPFSBackground.setName("PFSBackground");
+        ProgramStore.Builder b = new ProgramStore.Builder(mRS, null, null);
 
-        mRS.programFragmentStoreBegin(null, null);
-        mRS.programFragmentStoreDepthFunc(RenderScript.DepthFunc.EQUAL);
-        mRS.programFragmentStoreDitherEnable(false);
-        mRS.programFragmentStoreDepthMask(false);
-        mRS.programFragmentStoreBlendFunc(RenderScript.BlendSrcFunc.ONE,
-                                          RenderScript.BlendDstFunc.ONE);
-        mPFSImages = mRS.programFragmentStoreCreate();
-        mPFSImages.setName("PFSImages");
+        b.setDepthFunc(ProgramStore.DepthFunc.LESS);
+        b.setDitherEnable(true);
+        b.setDepthMask(true);
+        mPSBackground = b.create();
+        mPSBackground.setName("PSBackground");
+
+        b.setDepthFunc(ProgramStore.DepthFunc.EQUAL);
+        b.setDitherEnable(false);
+        b.setDepthMask(false);
+        b.setBlendFunc(ProgramStore.BlendSrcFunc.ONE,
+                       ProgramStore.BlendDstFunc.ONE);
+        mPSImages = b.create();
+        mPSImages.setName("PSImages");
     }
 
     private void initPF() {
@@ -128,15 +130,14 @@
                        RenderScript.SamplerValue.WRAP);
         mSampler = mRS.samplerCreate();
 
+        ProgramFragment.Builder b = new ProgramFragment.Builder(mRS, null, null);
 
-        mRS.programFragmentBegin(null, null);
-        mPFBackground = mRS.programFragmentCreate();
+        mPFBackground = b.create();
         mPFBackground.setName("PFBackground");
 
-        mRS.programFragmentBegin(null, null);
-        mRS.programFragmentSetTexEnable(0, true);
-        mRS.programFragmentSetTexEnvMode(0, RenderScript.EnvMode.REPLACE);
-        mPFImages = mRS.programFragmentCreate();
+        b.setTexEnable(true, 0);
+        b.setTexEnvMode(ProgramFragment.EnvMode.REPLACE, 0);
+        mPFImages = b.create();
         mPFImages.bindSampler(mSampler, 0);
         mPFImages.setName("PFImages");
     }
diff --git a/libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java b/libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java
index c8d02c1..4c2ab68 100644
--- a/libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java
+++ b/libs/rs/java/Fountain/src/com/android/fountain/FountainRS.java
@@ -31,6 +31,8 @@
 import android.renderscript.Allocation;
 import android.renderscript.Script;
 import android.renderscript.ScriptC;
+import android.renderscript.ProgramFragment;
+import android.renderscript.ProgramStore;
 
 public class FountainRS {
 
@@ -60,8 +62,8 @@
     private Allocation mPartAlloc;
     private Allocation mVertAlloc;
     private Script mScript;
-    private RenderScript.ProgramFragmentStore mPFS;
-    private RenderScript.ProgramFragment mPF;
+    private ProgramStore mPFS;
+    private ProgramFragment mPF;
 
     private Bitmap mBackground;
 
@@ -75,16 +77,16 @@
         mPartAlloc.setName("PartBuffer");
         mVertAlloc = Allocation.createSized(mRS, Element.USER_I32, partCount * 5 + 1);
 
-        mRS.programFragmentStoreBegin(null, null);
-        mRS.programFragmentStoreBlendFunc(RenderScript.BlendSrcFunc.SRC_ALPHA, RenderScript.BlendDstFunc.ONE);
-        mRS.programFragmentStoreDepthFunc(RenderScript.DepthFunc.ALWAYS);
-        mRS.programFragmentStoreDepthMask(false);
-        mRS.programFragmentStoreDitherEnable(false);
-        mPFS = mRS.programFragmentStoreCreate();
+        ProgramStore.Builder bs = new ProgramStore.Builder(mRS, null, null);
+        bs.setBlendFunc(ProgramStore.BlendSrcFunc.SRC_ALPHA, ProgramStore.BlendDstFunc.ONE);
+        bs.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
+        bs.setDepthMask(false);
+        bs.setDitherEnable(false);
+        mPFS = bs.create();
         mPFS.setName("PFSBlend");
 
-        mRS.programFragmentBegin(null, null);
-        mPF = mRS.programFragmentCreate();
+        ProgramFragment.Builder bf = new ProgramFragment.Builder(mRS, null, null);
+        mPF = bf.create();
         mPF.setName("PgmFragParts");
 
         mParams[0] = 0;
diff --git a/libs/rs/java/Grass/src/com/android/grass/rs/GrassRS.java b/libs/rs/java/Grass/src/com/android/grass/rs/GrassRS.java
index 55b77e5..8852b3c 100644
--- a/libs/rs/java/Grass/src/com/android/grass/rs/GrassRS.java
+++ b/libs/rs/java/Grass/src/com/android/grass/rs/GrassRS.java
@@ -19,11 +19,13 @@
 import android.content.res.Resources;
 import static android.renderscript.RenderScript.SamplerParam.*;
 import static android.renderscript.RenderScript.SamplerValue.*;
-import static android.renderscript.RenderScript.EnvMode.*;
-import static android.renderscript.RenderScript.DepthFunc.*;
-import static android.renderscript.RenderScript.BlendSrcFunc;
-import static android.renderscript.RenderScript.BlendDstFunc;
+import static android.renderscript.ProgramFragment.EnvMode.*;
+import static android.renderscript.ProgramStore.DepthFunc.*;
+import static android.renderscript.ProgramStore.BlendSrcFunc;
+import static android.renderscript.ProgramStore.BlendDstFunc;
 import android.renderscript.RenderScript;
+import android.renderscript.ProgramFragment;
+import android.renderscript.ProgramStore;
 import android.renderscript.Allocation;
 import android.renderscript.ProgramVertexAlloc;
 import static android.renderscript.Element.*;
@@ -72,9 +74,9 @@
     @SuppressWarnings({"FieldCanBeLocal"})
     private RenderScript.Sampler mSampler;
     @SuppressWarnings({"FieldCanBeLocal"})
-    private RenderScript.ProgramFragment mPfBackground;
+    private ProgramFragment mPfBackground;
     @SuppressWarnings({"FieldCanBeLocal"})
-    private RenderScript.ProgramFragmentStore mPfsBackground;
+    private ProgramStore mPfsBackground;
     @SuppressWarnings({"FieldCanBeLocal"})
     private RenderScript.ProgramVertex mPvBackground;
     @SuppressWarnings({"FieldCanBeLocal"})
@@ -91,9 +93,9 @@
     @SuppressWarnings({"FieldCanBeLocal"})
     private Allocation mBlades;
     @SuppressWarnings({"FieldCanBeLocal"})
-    private RenderScript.ProgramFragment mPfGrass;
+    private ProgramFragment mPfGrass;
     @SuppressWarnings({"FieldCanBeLocal"})
-    private RenderScript.ProgramFragmentStore mPfsGrass;
+    private ProgramStore mPfsGrass;
 
     public GrassRS(int width, int height) {
         mWidth = width;
@@ -116,10 +118,10 @@
 
         ScriptC.Builder sb = new ScriptC.Builder(mRS);
         sb.setScript(mResources, R.raw.grass);
-        sb.setTimeZone(TimeZone.getDefault().getID());
         sb.setRoot(true);
         mScript = sb.create();
         mScript.setClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+        mScript.setTimeZone(TimeZone.getDefault().getID());
 
         loadSkyTextures();
         mScript.bindAllocation(mState, RSID_STATE);
@@ -210,36 +212,33 @@
         mRS.samplerSet(WRAP_MODE_T, CLAMP);
         mSampler = mRS.samplerCreate();
 
-        mRS.programFragmentBegin(null, null);
-        mRS.programFragmentSetTexEnable(0, true);
-        mRS.programFragmentSetTexEnvMode(0, REPLACE);
-        mPfBackground = mRS.programFragmentCreate();
+        ProgramFragment.Builder b;
+        b = new ProgramFragment.Builder(mRS, null, null);
+        b.setTexEnable(true, 0);
+        b.setTexEnvMode(REPLACE, 0);
+        mPfBackground = b.create();
         mPfBackground.setName("PFBackground");
         mPfBackground.bindSampler(mSampler, 0);
 
-        mRS.programFragmentBegin(null, null);
-        mRS.programFragmentSetTexEnable(0, true);
-        mRS.programFragmentSetTexEnvMode(0, MODULATE);
-        mPfGrass = mRS.programFragmentCreate();
+        b.setTexEnvMode(MODULATE, 0);
+        mPfGrass = b.create();
         mPfGrass.setName("PFGrass");
         mPfGrass.bindSampler(mSampler, 0);
     }
 
     private void createProgramFragmentStore() {
-        mRS.programFragmentStoreBegin(null, null);
-        mRS.programFragmentStoreDepthFunc(ALWAYS);
-        mRS.programFragmentStoreBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE_MINUS_SRC_ALPHA);
-        mRS.programFragmentStoreDitherEnable(true);
-        mRS.programFragmentStoreDepthMask(false);
-        mPfsBackground = mRS.programFragmentStoreCreate();
+        ProgramStore.Builder b;
+        b = new ProgramStore.Builder(mRS, null, null);
+
+        b.setDepthFunc(ALWAYS);
+        b.setBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE_MINUS_SRC_ALPHA);
+        b.setDitherEnable(true);
+        b.setDepthMask(false);
+        mPfsBackground = b.create();
         mPfsBackground.setName("PFSBackground");
 
-        mRS.programFragmentStoreBegin(null, null);
-        mRS.programFragmentStoreDepthFunc(ALWAYS);
-        mRS.programFragmentStoreBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ONE_MINUS_SRC_ALPHA);
-        mRS.programFragmentStoreDitherEnable(true);
-        mRS.programFragmentStoreDepthMask(false);
-        mPfsGrass = mRS.programFragmentStoreCreate();
+        b.setBlendFunc(BlendSrcFunc.ONE, BlendDstFunc.ONE_MINUS_SRC_ALPHA);
+        mPfsGrass = b.create();
         mPfsGrass.setName("PFSGrass");
     }
 
diff --git a/libs/rs/java/Rollo/src/com/android/rollo/RolloRS.java b/libs/rs/java/Rollo/src/com/android/rollo/RolloRS.java
index 578c225..9389688 100644
--- a/libs/rs/java/Rollo/src/com/android/rollo/RolloRS.java
+++ b/libs/rs/java/Rollo/src/com/android/rollo/RolloRS.java
@@ -24,6 +24,8 @@
 import android.renderscript.Allocation;
 import android.renderscript.Script;
 import android.renderscript.ScriptC;
+import android.renderscript.ProgramFragment;
+import android.renderscript.ProgramStore;
 
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
@@ -95,10 +97,10 @@
     private Script mScript;
     private RenderScript.Sampler mSampler;
     private RenderScript.Sampler mSamplerText;
-    private RenderScript.ProgramFragmentStore mPFSBackground;
-    private RenderScript.ProgramFragmentStore mPFSText;
-    private RenderScript.ProgramFragment mPFImages;
-    private RenderScript.ProgramFragment mPFText;
+    private ProgramStore mPSBackground;
+    private ProgramStore mPSText;
+    private ProgramFragment mPFImages;
+    private ProgramFragment mPFText;
     private RenderScript.ProgramVertex mPV;
     private ProgramVertexAlloc mPVAlloc;
     private RenderScript.ProgramVertex mPVOrtho;
@@ -142,37 +144,33 @@
         mSamplerText = mRS.samplerCreate();
 
 
-        mRS.programFragmentBegin(null, null);
-        mRS.programFragmentSetTexEnable(0, true);
-        mRS.programFragmentSetTexEnvMode(0, RenderScript.EnvMode.MODULATE);
-        mPFImages = mRS.programFragmentCreate();
+        ProgramFragment.Builder bf = new ProgramFragment.Builder(mRS, null, null);
+        bf.setTexEnable(true, 0);
+        bf.setTexEnvMode(ProgramFragment.EnvMode.MODULATE, 0);
+        mPFImages = bf.create();
         mPFImages.setName("PF");
         mPFImages.bindSampler(mSampler, 0);
 
-        mRS.programFragmentBegin(null, null);
-        mRS.programFragmentSetTexEnable(0, true);
-        mRS.programFragmentSetTexEnvMode(0, RenderScript.EnvMode.MODULATE);
-        mPFText = mRS.programFragmentCreate();
+        bf.setTexEnvMode(ProgramFragment.EnvMode.MODULATE, 0);
+        mPFText = bf.create();
         mPFText.setName("PFText");
         mPFText.bindSampler(mSamplerText, 0);
 
-        mRS.programFragmentStoreBegin(null, null);
-        mRS.programFragmentStoreDepthFunc(RenderScript.DepthFunc.LESS);
-        mRS.programFragmentStoreDitherEnable(false);
-        mRS.programFragmentStoreDepthMask(true);
-        mRS.programFragmentStoreBlendFunc(RenderScript.BlendSrcFunc.SRC_ALPHA,
-                                          RenderScript.BlendDstFunc.ONE_MINUS_SRC_ALPHA);
-        mPFSBackground = mRS.programFragmentStoreCreate();
-        mPFSBackground.setName("PFS");
+        ProgramStore.Builder bs = new ProgramStore.Builder(mRS, null, null);
+        bs.setDepthFunc(ProgramStore.DepthFunc.LESS);
+        bs.setDitherEnable(false);
+        bs.setDepthMask(true);
+        bs.setBlendFunc(ProgramStore.BlendSrcFunc.SRC_ALPHA,
+                        ProgramStore.BlendDstFunc.ONE_MINUS_SRC_ALPHA);
+        mPSBackground = bs.create();
+        mPSBackground.setName("PFS");
 
-        mRS.programFragmentStoreBegin(null, null);
-        mRS.programFragmentStoreDepthFunc(RenderScript.DepthFunc.ALWAYS);
-        mRS.programFragmentStoreDitherEnable(false);
-        mRS.programFragmentStoreDepthMask(false);
-        mRS.programFragmentStoreBlendFunc(RenderScript.BlendSrcFunc.SRC_ALPHA,
-                                          RenderScript.BlendDstFunc.ONE_MINUS_SRC_ALPHA);
-        mPFSText = mRS.programFragmentStoreCreate();
-        mPFSText.setName("PFSText");
+        bs.setDepthFunc(ProgramStore.DepthFunc.ALWAYS);
+        bs.setDepthMask(false);
+        bs.setBlendFunc(ProgramStore.BlendSrcFunc.SRC_ALPHA,
+                        ProgramStore.BlendDstFunc.ONE_MINUS_SRC_ALPHA);
+        mPSText = bs.create();
+        mPSText.setName("PFSText");
 
         mPVAlloc = new ProgramVertexAlloc(mRS);
         mRS.programVertexBegin(null, null);
diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec
index d9a6456..e118ace 100644
--- a/libs/rs/rs.spec
+++ b/libs/rs/rs.spec
@@ -127,14 +127,14 @@
 AllocationData {
 	param RsAllocation va
 	param const void * data
-	} 
+	}
 
 Allocation1DSubData {
 	param RsAllocation va
 	param uint32_t xoff
 	param uint32_t count
 	param const void *data
-	} 
+	}
 
 Allocation2DSubData {
 	param RsAllocation va
@@ -168,14 +168,14 @@
 Adapter1DData {
 	param RsAdapter1D adapter
 	param const void * data
-	} 
+	}
 
 Adapter1DSubData {
 	param RsAdapter1D adapter
 	param uint32_t xoff
 	param uint32_t count
 	param const void *data
-	} 
+	}
 
 Adapter2DCreate {
 	ret RsAdapter2D
@@ -199,7 +199,7 @@
 Adapter2DData {
 	param RsAdapter2D adapter
 	param const void *data
-	} 
+	}
 
 Adapter2DSubData {
 	param RsAdapter2D adapter
@@ -273,23 +273,27 @@
 ScriptCBegin {
 	}
 
-ScriptCSetClearColor {
+ScriptSetClearColor {
+	param RsScript s
 	param float r
 	param float g
 	param float b
 	param float a
 	}
 
-ScriptCSetTimeZone {
+ScriptSetTimeZone {
+	param RsScript s
 	param const char * timeZone
 	param uint32_t length
 	}
 
-ScriptCSetClearDepth {
+ScriptSetClearDepth {
+	param RsScript s
 	param float depth
 	}
 
-ScriptCSetClearStencil {
+ScriptSetClearStencil {
+	param RsScript s
 	param uint32_t stencil
 	}
 
diff --git a/libs/rs/rsScript.cpp b/libs/rs/rsScript.cpp
index ae85c9c..6ce9f61 100644
--- a/libs/rs/rsScript.cpp
+++ b/libs/rs/rsScript.cpp
@@ -49,6 +49,32 @@
     s->mSlots[slot].set(static_cast<Allocation *>(va));
 }
 
+void rsi_ScriptSetClearColor(Context * rsc, RsScript vs, float r, float g, float b, float a)
+{
+    Script *s = static_cast<Script *>(vs);
+    s->mEnviroment.mClearColor[0] = r;
+    s->mEnviroment.mClearColor[1] = g;
+    s->mEnviroment.mClearColor[2] = b;
+    s->mEnviroment.mClearColor[3] = a;
+}
+
+void rsi_ScriptSetTimeZone(Context * rsc, RsScript vs, const char * timeZone, uint32_t length)
+{
+    Script *s = static_cast<Script *>(vs);
+    s->mEnviroment.mTimeZone = timeZone;
+}
+
+void rsi_ScriptSetClearDepth(Context * rsc, RsScript vs, float v)
+{
+    Script *s = static_cast<Script *>(vs);
+    s->mEnviroment.mClearDepth = v;
+}
+
+void rsi_ScriptSetClearStencil(Context * rsc, RsScript vs, uint32_t v)
+{
+    Script *s = static_cast<Script *>(vs);
+    s->mEnviroment.mClearStencil = v;
+}
 
 }
 }
diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp
index 3b9d27a..b0b8404 100644
--- a/libs/rs/rsScriptC.cpp
+++ b/libs/rs/rsScriptC.cpp
@@ -49,7 +49,7 @@
 
 bool ScriptC::run(Context *rsc, uint32_t launchIndex)
 {
-    Context::ScriptTLSStruct * tls = 
+    Context::ScriptTLSStruct * tls =
     (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey);
 
     if (mEnviroment.mFragmentStore.get()) {
@@ -100,7 +100,7 @@
 
 }
 
-static ACCvoid* symbolLookup(ACCvoid* pContext, const ACCchar* name) 
+static ACCvoid* symbolLookup(ACCvoid* pContext, const ACCchar* name)
 {
     const ScriptCState::SymbolTable_t *sym = ScriptCState::lookupSymbol(name);
     if (sym) {
@@ -194,7 +194,7 @@
                     mEnviroment.mFragmentStore.clear();
                     continue;
                 }
-                ProgramFragmentStore * pfs = 
+                ProgramFragmentStore * pfs =
                     (ProgramFragmentStore *)rsc->lookupName(str[ct+1]);
                 if (pfs != NULL) {
                     mEnviroment.mFragmentStore.set(pfs);
@@ -205,7 +205,7 @@
 
         }
 
-            
+
     } else {
         // Deal with an error.
     }
@@ -221,33 +221,6 @@
     ss->clear();
 }
 
-void rsi_ScriptCSetClearColor(Context * rsc, float r, float g, float b, float a)
-{
-    ScriptCState *ss = &rsc->mScriptC;
-    ss->mEnviroment.mClearColor[0] = r;
-    ss->mEnviroment.mClearColor[1] = g;
-    ss->mEnviroment.mClearColor[2] = b;
-    ss->mEnviroment.mClearColor[3] = a;
-}
-
-void rsi_ScriptCSetTimeZone(Context * rsc, const char * timeZone, uint32_t length)
-{
-    ScriptCState *ss = &rsc->mScriptC;
-    ss->mEnviroment.mTimeZone = timeZone;
-}
-
-void rsi_ScriptCSetClearDepth(Context * rsc, float v)
-{
-    ScriptCState *ss = &rsc->mScriptC;
-    ss->mEnviroment.mClearDepth = v;
-}
-
-void rsi_ScriptCSetClearStencil(Context * rsc, uint32_t v)
-{
-    ScriptCState *ss = &rsc->mScriptC;
-    ss->mEnviroment.mClearStencil = v;
-}
-
 void rsi_ScriptCAddType(Context * rsc, RsType vt)
 {
     ScriptCState *ss = &rsc->mScriptC;