Add API entry points for clipped kernels and fix Z-dimension clipping.

Change-Id: I43074cb8556d9b28d3e549930f5ac68387f8d823
diff --git a/cpp/Script.cpp b/cpp/Script.cpp
index 09d541d..0f87adb 100644
--- a/cpp/Script.cpp
+++ b/cpp/Script.cpp
@@ -33,7 +33,7 @@
     }
     void *in_id = BaseObj::getObjID(ain);
     void *out_id = BaseObj::getObjID(aout);
-    rsScriptForEach(mRS->getContext(), getID(), slot, in_id, out_id, usr, usrLen);
+    rsScriptForEach(mRS->getContext(), getID(), slot, in_id, out_id, usr, usrLen, NULL, 0);
 }
 
 
diff --git a/cpu_ref/rsCpuScript.cpp b/cpu_ref/rsCpuScript.cpp
index 06ce4bb..e79a675 100644
--- a/cpu_ref/rsCpuScript.cpp
+++ b/cpu_ref/rsCpuScript.cpp
@@ -211,6 +211,17 @@
         if (mtls->yStart >= mtls->yEnd) return;
     }
 
+    if (!sc || (sc->zEnd == 0)) {
+        mtls->zEnd = mtls->fep.dimZ;
+    } else {
+        rsAssert(sc->zStart < mtls->fep.dimZ);
+        rsAssert(sc->zEnd <= mtls->fep.dimZ);
+        rsAssert(sc->zStart < sc->zEnd);
+        mtls->zStart = rsMin(mtls->fep.dimZ, sc->zStart);
+        mtls->zEnd = rsMin(mtls->fep.dimZ, sc->zEnd);
+        if (mtls->zStart >= mtls->zEnd) return;
+    }
+
     mtls->xEnd = rsMax((uint32_t)1, mtls->xEnd);
     mtls->yEnd = rsMax((uint32_t)1, mtls->yEnd);
     mtls->zEnd = rsMax((uint32_t)1, mtls->zEnd);
diff --git a/rs.spec b/rs.spec
index 024497e..ddd85f4 100644
--- a/rs.spec
+++ b/rs.spec
@@ -319,6 +319,7 @@
     param RsAllocation ain
     param RsAllocation aout
     param const void * usr
+    param const RsScriptCall * sc
 }
 
 ScriptSetVarI {
diff --git a/rsScript.cpp b/rsScript.cpp
index 9bbc2ba..f23d107 100644
--- a/rsScript.cpp
+++ b/rsScript.cpp
@@ -163,11 +163,12 @@
 
 void rsi_ScriptForEach(Context *rsc, RsScript vs, uint32_t slot,
                        RsAllocation vain, RsAllocation vaout,
-                       const void *params, size_t paramLen) {
+                       const void *params, size_t paramLen,
+                       const RsScriptCall *sc, size_t scLen) {
     Script *s = static_cast<Script *>(vs);
     s->runForEach(rsc, slot,
                   static_cast<const Allocation *>(vain), static_cast<Allocation *>(vaout),
-                  params, paramLen);
+                  params, paramLen, sc);
 
 }