Remove internal element builder and vector code.

Remove additional String8 references from shared includes.

Change-Id: Iede11384b9fc5a303d15d47fd4074c800dc6ad5f
diff --git a/Android.mk b/Android.mk
index 6e4917d..eaed350 100644
--- a/Android.mk
+++ b/Android.mk
@@ -117,6 +117,7 @@
 	rsAnimation.cpp \
 	rsComponent.cpp \
 	rsContext.cpp \
+	rsCppUtils.cpp \
 	rsDevice.cpp \
 	rsElement.cpp \
 	rsFBOCache.cpp \
diff --git a/rsCppUtils.cpp b/rsCppUtils.cpp
new file mode 100644
index 0000000..899e7c9
--- /dev/null
+++ b/rsCppUtils.cpp
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2013 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.
+ */
+
+
+
+#include "rsCppUtils.h"
+
+namespace android {
+namespace renderscript {
+
+const char * rsuCopyString(const char *name) {
+    return rsuCopyString(name, strlen(name));
+}
+
+const char * rsuCopyString(const char *name, size_t len) {
+    char *n = new char[len+1];
+    memcpy(n, name, len);
+    n[len] = 0;
+    return n;
+}
+
+
+}
+}
diff --git a/rsCppUtils.h b/rsCppUtils.h
index f16325f..342baf5 100644
--- a/rsCppUtils.h
+++ b/rsCppUtils.h
@@ -124,6 +124,9 @@
 namespace android {
 namespace renderscript {
 
+const char * rsuCopyString(const char *name);
+const char * rsuCopyString(const char *name, size_t len);
+
 #if 1
 #define rsAssert(v) do {if(!(v)) ALOGE("rsAssert failed: %s, in %s at %i", #v, __FILE__, __LINE__);} while (0)
 #else
diff --git a/rsElement.cpp b/rsElement.cpp
index 712f17d..559d567 100644
--- a/rsElement.cpp
+++ b/rsElement.cpp
@@ -262,10 +262,21 @@
         if (ee->getFieldCount() == count) {
             bool match = true;
             for (uint32_t i=0; i < count; i++) {
+                size_t len;
+                uint32_t asize = 1;
+                if (lengths) {
+                    len = lengths[i];
+                } else {
+                    len = strlen(nin[i]);
+                }
+                if (asin) {
+                    asize = asin[i];
+                }
+
                 if ((ee->mFields[i].e.get() != ein[i]) ||
-                    (ee->mFields[i].name.length() != lengths[i]) ||
+                    (ee->mFields[i].name.length() != len) ||
                     (ee->mFields[i].name != nin[i]) ||
-                    (ee->mFields[i].arraySize != asin[i])) {
+                    (ee->mFields[i].arraySize != asize)) {
                     match = false;
                     break;
                 }
@@ -284,9 +295,20 @@
     e->mFields = new ElementField_t [count];
     e->mFieldCount = count;
     for (size_t ct=0; ct < count; ct++) {
+        size_t len;
+        uint32_t asize = 1;
+        if (lengths) {
+            len = lengths[ct];
+        } else {
+            len = strlen(nin[ct]);
+        }
+        if (asin) {
+            asize = asin[ct];
+        }
+
         e->mFields[ct].e.set(ein[ct]);
-        e->mFields[ct].name.setTo(nin[ct], lengths[ct]);
-        e->mFields[ct].arraySize = asin[ct];
+        e->mFields[ct].name.setTo(nin[ct], len);
+        e->mFields[ct].arraySize = asize;
     }
     e->compute();
 
@@ -341,33 +363,6 @@
     }
 }
 
-Element::Builder::Builder() {
-    const uint32_t initialCapacity = 32;
-    mBuilderElementRefs.setCapacity(initialCapacity);
-    mBuilderElements.setCapacity(initialCapacity);
-    mBuilderNameStrings.setCapacity(initialCapacity);
-    mBuilderNameLengths.setCapacity(initialCapacity);
-    mBuilderArrays.setCapacity(initialCapacity);
-}
-
-void Element::Builder::add(const Element *e, const char *nameStr, uint32_t arraySize) {
-    mBuilderElementRefs.push(ObjectBaseRef<const Element>(e));
-    mBuilderElements.push(e);
-    mBuilderNameStrings.push(nameStr);
-    mBuilderNameLengths.push(strlen(nameStr));
-    mBuilderArrays.push(arraySize);
-
-}
-
-ObjectBaseRef<const Element> Element::Builder::create(Context *rsc) {
-    return Element::createRef(rsc, mBuilderElements.size(),
-                              &(mBuilderElements.editArray()[0]),
-                              &(mBuilderNameStrings.editArray()[0]),
-                              mBuilderNameLengths.editArray(),
-                              mBuilderArrays.editArray());
-}
-
-
 ElementState::ElementState() {
 }
 
diff --git a/rsElement.h b/rsElement.h
index 1eae46d..32cfda1 100644
--- a/rsElement.h
+++ b/rsElement.h
@@ -57,18 +57,6 @@
     };
     Hal mHal;
 
-    class Builder {
-    public:
-        Builder();
-        void add(const Element *e, const char *nameStr, uint32_t arraySize);
-        ObjectBaseRef<const Element> create(Context *rsc);
-    private:
-        Vector<ObjectBaseRef<const Element> > mBuilderElementRefs;
-        Vector<const Element *> mBuilderElements;
-        Vector<const char*> mBuilderNameStrings;
-        Vector<size_t> mBuilderNameLengths;
-        Vector<uint32_t> mBuilderArrays;
-    };
     uint32_t getGLType() const;
     uint32_t getGLFormat() const;
 
@@ -133,8 +121,8 @@
     static const Element* create(Context *rsc, size_t count,
                                  const Element **ein,
                                  const char **nin,
-                                 const size_t * lengths,
-                                 const uint32_t *asin) {
+                                 const size_t * lengths = NULL,
+                                 const uint32_t *asin = NULL) {
         ObjectBaseRef<const Element> elem = createRef(rsc, count, ein, nin, lengths, asin);
         elem->incUserRef();
         return elem.get();
diff --git a/rsFont.cpp b/rsFont.cpp
index 2a2c3b4..a483359 100644
--- a/rsFont.cpp
+++ b/rsFont.cpp
@@ -508,10 +508,10 @@
                                                                 RS_KIND_USER, false, 4);
     ObjectBaseRef<const Element> gammaElem = Element::createRef(mRSC, RS_TYPE_FLOAT_32,
                                                                 RS_KIND_USER, false, 1);
-    Element::Builder builder;
-    builder.add(colorElem.get(), "Color", 1);
-    builder.add(gammaElem.get(), "Gamma", 1);
-    ObjectBaseRef<const Element> constInput = builder.create(mRSC);
+
+    const char *ebn1[] = { "Color", "Gamma" };
+    const Element *ebe1[] = {colorElem.get(), gammaElem.get()};
+    ObjectBaseRef<const Element> constInput = Element::create(mRSC, 2, ebe1, ebn1);
 
     ObjectBaseRef<Type> inputType = Type::getTypeRef(mRSC, constInput.get(), 1, 0, 0, false, false, 0);
 
@@ -607,10 +607,9 @@
     ObjectBaseRef<const Element> posElem = Element::createRef(mRSC, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 3);
     ObjectBaseRef<const Element> texElem = Element::createRef(mRSC, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 2);
 
-    Element::Builder builder;
-    builder.add(posElem.get(), "position", 1);
-    builder.add(texElem.get(), "texture0", 1);
-    ObjectBaseRef<const Element> vertexDataElem = builder.create(mRSC);
+    const char *ebn1[] = { "position", "texture0" };
+    const Element *ebe1[] = {posElem.get(), texElem.get()};
+    ObjectBaseRef<const Element> vertexDataElem = Element::create(mRSC, 2, ebe1, ebn1);
 
     ObjectBaseRef<Type> vertexDataType = Type::getTypeRef(mRSC, vertexDataElem.get(),
                                                           mMaxNumberOfQuads * 4,
diff --git a/rsProgram.cpp b/rsProgram.cpp
index 7114f29..806d1de 100644
--- a/rsProgram.cpp
+++ b/rsProgram.cpp
@@ -77,7 +77,9 @@
         shaderText += internalTokenLen;
         shaderLength -= internalTokenLen;
     }
-    mUserShader.setTo(shaderText, shaderLength);
+
+    mUserShader = rsuCopyString(shaderText, shaderLength);
+    mUserShaderLen = shaderLength;
 }
 
 Program::~Program() {
@@ -98,6 +100,12 @@
     mHal.state.inputElementsCount = 0;
     mHal.state.constantsCount = 0;
     mHal.state.texturesCount = 0;
+
+    if (mUserShader != NULL) {
+        delete[] mUserShader;
+        mUserShader = NULL;
+    }
+    mUserShaderLen = 0;
 }
 
 bool Program::freeChildren() {
@@ -134,6 +142,9 @@
     mConstants = NULL;
 
     mIsInternal = false;
+
+    mUserShader = NULL;
+    mUserShaderLen = 0;
 }
 
 void Program::bindAllocation(Context *rsc, Allocation *alloc, uint32_t slot) {
diff --git a/rsProgram.h b/rsProgram.h
index d032930..be5631f 100644
--- a/rsProgram.h
+++ b/rsProgram.h
@@ -78,7 +78,8 @@
     ObjectBaseRef<Element> *mInputElements;
 
     bool mIsInternal;
-    String8 mUserShader;
+    const char *mUserShader;
+    size_t mUserShaderLen;
     void initMemberVars();
 };
 
