summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/java/android/view/GLES20Canvas.java17
-rw-r--r--core/java/android/view/HardwareRenderer.java46
-rw-r--r--core/jni/Android.mk10
-rw-r--r--core/jni/AndroidRuntime.cpp2
-rw-r--r--core/jni/android/graphics/Canvas.cpp13
-rw-r--r--core/jni/android/graphics/ColorFilter.cpp56
-rw-r--r--core/jni/android/graphics/Shader.cpp23
-rw-r--r--core/jni/android_view_GLES20Canvas.cpp46
-rw-r--r--core/jni/android_view_HardwareRenderer.cpp44
9 files changed, 118 insertions, 139 deletions
diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java
index 8e1338d..96bd884 100644
--- a/core/java/android/view/GLES20Canvas.java
+++ b/core/java/android/view/GLES20Canvas.java
@@ -40,7 +40,6 @@ import javax.microedition.khronos.opengles.GL;
/**
* An implementation of Canvas on top of OpenGL ES 2.0.
*/
-@SuppressWarnings({"deprecation"})
class GLES20Canvas extends Canvas {
@SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"})
private final GL mGl;
@@ -56,6 +55,17 @@ class GLES20Canvas extends Canvas {
private final Rect mClipBounds = new Rect();
private DrawFilter mFilter;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // JNI
+ ///////////////////////////////////////////////////////////////////////////
+
+ private static native boolean nIsAvailable();
+ private static boolean sIsAvailable = nIsAvailable();
+
+ static boolean isAvailable() {
+ return sIsAvailable;
+ }
///////////////////////////////////////////////////////////////////////////
// Constructors
@@ -91,11 +101,6 @@ class GLES20Canvas extends Canvas {
}
@Override
- public GL getGL() {
- throw new UnsupportedOperationException();
- }
-
- @Override
public void setBitmap(Bitmap bitmap) {
throw new UnsupportedOperationException();
}
diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java
index 090a743..60d495f 100644
--- a/core/java/android/view/HardwareRenderer.java
+++ b/core/java/android/view/HardwareRenderer.java
@@ -28,10 +28,6 @@ import javax.microedition.khronos.egl.EGLContext;
import javax.microedition.khronos.egl.EGLDisplay;
import javax.microedition.khronos.egl.EGLSurface;
import javax.microedition.khronos.opengles.GL;
-import javax.microedition.khronos.opengles.GL11;
-
-import static javax.microedition.khronos.opengles.GL10.GL_COLOR_BUFFER_BIT;
-import static javax.microedition.khronos.opengles.GL10.GL_SCISSOR_TEST;
/**
* Interface for rendering a ViewRoot using hardware acceleration.
@@ -110,10 +106,8 @@ abstract class HardwareRenderer {
*/
static HardwareRenderer createGlRenderer(int glVersion, boolean translucent) {
switch (glVersion) {
- case 1:
- return new Gl10Renderer(translucent);
case 2:
- return new Gl20Renderer(translucent);
+ return Gl20Renderer.create(translucent);
}
throw new IllegalArgumentException("Unknown GL version: " + glVersion);
}
@@ -520,43 +514,13 @@ abstract class HardwareRenderer {
@Override
void onPreDraw() {
mGlCanvas.onPreDraw();
- }
- }
-
- /**
- * Hardware renderer using OpenGL ES 1.0.
- */
- @SuppressWarnings({"deprecation"})
- static class Gl10Renderer extends GlRenderer {
- Gl10Renderer(boolean translucent) {
- super(1, translucent);
- }
-
- @Override
- Canvas createCanvas() {
- return new Canvas(mGl);
}
- @Override
- void destroy() {
- if (isEnabled()) {
- nativeAbandonGlCaches();
+ static HardwareRenderer create(boolean translucent) {
+ if (GLES20Canvas.isAvailable()) {
+ return new Gl20Renderer(translucent);
}
-
- super.destroy();
- }
-
- @Override
- void onPreDraw() {
- GL11 gl = (GL11) mGl;
- gl.glDisable(GL_SCISSOR_TEST);
- gl.glClearColor(0, 0, 0, 0);
- gl.glClear(GL_COLOR_BUFFER_BIT);
- gl.glEnable(GL_SCISSOR_TEST);
+ return null;
}
}
-
- // Inform Skia to just abandon its texture cache IDs doesn't call glDeleteTextures
- // Used only by the native Skia OpenGL ES 1.x implementation
- private static native void nativeAbandonGlCaches();
}
diff --git a/core/jni/Android.mk b/core/jni/Android.mk
index 77c77f9..d1a5ae1 100644
--- a/core/jni/Android.mk
+++ b/core/jni/Android.mk
@@ -19,6 +19,10 @@ ifneq ($(USE_CUSTOM_RUNTIME_HEAP_MAX),)
LOCAL_CFLAGS += -DCUSTOM_RUNTIME_HEAP_MAX=$(USE_CUSTOM_RUNTIME_HEAP_MAX)
endif
+ifeq ($(USE_OPENGL_RENDERER),true)
+ LOCAL_CFLAGS += -DUSE_OPENGL_RENDERER
+endif
+
LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES -DEGL_EGLEXT_PROTOTYPES
LOCAL_SRC_FILES:= \
@@ -47,7 +51,6 @@ LOCAL_SRC_FILES:= \
android_view_InputChannel.cpp \
android_view_InputQueue.cpp \
android_view_KeyEvent.cpp \
- android_view_HardwareRenderer.cpp \
android_view_GLES20Canvas.cpp \
android_view_MotionEvent.cpp \
android_text_AndroidCharacter.cpp \
@@ -170,7 +173,6 @@ LOCAL_SHARED_LIBRARIES := \
libbinder \
libnetutils \
libui \
- libhwui \
libgui \
libsurfaceflinger_client \
libcamera_client \
@@ -193,6 +195,10 @@ LOCAL_SHARED_LIBRARIES := \
libwpa_client \
libjpeg
+ifeq ($(USE_OPENGL_RENDERER),true)
+ LOCAL_SHARED_LIBRARIES += libhwui
+endif
+
ifeq ($(BOARD_HAVE_BLUETOOTH),true)
LOCAL_C_INCLUDES += \
external/dbus \
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 1e6d219..8b09e5f 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -115,7 +115,6 @@ extern int register_android_graphics_PixelFormat(JNIEnv* env);
extern int register_com_android_internal_graphics_NativeUtils(JNIEnv *env);
extern int register_android_view_Display(JNIEnv* env);
extern int register_android_view_GLES20Canvas(JNIEnv* env);
-extern int register_android_view_HardwareRenderer(JNIEnv* env);
extern int register_android_view_Surface(JNIEnv* env);
extern int register_android_view_ViewRoot(JNIEnv* env);
extern int register_android_database_CursorWindow(JNIEnv* env);
@@ -1244,7 +1243,6 @@ static const RegJNIRec gRegJNI[] = {
REG_JNI(register_android_graphics_PixelFormat),
REG_JNI(register_android_graphics_Graphics),
REG_JNI(register_android_view_GLES20Canvas),
- REG_JNI(register_android_view_HardwareRenderer),
REG_JNI(register_android_view_Surface),
REG_JNI(register_android_view_ViewRoot),
REG_JNI(register_com_google_android_gles_jni_EGLImpl),
diff --git a/core/jni/android/graphics/Canvas.cpp b/core/jni/android/graphics/Canvas.cpp
index 558f5ff..bf150a9 100644
--- a/core/jni/android/graphics/Canvas.cpp
+++ b/core/jni/android/graphics/Canvas.cpp
@@ -20,7 +20,6 @@
#include "SkCanvas.h"
#include "SkDevice.h"
-#include "SkGLCanvas.h"
#include "SkGraphics.h"
#include "SkImageRef_GlobalPool.h"
#include "SkPorterDuff.h"
@@ -67,13 +66,8 @@ public:
return bitmap ? new SkCanvas(*bitmap) : new SkCanvas;
}
- static SkCanvas* initGL(JNIEnv* env, jobject) {
- return new SkGLCanvas;
- }
-
static void freeCaches(JNIEnv* env, jobject) {
// these are called in no particular order
- SkGLCanvas::DeleteAllTextures();
SkImageRef_GlobalPool::SetRAMUsed(0);
SkGraphics::SetFontCacheUsed(0);
}
@@ -110,11 +104,6 @@ public:
return canvas->getDevice()->accessBitmap(false).height();
}
- static void setViewport(JNIEnv* env, jobject, SkCanvas* canvas,
- int width, int height) {
- canvas->setViewport(width, height);
- }
-
static void setBitmap(JNIEnv* env, jobject, SkCanvas* canvas,
SkBitmap* bitmap) {
canvas->setBitmapDevice(*bitmap);
@@ -880,12 +869,10 @@ public:
static JNINativeMethod gCanvasMethods[] = {
{"finalizer", "(I)V", (void*) SkCanvasGlue::finalizer},
{"initRaster","(I)I", (void*) SkCanvasGlue::initRaster},
- {"initGL","()I", (void*) SkCanvasGlue::initGL},
{"isOpaque","()Z", (void*) SkCanvasGlue::isOpaque},
{"getWidth","()I", (void*) SkCanvasGlue::getWidth},
{"getHeight","()I", (void*) SkCanvasGlue::getHeight},
{"native_setBitmap","(II)V", (void*) SkCanvasGlue::setBitmap},
- {"nativeSetViewport", "(III)V", (void*) SkCanvasGlue::setViewport},
{"save","()I", (void*) SkCanvasGlue::saveAll},
{"save","(I)I", (void*) SkCanvasGlue::save},
{"native_saveLayer","(ILandroid/graphics/RectF;II)I",
diff --git a/core/jni/android/graphics/ColorFilter.cpp b/core/jni/android/graphics/ColorFilter.cpp
index 848234f..f3be8b0 100644
--- a/core/jni/android/graphics/ColorFilter.cpp
+++ b/core/jni/android/graphics/ColorFilter.cpp
@@ -36,40 +36,25 @@ public:
obj->safeUnref();
}
- static SkColorFilter* CreatePorterDuffFilter(JNIEnv* env, jobject, jint srcColor,
- SkPorterDuff::Mode mode) {
- return SkColorFilter::CreateModeFilter(srcColor, SkPorterDuff::ToXfermodeMode(mode));
- }
-
static SkiaColorFilter* glCreatePorterDuffFilter(JNIEnv* env, jobject, jint srcColor,
SkPorterDuff::Mode mode) {
+#ifdef USE_OPENGL_RENDERER
return new SkiaBlendFilter(srcColor, SkPorterDuff::ToXfermodeMode(mode));
+#else
+ return NULL;
+#endif
}
- static SkColorFilter* CreateLightingFilter(JNIEnv* env, jobject, jint mul, jint add) {
- return SkColorFilter::CreateLightingFilter(mul, add);
- }
-
static SkiaColorFilter* glCreateLightingFilter(JNIEnv* env, jobject, jint mul, jint add) {
+#ifdef USE_OPENGL_RENDERER
return new SkiaLightingFilter(mul, add);
- }
-
- static SkColorFilter* CreateColorMatrixFilter(JNIEnv* env, jobject, jfloatArray jarray) {
- AutoJavaFloatArray autoArray(env, jarray, 20);
- const float* src = autoArray.ptr();
-
-#ifdef SK_SCALAR_IS_FIXED
- SkFixed array[20];
- for (int i = 0; i < 20; i++) {
- array[i] = SkFloatToScalar(src[i]);
- }
- return new SkColorMatrixFilter(array);
#else
- return new SkColorMatrixFilter(src);
+ return NULL;
#endif
}
static SkiaColorFilter* glCreateColorMatrixFilter(JNIEnv* env, jobject, jfloatArray jarray) {
+#ifdef USE_OPENGL_RENDERER
AutoJavaFloatArray autoArray(env, jarray, 20);
const float* src = autoArray.ptr();
@@ -86,6 +71,33 @@ public:
colorVector[3] = src[19];
return new SkiaColorMatrixFilter(colorMatrix, colorVector);
+#else
+ return NULL;
+#endif
+ }
+
+ static SkColorFilter* CreatePorterDuffFilter(JNIEnv* env, jobject, jint srcColor,
+ SkPorterDuff::Mode mode) {
+ return SkColorFilter::CreateModeFilter(srcColor, SkPorterDuff::ToXfermodeMode(mode));
+ }
+
+ static SkColorFilter* CreateLightingFilter(JNIEnv* env, jobject, jint mul, jint add) {
+ return SkColorFilter::CreateLightingFilter(mul, add);
+ }
+
+ static SkColorFilter* CreateColorMatrixFilter(JNIEnv* env, jobject, jfloatArray jarray) {
+ AutoJavaFloatArray autoArray(env, jarray, 20);
+ const float* src = autoArray.ptr();
+
+#ifdef SK_SCALAR_IS_FIXED
+ SkFixed array[20];
+ for (int i = 0; i < 20; i++) {
+ array[i] = SkFloatToScalar(src[i]);
+ }
+ return new SkColorMatrixFilter(array);
+#else
+ return new SkColorMatrixFilter(src);
+#endif
}
};
diff --git a/core/jni/android/graphics/Shader.cpp b/core/jni/android/graphics/Shader.cpp
index 34b4ab5..2b98e89 100644
--- a/core/jni/android/graphics/Shader.cpp
+++ b/core/jni/android/graphics/Shader.cpp
@@ -71,7 +71,9 @@ static void Shader_setLocalMatrix(JNIEnv* env, jobject o, SkShader* shader, Skia
else {
shader->setLocalMatrix(*matrix);
}
+#ifdef USE_OPENGL_RENDERER
skiaShader->setMatrix(const_cast<SkMatrix*>(matrix));
+#endif
}
}
@@ -90,10 +92,14 @@ static SkShader* BitmapShader_constructor(JNIEnv* env, jobject o, const SkBitmap
static SkiaShader* BitmapShader_postConstructor(JNIEnv* env, jobject o, SkShader* shader,
SkBitmap* bitmap, int tileModeX, int tileModeY) {
+#ifdef USE_OPENGL_RENDERER
SkiaShader* skiaShader = new SkiaBitmapShader(bitmap, shader,
static_cast<SkShader::TileMode>(tileModeX), static_cast<SkShader::TileMode>(tileModeY),
NULL, (shader->getFlags() & SkShader::kOpaqueAlpha_Flag) == 0);
return skiaShader;
+#else
+ return NULL;
+#endif
}
///////////////////////////////////////////////////////////////////////////////////////////////
@@ -134,7 +140,7 @@ static SkShader* LinearGradient_create1(JNIEnv* env, jobject o,
static SkiaShader* LinearGradient_postCreate1(JNIEnv* env, jobject o, SkShader* shader,
float x0, float y0, float x1, float y1, jintArray colorArray,
jfloatArray posArray, int tileMode) {
-
+#ifdef USE_OPENGL_RENDERER
size_t count = env->GetArrayLength(colorArray);
const jint* colorValues = env->GetIntArrayElements(colorArray, NULL);
@@ -162,10 +168,14 @@ static SkiaShader* LinearGradient_postCreate1(JNIEnv* env, jobject o, SkShader*
env->ReleaseIntArrayElements(colorArray, const_cast<jint*>(colorValues), JNI_ABORT);
return skiaShader;
+#else
+ return NULL;
+#endif
}
static SkiaShader* LinearGradient_postCreate2(JNIEnv* env, jobject o, SkShader* shader,
float x0, float y0, float x1, float y1, int color0, int color1, int tileMode) {
+#ifdef USE_OPENGL_RENDERER
float* storedBounds = new float[4];
storedBounds[0] = x0; storedBounds[1] = y0;
storedBounds[2] = x1; storedBounds[3] = y1;
@@ -183,6 +193,9 @@ static SkiaShader* LinearGradient_postCreate2(JNIEnv* env, jobject o, SkShader*
(shader->getFlags() & SkShader::kOpaqueAlpha_Flag) == 0);
return skiaShader;
+#else
+ return NULL;
+#endif
}
static SkShader* LinearGradient_create2(JNIEnv* env, jobject o,
@@ -315,6 +328,7 @@ static SkShader* ComposeShader_create2(JNIEnv* env, jobject o,
static SkiaShader* ComposeShader_postCreate2(JNIEnv* env, jobject o, SkShader* shader,
SkiaShader* shaderA, SkiaShader* shaderB, SkPorterDuff::Mode porterDuffMode) {
+#ifdef USE_OPENGL_RENDERER
SkAutoUnref au(SkPorterDuff::CreateXfermode(porterDuffMode));
SkXfermode* mode = (SkXfermode*) au.get();
SkXfermode::Mode skiaMode;
@@ -322,15 +336,22 @@ static SkiaShader* ComposeShader_postCreate2(JNIEnv* env, jobject o, SkShader* s
skiaMode = SkXfermode::kSrcOver_Mode;
}
return new SkiaComposeShader(shaderA, shaderB, skiaMode, shader);
+#else
+ return NULL;
+#endif
}
static SkiaShader* ComposeShader_postCreate1(JNIEnv* env, jobject o, SkShader* shader,
SkiaShader* shaderA, SkiaShader* shaderB, SkXfermode* mode) {
+#ifdef USE_OPENGL_RENDERER
SkXfermode::Mode skiaMode;
if (!SkXfermode::IsMode(mode, &skiaMode)) {
skiaMode = SkXfermode::kSrcOver_Mode;
}
return new SkiaComposeShader(shaderA, shaderB, skiaMode, shader);
+#else
+ return NULL;
+#endif
}
///////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/core/jni/android_view_GLES20Canvas.cpp b/core/jni/android_view_GLES20Canvas.cpp
index 9fd2b86..bb1a9e3 100644
--- a/core/jni/android_view_GLES20Canvas.cpp
+++ b/core/jni/android_view_GLES20Canvas.cpp
@@ -41,6 +41,13 @@ namespace android {
using namespace uirenderer;
+/**
+ * Note: OpenGLRenderer JNI layer is generated and compiled only on supported
+ * devices. This means all the logic must be compiled only when the
+ * preprocessor variable USE_OPENGL_RENDERER is defined.
+ */
+#ifdef USE_OPENGL_RENDERER
+
// ----------------------------------------------------------------------------
// Java APIs
// ----------------------------------------------------------------------------
@@ -284,6 +291,20 @@ static void android_view_GLES20Canvas_drawText(JNIEnv* env, jobject canvas,
env->ReleaseStringChars(text, textArray);
}
+#endif // USE_OPENGL_RENDERER
+
+// ----------------------------------------------------------------------------
+// Common
+// ----------------------------------------------------------------------------
+
+static jboolean android_view_GLES20Canvas_isAvailable(JNIEnv* env, jobject clazz) {
+#ifdef USE_OPENGL_RENDERER
+ return JNI_TRUE;
+#else
+ return JNI_FALSE;
+#endif
+}
+
// ----------------------------------------------------------------------------
// JNI Glue
// ----------------------------------------------------------------------------
@@ -291,6 +312,9 @@ static void android_view_GLES20Canvas_drawText(JNIEnv* env, jobject canvas,
const char* const kClassPathName = "android/view/GLES20Canvas";
static JNINativeMethod gMethods[] = {
+ { "nIsAvailable", "()Z", (void*) android_view_GLES20Canvas_isAvailable },
+#ifdef USE_OPENGL_RENDERER
+
{ "nCreateRenderer", "()I", (void*) android_view_GLES20Canvas_createRenderer },
{ "nDestroyRenderer", "(I)V", (void*) android_view_GLES20Canvas_destroyRenderer },
{ "nSetViewport", "(III)V", (void*) android_view_GLES20Canvas_setViewport },
@@ -334,16 +358,22 @@ static JNINativeMethod gMethods[] = {
{ "nGetClipBounds", "(ILandroid/graphics/Rect;)Z",
(void*) android_view_GLES20Canvas_getClipBounds },
+#endif
};
-#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);
+#ifdef USE_OPENGL_RENDERER
+ #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);
+#else
+ #define FIND_CLASS(var, className)
+ #define GET_METHOD_ID(var, clazz, methodName, methodDescriptor)
+#endif
int register_android_view_GLES20Canvas(JNIEnv* env) {
FIND_CLASS(gRectClassInfo.clazz, "android/graphics/Rect");
diff --git a/core/jni/android_view_HardwareRenderer.cpp b/core/jni/android_view_HardwareRenderer.cpp
deleted file mode 100644
index 6d20c9d..0000000
--- a/core/jni/android_view_HardwareRenderer.cpp
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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.
- */
-
-#include <utils/SkGLCanvas.h>
-
-#include "jni.h"
-#include <nativehelper/JNIHelp.h>
-#include <android_runtime/AndroidRuntime.h>
-#include <utils/misc.h>
-
-// ----------------------------------------------------------------------------
-
-namespace android {
-
-static void android_view_HardwareRenderer_abandonGlCaches(JNIEnv* env, jobject) {
- SkGLCanvas::AbandonAllTextures();
-}
-
-// ----------------------------------------------------------------------------
-
-const char* const kClassPathName = "android/view/HardwareRenderer";
-
-static JNINativeMethod gMethods[] = {
- { "nativeAbandonGlCaches", "()V", (void*)android_view_HardwareRenderer_abandonGlCaches },
-};
-
-int register_android_view_HardwareRenderer(JNIEnv* env) {
- return AndroidRuntime::registerNativeMethods(env, kClassPathName, gMethods, NELEM(gMethods));
-}
-
-};