Reduced the complexity of layers composition.

This change also refactors the code base a bit by moving classes out of
OpenGLRenderer into separate headers/implementations. This makes the code
more manageable.

This change also adds documentation for implementation methods. The
undocumented methods are simply Skia's Canvas methods.

Change-Id: I54c68b443580a0129251dddc1a7ac95813d5289e
diff --git a/libs/hwui/Program.h b/libs/hwui/Program.h
new file mode 100644
index 0000000..ee16a92
--- /dev/null
+++ b/libs/hwui/Program.h
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2010 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.
+ */
+
+#ifndef ANDROID_UI_PROGRAM_H
+#define ANDROID_UI_PROGRAM_H
+
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
+
+#include <utils/KeyedVector.h>
+#include <utils/RefBase.h>
+
+namespace android {
+namespace uirenderer {
+
+/**
+ * A program holds a vertex and a fragment shader. It offers several utility
+ * methods to query attributes and uniforms.
+ */
+class Program: public LightRefBase<Program> {
+public:
+    /**
+     * Creates a new program with the specified vertex and fragment
+     * shaders sources.
+     */
+    Program(const char* vertex, const char* fragment);
+    ~Program();
+
+    /**
+     * Binds this program to the GL context.
+     */
+    void use();
+
+protected:
+    /**
+     * Adds an attribute with the specified name.
+     *
+     * @return The OpenGL name of the attribute.
+     */
+    int addAttrib(const char* name);
+    /**
+     * Returns the OpenGL name of the specified attribute.
+     */
+    int getAttrib(const char* name);
+
+    /**
+     * Adds a uniform with the specified name.
+     *
+     * @return The OpenGL name of the uniform.
+     */
+    int addUniform(const char* name);
+    /**
+     * Returns the OpenGL name of the specified uniform.
+     */
+    int getUniform(const char* name);
+
+private:
+    /**
+     * Compiles the specified shader of the specified type.
+     *
+     * @return The name of the compiled shader.
+     */
+    GLuint buildShader(const char* source, GLenum type);
+
+    // Name of the OpenGL program
+    GLuint id;
+
+    // Name of the shaders
+    GLuint vertexShader;
+    GLuint fragmentShader;
+
+    // Keeps track of attributes and uniforms slots
+    KeyedVector<const char*, int> attributes;
+    KeyedVector<const char*, int> uniforms;
+}; // class Program
+
+/**
+ * Program used to draw vertices with a simple color. The shaders must
+ * specify the following attributes:
+ *      vec4 position, position of the vertex
+ *      vec4 color, RGBA color of the vertex
+ *
+ * And the following uniforms:
+ *      mat4 projection, the projection matrix
+ *      mat4 modelView, the modelView matrix
+ *      mat4 transform, an extra transformation matrix
+ */
+class DrawColorProgram: public Program {
+public:
+    DrawColorProgram();
+    DrawColorProgram(const char* vertex, const char* fragment);
+
+    /**
+     * Binds the program with the specified projection, modelView and
+     * transform matrices.
+     */
+    void use(const GLfloat* projectionMatrix, const GLfloat* modelViewMatrix,
+             const GLfloat* transformMatrix);
+
+    /**
+     * Name of the position attribute.
+     */
+    int position;
+    /**
+     * Name of the color attribute.
+     */
+    int color;
+
+    /**
+     * Name of the projection uniform.
+     */
+    int projection;
+    /**
+     * Name of the modelView uniform.
+     */
+    int modelView;
+    /**
+     * Name of the transform uniform.
+     */
+    int transform;
+
+protected:
+    void getAttribsAndUniforms();
+};
+
+/**
+ * Program used to draw textured vertices. In addition to everything that the
+ * DrawColorProgram supports, the following two attributes must be specified:
+ *      sampler2D sampler, the texture sampler
+ *      vec2 texCoords, the texture coordinates of the vertex
+ */
+class DrawTextureProgram: public DrawColorProgram {
+public:
+    DrawTextureProgram();
+
+    int sampler;
+    int texCoords;
+};
+
+}; // namespace uirenderer
+}; // namespace android
+
+#endif // ANDROID_UI_PROGRAM_H