Add colored rectangles implementation in OpenGLRenderer.

Drawing two rectangles one after the other discards the second one because of
Z buffering issues. This will be fixed in another changelist.

Change-Id: Ida1b3cde8a78e60cacc07e477abc44def527ff67
diff --git a/core/jni/android_view_GLES20Canvas.cpp b/core/jni/android_view_GLES20Canvas.cpp
index 1ca172d..95476eb 100644
--- a/core/jni/android_view_GLES20Canvas.cpp
+++ b/core/jni/android_view_GLES20Canvas.cpp
@@ -22,9 +22,22 @@
 #include <SkXfermode.h>
 
 #include <OpenGLRenderer.h>
+#include <Rect.h>
+#include <ui/Rect.h>
 
 namespace android {
 
+using namespace uirenderer;
+
+// ----------------------------------------------------------------------------
+// Java APIs
+// ----------------------------------------------------------------------------
+
+static struct {
+	jclass clazz;
+	jmethodID set;
+} gRectClassInfo;
+
 // ----------------------------------------------------------------------------
 // Constructors
 // ----------------------------------------------------------------------------
@@ -90,6 +103,17 @@
     return renderer->clipRect(float(left), float(top), float(right), float(bottom));
 }
 
+static bool android_view_GLES20Renderer_getClipBounds(JNIEnv* env, jobject canvas,
+        OpenGLRenderer* renderer, jobject rect) {
+
+	const android::uirenderer::Rect& bounds(renderer->getClipBounds());
+
+	env->CallVoidMethod(rect, gRectClassInfo.set,
+			int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom));
+
+	return !bounds.isEmpty();
+}
+
 // ----------------------------------------------------------------------------
 // Transforms
 // ----------------------------------------------------------------------------
@@ -153,6 +177,9 @@
     {   "nClipRect",          "(IFFFF)Z", (void*) android_view_GLES20Renderer_clipRectF },
     {   "nClipRect",          "(IIIII)Z", (void*) android_view_GLES20Renderer_clipRect },
 
+    {   "nGetClipBounds",     "(ILandroid/graphics/Rect;)Z",
+    		(void*) android_view_GLES20Renderer_getClipBounds },
+
     {   "nTranslate",         "(IFF)V",   (void*) android_view_GLES20Renderer_translate },
     {   "nRotate",            "(IF)V",    (void*) android_view_GLES20Renderer_rotate },
     {   "nScale",             "(IFF)V",   (void*) android_view_GLES20Renderer_scale },
@@ -164,7 +191,19 @@
     {   "nDrawColor",         "(III)V",   (void*) android_view_GLES20Renderer_drawColor },
 };
 
+#define FIND_CLASS(var, className) \
+        var = env->FindClass(className); \
+        LOG_FATAL_IF(! var, "Unable to find class " className); \
+        var = jclass(env->NewGlobalRef(var));
+
+#define GET_METHOD_ID(var, clazz, methodName, methodDescriptor) \
+        var = env->GetMethodID(clazz, methodName, methodDescriptor); \
+        LOG_FATAL_IF(! var, "Unable to find method " methodName);
+
 int register_android_view_GLES20Canvas(JNIEnv* env) {
+	FIND_CLASS(gRectClassInfo.clazz, "android/graphics/Rect");
+	GET_METHOD_ID(gRectClassInfo.set, gRectClassInfo.clazz, "set", "(IIII)V");
+
     return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
 }