16c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen/* 26c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * Copyright (C) 2007, 2008, 2009, 2010 Apple, Inc. All rights reserved. 36c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * 46c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * Redistribution and use in source and binary forms, with or without 56c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * modification, are permitted provided that the following conditions 66c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * are met: 76c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * 1. Redistributions of source code must retain the above copyright 86c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * notice, this list of conditions and the following disclaimer. 96c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * 2. Redistributions in binary form must reproduce the above copyright 106c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * notice, this list of conditions and the following disclaimer in the 116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * documentation and/or other materials provided with the distribution. 126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * 136c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 146c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 156c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 166c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 176c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 186c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 196c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 206c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 216c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 226c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 236c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 246c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen */ 256c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#include "config.h" 266c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 276c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#include "QTMovieGWorld.h" 286c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 296c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#include "QTMovieTask.h" 306c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#include <GXMath.h> 316c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#include <Movies.h> 326c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#include <QTML.h> 336c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#include <QuickTimeComponents.h> 346c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#include <wtf/Assertions.h> 356c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#include <wtf/HashSet.h> 366c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#include <wtf/Noncopyable.h> 376c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#include <wtf/Vector.h> 386c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 396c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenusing namespace std; 406c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 416c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenstatic const long minimumQuickTimeVersion = 0x07300000; // 7.3 426c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 432fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockstatic LPCWSTR fullscreenQTMovieGWorldPointerProp = L"fullscreenQTMovieGWorldPointer"; 446c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 456c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen// Resizing GWorlds is slow, give them a minimum size so size of small 466c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen// videos can be animated smoothly 476c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenstatic const int cGWorldMinWidth = 640; 486c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenstatic const int cGWorldMinHeight = 360; 496c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 506c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenstatic const float cNonContinuousTimeChange = 0.2f; 516c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 526c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenunion UppParam { 536c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen long longValue; 546c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen void* ptr; 556c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen}; 566c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 576c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenstatic MovieDrawingCompleteUPP gMovieDrawingCompleteUPP = 0; 586c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenstatic HashSet<QTMovieGWorldPrivate*>* gTaskList; 596c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenstatic Vector<CFStringRef>* gSupportedTypes = 0; 606c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenstatic SInt32 quickTimeVersion = 0; 616c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 626c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenclass QTMovieGWorldPrivate : public QTMovieClient { 636c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenpublic: 646c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen QTMovieGWorldPrivate(QTMovieGWorld* movieWin); 656c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen virtual ~QTMovieGWorldPrivate(); 666c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 676c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen void registerDrawingCallback(); 686c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen void unregisterDrawingCallback(); 696c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen void drawingComplete(); 706c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen void updateGWorld(); 716c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen void createGWorld(); 726c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen void deleteGWorld(); 736c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen void clearGWorld(); 746c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen void updateMovieSize(); 756c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 766c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen void setSize(int, int); 776c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 786c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen virtual void movieEnded(QTMovie*); 796c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen virtual void movieLoadStateChanged(QTMovie*); 806c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen virtual void movieTimeChanged(QTMovie*); 816c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 826c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen QTMovieGWorld* m_movieWin; 836c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen RefPtr<QTMovie> m_qtMovie; 846c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen Movie m_movie; 856c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen QTMovieGWorldClient* m_client; 866c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen long m_loadState; 876c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen int m_width; 886c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen int m_height; 896c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen bool m_visible; 906c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen GWorldPtr m_gWorld; 916c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen int m_gWorldWidth; 926c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen int m_gWorldHeight; 936c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen GWorldPtr m_savedGWorld; 946c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen float m_widthScaleFactor; 956c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen float m_heightScaleFactor; 966c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#if !ASSERT_DISABLED 976c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen bool m_scaleCached; 986c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#endif 996c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen WindowPtr m_fullscreenWindow; 1006c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen GWorldPtr m_fullscreenOrigGWorld; 1016c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen Rect m_fullscreenRect; 1026c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen QTMovieGWorldFullscreenClient* m_fullscreenClient; 1036c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen char* m_fullscreenRestoreState; 1046c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen bool m_disabled; 1056c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen}; 1066c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 1076c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenQTMovieGWorldPrivate::QTMovieGWorldPrivate(QTMovieGWorld* movieWin) 1086c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen : m_movieWin(movieWin) 1096c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_movie(0) 1106c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_client(0) 1116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_loadState(0) 1126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_width(0) 1136c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_height(0) 1146c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_visible(false) 1156c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_gWorld(0) 1166c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_gWorldWidth(0) 1176c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_gWorldHeight(0) 1186c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_savedGWorld(0) 1196c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_widthScaleFactor(1) 1206c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_heightScaleFactor(1) 1216c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#if !ASSERT_DISABLED 1226c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_scaleCached(false) 1236c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#endif 1246c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_fullscreenWindow(0) 1256c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_fullscreenOrigGWorld(0) 1266c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_fullscreenClient(0) 1276c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_fullscreenRestoreState(0) 1286c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_disabled(false) 1296c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_qtMovie(0) 1306c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 1316c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen Rect rect = { 0, 0, 0, 0 }; 1326c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_fullscreenRect = rect; 1336c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 1346c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 1356c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenQTMovieGWorldPrivate::~QTMovieGWorldPrivate() 1366c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 1376c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen ASSERT(!m_fullscreenWindow); 1386c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 1396c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (m_gWorld) 1406c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen deleteGWorld(); 1416c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 1426c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 1436c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenpascal OSErr movieDrawingCompleteProc(Movie movie, long data) 1446c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 1456c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen UppParam param; 1466c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen param.longValue = data; 1476c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen QTMovieGWorldPrivate* mp = static_cast<QTMovieGWorldPrivate*>(param.ptr); 1486c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (mp) 1496c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen mp->drawingComplete(); 1506c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return 0; 1516c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 1526c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 1536c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenvoid QTMovieGWorldPrivate::registerDrawingCallback() 1546c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 1556c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (!gMovieDrawingCompleteUPP) 1566c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen gMovieDrawingCompleteUPP = NewMovieDrawingCompleteUPP(movieDrawingCompleteProc); 1576c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 1586c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen UppParam param; 1596c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen param.ptr = this; 1606c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen SetMovieDrawingCompleteProc(m_movie, movieDrawingCallWhenChanged, gMovieDrawingCompleteUPP, param.longValue); 1616c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 1626c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 1636c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenvoid QTMovieGWorldPrivate::unregisterDrawingCallback() 1646c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 1656c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen SetMovieDrawingCompleteProc(m_movie, movieDrawingCallWhenChanged, 0, 0); 1666c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 1676c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 1686c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenvoid QTMovieGWorldPrivate::drawingComplete() 1696c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 1706c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (!m_gWorld || m_movieWin->m_private->m_disabled || m_loadState < QTMovieLoadStateLoaded) 1716c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return; 1726c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_client->movieNewImageAvailable(m_movieWin); 1736c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 1746c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 1756c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenvoid QTMovieGWorldPrivate::updateGWorld() 1766c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 1776c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen bool shouldBeVisible = m_visible; 1786c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (!m_height || !m_width) 1796c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen shouldBeVisible = false; 1806c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 1816c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (shouldBeVisible && !m_gWorld) 1826c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen createGWorld(); 1836c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen else if (!shouldBeVisible && m_gWorld) 1846c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen deleteGWorld(); 1856c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen else if (m_gWorld && (m_width > m_gWorldWidth || m_height > m_gWorldHeight)) { 1866c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen // need a bigger, better gWorld 1876c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen deleteGWorld(); 1886c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen createGWorld(); 1896c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen } 1906c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 1916c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 1926c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenvoid QTMovieGWorldPrivate::createGWorld() 1936c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 1946c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen ASSERT(!m_gWorld); 1956c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (!m_movie || m_loadState < QTMovieLoadStateLoaded) 1966c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return; 1976c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 1986c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_gWorldWidth = max(cGWorldMinWidth, m_width); 1996c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_gWorldHeight = max(cGWorldMinHeight, m_height); 2006c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen Rect bounds; 2016c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen bounds.top = 0; 2026c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen bounds.left = 0; 2036c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen bounds.right = m_gWorldWidth; 2046c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen bounds.bottom = m_gWorldHeight; 2056c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen OSErr err = QTNewGWorld(&m_gWorld, k32BGRAPixelFormat, &bounds, 0, 0, 0); 2066c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (err) 2076c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return; 2086c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen GetMovieGWorld(m_movie, &m_savedGWorld, 0); 2096c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen SetMovieGWorld(m_movie, m_gWorld, 0); 2106c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen bounds.right = m_width; 2116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen bounds.bottom = m_height; 2126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen SetMovieBox(m_movie, &bounds); 2136c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 2146c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 2156c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenvoid QTMovieGWorldPrivate::clearGWorld() 2166c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 2176c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (!m_movie || !m_gWorld) 2186c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return; 2196c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 2206c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen GrafPtr savePort; 2216c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen GetPort(&savePort); 2226c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen MacSetPort((GrafPtr)m_gWorld); 2236c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 2246c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen Rect bounds; 2256c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen bounds.top = 0; 2266c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen bounds.left = 0; 2276c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen bounds.right = m_gWorldWidth; 2286c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen bounds.bottom = m_gWorldHeight; 2296c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen EraseRect(&bounds); 2306c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 2316c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen MacSetPort(savePort); 2326c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 2336c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 2346c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenvoid QTMovieGWorldPrivate::setSize(int width, int height) 2356c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 2366c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (m_width == width && m_height == height) 2376c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return; 2386c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_width = width; 2396c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_height = height; 2406c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 2416c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen // Do not change movie box before reaching load state loaded as we grab 2426c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen // the initial size when task() sees that state for the first time, and 2436c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen // we need the initial size to be able to scale movie properly. 2446c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (!m_movie || m_loadState < QTMovieLoadStateLoaded) 2456c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return; 2466c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 2476c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#if !ASSERT_DISABLED 2486c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen ASSERT(m_scaleCached); 2496c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#endif 2506c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 2516c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen updateMovieSize(); 2526c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 2536c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 2546c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenvoid QTMovieGWorldPrivate::updateMovieSize() 2556c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 2566c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (!m_movie || m_loadState < QTMovieLoadStateLoaded) 2576c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return; 2586c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 2596c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen Rect bounds; 2606c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen bounds.top = 0; 2616c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen bounds.left = 0; 2626c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen bounds.right = m_width; 2636c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen bounds.bottom = m_height; 2646c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen SetMovieBox(m_movie, &bounds); 2656c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen updateGWorld(); 2666c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 2676c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 2686c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 2696c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenvoid QTMovieGWorldPrivate::deleteGWorld() 2706c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 2716c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen ASSERT(m_gWorld); 2726c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (m_movie) 2736c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen SetMovieGWorld(m_movie, m_savedGWorld, 0); 2746c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_savedGWorld = 0; 2756c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen DisposeGWorld(m_gWorld); 2766c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_gWorld = 0; 2776c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_gWorldWidth = 0; 2786c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_gWorldHeight = 0; 2796c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 2806c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 2816c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenvoid QTMovieGWorldPrivate::movieEnded(QTMovie*) 2826c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 2836c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen // Do nothing 2846c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 2856c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 2866c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenvoid QTMovieGWorldPrivate::movieLoadStateChanged(QTMovie* movie) 2876c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 2886c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen long loadState = GetMovieLoadState(movie->getMovieHandle()); 2896c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (loadState != m_loadState) { 2906c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 2916c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen // we only need to erase the movie gworld when the load state changes to loaded while it 2926c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen // is visible as the gworld is destroyed/created when visibility changes 2936c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen bool movieNewlyPlayable = loadState >= QTMovieLoadStateLoaded && m_loadState < QTMovieLoadStateLoaded; 2946c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_loadState = loadState; 2956c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 2966c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (movieNewlyPlayable) { 2976c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen updateMovieSize(); 2986c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (m_visible) 2996c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen clearGWorld(); 3006c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen } 3016c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen } 3026c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 3036c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 3046c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenvoid QTMovieGWorldPrivate::movieTimeChanged(QTMovie*) 3056c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 3066c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen // Do nothing 3076c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 3086c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 3096c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenQTMovieGWorld::QTMovieGWorld(QTMovieGWorldClient* client) 3106c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen : m_private(new QTMovieGWorldPrivate(this)) 3116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 3126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_private->m_client = client; 3136c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 3146c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 3156c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenQTMovieGWorld::~QTMovieGWorld() 3166c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 3176c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen delete m_private; 3186c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 3196c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 3206c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenvoid QTMovieGWorld::setSize(int width, int height) 3216c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 3226c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_private->setSize(width, height); 3236c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen QTMovieTask::sharedTask()->updateTaskTimer(); 3246c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 3256c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 3266c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenvoid QTMovieGWorld::setVisible(bool b) 3276c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 3286c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_private->m_visible = b; 3296c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_private->updateGWorld(); 3306c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 3316c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 3326c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenvoid QTMovieGWorld::getCurrentFrameInfo(void*& buffer, unsigned& bitsPerPixel, unsigned& rowBytes, unsigned& width, unsigned& height) 3336c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 3346c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (!m_private->m_gWorld) { 3356c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen buffer = 0; 3366c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen bitsPerPixel = 0; 3376c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen rowBytes = 0; 3386c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen width = 0; 3396c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen height = 0; 3406c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return; 3416c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen } 3426c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen PixMapHandle offscreenPixMap = GetGWorldPixMap(m_private->m_gWorld); 3436c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen buffer = (*offscreenPixMap)->baseAddr; 3446c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen bitsPerPixel = (*offscreenPixMap)->pixelSize; 3456c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen rowBytes = (*offscreenPixMap)->rowBytes & 0x3FFF; 3466c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen width = m_private->m_width; 3476c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen height = m_private->m_height; 3486c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 3496c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 3506c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenvoid QTMovieGWorld::paint(HDC hdc, int x, int y) 3516c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 3526c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (!m_private->m_gWorld) 3536c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return; 3546c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 3556c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen HDC hdcSrc = static_cast<HDC>(GetPortHDC(reinterpret_cast<GrafPtr>(m_private->m_gWorld))); 3566c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (!hdcSrc) 3576c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return; 3586c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 3596c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen // FIXME: If we could determine the movie has no alpha, we could use BitBlt for those cases, which might be faster. 3606c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen BLENDFUNCTION blendFunction; 3616c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen blendFunction.BlendOp = AC_SRC_OVER; 3626c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen blendFunction.BlendFlags = 0; 3636c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen blendFunction.SourceConstantAlpha = 255; 3646c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen blendFunction.AlphaFormat = AC_SRC_ALPHA; 3656c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen AlphaBlend(hdc, x, y, m_private->m_width, m_private->m_height, hdcSrc, 3666c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 0, 0, m_private->m_width, m_private->m_height, blendFunction); 3676c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 3686c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 3696c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenvoid QTMovieGWorld::setDisabled(bool b) 3706c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 3716c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_private->m_disabled = b; 3726c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 3736c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 3746c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenbool QTMovieGWorld::isDisabled() const 3756c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 3766c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return m_private->m_disabled; 3776c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 3786c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 3796c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenLRESULT QTMovieGWorld::fullscreenWndProc(HWND wnd, UINT message, WPARAM wParam, LPARAM lParam) 3806c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 3812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block QTMovieGWorld* movie = static_cast<QTMovieGWorld*>(GetPropW(wnd, fullscreenQTMovieGWorldPointerProp)); 3826c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 3836c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (message == WM_DESTROY) 3842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block RemovePropW(wnd, fullscreenQTMovieGWorldPointerProp); 3856c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 3866c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (!movie) 3876c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return DefWindowProc(wnd, message, wParam, lParam); 3886c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 3896c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return movie->m_private->m_fullscreenClient->fullscreenClientWndProc(wnd, message, wParam, lParam); 3906c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 3916c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 3926c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenHWND QTMovieGWorld::enterFullscreen(QTMovieGWorldFullscreenClient* client) 3936c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 3946c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_private->m_fullscreenClient = client; 3956c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 3966c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen BeginFullScreen(&m_private->m_fullscreenRestoreState, 0, 0, 0, &m_private->m_fullscreenWindow, 0, fullScreenAllowEvents); 3976c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen QTMLSetWindowWndProc(m_private->m_fullscreenWindow, fullscreenWndProc); 3986c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen CreatePortAssociation(GetPortNativeWindow(m_private->m_fullscreenWindow), 0, 0); 3996c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 4006c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen GetMovieBox(m_private->m_movie, &m_private->m_fullscreenRect); 4016c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen GetMovieGWorld(m_private->m_movie, &m_private->m_fullscreenOrigGWorld, 0); 4026c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen SetMovieGWorld(m_private->m_movie, reinterpret_cast<CGrafPtr>(m_private->m_fullscreenWindow), GetGWorldDevice(reinterpret_cast<CGrafPtr>(m_private->m_fullscreenWindow))); 4036c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 4046c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen // Set the size of the box to preserve aspect ratio 4056c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen Rect rect = m_private->m_fullscreenWindow->portRect; 4066c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 4076c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen float movieRatio = static_cast<float>(m_private->m_width) / m_private->m_height; 4086c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen int windowWidth = rect.right - rect.left; 4096c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen int windowHeight = rect.bottom - rect.top; 4106c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen float windowRatio = static_cast<float>(windowWidth) / windowHeight; 4116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen int actualWidth = (windowRatio > movieRatio) ? (windowHeight * movieRatio) : windowWidth; 4126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen int actualHeight = (windowRatio < movieRatio) ? (windowWidth / movieRatio) : windowHeight; 4136c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen int offsetX = (windowWidth - actualWidth) / 2; 4146c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen int offsetY = (windowHeight - actualHeight) / 2; 4156c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 4166c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen rect.left = offsetX; 4176c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen rect.right = offsetX + actualWidth; 4186c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen rect.top = offsetY; 4196c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen rect.bottom = offsetY + actualHeight; 4206c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 4216c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen SetMovieBox(m_private->m_movie, &rect); 4226c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen ShowHideTaskBar(true); 4236c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 4246c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen // Set the 'this' pointer on the HWND 4256c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen HWND wnd = static_cast<HWND>(GetPortNativeWindow(m_private->m_fullscreenWindow)); 4262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block SetPropW(wnd, fullscreenQTMovieGWorldPointerProp, static_cast<HANDLE>(this)); 4276c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 4286c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return wnd; 4296c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 4306c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 4316c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenvoid QTMovieGWorld::exitFullscreen() 4326c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 4336c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (!m_private->m_fullscreenWindow) 4346c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return; 4356c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 4366c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen HWND wnd = static_cast<HWND>(GetPortNativeWindow(m_private->m_fullscreenWindow)); 4376c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen DestroyPortAssociation(reinterpret_cast<CGrafPtr>(m_private->m_fullscreenWindow)); 4386c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen SetMovieGWorld(m_private->m_movie, m_private->m_fullscreenOrigGWorld, 0); 4396c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen EndFullScreen(m_private->m_fullscreenRestoreState, 0L); 4406c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen SetMovieBox(m_private->m_movie, &m_private->m_fullscreenRect); 4416c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_private->m_fullscreenWindow = 0; 4426c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 4436c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 4446c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenvoid QTMovieGWorld::setMovie(PassRefPtr<QTMovie> movie) 4456c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 4466c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (m_private->m_qtMovie) { 4476c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_private->unregisterDrawingCallback(); 4486c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_private->m_qtMovie->removeClient(m_private); 4496c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_private->m_qtMovie = 0; 4506c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_private->m_movie = 0; 4516c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen } 4526c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 4536c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_private->m_qtMovie = movie; 4546c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 4556c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (m_private->m_qtMovie) { 4566c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_private->m_qtMovie->addClient(m_private); 4576c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_private->m_movie = m_private->m_qtMovie->getMovieHandle(); 4586c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_private->registerDrawingCallback(); 4596c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen } 4606c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 4616c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 4626c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenQTMovie* QTMovieGWorld::movie() const 4636c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 4646c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return m_private->m_qtMovie.get(); 4656c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 466