Implement default programs and implement defaults and parents for imports.
diff --git a/java/Fountain/res/raw/fountain.c b/java/Fountain/res/raw/fountain.c
index 3bd9496..54130f9 100644
--- a/java/Fountain/res/raw/fountain.c
+++ b/java/Fountain/res/raw/fountain.c
@@ -1,10 +1,9 @@
 // Fountain test script
 
 #pragma version(1)
-#pragma stateVertex(orthoWindow)
-#pragma stateRaster(flat)
+#pragma stateVertex(default)
 #pragma stateFragment(PgmFragBackground)
-#pragma stateFragmentStore(MyBlend)
+#pragma stateFragmentStore(parent)
 
 
 int main(void* con, int ft, int launchID) {
diff --git a/java/Fountain/src/com/android/fountain/FountainRS.java b/java/Fountain/src/com/android/fountain/FountainRS.java
index d167b5f..467115a 100644
--- a/java/Fountain/src/com/android/fountain/FountainRS.java
+++ b/java/Fountain/src/com/android/fountain/FountainRS.java
@@ -58,10 +58,8 @@
     private RenderScript.ProgramFragmentStore mPFS;
     private RenderScript.ProgramFragment mPF;
     private RenderScript.ProgramFragment mPF2;
-    private RenderScript.ProgramVertex mPV;
     private RenderScript.Allocation mTexture;
     private RenderScript.Sampler mSampler;
-    private ProgramVertexAlloc mPVA;
 
     private Bitmap mBackground;
 
@@ -110,15 +108,6 @@
         mPF2.bindSampler(mSampler, 0);
         mPF2.setName("PgmFragBackground");
 
-        mRS.programVertexBegin(null, null);
-        mPV = mRS.programVertexCreate();
-        mPVA = new ProgramVertexAlloc(mRS);
-        mPV.bindAllocation(0, mPVA.mAlloc);
-        mPVA.setupOrthoWindow(320, 480);
-        mRS.contextBindProgramVertex(mPV);
-
-
-
 
         mParams[0] = 0;
         mParams[1] = partCount;
diff --git a/rsContext.cpp b/rsContext.cpp
index c466f46..7248ecc 100644
--- a/rsContext.cpp
+++ b/rsContext.cpp
@@ -119,6 +119,14 @@
      rsc->mServerReturns.init(128);
 
      rsc->initEGL();
+
+     rsc->mStateVertex.init(rsc, rsc->mWidth, rsc->mHeight);
+     rsc->setVertex(NULL);
+     rsc->mStateFragment.init(rsc, rsc->mWidth, rsc->mHeight);
+     rsc->setFragment(NULL);
+     rsc->mStateFragmentStore.init(rsc, rsc->mWidth, rsc->mHeight);
+     rsc->setFragmentStore(NULL);
+
      rsc->mRunning = true;
      bool mDraw = true;
      while (!rsc->mExit) {
@@ -212,20 +220,32 @@
 
 void Context::setFragmentStore(ProgramFragmentStore *pfs)
 {
-    mFragmentStore.set(pfs);
-    pfs->setupGL();
+    if (pfs == NULL) {
+        mFragmentStore.set(mStateFragmentStore.mDefault);
+    } else {
+        mFragmentStore.set(pfs);
+    }
+    mFragmentStore->setupGL();
 }
 
 void Context::setFragment(ProgramFragment *pf)
 {
-    mFragment.set(pf);
-    pf->setupGL();
+    if (pf == NULL) {
+        mFragment.set(mStateFragment.mDefault);
+    } else {
+        mFragment.set(pf);
+    }
+    mFragment->setupGL();
 }
 
 void Context::setVertex(ProgramVertex *pv)
 {
-    mVertex.set(pv);
-    pv->setupGL();
+    if (pv == NULL) {
+        mVertex.set(mStateVertex.mDefault);
+    } else {
+        mVertex.set(pv);
+    }
+    mVertex->setupGL();
 }
 
 void Context::assignName(ObjectBase *obj, const char *name, uint32_t len)
diff --git a/rsContext.h b/rsContext.h
index 21ae8c5..10b9a13 100644
--- a/rsContext.h
+++ b/rsContext.h
@@ -81,6 +81,17 @@
     ObjectBase * lookupName(const char *name) const;
     void appendNameDefines(String8 *str) const;
 
+
+    ProgramFragment * getDefaultProgramFragment() const {
+        return mStateFragment.mDefault.get();
+    }
+    ProgramVertex * getDefaultProgramVertex() const {
+        return mStateVertex.mDefault.get();
+    }
+    ProgramFragmentStore * getDefaultProgramFragmentStore() const {
+        return mStateFragmentStore.mDefault.get();
+    }
+
 protected:
     Device *mDev;
 
@@ -107,10 +118,6 @@
     ObjectBaseRef<ProgramVertex> mVertex;
     ObjectBaseRef<ProgramFragmentStore> mFragmentStore;
 
-    ProgramFragment * mDefaultFragment;
-    ProgramVertex * mDefaultVertex;
-    ProgramFragmentStore * mDefaultFragmentStore;
-
 private:
     Context();
 
diff --git a/rsMatrix.cpp b/rsMatrix.cpp
index e68d5ac..258b836 100644
--- a/rsMatrix.cpp
+++ b/rsMatrix.cpp
@@ -136,4 +136,26 @@
     }
 }
 
