Add program for linear gradient.

This change adds a new DrawLinearGradientProgram class to enable the drawing
of linear gradients. Two new vertex and fragment shaders are introduced,
based on DrawTextureProgram's shaders.

Change-Id: I885afc076bb6cef8cd3962ae21a086fa6a03bf96
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index 1431563..731862b 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -124,6 +124,7 @@
 
     mDrawColorProgram = new DrawColorProgram;
     mDrawTextureProgram = new DrawTextureProgram;
+    mDrawLinearGradientProgram = new DrawLinearGradientProgram;
     mCurrentProgram = mDrawTextureProgram;
 
     mShader = kShaderNone;
@@ -521,6 +522,7 @@
 
 void OpenGLRenderer::resetShader() {
     mShader = OpenGLRenderer::kShaderNone;
+    mShaderKey = NULL;
     mShaderBlend = false;
     mShaderTileX = SkShader::kClamp_TileMode;
     mShaderTileY = SkShader::kClamp_TileMode;
@@ -536,9 +538,11 @@
     mShaderMatrix = matrix;
 }
 
-void OpenGLRenderer::setupLinearGradientShader(float* bounds, uint32_t* colors,
+void OpenGLRenderer::setupLinearGradientShader(SkShader* shader, float* bounds,uint32_t* colors,
         float* positions, SkShader::TileMode tileMode, SkMatrix* matrix, bool hasAlpha) {
+    // TODO: We should use a struct to describe each shader
     mShader = OpenGLRenderer::kShaderLinearGradient;
+    mShaderKey = shader;
     mShaderBlend = hasAlpha;
     mShaderTileX = tileMode;
     mShaderTileY = tileMode;