diff --git a/rsProgramFragment.cpp b/rsProgramFragment.cpp
index fb00cd1..877b8bd 100644
--- a/rsProgramFragment.cpp
+++ b/rsProgramFragment.cpp
@@ -30,7 +30,7 @@
     mConstantColor[2] = 1.f;
     mConstantColor[3] = 1.f;
 
-    mRSC->mHal.funcs.fragment.init(mRSC, this, mUserShader.string(), mUserShader.length(),
+    mRSC->mHal.funcs.fragment.init(mRSC, this, mUserShader, mUserShaderLen,
                                    textureNames, textureNamesCount, textureNamesLength);
 }
 
@@ -103,9 +103,10 @@
             "}\n";
 
     ObjectBaseRef<const Element> colorElem = Element::createRef(rsc, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 4);
-    Element::Builder builder;
-    builder.add(colorElem.get(), "Color", 1);
-    ObjectBaseRef<const Element> constInput = builder.create(rsc);
+
+    const char *enames[] = { "Color" };
+    const Element *eins[] = {colorElem.get()};
+    ObjectBaseRef<const Element> constInput = Element::create(rsc, 1, eins, enames);
 
     ObjectBaseRef<Type> inputType = Type::getTypeRef(rsc, constInput.get(), 1, 0, 0, false, false, 0);
 