+void Matrix::loadOrtho(float l, float r, float b, float t, float n, float f) {
+    loadIdentity();
+    m[0] = 2 / (r - l);
+    m[5] = 2 / (t - b);
+    m[10]= -2 / (f - n);
+    m[12]= -(r + l) / (r - l);
+    m[13]= -(t + b) / (t - b);
+    m[14]= -(f + n) / (f - n);
+}
+
+void Matrix::loadFrustum(float l, float r, float b, float t, float n, float f) {
+    loadIdentity();
+    m[0] = 2 * n / (r - l);
+    m[5] = 2 * n / (t - b);
+    m[8] = (r + l) / (r - l);
+    m[9] = (t + b) / (t - b);
+    m[10]= -(f + n) / (f - n);
+    m[11]= -1;
+    m[14]= -2*f*n / (f - n);
+    m[15]= 0;
+}
+
 
diff --git a/rsMatrix.h b/rsMatrix.h
index 619b494..7dc4165 100644
--- a/rsMatrix.h
+++ b/rsMatrix.h
@@ -44,6 +44,9 @@
     void loadTranslate(float x, float y, float z);
     void loadMultiply(const Matrix *lhs, const Matrix *rhs);
 
+    void loadOrtho(float l, float r, float b, float t, float n, float f);
+    void loadFrustum(float l, float r, float b, float t, float n, float f);
+
     void multiply(const Matrix *rhs) {
         Matrix tmp;
         tmp.loadMultiply(this, rhs);
diff --git a/rsProgramFragment.cpp b/rsProgramFragment.cpp
index 316e791..8777335 100644
--- a/rsProgramFragment.cpp
+++ b/rsProgramFragment.cpp
@@ -148,6 +148,11 @@
 
 }
 
+void ProgramFragmentState::init(Context *rsc, int32_t w, int32_t h)
+{
+    ProgramFragment *pf = new ProgramFragment(NULL, NULL);
+    mDefault.set(pf);
+}
 
 
 namespace android {
diff --git a/rsProgramFragment.h b/rsProgramFragment.h
index ed9c49b..896d8dd 100644
--- a/rsProgramFragment.h
+++ b/rsProgramFragment.h
@@ -82,9 +82,10 @@
     ~ProgramFragmentState();
 
     ProgramFragment *mPF;
+    void init(Context *rsc, int32_t w, int32_t h);
 
     ObjectBaseRef<Type> mTextureTypes[ProgramFragment::MAX_TEXTURE];
-
+    ObjectBaseRef<ProgramFragment> mDefault;
     Vector<ProgramFragment *> mPrograms;
 };
 
diff --git a/rsProgramFragmentStore.cpp b/rsProgramFragmentStore.cpp
index a1855a6..96d37ae 100644
--- a/rsProgramFragmentStore.cpp
+++ b/rsProgramFragmentStore.cpp
@@ -201,6 +201,12 @@
 
 }
 
+void ProgramFragmentStoreState::init(Context *rsc, int32_t w, int32_t h)
+{
+    ProgramFragmentStore *pfs = new ProgramFragmentStore(NULL, NULL);
+    mDefault.set(pfs);
+}
+
 
 namespace android {
 namespace renderscript {
diff --git a/rsProgramFragmentStore.h b/rsProgramFragmentStore.h
index d862775..bd3a9f4 100644
--- a/rsProgramFragmentStore.h
+++ b/rsProgramFragmentStore.h
@@ -74,7 +74,9 @@
 public:
     ProgramFragmentStoreState();
     ~ProgramFragmentStoreState();
+    void init(Context *rsc, int32_t w, int32_t h);
 
+    ObjectBaseRef<ProgramFragmentStore> mDefault;
     ProgramFragmentStore *mPFS;
 };
 
diff --git a/rsProgramVertex.cpp b/rsProgramVertex.cpp
index c24f228..19afad5 100644
--- a/rsProgramVertex.cpp
+++ b/rsProgramVertex.cpp
@@ -81,6 +81,23 @@
     delete mPV;
 }
 
