Microsoft-3D-Movie-Maker/kauai/SRC/PICMAC.CPP

179 lines
4.2 KiB
C++

/* Copyright (c) Microsoft Corporation.
Licensed under the MIT License. */
/***************************************************************************
Author: ShonK
Project: Kauai
Reviewed:
Copyright (c) Microsoft Corporation
Macintosh picture routines.
***************************************************************************/
#include "frame.h"
ASSERTNAME
/***************************************************************************
Constructor for a picture.
***************************************************************************/
PIC::PIC(void)
{
_hpic = hNil;
_rc.Zero();
}
/***************************************************************************
Destructor for a picture.
***************************************************************************/
PIC::~PIC(void)
{
AssertBaseThis(0);
if (hNil != _hpic)
KillPicture(_hpic);
}
/***************************************************************************
Read a picture from a chunky file. This routine only reads or converts
OS specific representations with the given chid value.
***************************************************************************/
PPIC PIC::PpicFetch(PCFL pcfl, CTG ctg, CNO cno, CHID chid)
{
AssertPo(pcfl, 0);
KID kid;
BLCK blck;
if (!pcfl->FFind(ctg, cno))
return pvNil;
if (pcfl->FGetKidChidCtg(ctg, cno, chid, kctgMacPict, &kid) &&
pcfl->FFind(kid.cki.ctg, kid.cki.cno, &blck))
{
return PpicRead(&blck);
}
//REVIEW shonk: convert another type to a Mac Pict...
return pvNil;
}
/***************************************************************************
Read a picture from a chunky file. This routine only reads a system
specific pict (Mac PICT or Windows MetaFile) and its header.
***************************************************************************/
PPIC PIC::PpicRead(PBLCK pblck)
{
AssertPo(pblck, fblckReadable);
HPIC hpic;
PICH pich;
PPIC ppic;
RC rc;
bool fT;
if (!pblck->FUnpackData() || pblck->Cb() <= size(PICH) + size(Picture) ||
!pblck->FReadRgb(&pich, size(PICH), 0) ||
pich.rc.FEmpty() || pich.cb != pblck->Cb())
{
return pvNil;
}
if (hNil == (hpic = (HPIC)NewHandle(pich.cb - size(PICH))))
return pvNil;
HLock((HN)hpic);
fT = pblck->FReadRgb(*hpic, pich.cb - size(PICH), size(PICH));
HUnlock((HN)hpic);
if (!fT || pvNil == (ppic = NewObj PIC))
{
KillPicture(hpic);
return pvNil;
}
ppic->_hpic = hpic;
ppic->_rc = pich.rc;
AssertPo(ppic, 0);
return ppic;
}
/***************************************************************************
Return the total size on file.
***************************************************************************/
long PIC::CbOnFile(void)
{
AssertThis(0);
return GetHandleSize((HN)_hpic) + size(PICH);
}
/***************************************************************************
Write the meta file (and its header) to the given BLCK.
***************************************************************************/
bool PIC::FWrite(PBLCK pblck)
{
AssertThis(0);
AssertPo(pblck, 0);
long cb;
bool fT;
PICH pich;
achar ch;
cb = GetHandleSize((HN)_hpic);
if ((pich.cb = cb + size(PICH)) != pblck->Cb())
return fFalse;
ch = HGetState((HN)_hpic);
HLock((HN)_hpic);
pich.rc = _rc;
fT = pblck->FWriteRgb(&pich, size(PICH), 0) &&
pblck->FWriteRgb(*_hpic, cb, size(PICH));
HSetState((HN)_hpic, ch);
return fT;
}
/***************************************************************************
Static method to read the file as a native picture (PICT file on Mac).
***************************************************************************/
PPIC PIC::PpicReadNative(FNI *pfni)
{
AssertPo(pfni, ffniFile);
PFIL pfil;
FP fpMac;
HPIC hpic;
PPIC ppic;
bool fT;
RCS rcs;
if (pfni->Ftg() != kftgPict ||
pvNil == (pfil = FIL::PfilOpen(pfni)))
{
return pvNil;
}
if (512 + size(Picture) >= (fpMac = pfil->FpMac()))
goto LFail;
if (hNil == (hpic = (HPIC)NewHandle(fpMac - 512)))
{
LFail:
ReleasePpo(&pfil);
return pvNil;
}
HLock((HN)hpic);
fT = pfil->FReadRgb(*hpic, fpMac - 512, 512);
rcs = (*hpic)->picFrame;
HUnlock((HN)hpic);
ReleasePpo(&pfil);
if (!fT || pvNil == (ppic = NewObj PIC))
{
DisposHandle((HN)hpic);
return pvNil;
}
ppic->_hpic = hpic;
ppic->_rc = RC(rcs);
AssertPo(ppic, 0);
return ppic;
}