summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/platform/graphics/android/MediaLayer.cpp
diff options
context:
space:
mode:
authorSteve Block <steveblock@google.com>2011-05-09 16:25:46 +0100
committerSteve Block <steveblock@google.com>2011-05-12 14:28:33 +0100
commit31dbc523d9ee6fd7d7e46c540b5f675eeb559ed7 (patch)
tree3e73099a4bf4c6849c6f448aa3aba9fe408998f8 /Source/WebCore/platform/graphics/android/MediaLayer.cpp
parentcad810f21b803229eb11403f9209855525a25d57 (diff)
downloadexternal_webkit-31dbc523d9ee6fd7d7e46c540b5f675eeb559ed7.zip
external_webkit-31dbc523d9ee6fd7d7e46c540b5f675eeb559ed7.tar.gz
external_webkit-31dbc523d9ee6fd7d7e46c540b5f675eeb559ed7.tar.bz2
Merge WebKit at r75315: Move Android-specific WebCore files to Source
This moves files in the following WebCore subdirectories ... - bindings/js - bindings/v8/custom - plugins/android - platform/android - platform/graphics/android - page/ - css/ - dom/ - loader/archive/android
Diffstat (limited to 'Source/WebCore/platform/graphics/android/MediaLayer.cpp')
-rw-r--r--Source/WebCore/platform/graphics/android/MediaLayer.cpp152
1 files changed, 152 insertions, 0 deletions
diff --git a/Source/WebCore/platform/graphics/android/MediaLayer.cpp b/Source/WebCore/platform/graphics/android/MediaLayer.cpp
new file mode 100644
index 0000000..1ba6d46
--- /dev/null
+++ b/Source/WebCore/platform/graphics/android/MediaLayer.cpp
@@ -0,0 +1,152 @@
+/*
+ * 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 "config.h"
+#include "MediaLayer.h"
+#include "MediaTexture.h"
+#include "TilesManager.h"
+
+#if USE(ACCELERATED_COMPOSITING)
+
+#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, "MediaLayer", __VA_ARGS__)
+
+#else
+
+#undef XLOG
+#define XLOG(...)
+
+#endif // DEBUG
+
+namespace WebCore {
+
+MediaLayer::MediaLayer(jobject weakWebViewRef) : LayerAndroid((RenderLayer*) NULL)
+{
+ m_bufferedTexture = new MediaTexture(EGL_NO_CONTEXT);
+ m_bufferedTexture->producerInc();
+ m_videoTexture = new VideoTexture(weakWebViewRef);
+ m_videoTexture->incStrong(this);
+
+ m_isCopy = false;
+ m_currentTextureInfo = 0;
+ m_isContentInverted = false;
+ m_outlineSize = 0;
+ XLOG("Creating Media Layer %p", this);
+ XLOG("producer: %d consumer: %d", m_bufferedTexture->getProducerCount(),
+ m_bufferedTexture->getConsumerCount());
+}
+
+MediaLayer::MediaLayer(const MediaLayer& layer) : LayerAndroid(layer)
+{
+ m_bufferedTexture = layer.getTexture();
+ m_bufferedTexture->consumerInc();
+ m_videoTexture = layer.m_videoTexture;
+ m_videoTexture->incStrong(this);
+
+ m_isCopy = true;
+ m_currentTextureInfo = 0;
+ m_isContentInverted = layer.m_isContentInverted;
+ m_outlineSize = layer.m_outlineSize;
+ XLOG("Creating Media Layer Copy %p -> %p", &layer, this);
+ XLOG("producer: %d consumer: %d COPY", m_bufferedTexture->getProducerCount(),
+ m_bufferedTexture->getConsumerCount());
+}
+
+MediaLayer::~MediaLayer()
+{
+ XLOG("Deleting Media Layer");
+ XLOG("producer: %d consumer: %d %s", m_bufferedTexture->getProducerCount(),
+ m_bufferedTexture->getConsumerCount(), (m_isCopy) ? "COPY" : "");
+
+ if (m_isCopy)
+ m_bufferedTexture->consumerDec();
+ else
+ m_bufferedTexture->producerDec();
+ m_videoTexture->decStrong(this);
+}
+
+bool MediaLayer::drawGL(GLWebViewState* glWebViewState, SkMatrix& matrix)
+{
+ TilesManager::instance()->shader()->clip(drawClip());
+
+ // when the plugin gains focus webkit applies an outline to the
+ // widget, which causes the layer to expand to accommodate the
+ // outline. Therefore, we shrink the rect by the outline's dimensions
+ // to ensure the plugin does not draw outside of its bounds.
+ SkRect mediaBounds;
+ mediaBounds.set(0, 0, getSize().width(), getSize().height());
+ mediaBounds.inset(m_outlineSize, m_outlineSize);
+
+ // check to see if we need to create a video texture
+ m_videoTexture->initNativeWindowIfNeeded();
+ // draw any video content if present
+ m_videoTexture->drawVideo(drawTransform(), mediaBounds);
+
+ // draw the primary content
+ if (m_bufferedTexture) {
+ TextureInfo* textureInfo = m_bufferedTexture->consumerLock();
+ if (textureInfo && textureInfo->m_width != 0 && textureInfo->m_height != 0) {
+ // the layer's shader draws the content inverted so we must undo
+ // that change in the transformation matrix
+ TransformationMatrix m = drawTransform();
+ if (!m_isContentInverted) {
+ m.flipY();
+ m.translate(0, -getSize().height());
+ }
+
+ bool forceBlending = textureInfo->m_internalFormat == GL_RGBA ||
+ textureInfo->m_internalFormat == GL_BGRA_EXT ||
+ textureInfo->m_internalFormat == GL_ALPHA;
+ TilesManager::instance()->shader()->drawLayerQuad(m, mediaBounds,
+ textureInfo->m_textureId,
+ 1.0f, forceBlending);
+ }
+ m_bufferedTexture->consumerRelease();
+ }
+
+ return drawChildrenGL(glWebViewState, matrix);
+}
+
+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)