blob: 12cfe3819b1d6b3efc75ca76f0fa2f519bcc6081 [file] [log] [blame]
/*
* 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 webViewRef) : LayerAndroid((RenderLayer*) NULL)
{
m_mediaTexture = new MediaTexture(webViewRef);
m_mediaTexture->incStrong(this);
m_isCopy = false;
m_outlineSize = 0;
XLOG("Creating Media Layer %p", this);
}
MediaLayer::MediaLayer(const MediaLayer& layer) : LayerAndroid(layer)
{
m_mediaTexture = layer.m_mediaTexture;
m_mediaTexture->incStrong(this);
m_isCopy = true;
m_outlineSize = layer.m_outlineSize;
XLOG("Creating Media Layer Copy %p -> %p", &layer, this);
}
MediaLayer::~MediaLayer()
{
XLOG("Deleting Media Layer");
m_mediaTexture->decStrong(this);
}
bool MediaLayer::drawGL()
{
FloatRect clippingRect = TilesManager::instance()->shader()->rectInScreenCoord(drawClip());
TilesManager::instance()->shader()->clip(clippingRect);
// 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 content or video texture
m_mediaTexture->initNativeWindowIfNeeded();
// the layer's shader draws the content inverted so we must undo
// that change in the transformation matrix
TransformationMatrix m = m_drawTransform;
if (!m_mediaTexture->isContentInverted()) {
m.flipY();
m.translate(0, -getSize().height());
}
// draw any content or video if present
m_mediaTexture->draw(m, m_drawTransform, mediaBounds);
return drawChildrenGL();
}
ANativeWindow* MediaLayer::acquireNativeWindowForContent()
{
return m_mediaTexture->getNativeWindowForContent();
}
ANativeWindow* MediaLayer::acquireNativeWindowForVideo()
{
return m_mediaTexture->requestNativeWindowForVideo();
}
void MediaLayer::setWindowDimensionsForVideo(const ANativeWindow* window, const SkRect& dimensions)
{
//TODO validate that the dimensions do not exceed the plugin's bounds
m_mediaTexture->setDimensions(window, dimensions);
}
void MediaLayer::releaseNativeWindowForVideo(ANativeWindow* window)
{
m_mediaTexture->releaseNativeWindow(window);
}
void MediaLayer::setFramerateCallback(const ANativeWindow* window, FramerateCallbackProc callback)
{
m_mediaTexture->setFramerateCallback(window, callback);
}
} // namespace WebCore
#endif // USE(ACCELERATED_COMPOSITING)