summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Android.mk3
-rw-r--r--WebCore/Android.mk1
-rw-r--r--WebCore/platform/graphics/android/MediaLayer.cpp54
-rw-r--r--WebCore/platform/graphics/android/MediaLayer.h26
-rw-r--r--WebCore/platform/graphics/android/MediaTexture.cpp137
-rw-r--r--WebCore/platform/graphics/android/MediaTexture.h72
-rw-r--r--WebCore/plugins/android/PluginViewAndroid.cpp3
-rw-r--r--WebKit/Android.mk1
-rw-r--r--WebKit/android/plugins/ANPVideoInterface.cpp83
-rw-r--r--WebKit/android/plugins/ANPVideo_npapi.h61
-rw-r--r--WebKit/android/plugins/android_npapi.h1
11 files changed, 417 insertions, 25 deletions
diff --git a/Android.mk b/Android.mk
index 744b81a..0bddbc1 100644
--- a/Android.mk
+++ b/Android.mk
@@ -364,7 +364,8 @@ LOCAL_SHARED_LIBRARIES := \
libmedia \
libsurfaceflinger_client \
libEGL \
- libGLESv2
+ libGLESv2 \
+ libgui
ifeq ($(WEBCORE_INSTRUMENTATION),true)
LOCAL_SHARED_LIBRARIES += libhardware_legacy
diff --git a/WebCore/Android.mk b/WebCore/Android.mk
index 7861bd3..4750751 100644
--- a/WebCore/Android.mk
+++ b/WebCore/Android.mk
@@ -616,6 +616,7 @@ LOCAL_SRC_FILES := $(LOCAL_SRC_FILES) \
platform/graphics/android/ImageSourceAndroid.cpp \
platform/graphics/android/LayerAndroid.cpp \
platform/graphics/android/MediaLayer.cpp \
+ platform/graphics/android/MediaTexture.cpp \
platform/graphics/android/PaintLayerOperation.cpp \
platform/graphics/android/PathAndroid.cpp \
platform/graphics/android/PatternAndroid.cpp \
diff --git a/WebCore/platform/graphics/android/MediaLayer.cpp b/WebCore/platform/graphics/android/MediaLayer.cpp
index e4ccbdb..3ec21a4 100644
--- a/WebCore/platform/graphics/android/MediaLayer.cpp
+++ b/WebCore/platform/graphics/android/MediaLayer.cpp
@@ -15,12 +15,11 @@
*/
#include "config.h"
#include "MediaLayer.h"
+#include "MediaTexture.h"
#include "TilesManager.h"
#if USE(ACCELERATED_COMPOSITING)
-#include <wtf/CurrentTime.h>
-
#define LAYER_DEBUG
#undef LAYER_DEBUG
@@ -45,6 +44,9 @@ MediaLayer::MediaLayer() : LayerAndroid(false)
{
m_bufferedTexture = new MediaTexture(EGL_NO_CONTEXT);
m_bufferedTexture->incStrong(this);
+ m_videoTexture = new VideoTexture();
+ m_videoTexture->incStrong(this);
+
m_currentTextureInfo = 0;
m_isContentInverted = false;
XLOG("Creating Media Layer %p", this);
@@ -54,6 +56,9 @@ MediaLayer::MediaLayer(const MediaLayer& layer) : LayerAndroid(layer)
{
m_bufferedTexture = layer.getTexture();
m_bufferedTexture->incStrong(this);
+ m_videoTexture = layer.m_videoTexture;
+ m_videoTexture->incStrong(this);
+
m_currentTextureInfo = 0;
m_isContentInverted = layer.m_isContentInverted;
XLOG("Creating Media Layer Copy %p -> %p", &layer, this);
@@ -63,24 +68,31 @@ MediaLayer::~MediaLayer()
{
XLOG("Deleting Media Layer");
m_bufferedTexture->decStrong(this);
+ m_videoTexture->decStrong(this);
}
bool MediaLayer::drawGL(SkMatrix& matrix)
{
+
+ TransformationMatrix m = drawTransform();
+ // the layer's shader draws the content inverted so we must undo
+ // that change in the transformation matrix
+ if (!m_isContentInverted) {
+ m.flipY();
+ m.translate(0, -getSize().height());
+ }
+
+ // check to see if we need to create a video texture
+ m_videoTexture->initNativeWindowIfNeeded();
+ // draw any video content if present
+ m_videoTexture->drawVideo(m);
+
+ // draw the primary content
if (m_bufferedTexture) {
TextureInfo* textureInfo = m_bufferedTexture->consumerLock();
if (textureInfo) {
SkRect rect;
rect.set(0, 0, getSize().width(), getSize().height());
- TransformationMatrix m = drawTransform();
-
- // the layer's shader draws the content inverted so we must undo
- // that change in the transformation matrix
- if (!m_isContentInverted) {
- m.flipY();
- m.translate(0, -getSize().height());
- }
-
TilesManager::instance()->shader()->drawLayerQuad(m, rect,
textureInfo->m_textureId,
1.0f); //TODO fix this m_drawOpacity
@@ -94,6 +106,26 @@ bool MediaLayer::drawGL(SkMatrix& matrix)
return true;
}
+ANativeWindow* MediaLayer::acquireNativeWindowForVideo()
+{
+ return m_videoTexture->requestNewWindow();
+}
+
+void MediaLayer::setWindowDimensionsForVideo(const ANativeWindow* window, const SkRect& dimensions)
+{
+ if (window != m_videoTexture->getNativeWindow())
+ return;
+
+ //TODO validate that the dimensions do not exceed the plugin's bounds
+ m_videoTexture->setDimensions(dimensions);
+}
+
+void MediaLayer::releaseNativeWindowForVideo(ANativeWindow* window)
+{
+ if (window == m_videoTexture->getNativeWindow())
+ m_videoTexture->releaseNativeWindow();
+}
+
} // namespace WebCore
#endif // USE(ACCELERATED_COMPOSITING)
diff --git a/WebCore/platform/graphics/android/MediaLayer.h b/WebCore/platform/graphics/android/MediaLayer.h
index 1944512..dec6427 100644
--- a/WebCore/platform/graphics/android/MediaLayer.h
+++ b/WebCore/platform/graphics/android/MediaLayer.h
@@ -19,22 +19,15 @@
#if USE(ACCELERATED_COMPOSITING)
-#include "RefPtr.h"
-#include "DoubleBufferedTexture.h"
+#include "MediaTexture.h"
#include "LayerAndroid.h"
-#include <utils/RefBase.h>
+namespace android {
+ class SurfaceTexture;
+}
namespace WebCore {
-class MediaTexture : public DoubleBufferedTexture,
- public android::LightRefBase<MediaTexture> {
-
-public:
- MediaTexture(EGLContext sharedContext) : DoubleBufferedTexture(sharedContext) { };
-};
-
-
class MediaLayer : public LayerAndroid {
public:
@@ -56,14 +49,21 @@ public:
void invertContents(bool invertContent) { m_isContentInverted = invertContent; }
+ // functions to manipulate secondary layers for video playback
+ ANativeWindow* acquireNativeWindowForVideo();
+ void setWindowDimensionsForVideo(const ANativeWindow* window, const SkRect& dimensions);
+ void releaseNativeWindowForVideo(ANativeWindow* window);
+
private:
- // GL textures management
+ // Primary GL texture variables
MediaTexture* m_bufferedTexture;
-
TextureInfo* m_currentTextureInfo;
bool m_isContentInverted;
+
+ // Video texture variables
+ VideoTexture* m_videoTexture;
};
} // namespace WebCore
diff --git a/WebCore/platform/graphics/android/MediaTexture.cpp b/WebCore/platform/graphics/android/MediaTexture.cpp
new file mode 100644
index 0000000..71a4a0e
--- /dev/null
+++ b/WebCore/platform/graphics/android/MediaTexture.cpp
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2011 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 "config.h"
+#include "MediaTexture.h"
+#include "TilesManager.h"
+
+#if USE(ACCELERATED_COMPOSITING)
+
+#include <android/native_window.h>
+#include <gui/SurfaceTexture.h>
+#include <gui/SurfaceTextureClient.h>
+#include <wtf/CurrentTime.h>
+
+#define LAYER_DEBUG
+#undef LAYER_DEBUG
+
+#ifdef DEBUG
+
+#include <cutils/log.h>
+#include <wtf/text/CString.h>
+
+#undef XLOG
+#define XLOG(...) android_printLog(ANDROID_LOG_DEBUG, "MediaTexture", __VA_ARGS__)
+
+#else
+
+#undef XLOG
+#define XLOG(...)
+
+#endif // DEBUG
+
+namespace WebCore {
+
+VideoTexture::VideoTexture()
+{
+ m_textureId = 0;
+ m_dimensions.setEmpty();
+ m_newWindowRequest = false;
+ m_newWindowReady = false;
+}
+
+VideoTexture::~VideoTexture()
+{
+ releaseNativeWindow();
+ if (m_textureId)
+ glDeleteTextures(1, &m_textureId);
+}
+
+void VideoTexture::initNativeWindowIfNeeded()
+{
+ android::Mutex::Autolock lock(m_videoLock);
+
+ if(!m_newWindowRequest)
+ return;
+
+ // reuse an existing texture if possible
+ if (!m_textureId)
+ glGenTextures(1, &m_textureId);
+
+ m_surfaceTexture = new android::SurfaceTexture(m_textureId);
+ m_surfaceTextureClient = new android::SurfaceTextureClient(m_surfaceTexture);
+ m_newWindowRequest = false;
+ m_newWindowReady = true;
+ m_newVideoRequestCond.signal();
+}
+
+void VideoTexture::drawVideo(TransformationMatrix matrix)
+{
+ android::Mutex::Autolock lock(m_videoLock);
+
+ if(!m_surfaceTexture.get() || m_dimensions.isEmpty())
+ return;
+
+ m_surfaceTexture->updateTexImage();
+ TilesManager::instance()->shader()->drawLayerQuad(matrix, m_dimensions, m_textureId, 1.0f);
+}
+
+ANativeWindow* VideoTexture::requestNewWindow()
+{
+ android::Mutex::Autolock lock(m_videoLock);
+
+ // the window was not ready before the timeout so return it this time
+ if (m_newWindowReady) {
+ m_newWindowReady = false;
+ return m_surfaceTextureClient.get();
+ }
+ // we only allow for one texture, so if one already exists return null
+ else if (m_surfaceTextureClient.get()) {
+ return 0;
+ }
+
+ m_newWindowRequest = true;
+ //block until the request can be fulfilled or we time out
+ m_newVideoRequestCond.waitRelative(m_videoLock, 1000000000); // 1 sec
+
+ if (m_surfaceTextureClient.get())
+ m_newWindowReady = false;
+
+ return m_surfaceTextureClient.get();
+}
+
+ANativeWindow* VideoTexture::getNativeWindow()
+{
+ android::Mutex::Autolock lock(m_videoLock);
+ return m_surfaceTextureClient.get();
+}
+
+void VideoTexture::releaseNativeWindow()
+{
+ android::Mutex::Autolock lock(m_videoLock);
+ m_dimensions.setEmpty();
+ m_surfaceTextureClient.clear();
+ m_surfaceTexture.clear();
+}
+
+void VideoTexture::setDimensions(const SkRect& dimensions)
+{
+ android::Mutex::Autolock lock(m_videoLock);
+ m_dimensions = dimensions;
+}
+
+} // namespace WebCore
+
+#endif // USE(ACCELERATED_COMPOSITING)
diff --git a/WebCore/platform/graphics/android/MediaTexture.h b/WebCore/platform/graphics/android/MediaTexture.h
new file mode 100644
index 0000000..abb8081
--- /dev/null
+++ b/WebCore/platform/graphics/android/MediaTexture.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+
+#ifndef MediaTexture_h
+#define MediaTexture_h
+
+#if USE(ACCELERATED_COMPOSITING)
+
+#include "RefPtr.h"
+#include "DoubleBufferedTexture.h"
+#include "LayerAndroid.h"
+#include <utils/RefBase.h>
+
+namespace android {
+ class SurfaceTexture;
+}
+
+namespace WebCore {
+
+class MediaTexture : public DoubleBufferedTexture,
+ public android::LightRefBase<MediaTexture> {
+
+public:
+ MediaTexture(EGLContext sharedContext) : DoubleBufferedTexture(sharedContext) { };
+};
+
+class VideoTexture : public android::LightRefBase<VideoTexture> {
+
+public:
+ VideoTexture();
+ ~VideoTexture();
+
+ void initNativeWindowIfNeeded();
+ void drawVideo(TransformationMatrix matrix);
+
+ ANativeWindow* requestNewWindow();
+ ANativeWindow* getNativeWindow();
+ void releaseNativeWindow();
+ void setDimensions(const SkRect& dimensions);
+
+
+private:
+ GLuint m_textureId;
+ sp<android::SurfaceTexture> m_surfaceTexture;
+ sp<ANativeWindow> m_surfaceTextureClient;
+ SkRect m_dimensions;
+ bool m_newWindowRequest;
+ bool m_newWindowReady;
+
+ android::Mutex m_videoLock;
+ android::Condition m_newVideoRequestCond;
+};
+
+
+} // namespace WebCore
+
+#endif // USE(ACCELERATED_COMPOSITING)
+
+#endif // MediaTexture_h
diff --git a/WebCore/plugins/android/PluginViewAndroid.cpp b/WebCore/plugins/android/PluginViewAndroid.cpp
index bd367c3..122404a 100644
--- a/WebCore/plugins/android/PluginViewAndroid.cpp
+++ b/WebCore/plugins/android/PluginViewAndroid.cpp
@@ -86,6 +86,7 @@
#include "ANPOpenGL_npapi.h"
#include "ANPSurface_npapi.h"
#include "ANPSystem_npapi.h"
+#include "ANPVideo_npapi.h"
#include "SkANP.h"
#include "SkFlipPixelRef.h"
@@ -107,6 +108,7 @@ extern void ANPWindowInterfaceV0_Init(ANPInterface* value);
extern void ANPWindowInterfaceV1_Init(ANPInterface* value);
extern void ANPSystemInterfaceV0_Init(ANPInterface* value);
extern void ANPOpenGLInterfaceV0_Init(ANPInterface* value);
+extern void ANPVideoInterfaceV0_Init(ANPInterface* value);
struct VarProcPair {
int enumValue;
@@ -133,6 +135,7 @@ static const VarProcPair gVarProcs[] = {
{ VARPROCLINE(WindowInterfaceV1) },
{ VARPROCLINE(SystemInterfaceV0) },
{ VARPROCLINE(OpenGLInterfaceV0) },
+ { VARPROCLINE(VideoInterfaceV0) },
};
/* return true if var was an interface request (error will be set accordingly)
diff --git a/WebKit/Android.mk b/WebKit/Android.mk
index b87e981..88defda 100644
--- a/WebKit/Android.mk
+++ b/WebKit/Android.mk
@@ -107,6 +107,7 @@ LOCAL_SRC_FILES := $(LOCAL_SRC_FILES) \
android/plugins/ANPSurfaceInterface.cpp \
android/plugins/ANPSystemInterface.cpp \
android/plugins/ANPTypefaceInterface.cpp \
+ android/plugins/ANPVideoInterface.cpp \
android/plugins/ANPWindowInterface.cpp \
android/plugins/PluginDebugAndroid.cpp \
android/plugins/PluginTimer.cpp \
diff --git a/WebKit/android/plugins/ANPVideoInterface.cpp b/WebKit/android/plugins/ANPVideoInterface.cpp
new file mode 100644
index 0000000..8eb9846
--- /dev/null
+++ b/WebKit/android/plugins/ANPVideoInterface.cpp
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2011, The Android Open Source Project
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// must include config.h first for webkit to fiddle with new/delete
+#include "config.h"
+#include "ANPVideo_npapi.h"
+#include "SkANP.h"
+
+#include "PluginView.h"
+#include "PluginWidgetAndroid.h"
+#include "MediaLayer.h"
+
+static WebCore::PluginView* pluginViewForInstance(NPP instance) {
+ if (instance && instance->ndata)
+ return static_cast<WebCore::PluginView*>(instance->ndata);
+ return WebCore::PluginView::currentPluginView();
+}
+
+static WebCore::MediaLayer* mediaLayerForInstance(NPP instance) {
+ WebCore::PluginView* pluginView = pluginViewForInstance(instance);
+ PluginWidgetAndroid* pluginWidget = pluginView->platformPluginWidget();
+ return pluginWidget->getLayer();
+}
+
+static ANativeWindow* anp_acquireNativeWindow(NPP instance) {
+ WebCore::MediaLayer* mediaLayer = mediaLayerForInstance(instance);
+
+ return mediaLayer->acquireNativeWindowForVideo();
+}
+
+static void anp_setWindowDimensions(NPP instance, const ANativeWindow* window,
+ const ANPRectF* dimensions) {
+
+ WebCore::MediaLayer* mediaLayer = mediaLayerForInstance(instance);
+ if (!mediaLayer)
+ return;
+
+ SkRect rect;
+ mediaLayer->setWindowDimensionsForVideo(window, *SkANP::SetRect(&rect, *dimensions));
+}
+
+
+static void anp_releaseNativeWindow(NPP instance, ANativeWindow* window) {
+ WebCore::MediaLayer* mediaLayer = mediaLayerForInstance(instance);
+ if (!mediaLayer)
+ return;
+
+ mediaLayer->releaseNativeWindowForVideo(window);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+#define ASSIGN(obj, name) (obj)->name = anp_##name
+
+void ANPVideoInterfaceV0_Init(ANPInterface* value) {
+ ANPVideoInterfaceV0* i = reinterpret_cast<ANPVideoInterfaceV0*>(value);
+
+ ASSIGN(i, acquireNativeWindow);
+ ASSIGN(i, setWindowDimensions);
+ ASSIGN(i, releaseNativeWindow);
+}
diff --git a/WebKit/android/plugins/ANPVideo_npapi.h b/WebKit/android/plugins/ANPVideo_npapi.h
new file mode 100644
index 0000000..18e0231
--- /dev/null
+++ b/WebKit/android/plugins/ANPVideo_npapi.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2011, The Android Open Source Project
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef ANPVideo_npapi_H
+#define ANPVideo_npapi_H
+
+#include "android_npapi.h"
+#include <android/native_window.h>
+
+struct ANPVideoInterfaceV0 : ANPInterface {
+
+ /**
+ * Constructs a new native window to be used for rendering video content.
+ *
+ * Subsequent calls will produce new windows, but may also return NULL after
+ * n attempts if the browser has reached it's limit. Further, if the browser
+ * is unable to acquire the window quickly it may also return NULL in order
+ * to not prevent the plugin from executing. A subsequent call will then
+ * return the window if it is avaiable.
+ *
+ * NOTE: The hardware may fail if you try to decode more than the allowable
+ * number of videos supported on that device.
+ */
+ ANativeWindow* (*acquireNativeWindow)(NPP instance);
+
+ /**
+ * Sets the rectangle that specifies where the video content is to be drawn.
+ * The dimensions are in document space. Further, if the rect is NULL the
+ * browser will not attempt to draw the window, therefore do not set the
+ * dimensions until you queue the first buffer in the window.
+ */
+ void (*setWindowDimensions)(NPP instance, const ANativeWindow* window, const ANPRectF* dimensions);
+
+ /**
+ */
+ void (*releaseNativeWindow)(NPP instance, ANativeWindow* window);
+};
+
+#endif //ANPVideo_npapi_H
diff --git a/WebKit/android/plugins/android_npapi.h b/WebKit/android/plugins/android_npapi.h
index a9993a5..dd2dd10 100644
--- a/WebKit/android/plugins/android_npapi.h
+++ b/WebKit/android/plugins/android_npapi.h
@@ -123,6 +123,7 @@ typedef uint32_t ANPMatrixFlag;
#define kAudioTrackInterfaceV1_ANPGetValue ((NPNVariable)1012)
#define kOpenGLInterfaceV0_ANPGetValue ((NPNVariable)1013)
#define kWindowInterfaceV1_ANPGetValue ((NPNVariable)1014)
+#define kVideoInterfaceV0_ANPGetValue ((NPNVariable)1015)
/** queries for the drawing models supported on this device.