summaryrefslogtreecommitdiffstats
path: root/WebKit/android/plugins/ANPSurfaceInterface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebKit/android/plugins/ANPSurfaceInterface.cpp')
-rw-r--r--WebKit/android/plugins/ANPSurfaceInterface.cpp110
1 files changed, 80 insertions, 30 deletions
diff --git a/WebKit/android/plugins/ANPSurfaceInterface.cpp b/WebKit/android/plugins/ANPSurfaceInterface.cpp
index a96220f..dd5dbe0 100644
--- a/WebKit/android/plugins/ANPSurfaceInterface.cpp
+++ b/WebKit/android/plugins/ANPSurfaceInterface.cpp
@@ -26,50 +26,102 @@
// must include config.h first for webkit to fiddle with new/delete
#include "config.h"
-#include "PluginSurface.h"
#include "PluginView.h"
#include "PluginWidgetAndroid.h"
#include "SkANP.h"
+#include <ui/Surface.h>
+#include <ui/Rect.h>
+#include <ui/Region.h>
+#include "jni_utility.h"
+#include <utils/RefBase.h>
+#include "android_graphics.h"
+#include "ANPSurface_npapi.h"
-using namespace WebCore;
+using namespace android;
-static ANPSurface* anp_newRasterSurface(NPP instance, ANPBitmapFormat format,
- bool fixedSize) {
- if (instance && instance->ndata) {
- PluginView* view = static_cast<PluginView*>(instance->ndata);
- PluginWidgetAndroid* widget = view->platformPluginWidget();
- return widget->createRasterSurface(format, fixedSize);
+static inline sp<Surface> getSurface(JNIEnv* env, jobject view) {
+ if (!env || !view) {
+ return NULL;
}
- return NULL;
+
+ jclass clazz = env->FindClass("android/view/Surface");
+ jfieldID surfaceField = env->GetFieldID(clazz, "mSurface", "I");
+
+ clazz = env->FindClass("android/view/SurfaceView");
+ jmethodID getHolder = env->GetMethodID(clazz, "getHolder", "()Landroid/view/SurfaceHolder;");
+
+ clazz = env->FindClass("android/view/SurfaceHolder");
+ jmethodID getSurface = env->GetMethodID(clazz, "getSurface", "()Landroid/view/Surface;");
+
+ jobject holder = env->CallObjectMethod(view, getHolder);
+ jobject surface = env->CallObjectMethod(holder, getSurface);
+ return sp<Surface>((Surface*) env->GetIntField(surface, surfaceField));
}
-static void anp_deleteSurface(ANPSurface* surface) {
- if (surface) {
- if (surface->data) {
- android::PluginSurface* s =
- static_cast<android::PluginSurface*>(surface->data);
- s->destroy();
- }
- delete surface;
+static inline ANPBitmapFormat convertPixelFormat(PixelFormat format) {
+ switch (format) {
+ case PIXEL_FORMAT_RGBA_8888: return kRGBA_8888_ANPBitmapFormat;
+ case PIXEL_FORMAT_RGB_565: return kRGB_565_ANPBitmapFormat;
+ default: return kUnknown_ANPBitmapFormat;
}
}
-static bool anp_lock(ANPSurface* surface, ANPBitmap* bitmap, ANPRectI* dirtyRect) {
- if (bitmap && surface && surface->data) {
- android::PluginSurface* s =
- static_cast<android::PluginSurface*>(surface->data);
+static bool anp_lock(JNIEnv* env, jobject surfaceView, ANPBitmap* bitmap, ANPRectI* dirtyRect) {
+ if (!bitmap || !surfaceView) {
+ return false;
+ }
- return s->lock(dirtyRect, bitmap);
+ sp<Surface> surface = getSurface(env, surfaceView);
+
+ if (!bitmap || !Surface::isValid(surface)) {
+ return false;
}
- return false;
+
+ Region dirtyRegion;
+ if (dirtyRect) {
+ Rect rect(dirtyRect->left, dirtyRect->top, dirtyRect->right, dirtyRect->bottom);
+ if (!rect.isEmpty()) {
+ dirtyRegion.set(rect);
+ }
+ } else {
+ dirtyRegion.set(Rect(0x3FFF, 0x3FFF));
+ }
+
+ Surface::SurfaceInfo info;
+ status_t err = surface->lock(&info, &dirtyRegion);
+ if (err < 0) {
+ return false;
+ }
+
+ ssize_t bpr = info.s * bytesPerPixel(info.format);
+
+ bitmap->format = convertPixelFormat(info.format);
+ bitmap->width = info.w;
+ bitmap->height = info.h;
+ bitmap->rowBytes = bpr;
+
+ if (info.w > 0 && info.h > 0) {
+ bitmap->baseAddr = info.bits;
+ } else {
+ bitmap->baseAddr = NULL;
+ return false;
+ }
+
+ return true;
}
-static void anp_unlock(ANPSurface* surface) {
- if (surface && surface->data) {
- android::PluginSurface* s =
- static_cast<android::PluginSurface*>(surface->data);
- s->unlock();
+static void anp_unlock(JNIEnv* env, jobject surfaceView) {
+ if (!surfaceView) {
+ return;
}
+
+ sp<Surface> surface = getSurface(env, surfaceView);
+
+ if (!Surface::isValid(surface)) {
+ return;
+ }
+
+ surface->unlockAndPost();
}
///////////////////////////////////////////////////////////////////////////////
@@ -79,8 +131,6 @@ static void anp_unlock(ANPSurface* surface) {
void ANPSurfaceInterfaceV0_Init(ANPInterface* value) {
ANPSurfaceInterfaceV0* i = reinterpret_cast<ANPSurfaceInterfaceV0*>(value);
- ASSIGN(i, newRasterSurface);
- ASSIGN(i, deleteSurface);
ASSIGN(i, lock);
ASSIGN(i, unlock);
}