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));
}