Create holder inner class for pushing context state.
Fix bug with rsForEach corrupting parent context state.
Remove workaround from rsBalls.

Change-Id: I43a948536e70d44645d1c2ef7b97e1c5906f6943
diff --git a/rsContext.h b/rsContext.h
index 6945342..c377c73 100644
--- a/rsContext.h
+++ b/rsContext.h
@@ -80,6 +80,21 @@
         Context * mContext;
         Script * mScript;
     };
+
+    class PushState {
+    public:
+        PushState(Context *);
+        ~PushState();
+
+    private:
+        ObjectBaseRef<ProgramFragment> mFragment;
+        ObjectBaseRef<ProgramVertex> mVertex;
+        ObjectBaseRef<ProgramStore> mStore;
+        ObjectBaseRef<ProgramRaster> mRaster;
+        ObjectBaseRef<Font> mFont;
+        Context *mRsc;
+    };
+
     ScriptTLSStruct *mTlsStruct;
     RsSurfaceConfig mUserSurfaceConfig;
 
@@ -101,18 +116,18 @@
 
     void swapBuffers();
     void setRootScript(Script *);
-    void setRaster(ProgramRaster *);
-    void setVertex(ProgramVertex *);
-    void setFragment(ProgramFragment *);
-    void setFragmentStore(ProgramStore *);
+    void setProgramRaster(ProgramRaster *);
+    void setProgramVertex(ProgramVertex *);
+    void setProgramFragment(ProgramFragment *);
+    void setProgramStore(ProgramStore *);
     void setFont(Font *);
 
     void updateSurface(void *sur);
 
-    const ProgramFragment * getFragment() {return mFragment.get();}
-    const ProgramStore * getFragmentStore() {return mFragmentStore.get();}
-    const ProgramRaster * getRaster() {return mRaster.get();}
-    const ProgramVertex * getVertex() {return mVertex.get();}
+    ProgramFragment * getProgramFragment() {return mFragment.get();}
+    ProgramStore * getProgramStore() {return mFragmentStore.get();}
+    ProgramRaster * getProgramRaster() {return mRaster.get();}
+    ProgramVertex * getProgramVertex() {return mVertex.get();}
     Font * getFont() {return mFont.get();}
 
     bool setupCheck();