+void ProgramVertexState::init(Context *rsc, int32_t w, int32_t h)
+{
+    ProgramVertex *pv = new ProgramVertex(NULL, NULL);
+    Allocation *alloc = (Allocation *)
+        rsi_AllocationCreatePredefSized(rsc, RS_ELEMENT_USER_FLOAT, 48);
+    mDefaultAlloc.set(alloc);
+    mDefault.set(pv);
+
+    pv->bindAllocation(0, alloc);
+    
+    Matrix m;
+    m.loadOrtho(0,w, h,0, -1,1);
+    alloc->subData(RS_PROGRAM_VERTEX_PROJECTION_OFFSET, 16, &m.m[0]);
+
+    m.loadIdentity();
+    alloc->subData(RS_PROGRAM_VERTEX_MODELVIEW_OFFSET, 16, &m.m[0]);
+}
 
 
 namespace android {
diff --git a/rsProgramVertex.h b/rsProgramVertex.h
index 0b3a3eb..1a92f01 100644
--- a/rsProgramVertex.h
+++ b/rsProgramVertex.h
@@ -57,6 +57,11 @@
     ProgramVertexState();
     ~ProgramVertexState();
 
+    void init(Context *rsc, int32_t w, int32_t h);
+
+    ObjectBaseRef<ProgramVertex> mDefault;
+    ObjectBaseRef<Allocation> mDefaultAlloc;
+
     ProgramVertex *mPV;
 
     //ObjectBaseRef<Type> mTextureTypes[ProgramFragment::MAX_TEXTURE];
diff --git a/rsScriptC.cpp b/rsScriptC.cpp
index 2963831..c650656 100644
--- a/rsScriptC.cpp
+++ b/rsScriptC.cpp
@@ -398,6 +398,9 @@
     if (mEnviroment.mFragment.get()) {
         rsc->setFragment(mEnviroment.mFragment.get());
     }
+    if (mEnviroment.mVertex.get()) {
+        rsc->setVertex(mEnviroment.mVertex.get());
+    }
 
     return mProgram.mScript(&e, &scriptCPtrTable, launchID) != 0;
 }
@@ -448,6 +451,9 @@
     accGetScriptLabel(mAccScript, "main", (ACCvoid**) &mProgram.mScript);
     rsAssert(mProgram.mScript);
 
+    mEnviroment.mFragment.set(rsc->getDefaultProgramFragment());
+    mEnviroment.mVertex.set(rsc->getDefaultProgramVertex());
+    mEnviroment.mFragmentStore.set(rsc->getDefaultProgramFragmentStore());
 
     if (mProgram.mScript) {
         const static int pragmaMax = 16;
@@ -465,6 +471,18 @@
 
 
             if (!strcmp(str[ct], "stateVertex")) {
+                if (!strcmp(str[ct+1], "default")) {
+                    continue;
+                }
+                if (!strcmp(str[ct+1], "parent")) {
+                    mEnviroment.mVertex.clear();
+                    continue;
+                }
+                ProgramVertex * pv = (ProgramVertex *)rsc->lookupName(str[ct+1]);
+                if (pv != NULL) {
+                    mEnviroment.mVertex.set(pv);
+                    continue;
+                }
                 LOGE("Unreconized value %s passed to stateVertex", str[ct+1]);
             }
 
@@ -473,8 +491,14 @@
             }
 
             if (!strcmp(str[ct], "stateFragment")) {
-                ProgramFragment * pf = 
-                    (ProgramFragment *)rsc->lookupName(str[ct+1]);
+                if (!strcmp(str[ct+1], "default")) {
+                    continue;
+                }
+                if (!strcmp(str[ct+1], "parent")) {
+                    mEnviroment.mFragment.clear();
+                    continue;
+                }
+                ProgramFragment * pf = (ProgramFragment *)rsc->lookupName(str[ct+1]);
                 if (pf != NULL) {
                     mEnviroment.mFragment.set(pf);
                     continue;
@@ -483,18 +507,19 @@
             }
 
             if (!strcmp(str[ct], "stateFragmentStore")) {
+                if (!strcmp(str[ct+1], "default")) {
+                    continue;
+                }
+                if (!strcmp(str[ct+1], "parent")) {
+                    mEnviroment.mFragmentStore.clear();
+                    continue;
+                }
                 ProgramFragmentStore * pfs = 
                     (ProgramFragmentStore *)rsc->lookupName(str[ct+1]);
                 if (pfs != NULL) {
                     mEnviroment.mFragmentStore.set(pfs);
                     continue;
                 }
-
-                if (!strcmp(str[ct+1], "parent")) {
-                    //mEnviroment.mStateFragmentStore = 
-                        //Script::Enviroment_t::FRAGMENT_STORE_PARENT;
-                    continue;
-                }
                 LOGE("Unreconized value %s passed to stateFragmentStore", str[ct+1]);
             }