mirror of
https://github.com/elasota/Aerofoil.git
synced 2025-09-23 23:00:42 +00:00
Get TVs working
This commit is contained in:
@@ -1,140 +1,273 @@
|
||||
#include "PLMovies.h"
|
||||
|
||||
PLError_t EnterMovies()
|
||||
#include "BitmapImage.h"
|
||||
#include "MemoryManager.h"
|
||||
#include "PLQDraw.h"
|
||||
#include "PLResources.h"
|
||||
#include "QDManager.h"
|
||||
#include "QDPixMap.h"
|
||||
#include "ResourceManager.h"
|
||||
|
||||
#include "rapidjson/rapidjson.h"
|
||||
#include "rapidjson/document.h"
|
||||
|
||||
|
||||
AnimationPlayer::AnimationPlayer()
|
||||
: m_animPackage(nullptr)
|
||||
, m_renderRect(Rect::Create(0, 0, 0, 0))
|
||||
, m_constrainRect(Rect::Create(0, 0, 0, 0))
|
||||
, m_surface(nullptr)
|
||||
, m_playing(false)
|
||||
, m_timer(0)
|
||||
, m_frameIndex(0)
|
||||
, m_isFrameCurrent(false)
|
||||
, m_next(nullptr)
|
||||
, m_prev(nullptr)
|
||||
{
|
||||
return PLErrors::kNone;
|
||||
}
|
||||
|
||||
UserData GetMovieUserData(Movie movie)
|
||||
void AnimationPlayer::SetPackage(AnimationPackage *animPackage)
|
||||
{
|
||||
PL_NotYetImplemented();
|
||||
return nullptr;
|
||||
m_animPackage = animPackage;
|
||||
Restart();
|
||||
}
|
||||
|
||||
int CountUserDataType(UserData userData, UInt32 type)
|
||||
void AnimationPlayer::Restart()
|
||||
{
|
||||
PL_NotYetImplemented();
|
||||
return 0;
|
||||
m_isFrameCurrent = (m_frameIndex == 0);
|
||||
|
||||
m_playing = false;
|
||||
m_timer = 0;
|
||||
m_frameIndex = 0;
|
||||
}
|
||||
|
||||
PLError_t RemoveUserData(UserData userData, UInt32 type, int index)
|
||||
AnimationPackage *AnimationPackage::Create()
|
||||
{
|
||||
PL_NotYetImplemented();
|
||||
return PLErrors::kNone;
|
||||
void *storage = PortabilityLayer::MemoryManager::GetInstance()->Alloc(sizeof(AnimationPackage));
|
||||
if (!storage)
|
||||
return nullptr;
|
||||
|
||||
return new (storage) AnimationPackage();
|
||||
}
|
||||
|
||||
PLError_t AddUserData(UserData userData, Handle data, UInt32 type)
|
||||
void AnimationPackage::Destroy()
|
||||
{
|
||||
PL_NotYetImplemented();
|
||||
return PLErrors::kNone;
|
||||
this->~AnimationPackage();
|
||||
PortabilityLayer::MemoryManager::GetInstance()->Release(this);
|
||||
}
|
||||
|
||||
PLError_t OpenMovieFile(const VFileSpec &fsSpec, short *outRefNum, int permissions)
|
||||
bool AnimationPackage::Load(PortabilityLayer::VirtualDirectory_t virtualDir, const PLPasStr &path)
|
||||
{
|
||||
PL_NotYetImplemented_TODO("Movies");
|
||||
return PLErrors::kNone;
|
||||
m_resArchive = PortabilityLayer::ResourceManager::GetInstance()->LoadResFile(virtualDir, path);
|
||||
if (!m_resArchive)
|
||||
return false;
|
||||
|
||||
THandle<void> movieMetadataRes = m_resArchive->LoadResource('muvi', 0);
|
||||
if (!movieMetadataRes)
|
||||
return false;
|
||||
|
||||
const void *movieMetadata = *movieMetadataRes;
|
||||
|
||||
rapidjson::Document document;
|
||||
document.Parse(static_cast<const char*>(movieMetadata), movieMetadataRes.MMBlock()->m_size);
|
||||
|
||||
movieMetadataRes.Dispose();
|
||||
|
||||
if (document.HasParseError() || !document.IsObject())
|
||||
return false;
|
||||
|
||||
if (!document.HasMember("frameRateNumerator") || !document.HasMember("frameRateDenominator"))
|
||||
return false;
|
||||
|
||||
const rapidjson::Value &frameRateNumeratorJSON = document["frameRateNumerator"];
|
||||
const rapidjson::Value &frameRateDenominatorJSON = document["frameRateDenominator"];
|
||||
|
||||
if (!frameRateNumeratorJSON.IsInt() && !frameRateDenominatorJSON.IsInt())
|
||||
return false;
|
||||
|
||||
const int frameRateNumerator = frameRateNumeratorJSON.GetInt();
|
||||
const int frameRateDenominator = frameRateDenominatorJSON.GetInt();
|
||||
|
||||
if (frameRateNumerator < 1 || frameRateDenominator < 1)
|
||||
return false;
|
||||
|
||||
if (frameRateDenominator > INT_MAX / 60 || frameRateDenominator * 60 < frameRateNumerator)
|
||||
return false; // We only support up to 60fps
|
||||
|
||||
m_frameRateNumerator = frameRateNumerator;
|
||||
m_frameRateDenominator = frameRateDenominator;
|
||||
|
||||
uint32_t numFrames = 0;
|
||||
for (;;)
|
||||
{
|
||||
if (numFrames + 1 > 0x7fff)
|
||||
return false;
|
||||
|
||||
THandle<void> frameRes = m_resArchive->LoadResource('PICT', numFrames + 1);
|
||||
if (!frameRes)
|
||||
break;
|
||||
else
|
||||
{
|
||||
if (frameRes.MMBlock()->m_size < sizeof(BitmapImage))
|
||||
return false;
|
||||
|
||||
numFrames++;
|
||||
}
|
||||
}
|
||||
|
||||
if (numFrames == 0)
|
||||
return false;
|
||||
|
||||
void *imageListStorage = PortabilityLayer::MemoryManager::GetInstance()->Alloc(sizeof(THandle<BitmapImage>) * numFrames);
|
||||
if (!imageListStorage)
|
||||
return false;
|
||||
|
||||
m_images = static_cast<THandle<BitmapImage>*>(imageListStorage);
|
||||
|
||||
for (uint32_t i = 0; i < numFrames; i++)
|
||||
new (m_images + i) THandle<BitmapImage>();
|
||||
|
||||
for (uint32_t i = 0; i < numFrames; i++)
|
||||
m_images[i] = m_resArchive->LoadResource('PICT', i + 1).StaticCast<BitmapImage>();
|
||||
|
||||
m_numImages = numFrames;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
PLError_t NewMovieFromFile(Movie *movie, short refNum, const short *optResId, StringPtr resName, int flags, Boolean *unused)
|
||||
const THandle<BitmapImage> &AnimationPackage::GetFrame(size_t index) const
|
||||
{
|
||||
PL_NotYetImplemented_TODO("Movies");
|
||||
return PLErrors::kNone;
|
||||
return m_images[index];
|
||||
}
|
||||
|
||||
PLError_t CloseMovieFile(short refNum)
|
||||
size_t AnimationPackage::NumFrames() const
|
||||
{
|
||||
PL_NotYetImplemented();
|
||||
return PLErrors::kNone;
|
||||
return m_numImages;
|
||||
}
|
||||
|
||||
PLError_t GoToBeginningOfMovie(Movie movie)
|
||||
uint32_t AnimationPackage::GetFrameRateNumerator() const
|
||||
{
|
||||
PL_NotYetImplemented();
|
||||
return PLErrors::kNone;
|
||||
return m_frameRateNumerator;
|
||||
}
|
||||
|
||||
PLError_t LoadMovieIntoRam(Movie movie, TimeValue time, TimeValue duration, int flags)
|
||||
uint32_t AnimationPackage::GetFrameRateDenominator() const
|
||||
{
|
||||
PL_NotYetImplemented();
|
||||
return PLErrors::kNone;
|
||||
return m_frameRateDenominator;
|
||||
}
|
||||
|
||||
TimeValue GetMovieTime(Movie movie, TimeRecord *outCurrentTime)
|
||||
|
||||
AnimationPackage::AnimationPackage()
|
||||
: m_images(nullptr)
|
||||
, m_resArchive(nullptr)
|
||||
, m_numImages(0)
|
||||
{
|
||||
PL_NotYetImplemented();
|
||||
return 0;
|
||||
}
|
||||
|
||||
TimeValue GetMovieDuration(Movie movie)
|
||||
AnimationPackage::~AnimationPackage()
|
||||
{
|
||||
PL_NotYetImplemented();
|
||||
return 0;
|
||||
m_resArchive->Destroy();
|
||||
PortabilityLayer::MemoryManager::GetInstance()->Release(m_images);
|
||||
}
|
||||
|
||||
PLError_t PrerollMovie(Movie movie, TimeValue time, UInt32 rate)
|
||||
|
||||
void AnimationManager::RegisterPlayer(AnimationPlayer *player)
|
||||
{
|
||||
PL_NotYetImplemented();
|
||||
return PLErrors::kNone;
|
||||
assert(player->m_prev == nullptr || player->m_next == nullptr);
|
||||
|
||||
if (!m_firstPlayer)
|
||||
m_firstPlayer = player;
|
||||
|
||||
if (m_lastPlayer)
|
||||
m_lastPlayer->m_next = player;
|
||||
|
||||
player->m_prev = m_lastPlayer;
|
||||
player->m_next = nullptr;
|
||||
|
||||
m_lastPlayer = player;
|
||||
}
|
||||
|
||||
TimeBase GetMovieTimeBase(Movie movie)
|
||||
void AnimationManager::RemovePlayer(AnimationPlayer *player)
|
||||
{
|
||||
PL_NotYetImplemented();
|
||||
return nullptr;
|
||||
if (m_firstPlayer == player)
|
||||
m_firstPlayer = m_firstPlayer->m_next;
|
||||
|
||||
if (m_lastPlayer == player)
|
||||
m_lastPlayer = m_lastPlayer->m_prev;
|
||||
|
||||
if (player->m_prev)
|
||||
player->m_prev->m_next = player->m_next;
|
||||
if (player->m_next)
|
||||
player->m_next->m_prev = player->m_prev;
|
||||
|
||||
player->m_prev = player->m_next = nullptr;
|
||||
}
|
||||
|
||||
PLError_t SetTimeBaseFlags(TimeBase timeBase, int flags)
|
||||
void AnimationManager::RefreshPlayer(AnimationPlayer *player)
|
||||
{
|
||||
PL_NotYetImplemented();
|
||||
return PLErrors::kNone;
|
||||
if (!player->m_playing || !player->m_animPackage || !player->m_surface)
|
||||
return;
|
||||
|
||||
AnimationPackage *anim = player->m_animPackage;
|
||||
|
||||
if (!player->m_isFrameCurrent)
|
||||
{
|
||||
player->m_isFrameCurrent = true;
|
||||
|
||||
THandle<BitmapImage> img = anim->GetFrame(player->m_frameIndex);
|
||||
|
||||
DrawSurface *surface = player->m_surface;
|
||||
|
||||
if (player->m_renderRect == player->m_constrainRect)
|
||||
surface->DrawPicture(img, player->m_renderRect);
|
||||
else
|
||||
{
|
||||
DrawSurface *renderSurface = nullptr;
|
||||
if (PortabilityLayer::QDManager::GetInstance()->NewGWorld(&renderSurface, surface->m_port.GetPixelFormat(), player->m_renderRect, nullptr) != PLErrors::kNone)
|
||||
return;
|
||||
|
||||
renderSurface->DrawPicture(img, player->m_renderRect);
|
||||
|
||||
CopyBits(*renderSurface->m_port.GetPixMap(), *surface->m_port.GetPixMap(), &player->m_constrainRect, &player->m_constrainRect, srcCopy);
|
||||
|
||||
PortabilityLayer::QDManager::GetInstance()->DisposeGWorld(renderSurface);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SetMovieMasterTimeBase(Movie movie, TimeBase timeBase, void *unused)
|
||||
void AnimationManager::TickPlayers(uint32_t numTicks)
|
||||
{
|
||||
PL_NotYetImplemented();
|
||||
for (AnimationPlayer *player = m_firstPlayer; player; player = player->m_next)
|
||||
{
|
||||
AnimationPackage *anim = player->m_animPackage;
|
||||
|
||||
uint32_t fptNumerator = anim->GetFrameRateNumerator();
|
||||
uint32_t fptDenominator = anim->GetFrameRateDenominator() * 60;
|
||||
|
||||
for (uint32_t t = 0; t < numTicks; t++)
|
||||
{
|
||||
player->m_timer += fptNumerator;
|
||||
if (player->m_timer >= fptDenominator)
|
||||
{
|
||||
player->m_timer -= fptDenominator;
|
||||
player->m_frameIndex++;
|
||||
if (player->m_frameIndex == anim->NumFrames())
|
||||
player->m_frameIndex = 0;
|
||||
|
||||
player->m_isFrameCurrent = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void GetMovieBox(Movie movie, Rect *rect)
|
||||
AnimationManager *AnimationManager::GetInstance()
|
||||
{
|
||||
PL_NotYetImplemented();
|
||||
return &ms_instance;
|
||||
}
|
||||
|
||||
void StopMovie(Movie movie)
|
||||
AnimationManager::AnimationManager()
|
||||
: m_firstPlayer(nullptr)
|
||||
, m_lastPlayer(nullptr)
|
||||
{
|
||||
PL_NotYetImplemented();
|
||||
}
|
||||
|
||||
void DisposeMovie(Movie movie)
|
||||
{
|
||||
PL_NotYetImplemented();
|
||||
}
|
||||
|
||||
void SetMovieGWorld(Movie movie, DrawSurface *graf, void *unknown)
|
||||
{
|
||||
PL_NotYetImplemented();
|
||||
}
|
||||
|
||||
void SetMovieActive(Movie movie, Boolean active)
|
||||
{
|
||||
PL_NotYetImplemented();
|
||||
}
|
||||
|
||||
void StartMovie(Movie movie)
|
||||
{
|
||||
PL_NotYetImplemented();
|
||||
}
|
||||
|
||||
void MoviesTask(Movie movie, int unknown)
|
||||
{
|
||||
PL_NotYetImplemented();
|
||||
}
|
||||
|
||||
void SetMovieBox(Movie movie, const Rect *rect)
|
||||
{
|
||||
PL_NotYetImplemented();
|
||||
}
|
||||
|
||||
void SetMovieDisplayClipRgn(Movie movie, const Rect *rect)
|
||||
{
|
||||
PL_NotYetImplemented();
|
||||
}
|
||||
AnimationManager AnimationManager::ms_instance;
|
||||
|
Reference in New Issue
Block a user