diff --git a/rsProgramVertex.cpp b/rsProgramVertex.cpp
index 30000b0..549dcae 100644
--- a/rsProgramVertex.cpp
+++ b/rsProgramVertex.cpp
@@ -27,7 +27,7 @@
 
                              const uint32_t * params, size_t paramLength)
     : Program(rsc, shaderText, shaderLength, params, paramLength) {
-    mRSC->mHal.funcs.vertex.init(mRSC, this, mUserShader.string(), mUserShader.length(),
+    mRSC->mHal.funcs.vertex.init(mRSC, this, mUserShader, mUserShaderLen,
                                  textureNames, textureNamesCount, textureNamesLength);
 }
 
@@ -174,19 +174,14 @@
     ObjectBaseRef<const Element> f4Elem = Element::createRef(rsc, RS_TYPE_FLOAT_32,
                                                              RS_KIND_USER, false, 4);
 
-    Element::Builder constBuilder;
-    constBuilder.add(matrixElem.get(), "MV", 1);
-    constBuilder.add(matrixElem.get(), "P", 1);
-    constBuilder.add(matrixElem.get(), "TexMatrix", 1);
-    constBuilder.add(matrixElem.get(), "MVP", 1);
-    ObjectBaseRef<const Element> constInput = constBuilder.create(rsc);
+    const char *ebn1[] = { "MV", "P", "TexMatrix", "MVP" };
+    const Element *ebe1[] = {matrixElem.get(), matrixElem.get(),
+            matrixElem.get(), matrixElem.get()};
+    ObjectBaseRef<const Element> constInput = Element::create(rsc, 4, ebe1, ebn1);
 
-    Element::Builder inputBuilder;
-    inputBuilder.add(f4Elem.get(), "position", 1);
-    inputBuilder.add(f4Elem.get(), "color", 1);
-    inputBuilder.add(f3Elem.get(), "normal", 1);
-    inputBuilder.add(f2Elem.get(), "texture0", 1);
-    ObjectBaseRef<const Element> attrElem = inputBuilder.create(rsc);
+    const char *ebn2[] = { "position", "color", "normal", "texture0" };
+    const Element *ebe2[] = {f4Elem.get(), f4Elem.get(), f3Elem.get(), f2Elem.get()};
+    ObjectBaseRef<const Element> attrElem = Element::create(rsc, 4, ebe2, ebn2);
 
     ObjectBaseRef<Type> inputType = Type::getTypeRef(rsc, constInput.get(), 1, 0, 0, false, false, 0);