diff options
author | Steve Block <steveblock@google.com> | 2011-05-09 16:25:46 +0100 |
---|---|---|
committer | Steve Block <steveblock@google.com> | 2011-05-12 14:28:33 +0100 |
commit | 31dbc523d9ee6fd7d7e46c540b5f675eeb559ed7 (patch) | |
tree | 3e73099a4bf4c6849c6f448aa3aba9fe408998f8 /Source/WebCore/platform/graphics/android/MediaLayer.cpp | |
parent | cad810f21b803229eb11403f9209855525a25d57 (diff) | |
download | external_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.cpp | 152 |
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) |