| Index: Source/WebCore/platform/graphics/win/QTMovieGWorld.cpp
|
| diff --git a/Source/WebCore/platform/graphics/win/QTMovieGWorld.cpp b/Source/WebCore/platform/graphics/win/QTMovieGWorld.cpp
|
| deleted file mode 100644
|
| index 4be1bbb0ea45e4df716bc46e66f90216a932482c..0000000000000000000000000000000000000000
|
| --- a/Source/WebCore/platform/graphics/win/QTMovieGWorld.cpp
|
| +++ /dev/null
|
| @@ -1,465 +0,0 @@
|
| -/*
|
| - * Copyright (C) 2007, 2008, 2009, 2010 Apple, Inc. All rights reserved.
|
| - *
|
| - * Redistribution and use in source and binary forms, with or without
|
| - * modification, are permitted provided that the following conditions
|
| - * are met:
|
| - * 1. Redistributions of source code must retain the above copyright
|
| - * notice, this list of conditions and the following disclaimer.
|
| - * 2. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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.
|
| - */
|
| -#include "config.h"
|
| -
|
| -#include "QTMovieGWorld.h"
|
| -
|
| -#include "QTMovieTask.h"
|
| -#include <GXMath.h>
|
| -#include <Movies.h>
|
| -#include <QTML.h>
|
| -#include <QuickTimeComponents.h>
|
| -#include <wtf/Assertions.h>
|
| -#include <wtf/HashSet.h>
|
| -#include <wtf/Noncopyable.h>
|
| -#include <wtf/Vector.h>
|
| -
|
| -using namespace std;
|
| -
|
| -static const long minimumQuickTimeVersion = 0x07300000; // 7.3
|
| -
|
| -static LPCWSTR fullscreenQTMovieGWorldPointerProp = L"fullscreenQTMovieGWorldPointer";
|
| -
|
| -// Resizing GWorlds is slow, give them a minimum size so size of small
|
| -// videos can be animated smoothly
|
| -static const int cGWorldMinWidth = 640;
|
| -static const int cGWorldMinHeight = 360;
|
| -
|
| -static const float cNonContinuousTimeChange = 0.2f;
|
| -
|
| -union UppParam {
|
| - long longValue;
|
| - void* ptr;
|
| -};
|
| -
|
| -static MovieDrawingCompleteUPP gMovieDrawingCompleteUPP = 0;
|
| -static HashSet<QTMovieGWorldPrivate*>* gTaskList;
|
| -static Vector<CFStringRef>* gSupportedTypes = 0;
|
| -static SInt32 quickTimeVersion = 0;
|
| -
|
| -class QTMovieGWorldPrivate : public QTMovieClient {
|
| -public:
|
| - QTMovieGWorldPrivate(QTMovieGWorld* movieWin);
|
| - virtual ~QTMovieGWorldPrivate();
|
| -
|
| - void registerDrawingCallback();
|
| - void unregisterDrawingCallback();
|
| - void drawingComplete();
|
| - void updateGWorld();
|
| - void createGWorld();
|
| - void deleteGWorld();
|
| - void clearGWorld();
|
| - void updateMovieSize();
|
| -
|
| - void setSize(int, int);
|
| -
|
| - virtual void movieEnded(QTMovie*);
|
| - virtual void movieLoadStateChanged(QTMovie*);
|
| - virtual void movieTimeChanged(QTMovie*);
|
| -
|
| - QTMovieGWorld* m_movieWin;
|
| - RefPtr<QTMovie> m_qtMovie;
|
| - Movie m_movie;
|
| - QTMovieGWorldClient* m_client;
|
| - long m_loadState;
|
| - int m_width;
|
| - int m_height;
|
| - bool m_visible;
|
| - GWorldPtr m_gWorld;
|
| - int m_gWorldWidth;
|
| - int m_gWorldHeight;
|
| - GWorldPtr m_savedGWorld;
|
| - float m_widthScaleFactor;
|
| - float m_heightScaleFactor;
|
| -#if !ASSERT_DISABLED
|
| - bool m_scaleCached;
|
| -#endif
|
| - WindowPtr m_fullscreenWindow;
|
| - GWorldPtr m_fullscreenOrigGWorld;
|
| - Rect m_fullscreenRect;
|
| - QTMovieGWorldFullscreenClient* m_fullscreenClient;
|
| - char* m_fullscreenRestoreState;
|
| - bool m_disabled;
|
| -};
|
| -
|
| -QTMovieGWorldPrivate::QTMovieGWorldPrivate(QTMovieGWorld* movieWin)
|
| - : m_movieWin(movieWin)
|
| - , m_movie(0)
|
| - , m_client(0)
|
| - , m_loadState(0)
|
| - , m_width(0)
|
| - , m_height(0)
|
| - , m_visible(false)
|
| - , m_gWorld(0)
|
| - , m_gWorldWidth(0)
|
| - , m_gWorldHeight(0)
|
| - , m_savedGWorld(0)
|
| - , m_widthScaleFactor(1)
|
| - , m_heightScaleFactor(1)
|
| -#if !ASSERT_DISABLED
|
| - , m_scaleCached(false)
|
| -#endif
|
| - , m_fullscreenWindow(0)
|
| - , m_fullscreenOrigGWorld(0)
|
| - , m_fullscreenClient(0)
|
| - , m_fullscreenRestoreState(0)
|
| - , m_disabled(false)
|
| - , m_qtMovie(0)
|
| -{
|
| - Rect rect = { 0, 0, 0, 0 };
|
| - m_fullscreenRect = rect;
|
| -}
|
| -
|
| -QTMovieGWorldPrivate::~QTMovieGWorldPrivate()
|
| -{
|
| - ASSERT(!m_fullscreenWindow);
|
| -
|
| - if (m_gWorld)
|
| - deleteGWorld();
|
| -}
|
| -
|
| -pascal OSErr movieDrawingCompleteProc(Movie movie, long data)
|
| -{
|
| - UppParam param;
|
| - param.longValue = data;
|
| - QTMovieGWorldPrivate* mp = static_cast<QTMovieGWorldPrivate*>(param.ptr);
|
| - if (mp)
|
| - mp->drawingComplete();
|
| - return 0;
|
| -}
|
| -
|
| -void QTMovieGWorldPrivate::registerDrawingCallback()
|
| -{
|
| - if (!gMovieDrawingCompleteUPP)
|
| - gMovieDrawingCompleteUPP = NewMovieDrawingCompleteUPP(movieDrawingCompleteProc);
|
| -
|
| - UppParam param;
|
| - param.ptr = this;
|
| - SetMovieDrawingCompleteProc(m_movie, movieDrawingCallWhenChanged, gMovieDrawingCompleteUPP, param.longValue);
|
| -}
|
| -
|
| -void QTMovieGWorldPrivate::unregisterDrawingCallback()
|
| -{
|
| - SetMovieDrawingCompleteProc(m_movie, movieDrawingCallWhenChanged, 0, 0);
|
| -}
|
| -
|
| -void QTMovieGWorldPrivate::drawingComplete()
|
| -{
|
| - if (!m_gWorld || m_movieWin->m_private->m_disabled || m_loadState < QTMovieLoadStateLoaded)
|
| - return;
|
| - m_client->movieNewImageAvailable(m_movieWin);
|
| -}
|
| -
|
| -void QTMovieGWorldPrivate::updateGWorld()
|
| -{
|
| - bool shouldBeVisible = m_visible;
|
| - if (!m_height || !m_width)
|
| - shouldBeVisible = false;
|
| -
|
| - if (shouldBeVisible && !m_gWorld)
|
| - createGWorld();
|
| - else if (!shouldBeVisible && m_gWorld)
|
| - deleteGWorld();
|
| - else if (m_gWorld && (m_width > m_gWorldWidth || m_height > m_gWorldHeight)) {
|
| - // need a bigger, better gWorld
|
| - deleteGWorld();
|
| - createGWorld();
|
| - }
|
| -}
|
| -
|
| -void QTMovieGWorldPrivate::createGWorld()
|
| -{
|
| - ASSERT(!m_gWorld);
|
| - if (!m_movie || m_loadState < QTMovieLoadStateLoaded)
|
| - return;
|
| -
|
| - m_gWorldWidth = max(cGWorldMinWidth, m_width);
|
| - m_gWorldHeight = max(cGWorldMinHeight, m_height);
|
| - Rect bounds;
|
| - bounds.top = 0;
|
| - bounds.left = 0;
|
| - bounds.right = m_gWorldWidth;
|
| - bounds.bottom = m_gWorldHeight;
|
| - OSErr err = QTNewGWorld(&m_gWorld, k32BGRAPixelFormat, &bounds, 0, 0, 0);
|
| - if (err)
|
| - return;
|
| - GetMovieGWorld(m_movie, &m_savedGWorld, 0);
|
| - SetMovieGWorld(m_movie, m_gWorld, 0);
|
| - bounds.right = m_width;
|
| - bounds.bottom = m_height;
|
| - SetMovieBox(m_movie, &bounds);
|
| -}
|
| -
|
| -void QTMovieGWorldPrivate::clearGWorld()
|
| -{
|
| - if (!m_movie || !m_gWorld)
|
| - return;
|
| -
|
| - GrafPtr savePort;
|
| - GetPort(&savePort);
|
| - MacSetPort((GrafPtr)m_gWorld);
|
| -
|
| - Rect bounds;
|
| - bounds.top = 0;
|
| - bounds.left = 0;
|
| - bounds.right = m_gWorldWidth;
|
| - bounds.bottom = m_gWorldHeight;
|
| - EraseRect(&bounds);
|
| -
|
| - MacSetPort(savePort);
|
| -}
|
| -
|
| -void QTMovieGWorldPrivate::setSize(int width, int height)
|
| -{
|
| - if (m_width == width && m_height == height)
|
| - return;
|
| - m_width = width;
|
| - m_height = height;
|
| -
|
| - // Do not change movie box before reaching load state loaded as we grab
|
| - // the initial size when task() sees that state for the first time, and
|
| - // we need the initial size to be able to scale movie properly.
|
| - if (!m_movie || m_loadState < QTMovieLoadStateLoaded)
|
| - return;
|
| -
|
| -#if !ASSERT_DISABLED
|
| - ASSERT(m_scaleCached);
|
| -#endif
|
| -
|
| - updateMovieSize();
|
| -}
|
| -
|
| -void QTMovieGWorldPrivate::updateMovieSize()
|
| -{
|
| - if (!m_movie || m_loadState < QTMovieLoadStateLoaded)
|
| - return;
|
| -
|
| - Rect bounds;
|
| - bounds.top = 0;
|
| - bounds.left = 0;
|
| - bounds.right = m_width;
|
| - bounds.bottom = m_height;
|
| - SetMovieBox(m_movie, &bounds);
|
| - updateGWorld();
|
| -}
|
| -
|
| -
|
| -void QTMovieGWorldPrivate::deleteGWorld()
|
| -{
|
| - ASSERT(m_gWorld);
|
| - if (m_movie)
|
| - SetMovieGWorld(m_movie, m_savedGWorld, 0);
|
| - m_savedGWorld = 0;
|
| - DisposeGWorld(m_gWorld);
|
| - m_gWorld = 0;
|
| - m_gWorldWidth = 0;
|
| - m_gWorldHeight = 0;
|
| -}
|
| -
|
| -void QTMovieGWorldPrivate::movieEnded(QTMovie*)
|
| -{
|
| - // Do nothing
|
| -}
|
| -
|
| -void QTMovieGWorldPrivate::movieLoadStateChanged(QTMovie* movie)
|
| -{
|
| - long loadState = GetMovieLoadState(movie->getMovieHandle());
|
| - if (loadState != m_loadState) {
|
| -
|
| - // we only need to erase the movie gworld when the load state changes to loaded while it
|
| - // is visible as the gworld is destroyed/created when visibility changes
|
| - bool movieNewlyPlayable = loadState >= QTMovieLoadStateLoaded && m_loadState < QTMovieLoadStateLoaded;
|
| - m_loadState = loadState;
|
| -
|
| - if (movieNewlyPlayable) {
|
| - updateMovieSize();
|
| - if (m_visible)
|
| - clearGWorld();
|
| - }
|
| - }
|
| -}
|
| -
|
| -void QTMovieGWorldPrivate::movieTimeChanged(QTMovie*)
|
| -{
|
| - // Do nothing
|
| -}
|
| -
|
| -QTMovieGWorld::QTMovieGWorld(QTMovieGWorldClient* client)
|
| - : m_private(new QTMovieGWorldPrivate(this))
|
| -{
|
| - m_private->m_client = client;
|
| -}
|
| -
|
| -QTMovieGWorld::~QTMovieGWorld()
|
| -{
|
| - delete m_private;
|
| -}
|
| -
|
| -void QTMovieGWorld::setSize(int width, int height)
|
| -{
|
| - m_private->setSize(width, height);
|
| - QTMovieTask::sharedTask()->updateTaskTimer();
|
| -}
|
| -
|
| -void QTMovieGWorld::setVisible(bool b)
|
| -{
|
| - m_private->m_visible = b;
|
| - m_private->updateGWorld();
|
| -}
|
| -
|
| -void QTMovieGWorld::getCurrentFrameInfo(void*& buffer, unsigned& bitsPerPixel, unsigned& rowBytes, unsigned& width, unsigned& height)
|
| -{
|
| - if (!m_private->m_gWorld) {
|
| - buffer = 0;
|
| - bitsPerPixel = 0;
|
| - rowBytes = 0;
|
| - width = 0;
|
| - height = 0;
|
| - return;
|
| - }
|
| - PixMapHandle offscreenPixMap = GetGWorldPixMap(m_private->m_gWorld);
|
| - buffer = (*offscreenPixMap)->baseAddr;
|
| - bitsPerPixel = (*offscreenPixMap)->pixelSize;
|
| - rowBytes = (*offscreenPixMap)->rowBytes & 0x3FFF;
|
| - width = m_private->m_width;
|
| - height = m_private->m_height;
|
| -}
|
| -
|
| -void QTMovieGWorld::paint(HDC hdc, int x, int y)
|
| -{
|
| - if (!m_private->m_gWorld)
|
| - return;
|
| -
|
| - HDC hdcSrc = static_cast<HDC>(GetPortHDC(reinterpret_cast<GrafPtr>(m_private->m_gWorld)));
|
| - if (!hdcSrc)
|
| - return;
|
| -
|
| - // FIXME: If we could determine the movie has no alpha, we could use BitBlt for those cases, which might be faster.
|
| - BLENDFUNCTION blendFunction;
|
| - blendFunction.BlendOp = AC_SRC_OVER;
|
| - blendFunction.BlendFlags = 0;
|
| - blendFunction.SourceConstantAlpha = 255;
|
| - blendFunction.AlphaFormat = AC_SRC_ALPHA;
|
| - AlphaBlend(hdc, x, y, m_private->m_width, m_private->m_height, hdcSrc,
|
| - 0, 0, m_private->m_width, m_private->m_height, blendFunction);
|
| -}
|
| -
|
| -void QTMovieGWorld::setDisabled(bool b)
|
| -{
|
| - m_private->m_disabled = b;
|
| -}
|
| -
|
| -bool QTMovieGWorld::isDisabled() const
|
| -{
|
| - return m_private->m_disabled;
|
| -}
|
| -
|
| -LRESULT QTMovieGWorld::fullscreenWndProc(HWND wnd, UINT message, WPARAM wParam, LPARAM lParam)
|
| -{
|
| - QTMovieGWorld* movie = static_cast<QTMovieGWorld*>(GetPropW(wnd, fullscreenQTMovieGWorldPointerProp));
|
| -
|
| - if (message == WM_DESTROY)
|
| - RemovePropW(wnd, fullscreenQTMovieGWorldPointerProp);
|
| -
|
| - if (!movie)
|
| - return DefWindowProc(wnd, message, wParam, lParam);
|
| -
|
| - return movie->m_private->m_fullscreenClient->fullscreenClientWndProc(wnd, message, wParam, lParam);
|
| -}
|
| -
|
| -HWND QTMovieGWorld::enterFullscreen(QTMovieGWorldFullscreenClient* client)
|
| -{
|
| - m_private->m_fullscreenClient = client;
|
| -
|
| - BeginFullScreen(&m_private->m_fullscreenRestoreState, 0, 0, 0, &m_private->m_fullscreenWindow, 0, fullScreenAllowEvents);
|
| - QTMLSetWindowWndProc(m_private->m_fullscreenWindow, fullscreenWndProc);
|
| - CreatePortAssociation(GetPortNativeWindow(m_private->m_fullscreenWindow), 0, 0);
|
| -
|
| - GetMovieBox(m_private->m_movie, &m_private->m_fullscreenRect);
|
| - GetMovieGWorld(m_private->m_movie, &m_private->m_fullscreenOrigGWorld, 0);
|
| - SetMovieGWorld(m_private->m_movie, reinterpret_cast<CGrafPtr>(m_private->m_fullscreenWindow), GetGWorldDevice(reinterpret_cast<CGrafPtr>(m_private->m_fullscreenWindow)));
|
| -
|
| - // Set the size of the box to preserve aspect ratio
|
| - Rect rect = m_private->m_fullscreenWindow->portRect;
|
| -
|
| - float movieRatio = static_cast<float>(m_private->m_width) / m_private->m_height;
|
| - int windowWidth = rect.right - rect.left;
|
| - int windowHeight = rect.bottom - rect.top;
|
| - float windowRatio = static_cast<float>(windowWidth) / windowHeight;
|
| - int actualWidth = (windowRatio > movieRatio) ? (windowHeight * movieRatio) : windowWidth;
|
| - int actualHeight = (windowRatio < movieRatio) ? (windowWidth / movieRatio) : windowHeight;
|
| - int offsetX = (windowWidth - actualWidth) / 2;
|
| - int offsetY = (windowHeight - actualHeight) / 2;
|
| -
|
| - rect.left = offsetX;
|
| - rect.right = offsetX + actualWidth;
|
| - rect.top = offsetY;
|
| - rect.bottom = offsetY + actualHeight;
|
| -
|
| - SetMovieBox(m_private->m_movie, &rect);
|
| - ShowHideTaskBar(true);
|
| -
|
| - // Set the 'this' pointer on the HWND
|
| - HWND wnd = static_cast<HWND>(GetPortNativeWindow(m_private->m_fullscreenWindow));
|
| - SetPropW(wnd, fullscreenQTMovieGWorldPointerProp, static_cast<HANDLE>(this));
|
| -
|
| - return wnd;
|
| -}
|
| -
|
| -void QTMovieGWorld::exitFullscreen()
|
| -{
|
| - if (!m_private->m_fullscreenWindow)
|
| - return;
|
| -
|
| - HWND wnd = static_cast<HWND>(GetPortNativeWindow(m_private->m_fullscreenWindow));
|
| - DestroyPortAssociation(reinterpret_cast<CGrafPtr>(m_private->m_fullscreenWindow));
|
| - SetMovieGWorld(m_private->m_movie, m_private->m_fullscreenOrigGWorld, 0);
|
| - EndFullScreen(m_private->m_fullscreenRestoreState, 0L);
|
| - SetMovieBox(m_private->m_movie, &m_private->m_fullscreenRect);
|
| - m_private->m_fullscreenWindow = 0;
|
| -}
|
| -
|
| -void QTMovieGWorld::setMovie(PassRefPtr<QTMovie> movie)
|
| -{
|
| - if (m_private->m_qtMovie) {
|
| - m_private->unregisterDrawingCallback();
|
| - m_private->m_qtMovie->removeClient(m_private);
|
| - m_private->m_qtMovie = 0;
|
| - m_private->m_movie = 0;
|
| - }
|
| -
|
| - m_private->m_qtMovie = movie;
|
| -
|
| - if (m_private->m_qtMovie) {
|
| - m_private->m_qtMovie->addClient(m_private);
|
| - m_private->m_movie = m_private->m_qtMovie->getMovieHandle();
|
| - m_private->registerDrawingCallback();
|
| - }
|
| -}
|
| -
|
| -QTMovie* QTMovieGWorld::movie() const
|
| -{
|
| - return m_private->m_qtMovie.get();
|
| -}
|
|
|