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

161 lines
4.0 KiB
C++

/* Copyright (c) Microsoft Corporation.
Licensed under the MIT License. */
/***************************************************************************
Author: ShonK
Project: Kauai
Reviewed:
Copyright (c) Microsoft Corporation
Common OS-independent picture routines.
***************************************************************************/
#include "frame.h"
ASSERTNAME
RTCLASS(PIC)
/***************************************************************************
Static method to create a new PIC based on the given HPIC with
bounding rectangle *prc. If this fails, it is the callers responsibility
to free the hpic. If it succeeds, the ppic returned owns the hpic.
***************************************************************************/
PPIC PIC::PpicNew(HPIC hpic, RC *prc)
{
Assert(hpic != hNil, "nil hpic");
AssertVarMem(prc);
PPIC ppic;
if (pvNil == (ppic = NewObj PIC))
return pvNil;
ppic->_hpic = hpic;
ppic->_rc = *prc;
AssertPo(ppic, 0);
return ppic;
}
/***************************************************************************
Get the natural rectangle for the picture.
***************************************************************************/
void PIC::GetRc(RC *prc)
{
AssertThis(0);
*prc = _rc;
}
/***************************************************************************
Add the picture to the chunky file. The OS specific representation
will be a child of the chunk and have the given chid value.
***************************************************************************/
bool PIC::FAddToCfl(PCFL pcfl, CTG ctg, CNO *pcno, CHID chid)
{
AssertThis(0);
AssertPo(pcfl, 0);
AssertVarMem(pcno);
BLCK blck;
CNO cnoKid;
long cb;
if (!pcfl->FAdd(0, ctg, pcno))
return fFalse;
cb = CbOnFile();
if (!pcfl->FAddChild(ctg, *pcno, chid, cb, kctgPictNative, &cnoKid, &blck) ||
!FWrite(&blck))
{
pcfl->Delete(ctg, *pcno);
TrashVar(pcno);
return fFalse;
}
return fTrue;
}
/***************************************************************************
Put the picture as the given ctg and cno in the chunky file. The
OS specific representation will be a child of the chunk and have the
given chid value.
***************************************************************************/
bool PIC::FPutInCfl(PCFL pcfl, CTG ctg, CNO cno, CHID chid)
{
AssertThis(0);
AssertPo(pcfl, 0);
bool fDelOnFail;
long ikid;
KID kid;
BLCK blck;
CNO cnoKid;
long cb;
fDelOnFail = !pcfl->FFind(ctg, cno);
if (!pcfl->FPut(0, ctg, cno))
goto LFail;
cb = CbOnFile();
if (!pcfl->FAddChild(ctg, cno, chid, cb, kctgPictNative, &cnoKid, &blck))
goto LFail;
if (!FWrite(&blck))
{
if (!fDelOnFail)
pcfl->DeleteChild(ctg, cno, kctgPictNative, cnoKid, chid);
LFail:
if (fDelOnFail)
pcfl->Delete(ctg, cno);
return fFalse;
}
//delete all other reps with the same ctg and chid
for (ikid = pcfl->Ckid(ctg, cno); ikid-- > 0; )
{
AssertDo(pcfl->FGetKid(ctg, cno, ikid, &kid), 0);
if (kid.cki.ctg == kctgPictNative && kid.chid == chid && kid.cki.cno != cnoKid)
pcfl->DeleteChild(ctg, cno, kid.cki.ctg, kid.cki.cno, kid.chid);
}
return fTrue;
}
#ifdef DEBUG
/***************************************************************************
Assert the validity of a PIC.
***************************************************************************/
void PIC::AssertValid(ulong grf)
{
PIC_PAR::AssertValid(0);
Assert(_hpic != hNil, "bad hpic");
}
#endif //DEBUG
/***************************************************************************
A PFNRPO to read PIC 0 from a GRAF chunk.
***************************************************************************/
bool FReadMainPic(PCFL pcfl, CTG ctg, CNO cno, PBLCK pblck,
PBACO *ppbaco, long *pcb)
{
PPIC ppic;
if (pvNil == ppbaco)
{
//REVIEW shonk: get a better estimate of the real size -
*pcb = 1;
return fTrue;
}
if (pvNil == (ppic = PIC::PpicFetch(pcfl, ctg, cno)))
{
TrashVar(pcb);
TrashVar(ppbaco);
return fFalse;
}
*pcb = ppic->CbOnFile();
*ppbaco = ppic;
return fTrue;
}