From df143bdc1314b6db3d1488a6b8346a4e0bd18a14 Mon Sep 17 00:00:00 2001 From: "ajwong@chromium.org" Date: Tue, 16 Jun 2009 17:34:19 +0000 Subject: Hack to enable video on mac by creating a blank PlatformContextMac to draw on. This isn't a great solution, but it kinda works. Video renders, and the speed is acceptable even though we're doing an extra copy for each frame. The image shows up upside-down though. :( Review URL: http://codereview.chromium.org/126087 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@18503 0039d316-1c4b-4281-b951-d872f2087c98 --- webkit/api/public/WebCanvas.h | 4 ---- webkit/api/public/WebMediaPlayer.h | 3 --- webkit/api/src/WebMediaPlayerClientImpl.cpp | 33 +++++++++++++++++++++++++++-- webkit/api/src/WebMediaPlayerClientImpl.h | 2 ++ 4 files changed, 33 insertions(+), 9 deletions(-) (limited to 'webkit/api') diff --git a/webkit/api/public/WebCanvas.h b/webkit/api/public/WebCanvas.h index 0cd5d08..0b47676 100644 --- a/webkit/api/public/WebCanvas.h +++ b/webkit/api/public/WebCanvas.h @@ -33,8 +33,6 @@ #include "WebCommon.h" -#if WEBKIT_USING_SKIA && (defined(WIN32) || defined(__linux__)) - namespace skia { class PlatformCanvas; } @@ -44,5 +42,3 @@ namespace WebKit { } #endif - -#endif diff --git a/webkit/api/public/WebMediaPlayer.h b/webkit/api/public/WebMediaPlayer.h index 18d3bbf..56d01e5 100644 --- a/webkit/api/public/WebMediaPlayer.h +++ b/webkit/api/public/WebMediaPlayer.h @@ -80,10 +80,7 @@ namespace WebKit { virtual void setSize(const WebSize&) = 0; - // TODO(hclam): enable this for mac. -#if WEBKIT_USING_SKIA virtual void paint(WebCanvas*, const WebRect&) = 0; -#endif // True if a video is loaded. virtual bool hasVideo() const = 0; diff --git a/webkit/api/src/WebMediaPlayerClientImpl.cpp b/webkit/api/src/WebMediaPlayerClientImpl.cpp index d4d565a..ca666e9 100644 --- a/webkit/api/src/WebMediaPlayerClientImpl.cpp +++ b/webkit/api/src/WebMediaPlayerClientImpl.cpp @@ -305,11 +305,40 @@ void WebMediaPlayerClientImpl::setSize(const IntSize& size) void WebMediaPlayerClientImpl::paint(GraphicsContext* context, const IntRect& rect) { - // FIXME: enable this for mac. + if (m_webMediaPlayer.get()) { #if WEBKIT_USING_SKIA - if (m_webMediaPlayer.get()) m_webMediaPlayer->paint(context->platformContext()->canvas(), rect); +#elif WEBKIT_USING_CG + // If there is no preexisting platform canvas, or if the size has + // changed, recreate the canvas. This is to avoid recreating the bitmap + // buffer over and over for each frame of video. + if (!m_webCanvas || + m_webCanvas->getDevice()->width() != rect.width() || + m_webCanvas->getDevice()->height() != rect.height()) { + m_webCanvas.set(new WebCanvas(rect.width(), rect.height(), true)); + } + + IntRect normalized_rect(0, 0, rect.width(), rect.height()); + m_webMediaPlayer->paint(m_webCanvas.get(), normalized_rect); + + // The mac coordinate system is flipped vertical from the normal skia + // coordinates. During painting of the frame, flip the coordinates + // system and, for simplicity, also translate the clip rectangle to + // start at 0,0. + CGContext* cgContext = context->platformContext(); + CGContextSaveGState(cgContext); + CGContextTranslateCTM(cgContext, rect.x(), rect.height() + rect.y()); + CGContextScaleCTM(cgContext, 1.0, -1.0); + CGRect normalized_cgrect = normalized_rect; // For DrawToContext. + + m_webCanvas->getTopPlatformDevice().DrawToContext( + context->platformContext(), 0, 0, &normalized_cgrect); + + CGContextRestoreGState(cgContext); +#else + notImplemented(); #endif + } } void WebMediaPlayerClientImpl::setAutobuffer(bool autoBuffer) diff --git a/webkit/api/src/WebMediaPlayerClientImpl.h b/webkit/api/src/WebMediaPlayerClientImpl.h index e4f2b9f..9f5cd5d 100644 --- a/webkit/api/src/WebMediaPlayerClientImpl.h +++ b/webkit/api/src/WebMediaPlayerClientImpl.h @@ -36,6 +36,7 @@ #include "WebMediaPlayerClient.h" #include "MediaPlayerPrivate.h" +#include "WebCanvas.h" #include namespace WebKit { @@ -98,6 +99,7 @@ namespace WebKit { WebCore::MediaPlayer* m_mediaPlayer; OwnPtr m_webMediaPlayer; + OwnPtr m_webCanvas; }; } // namespace WebKit -- cgit v1.1