Create a ColorTexture to draw pure color in GL.

Change-Id: I9dfa69b6037397d01a43c976b2d02acb16f2af62
diff --git a/res/drawable-hdpi/ic_viewfinder_iconbar_highlight.9.png b/res/drawable-hdpi/ic_viewfinder_iconbar_highlight.9.png
deleted file mode 100644
index 1b08fdf..0000000
--- a/res/drawable-hdpi/ic_viewfinder_iconbar_highlight.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/optionheader_background.9.png b/res/drawable-hdpi/optionheader_background.9.png
deleted file mode 100644
index 22991e7..0000000
--- a/res/drawable-hdpi/optionheader_background.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/optionitem_highlight.9.png b/res/drawable-hdpi/optionitem_highlight.9.png
deleted file mode 100644
index 3a17a86..0000000
--- a/res/drawable-hdpi/optionitem_highlight.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_viewfinder_iconbar_highlight.9.png b/res/drawable-mdpi/ic_viewfinder_iconbar_highlight.9.png
deleted file mode 100644
index 1b08fdf..0000000
--- a/res/drawable-mdpi/ic_viewfinder_iconbar_highlight.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/optionheader_background.9.png b/res/drawable-mdpi/optionheader_background.9.png
deleted file mode 100644
index 22991e7..0000000
--- a/res/drawable-mdpi/optionheader_background.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/optionitem_highlight.9.png b/res/drawable-mdpi/optionitem_highlight.9.png
deleted file mode 100644
index 3a17a86..0000000
--- a/res/drawable-mdpi/optionitem_highlight.9.png
+++ /dev/null
Binary files differ
diff --git a/src/com/android/camera/ui/BasicIndicator.java b/src/com/android/camera/ui/BasicIndicator.java
index dc52af7..513b20d 100644
--- a/src/com/android/camera/ui/BasicIndicator.java
+++ b/src/com/android/camera/ui/BasicIndicator.java
@@ -9,6 +9,7 @@
 import com.android.camera.ui.GLListView.OnItemSelectedListener;
 
 class BasicIndicator extends AbstractIndicator {
+    private static final int COLOR_OPTION_ITEM_HIGHLIGHT = 0xFF181818;
 
     private final ResourceTexture mIcon[];
     private final IconListPreference mPreference;
@@ -56,8 +57,8 @@
         if (mPopupContent == null) {
             Context context = getGLRootView().getContext();
             mPopupContent = new GLListView(context);
-            mPopupContent.setHighLight(new NinePatchTexture(
-                    context, R.drawable.optionitem_highlight));
+            mPopupContent.setHighLight(
+                    new ColorTexture(COLOR_OPTION_ITEM_HIGHLIGHT));
             mPopupContent.setScroller(new NinePatchTexture(
                     context, R.drawable.scrollbar_handle_vertical));
             mModel = new PreferenceAdapter(context, mPreference);
diff --git a/src/com/android/camera/ui/ColorTexture.java b/src/com/android/camera/ui/ColorTexture.java
new file mode 100644
index 0000000..9054d8f
--- /dev/null
+++ b/src/com/android/camera/ui/ColorTexture.java
@@ -0,0 +1,34 @@
+package com.android.camera.ui;
+
+import android.graphics.Bitmap;
+import android.graphics.Rect;
+
+class ColorTexture extends FrameTexture {
+
+    private static final Rect EMPTY_PADDINGS = new Rect();
+    private int mColor;
+
+    public ColorTexture(int color) {
+        mColor = color;
+    }
+
+    @Override
+    public Rect getPaddings() {
+        return EMPTY_PADDINGS;
+    }
+
+    @Override
+    protected void freeBitmap(Bitmap bitmap) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    protected Bitmap getBitmap() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void draw(GLRootView root, int x, int y) {
+        root.drawColor(x, y, mWidth, mHeight, mColor);
+    }
+}
diff --git a/src/com/android/camera/ui/GLListView.java b/src/com/android/camera/ui/GLListView.java
index c4a607c..020d6c0 100644
--- a/src/com/android/camera/ui/GLListView.java
+++ b/src/com/android/camera/ui/GLListView.java
@@ -32,7 +32,7 @@
     private int mHighlightIndex = INDEX_NONE;
     private GLView mHighlightView;
 
-    private NinePatchTexture mHighLight;
+    private FrameTexture mHighLight;
     private NinePatchTexture mScrollbar;
 
     private int mVisibleStart = 0; // inclusive
@@ -109,7 +109,7 @@
         invalidate();
     }
 
-    public void setHighLight(NinePatchTexture highLight) {
+    public void setHighLight(FrameTexture highLight) {
         mHighLight = highLight;
     }
 
diff --git a/src/com/android/camera/ui/GLOptionHeader.java b/src/com/android/camera/ui/GLOptionHeader.java
index a922026..01914e2 100644
--- a/src/com/android/camera/ui/GLOptionHeader.java
+++ b/src/com/android/camera/ui/GLOptionHeader.java
@@ -4,8 +4,6 @@
 import android.content.Context;
 import android.graphics.Rect;
 
-import com.android.camera.R;
-
 import javax.microedition.khronos.opengles.GL11;
 
 class GLOptionHeader extends GLView {
@@ -13,12 +11,13 @@
     private static final float FONT_SIZE = 12;
     private static final int HORIZONTAL_PADDINGS = 4;
     private static final int VERTICAL_PADDINGS = 2;
+    private static final int COLOR_OPTION_HEADER = 0xFF2B2B2B;
 
     private static int sHorizontalPaddings = -1;
     private static int sVerticalPaddings;
 
     private final StringTexture mTitle;
-    private NinePatchTexture mBackground;
+    private FrameTexture mBackground;
 
     private static void initializeStaticVariables(Context context) {
         if (sHorizontalPaddings >= 0) return;
@@ -31,13 +30,12 @@
 
         float fontSize = GLRootView.dpToPixel(context, FONT_SIZE);
         mTitle = StringTexture.newInstance(title, fontSize, FONT_COLOR);
-        setBackground(new NinePatchTexture(
-                context, R.drawable.optionheader_background));
+        setBackground(new ColorTexture(COLOR_OPTION_HEADER));
         setPaddings(sHorizontalPaddings,
                 sVerticalPaddings, sHorizontalPaddings, sVerticalPaddings);
     }
 
-    public void setBackground(NinePatchTexture background) {
+    public void setBackground(FrameTexture background) {
         if (mBackground == background) return;
         mBackground = background;
         invalidate();
diff --git a/src/com/android/camera/ui/GLRootView.java b/src/com/android/camera/ui/GLRootView.java
index 0bbc3ed..97d236f 100644
--- a/src/com/android/camera/ui/GLRootView.java
+++ b/src/com/android/camera/ui/GLRootView.java
@@ -4,6 +4,7 @@
 
 import android.app.Activity;
 import android.content.Context;
+import android.graphics.Color;
 import android.graphics.Matrix;
 import android.graphics.PixelFormat;
 import android.opengl.GLSurfaceView;
@@ -47,6 +48,8 @@
     private static final int FLAG_INITIALIZED = 1;
     private static final int FLAG_NEED_LAYOUT = 2;
 
+    private static boolean mTexture2DEnabled;
+
     private static float sPixelDensity = -1f;
 
     private GL11 mGL;
@@ -237,6 +240,7 @@
         gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
         gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
         gl.glEnable(GL11.GL_TEXTURE_2D);
+        mTexture2DEnabled = true;
 
         gl.glTexEnvf(GL11.GL_TEXTURE_ENV,
                 GL11.GL_TEXTURE_ENV_MODE, GL11.GL_REPLACE);
@@ -288,14 +292,13 @@
     public void drawRect(int x, int y, int width, int height) {
         float matrix[] = mMatrixValues;
         mTransformation.getMatrix().getValues(matrix);
-        drawRect(x, y, width, height, matrix, mTransformation.getAlpha());
+        drawRect(x, y, width, height, matrix);
     }
 
     private void drawRect(
-            int x, int y, int width, int height, float matrix[], float alpha) {
+            int x, int y, int width, int height, float matrix[]) {
         GL11 gl = mGL;
         gl.glPushMatrix();
-        setAlphaValue(alpha);
         gl.glMultMatrixf(toGLMatrix(matrix), 0);
         gl.glTranslatef(x, y, 0);
         gl.glScalef(width, height, 1);
@@ -303,12 +306,6 @@
         gl.glPopMatrix();
     }
 
-    public void drawRect(int x, int y, int width, int height, float alpha) {
-        float matrix[] = mMatrixValues;
-        mTransformation.getMatrix().getValues(matrix);
-        drawRect(x, y, width, height, matrix, alpha);
-    }
-
     private float[] mapPoints(Matrix matrix, int x1, int y1, int x2, int y2) {
         float[] point = mPointBuffer;
         point[0] = x1; point[1] = y1; point[2] = x2; point[3] = y2;
@@ -351,9 +348,34 @@
         return v;
     }
 
+    public void drawColor(int x, int y, int width, int height, int color) {
+        drawColor(x, y, width, height, color, mTransformation.getAlpha());
+    }
+
+    public void drawColor(int x, int y,
+            int width, int height, int color, float alpha) {
+        GL11 gl = mGL;
+        if (mTexture2DEnabled) {
+            // Set mLastAlpha to an invalid value, so that it will reset again
+            // in setAlphaValue(float) later.
+            mLastAlpha = -1.0f;
+            mGL.glDisable(GL11.GL_TEXTURE_2D);
+            mTexture2DEnabled = false;
+        }
+        alpha /= 256.0f;
+        gl.glColor4f(Color.red(color) * alpha, Color.green(color) * alpha,
+                Color.blue(color) * alpha, Color.alpha(color) * alpha);
+        drawRect(x, y, width, height);
+    }
+
     public void drawTexture(
             Texture texture, int x, int y, int width, int height, float alpha) {
 
+        if (!mTexture2DEnabled) {
+            mGL.glEnable(GL11.GL_TEXTURE_2D);
+            mTexture2DEnabled = true;
+        }
+
         if (!texture.bind(this, mGL)) {
             throw new RuntimeException("cannot bind" + texture.toString());
         }
@@ -367,7 +389,8 @@
         if (isMatrixRotatedOrFlipped(mMatrixValues)) {
             texture.getTextureCoords(mCoordBuffer, 0);
             mTexCoordBuffer.asFloatBuffer().put(mCoordBuffer).position(0);
-            drawRect(x, y, width, height, mMatrixValues, alpha);
+            setAlphaValue(alpha);
+            drawRect(x, y, width, height, mMatrixValues);
         } else {
             // draw the rect from bottom-left to top-right
             float points[] = mapPoints(matrix, x, y + height, x + width, y);
diff --git a/src/com/android/camera/ui/HeadUpDisplay.java b/src/com/android/camera/ui/HeadUpDisplay.java
index 819fde7..3275d22 100644
--- a/src/com/android/camera/ui/HeadUpDisplay.java
+++ b/src/com/android/camera/ui/HeadUpDisplay.java
@@ -35,6 +35,8 @@
     private static final int POPUP_WINDOW_OVERLAP = 20;
     private static final int POPUP_TRIANGLE_OFFSET = 16;
 
+    private static final int COLOR_ICONBAR_HIGHLIGHT = 0x9A2B2B2B;
+
     private static final float MAX_HEIGHT_RATIO = 0.8f;
     private static final float MAX_WIDTH_RATIO = 0.8f;
 
@@ -322,8 +324,7 @@
 
         mIndicatorBar.setBackground(new NinePatchTexture(
                 context, R.drawable.ic_viewfinder_iconbar));
-        mIndicatorBar.setHighlight(new NinePatchTexture(
-                context, R.drawable.ic_viewfinder_iconbar_highlight));
+        mIndicatorBar.setHighlight(new ColorTexture(COLOR_ICONBAR_HIGHLIGHT));
         addComponent(mIndicatorBar);
         mIndicatorBar.setOnItemSelectedListener(new IndicatorBarListener());
     }
diff --git a/src/com/android/camera/ui/IndicatorBar.java b/src/com/android/camera/ui/IndicatorBar.java
index 0b29c23..294e83a 100644
--- a/src/com/android/camera/ui/IndicatorBar.java
+++ b/src/com/android/camera/ui/IndicatorBar.java
@@ -12,7 +12,7 @@
     public static final int INDEX_NONE = -1;
 
     private NinePatchTexture mBackground;
-    private NinePatchTexture mHighlight;
+    private FrameTexture mHighlight;
     private int mSelectedIndex = INDEX_NONE;
 
     private OnItemSelectedListener mSelectedListener;
@@ -69,7 +69,7 @@
         invalidate();
     }
 
-    public void setHighlight(NinePatchTexture highlight) {
+    public void setHighlight(FrameTexture highlight) {
         if (mHighlight == highlight) return;
         mHighlight = highlight;
         invalidate();
diff --git a/src/com/android/camera/ui/OtherSettingsIndicator.java b/src/com/android/camera/ui/OtherSettingsIndicator.java
index 807143f..178cb7f 100644
--- a/src/com/android/camera/ui/OtherSettingsIndicator.java
+++ b/src/com/android/camera/ui/OtherSettingsIndicator.java
@@ -8,6 +8,7 @@
 import java.util.HashMap;
 
 class OtherSettingsIndicator extends AbstractIndicator {
+    private static final int COLOR_OPTION_ITEM_HIGHLIGHT = 0xFF181818;
 
     private final ListPreference mPreference[];
     private final GLListView.Model mAdapters[];
@@ -81,8 +82,8 @@
         if (mPopupContent == null) {
             Context context = getGLRootView().getContext();
             mPopupContent = new GLListView(context);
-            mPopupContent.setHighLight(new NinePatchTexture(
-                    context, R.drawable.optionitem_highlight));
+            mPopupContent.setHighLight(
+                    new ColorTexture(COLOR_OPTION_ITEM_HIGHLIGHT));
             mPopupContent.setScroller(new NinePatchTexture(
                     context, R.drawable.scrollbar_handle_vertical));
             UberAdapter adapter = buildUberAdapter();
diff --git a/src/com/android/camera/ui/ZoomIndicator.java b/src/com/android/camera/ui/ZoomIndicator.java
index c115f25..4e63088 100644
--- a/src/com/android/camera/ui/ZoomIndicator.java
+++ b/src/com/android/camera/ui/ZoomIndicator.java
@@ -11,6 +11,7 @@
     private static final DecimalFormat sZoomFormat = new DecimalFormat("#.#x");
     private static final float FONT_SIZE = 18;
     private static final int FONT_COLOR = 0xA8FFFFFF;
+    private static final int COLOR_OPTION_HEADER = 0xFF2B2B2B;
 
     protected static final String TAG = "ZoomIndicator";
 
@@ -70,8 +71,7 @@
             mPopupContent = new LinearLayout();
             GLOptionHeader header = new GLOptionHeader(context,
                     context.getString(R.string.zoom_control_title));
-            header.setBackground(new NinePatchTexture(
-                    context, R.drawable.optionheader_background));
+            header.setBackground(new ColorTexture(COLOR_OPTION_HEADER));
             header.setPaddings(6, 3, 6, 3);
             mPopupContent.addComponent(header);
             mPopupContent.addComponent(mZoomController);