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