Browse Source

Merge branch 'ticket/20'

closes #20
tickets/20/20/2
rarified 3 years ago
parent
commit
3699a8c8c0
  1. 115
      Sources/Plasma/FeatureLib/pfJournalBook/pfJournalBook.cpp

115
Sources/Plasma/FeatureLib/pfJournalBook/pfJournalBook.cpp

@ -125,7 +125,7 @@ class pfEsHTMLChunk
hsScalar fCurrOpacity; // For SFX images hsScalar fCurrOpacity; // For SFX images
hsScalar fSFXTime; // For SFX images hsScalar fSFXTime; // For SFX images
hsScalar fMinOpacity, fMaxOpacity; hsScalar fMinOpacity, fMaxOpacity;
hsColorRGBA fCurrColor; hsColorRGBA fCurrColor;
hsColorRGBA fOffColor, fOnColor; hsColorRGBA fOffColor, fOnColor;
@ -156,7 +156,7 @@ class pfEsHTMLChunk
kCanLink = 0x00000008, kCanLink = 0x00000008,
kFloating = 0x00000010, kFloating = 0x00000010,
kGlowing = 0x00000020, kGlowing = 0x00000020,
kActAsCB = 0x00000040, // Cause the image to act in a checkbox-like fashion. kActAsCB = 0x00000040, // Cause the image to act in a checkbox-like fashion.
// Min opacity turns into "off opacity" and max opacity // Min opacity turns into "off opacity" and max opacity
// is "on opacity" // is "on opacity"
kChecked = 0x00000080, // Only for kActAsCB, set if it's currently "checked" kChecked = 0x00000080, // Only for kActAsCB, set if it's currently "checked"
@ -469,7 +469,7 @@ pfBookData::pfBookData(const char *guiName /* = nil */)
fTurnFrontEditCtrl = fTurnBackEditCtrl = nil; fTurnFrontEditCtrl = fTurnBackEditCtrl = nil;
fEditable = false; fEditable = false;
fAdjustCursorTo = -1; fAdjustCursorTo = -1;
if (guiName) if (guiName)
fGUIName = guiName; fGUIName = guiName;
else else
@ -542,7 +542,7 @@ hsBool pfBookData::MsgReceive(plMessage *pMsg)
else if( fCurrentlyTurning ) else if( fCurrentlyTurning )
{ {
if( callback->fUser & 0x04 ) if( callback->fUser & 0x04 )
IFillUncoveringPage( (hsBool)( callback->fUser & 0x01 ) ? true : false ); IFillUncoveringPage( (hsBool)( callback->fUser & 0x01 ) ? true : false );
else if( callback->fUser & 0x02 ) else if( callback->fUser & 0x02 )
StartTriggeredFlip( (hsBool)( callback->fUser & 0x01 ) ? true : false ); StartTriggeredFlip( (hsBool)( callback->fUser & 0x01 ) ? true : false );
else else
@ -564,7 +564,7 @@ hsBool pfBookData::MsgReceive(plMessage *pMsg)
if( time != nil && fCurrSFXPages != kNoSides && !fCurrentlyTurning && fCurrentlyOpen ) if( time != nil && fCurrSFXPages != kNoSides && !fCurrentlyTurning && fCurrentlyOpen )
{ {
IHandleSFX( (hsScalar)time->DSeconds() ); IHandleSFX( (hsScalar)time->DSeconds() );
return true; return true;
} }
plTimerCallbackMsg* timerMsg = plTimerCallbackMsg::ConvertNoRef(pMsg); plTimerCallbackMsg* timerMsg = plTimerCallbackMsg::ConvertNoRef(pMsg);
@ -590,13 +590,13 @@ void pfBookData::IInitTemplate(pfGUIDialogMod *templateDlg)
hsAssert(templateDlg != nil, "Nil template in pfBookData::IInitTemplate()!"); hsAssert(templateDlg != nil, "Nil template in pfBookData::IInitTemplate()!");
// Init and ref our fDialog pointer // Init and ref our fDialog pointer
hsgResMgr::ResMgr()->SendRef(templateDlg->GetKey(), TRACKED_NEW plGenRefMsg(GetKey(), plRefMsg::kOnCreate, -1, kRefDialog), plRefFlags::kPassiveRef); hsgResMgr::ResMgr()->SendRef(templateDlg->GetKey(), TRACKED_NEW plGenRefMsg(GetKey(), plRefMsg::kOnCreate, -1, kRefDialog), plRefFlags::kPassiveRef);
// Hijack the dialog proc with our own // Hijack the dialog proc with our own
templateDlg->SetHandlerForAll(TRACKED_NEW pfJournalDlgProc(this)); templateDlg->SetHandlerForAll(TRACKED_NEW pfJournalDlgProc(this));
// Find our animation keys // Find our animation keys
// And other interesting pointers // And other interesting pointers
fCoverButton = pfGUICheckBoxCtrl::ConvertNoRef(templateDlg->GetControlFromTag(pfJournalDlgProc::kTagBookCover)); fCoverButton = pfGUICheckBoxCtrl::ConvertNoRef(templateDlg->GetControlFromTag(pfJournalDlgProc::kTagBookCover));
fTurnPageButton = pfGUICheckBoxCtrl::ConvertNoRef(templateDlg->GetControlFromTag(pfJournalDlgProc::kTagTurnPageCtrl)); fTurnPageButton = pfGUICheckBoxCtrl::ConvertNoRef(templateDlg->GetControlFromTag(pfJournalDlgProc::kTagTurnPageCtrl));
@ -621,7 +621,7 @@ void pfBookData::IInitTemplate(pfGUIDialogMod *templateDlg)
// Grab and ref the default cover mipmap // Grab and ref the default cover mipmap
plLayer *lay = plLayer::ConvertNoRef(fCoverLayer); plLayer *lay = plLayer::ConvertNoRef(fCoverLayer);
if((lay != nil)&&(lay->GetTexture() != nil)) if((lay != nil)&&(lay->GetTexture() != nil))
hsgResMgr::ResMgr()->AddViaNotify(lay->GetTexture()->GetKey(), TRACKED_NEW plGenRefMsg(GetKey(), plRefMsg::kOnCreate, -1, kRefDefaultCover), plRefFlags::kPassiveRef); hsgResMgr::ResMgr()->AddViaNotify(lay->GetTexture()->GetKey(), TRACKED_NEW plGenRefMsg(GetKey(), plRefMsg::kOnCreate, -1, kRefDefaultCover), plRefFlags::kPassiveRef);
fLeftPageMap->SetFlag(pfGUIClickMapCtrl::kReportHovering); fLeftPageMap->SetFlag(pfGUIClickMapCtrl::kReportHovering);
fRightPageMap->SetFlag(pfGUIClickMapCtrl::kReportHovering); fRightPageMap->SetFlag(pfGUIClickMapCtrl::kReportHovering);
@ -663,7 +663,7 @@ void pfBookData::IInitTemplate(pfGUIDialogMod *templateDlg)
} }
//// IGetDTMap /////////////////////////////////////////////////////////////// //// IGetDTMap ///////////////////////////////////////////////////////////////
// Just a quick helper // Just a quick helper
plDynamicTextMap *pfBookData::GetDTMap(UInt32 which) plDynamicTextMap *pfBookData::GetDTMap(UInt32 which)
{ {
@ -691,7 +691,7 @@ pfGUIMultiLineEditCtrl *pfBookData::GetEditCtrl(UInt32 which)
} }
//// IRegisterForSFX ///////////////////////////////////////////////////////// //// IRegisterForSFX /////////////////////////////////////////////////////////
// Registers (or unregisters) for time messages so we can process special FX // Registers (or unregisters) for time messages so we can process special FX
// if we need to // if we need to
void pfBookData::RegisterForSFX(WhichSide whichPages) void pfBookData::RegisterForSFX(WhichSide whichPages)
@ -705,7 +705,7 @@ void pfBookData::RegisterForSFX(WhichSide whichPages)
} }
else else
plgDispatch::Dispatch()->UnRegisterForExactType(plTimeMsg::Index(), GetKey()); plgDispatch::Dispatch()->UnRegisterForExactType(plTimeMsg::Index(), GetKey());
fCurrSFXPages = whichPages; fCurrSFXPages = whichPages;
} }
@ -747,7 +747,7 @@ void pfBookData::IHandleSFX(hsScalar currTime, WhichSide whichSide /*= kNoSides*
for(idx = fCurrBook->fPageStarts[fCurrBook->fCurrentPage + inc]; idx < fCurrBook->fPageStarts[fCurrBook->fCurrentPage + inc + 1]; idx++) for(idx = fCurrBook->fPageStarts[fCurrBook->fCurrentPage + inc]; idx < fCurrBook->fPageStarts[fCurrBook->fCurrentPage + inc + 1]; idx++)
{ {
pfEsHTMLChunk *chunk = fCurrBook->fHTMLSource[idx]; pfEsHTMLChunk *chunk = fCurrBook->fHTMLSource[idx];
if(chunk->fFlags & pfEsHTMLChunk::kGlowing) if(chunk->fFlags & pfEsHTMLChunk::kGlowing)
{ {
// Glow SFX: animate opacity based on time offset // Glow SFX: animate opacity based on time offset
@ -843,7 +843,7 @@ void pfBookData::IFillUncoveringPage(hsBool rightSide)
// The right edit ctrl doesn't update until the page flip animation is done // The right edit ctrl doesn't update until the page flip animation is done
id = 98; id = 98;
} }
// create a timer so we can hide the old left or right turn page right before the animation finishes to prevent flicker // create a timer so we can hide the old left or right turn page right before the animation finishes to prevent flicker
plTimerCallbackMsg* pTimerMsg = TRACKED_NEW plTimerCallbackMsg(GetKey(),id); plTimerCallbackMsg* pTimerMsg = TRACKED_NEW plTimerCallbackMsg(GetKey(),id);
plgTimerCallbackMgr::NewTimer( .5, pTimerMsg ); // .5 found by trial and error plgTimerCallbackMgr::NewTimer( .5, pTimerMsg ); // .5 found by trial and error
@ -882,7 +882,7 @@ void pfBookData::ITriggerPageFlip(hsBool flipBackwards, hsBool immediate)
} }
msg->SetAnimName(flipBackwards ? "backward" : "forward"); msg->SetAnimName(flipBackwards ? "backward" : "forward");
msg->AddReceivers(keys); msg->AddReceivers(keys);
// Here's the whole reason why we're not just checking the checkbox: so we can attach a callback // Here's the whole reason why we're not just checking the checkbox: so we can attach a callback
// so we know when the animation completes. Pretty sad, huh? Poor checkbox. // so we know when the animation completes. Pretty sad, huh? Poor checkbox.
plEventCallbackMsg *eventMsg = TRACKED_NEW plEventCallbackMsg; plEventCallbackMsg *eventMsg = TRACKED_NEW plEventCallbackMsg;
@ -920,7 +920,7 @@ void pfBookData::ITriggerPageFlip(hsBool flipBackwards, hsBool immediate)
} }
//// StartTriggeredFlip ///////////////////////////////////////////////////// //// StartTriggeredFlip /////////////////////////////////////////////////////
// Finishes the start of the triggered page flip (once we're sure the // Finishes the start of the triggered page flip (once we're sure the
// animation is at the new frame) // animation is at the new frame)
void pfBookData::StartTriggeredFlip(hsBool flipBackwards) void pfBookData::StartTriggeredFlip(hsBool flipBackwards)
@ -1206,7 +1206,7 @@ void pfJournalBook::UnloadAllGUIs()
// the name of the mipmap to use as the cover of the book. The callback // the name of the mipmap to use as the cover of the book. The callback
// key is the keyed object to send event messages to (see <img> tag). // key is the keyed object to send event messages to (see <img> tag).
pfJournalBook::pfJournalBook( const char *esHTMLSource, plKey coverImageKey, plKey callbackKey /*= nil*/, pfJournalBook::pfJournalBook( const char *esHTMLSource, plKey coverImageKey, plKey callbackKey /*= nil*/,
const plLocation &hintLoc /* = plLocation::kGlobalFixedLoc */, const char *guiName /* = nil */ ) const plLocation &hintLoc /* = plLocation::kGlobalFixedLoc */, const char *guiName /* = nil */ )
{ {
if (guiName && (strcmp(guiName,"") != 0)) if (guiName && (strcmp(guiName,"") != 0))
@ -1219,7 +1219,7 @@ pfJournalBook::pfJournalBook( const char *esHTMLSource, plKey coverImageKey, plK
hsgResMgr::ResMgr()->NewKey(fCurBookGUI.c_str(),fBookGUIs[fCurBookGUI],pfGameGUIMgr::GetInstance()->GetKey()->GetUoid().GetLocation()); hsgResMgr::ResMgr()->NewKey(fCurBookGUI.c_str(),fBookGUIs[fCurBookGUI],pfGameGUIMgr::GetInstance()->GetKey()->GetUoid().GetLocation());
fBookGUIs[fCurBookGUI]->LoadGUI(); fBookGUIs[fCurBookGUI]->LoadGUI();
} }
fCurrentPage = 0; fCurrentPage = 0;
fLastPage = -1; fLastPage = -1;
fCoverMipKey = coverImageKey; fCoverMipKey = coverImageKey;
@ -1242,7 +1242,7 @@ pfJournalBook::pfJournalBook( const char *esHTMLSource, plKey coverImageKey, plK
delete [] wESHTMLSource; delete [] wESHTMLSource;
} }
pfJournalBook::pfJournalBook( const wchar_t *esHTMLSource, plKey coverImageKey, plKey callbackKey /*= nil*/, pfJournalBook::pfJournalBook( const wchar_t *esHTMLSource, plKey coverImageKey, plKey callbackKey /*= nil*/,
const plLocation &hintLoc /* = plLocation::kGlobalFixedLoc */, const char *guiName /* = nil */ ) const plLocation &hintLoc /* = plLocation::kGlobalFixedLoc */, const char *guiName /* = nil */ )
{ {
if (guiName && (strcmp(guiName,"") != 0)) if (guiName && (strcmp(guiName,"") != 0))
@ -1255,7 +1255,7 @@ pfJournalBook::pfJournalBook( const wchar_t *esHTMLSource, plKey coverImageKey,
hsgResMgr::ResMgr()->NewKey(fCurBookGUI.c_str(),fBookGUIs[fCurBookGUI],pfGameGUIMgr::GetInstance()->GetKey()->GetUoid().GetLocation()); hsgResMgr::ResMgr()->NewKey(fCurBookGUI.c_str(),fBookGUIs[fCurBookGUI],pfGameGUIMgr::GetInstance()->GetKey()->GetUoid().GetLocation());
fBookGUIs[fCurBookGUI]->LoadGUI(); fBookGUIs[fCurBookGUI]->LoadGUI();
} }
fCurrentPage = 0; fCurrentPage = 0;
fLastPage = -1; fLastPage = -1;
fCoverMipKey = coverImageKey; fCoverMipKey = coverImageKey;
@ -1498,7 +1498,7 @@ void pfJournalBook::ITriggerCloseWithNotify( hsBool closeNotOpen, hsBool immedia
} }
msg->SetAnimName( animName ); msg->SetAnimName( animName );
msg->AddReceivers( keys ); msg->AddReceivers( keys );
plEventCallbackMsg *eventMsg = TRACKED_NEW plEventCallbackMsg; plEventCallbackMsg *eventMsg = TRACKED_NEW plEventCallbackMsg;
eventMsg->AddReceiver( fBookGUIs[fCurBookGUI]->GetKey() ); eventMsg->AddReceiver( fBookGUIs[fCurBookGUI]->GetKey() );
eventMsg->fRepeats = 0; eventMsg->fRepeats = 0;
@ -1548,7 +1548,7 @@ void pfJournalBook::NextPage( void )
fVisibleLinks.Reset(); fVisibleLinks.Reset();
// Swap the right DT map into the turn page front DTMap, then render // Swap the right DT map into the turn page front DTMap, then render
// the new current page into turn page back and currPage+1 into // the new current page into turn page back and currPage+1 into
// the right DTMap // the right DTMap
plDynamicTextMap *turnFront = fBookGUIs[fCurBookGUI]->GetDTMap( pfJournalDlgProc::kTagTurnFrontDTMap ); plDynamicTextMap *turnFront = fBookGUIs[fCurBookGUI]->GetDTMap( pfJournalDlgProc::kTagTurnFrontDTMap );
plDynamicTextMap *right = fBookGUIs[fCurBookGUI]->GetDTMap( pfJournalDlgProc::kTagRightDTMap ); plDynamicTextMap *right = fBookGUIs[fCurBookGUI]->GetDTMap( pfJournalDlgProc::kTagRightDTMap );
@ -1588,7 +1588,7 @@ void pfJournalBook::PreviousPage( void )
{ {
if (fCurrentPage >= 2) // this variable can get out of whack if we open the book to a page in the middle if (fCurrentPage >= 2) // this variable can get out of whack if we open the book to a page in the middle
fCurrentPage -= 2; // just making sure that this doesn't go below zero (and therefore wrap around) fCurrentPage -= 2; // just making sure that this doesn't go below zero (and therefore wrap around)
pfGUIMultiLineEditCtrl *right = fBookGUIs[fCurBookGUI]->GetEditCtrl(pfJournalDlgProc::kTagRightEditCtrl); pfGUIMultiLineEditCtrl *right = fBookGUIs[fCurBookGUI]->GetEditCtrl(pfJournalDlgProc::kTagRightEditCtrl);
pfGUIMultiLineEditCtrl *left = fBookGUIs[fCurBookGUI]->GetEditCtrl(pfJournalDlgProc::kTagLeftEditCtrl); pfGUIMultiLineEditCtrl *left = fBookGUIs[fCurBookGUI]->GetEditCtrl(pfJournalDlgProc::kTagLeftEditCtrl);
pfGUIMultiLineEditCtrl *turnFront = fBookGUIs[fCurBookGUI]->GetEditCtrl(pfJournalDlgProc::kTagTurnFrontEditCtrl); pfGUIMultiLineEditCtrl *turnFront = fBookGUIs[fCurBookGUI]->GetEditCtrl(pfJournalDlgProc::kTagTurnFrontEditCtrl);
@ -1602,7 +1602,7 @@ void pfJournalBook::PreviousPage( void )
// At this point, only the left and right pages are visible, we don't want to actually update anything until the animation // At this point, only the left and right pages are visible, we don't want to actually update anything until the animation
// starts so that nothing flashes or overdraws. // starts so that nothing flashes or overdraws.
fBookGUIs[fCurBookGUI]->StartTriggeredFlip( true ); fBookGUIs[fCurBookGUI]->StartTriggeredFlip( true );
fBookGUIs[fCurBookGUI]->TurnPageButton()->PlaySound( pfGUICheckBoxCtrl::kMouseUp ); fBookGUIs[fCurBookGUI]->TurnPageButton()->PlaySound( pfGUICheckBoxCtrl::kMouseUp );
ISendNotify(kNotifyPreviousPage); ISendNotify(kNotifyPreviousPage);
@ -1618,7 +1618,7 @@ void pfJournalBook::PreviousPage( void )
fVisibleLinks.Reset(); fVisibleLinks.Reset();
// Swap the left DT map into the turn page back DTMap, then render // Swap the left DT map into the turn page back DTMap, then render
// the new current page into the left and currPage+1 into // the new current page into the left and currPage+1 into
// the turn page front DTMap // the turn page front DTMap
plDynamicTextMap *turnBack = fBookGUIs[fCurBookGUI]->GetDTMap( pfJournalDlgProc::kTagTurnBackDTMap ); plDynamicTextMap *turnBack = fBookGUIs[fCurBookGUI]->GetDTMap( pfJournalDlgProc::kTagTurnBackDTMap );
plDynamicTextMap *left = fBookGUIs[fCurBookGUI]->GetDTMap( pfJournalDlgProc::kTagLeftDTMap ); plDynamicTextMap *left = fBookGUIs[fCurBookGUI]->GetDTMap( pfJournalDlgProc::kTagLeftDTMap );
@ -1844,7 +1844,7 @@ hsBool pfJournalBook::ICompileSource( const wchar_t *source, const plLocation &h
UInt8 type = IGetTagType( c ); UInt8 type = IGetTagType( c );
if( type != pfEsHTMLChunk::kEmpty ) if( type != pfEsHTMLChunk::kEmpty )
{ {
// First, end the current paragraph chunk, which is a special case 'cause its // First, end the current paragraph chunk, which is a special case 'cause its
// text is defined outside the tag // text is defined outside the tag
if( start == c ) if( start == c )
{ {
@ -1855,7 +1855,7 @@ hsBool pfJournalBook::ICompileSource( const wchar_t *source, const plLocation &h
else if( lastParChunk != nil ) else if( lastParChunk != nil )
{ {
UInt32 count = ((UInt32)c - (UInt32)start)/2; // wchar_t is 2 bytes UInt32 count = ((UInt32)c - (UInt32)start)/2; // wchar_t is 2 bytes
wchar_t *temp = TRACKED_NEW wchar_t[ count + 1 ]; wchar_t *temp = TRACKED_NEW wchar_t[ count + 1 ];
wcsncpy( temp, start, count ); wcsncpy( temp, start, count );
temp[count] = L'\0'; temp[count] = L'\0';
@ -2010,7 +2010,7 @@ hsBool pfJournalBook::ICompileSource( const wchar_t *source, const plLocation &h
break; break;
case pfEsHTMLChunk::kCover: case pfEsHTMLChunk::kCover:
// Don't create an actual chunk for this one, just use the "src" and // Don't create an actual chunk for this one, just use the "src" and
// grab the mipmap key for our cover // grab the mipmap key for our cover
c += 6; c += 6;
while( IGetNextOption( c, name, option ) ) while( IGetNextOption( c, name, option ) )
@ -2181,7 +2181,7 @@ hsBool pfJournalBook::ICompileSource( const wchar_t *source, const plLocation &h
} }
fHeightScale = 1.f - bookHeight; fHeightScale = 1.f - bookHeight;
fWidthScale = 1.f - bookWidth; fWidthScale = 1.f - bookWidth;
// Still gotta create a new par chunk // Still gotta create a new par chunk
lastParChunk = TRACKED_NEW pfEsHTMLChunk( nil ); lastParChunk = TRACKED_NEW pfEsHTMLChunk( nil );
lastParChunk->fFlags = IFindLastAlignment(); lastParChunk->fFlags = IFindLastAlignment();
@ -2316,7 +2316,7 @@ hsBool pfJournalBook::ICompileSource( const wchar_t *source, const plLocation &h
lastParChunk = TRACKED_NEW pfEsHTMLChunk( nil ); lastParChunk = TRACKED_NEW pfEsHTMLChunk( nil );
lastParChunk->fFlags = IFindLastAlignment(); lastParChunk->fFlags = IFindLastAlignment();
break; break;
case pfEsHTMLChunk::kEditable: case pfEsHTMLChunk::kEditable:
c += 9; c += 9;
SetEditable(true); SetEditable(true);
@ -2350,12 +2350,12 @@ hsBool pfJournalBook::ICompileSource( const wchar_t *source, const plLocation &h
else if( lastParChunk != nil ) else if( lastParChunk != nil )
{ {
UInt32 count = (UInt32)c - (UInt32)start; UInt32 count = (UInt32)c - (UInt32)start;
wchar_t *temp = TRACKED_NEW wchar_t[ count + 1 ]; wchar_t *temp = TRACKED_NEW wchar_t[ count + 1 ];
wcsncpy( temp, start, count + 1 ); wcsncpy( temp, start, count + 1 );
lastParChunk->fText = temp; lastParChunk->fText = temp;
delete [] temp; delete [] temp;
// Special case to remove any last trailing carriage return // Special case to remove any last trailing carriage return
// if( count > 1 && lastParChunk->fText[ count - 1 ] == '\n' ) // if( count > 1 && lastParChunk->fText[ count - 1 ] == '\n' )
// lastParChunk->fText[ count - 1 ] = 0; // lastParChunk->fText[ count - 1 ] = 0;
@ -2370,7 +2370,7 @@ hsBool pfJournalBook::ICompileSource( const wchar_t *source, const plLocation &h
fLastPage = 0; fLastPage = 0;
else else
fLastPage = -1; fLastPage = -1;
return true; return true;
} }
@ -2394,7 +2394,7 @@ UInt8 pfJournalBook::IGetTagType( const wchar_t *string )
{ L"movie", pfEsHTMLChunk::kMovie }, { L"movie", pfEsHTMLChunk::kMovie },
{ L"editable", pfEsHTMLChunk::kEditable }, { L"editable", pfEsHTMLChunk::kEditable },
{ nil, pfEsHTMLChunk::kEmpty } }; { nil, pfEsHTMLChunk::kEmpty } };
UInt32 i; UInt32 i;
for( i = 0; tags[ i ].fTag != nil; i++ ) for( i = 0; tags[ i ].fTag != nil; i++ )
@ -2458,7 +2458,7 @@ hsBool pfJournalBook::IGetNextOption( const wchar_t *&string, wchar_t *name, wch
len = ((UInt32)string - (UInt32)c)/2; // divide length by 2 because each character is two bytes len = ((UInt32)string - (UInt32)c)/2; // divide length by 2 because each character is two bytes
wcsncpy( option, c, len ); wcsncpy( option, c, len );
option[len] = L'\0'; option[len] = L'\0';
if( *string == L'\"' ) if( *string == L'\"' )
string++; string++;
@ -2473,14 +2473,14 @@ hsBool pfJournalBook::IGetNextOption( const wchar_t *&string, wchar_t *name, wch
len = ((UInt32)string - (UInt32)c)/2; // divide length by 2 because each character is two bytes len = ((UInt32)string - (UInt32)c)/2; // divide length by 2 because each character is two bytes
wcsncpy( option, c, len ); wcsncpy( option, c, len );
option[len] = L'\0'; option[len] = L'\0';
return true; return true;
} }
void pfJournalBook::IFreeSource( void ) void pfJournalBook::IFreeSource( void )
{ {
UInt32 i; UInt32 i;
for( i = 0; i < fHTMLSource.GetCount(); i++ ) for( i = 0; i < fHTMLSource.GetCount(); i++ )
delete fHTMLSource[ i ]; delete fHTMLSource[ i ];
fHTMLSource.Reset(); fHTMLSource.Reset();
@ -2573,7 +2573,7 @@ void pfJournalBook::IRenderPage( UInt32 page, UInt32 whichDTMap, hsBool suppress
{ {
if (fAreEditing) if (fAreEditing)
return; // we don't render if we are editing the book return; // we don't render if we are editing the book
// Grab the DTMap via the GUI system // Grab the DTMap via the GUI system
plDynamicTextMap *dtMap = fBookGUIs[fCurBookGUI]->GetDTMap( whichDTMap ); plDynamicTextMap *dtMap = fBookGUIs[fCurBookGUI]->GetDTMap( whichDTMap );
hsAssert( dtMap != nil, "Invalid DT map in IRenderPage()" ); hsAssert( dtMap != nil, "Invalid DT map in IRenderPage()" );
@ -2619,12 +2619,12 @@ void pfJournalBook::IRenderPage( UInt32 page, UInt32 whichDTMap, hsBool suppress
#endif // USE_BINK_SDK #endif // USE_BINK_SDK
hsAssert(page < fPageStarts.GetCount() || page > fLastPage, "UnInitialized page start!"); hsAssert(page < fPageStarts.GetCount() || page > fLastPage, "UnInitialized page start!");
if( page <= fLastPage if( page <= fLastPage
&& page < fPageStarts.GetCount()) // Added this as a crash-prevention bandaid - MT && page < fPageStarts.GetCount()) // Added this as a crash-prevention bandaid - MT
{ {
UInt32 idx; UInt32 idx;
UInt16 width, height, y, x, ascent, lastX, lastY; UInt16 width, height, y, x, ascent, lastX, lastY;
UInt8 fontFlags, fontSize; UInt8 fontFlags, fontSize;
const wchar_t *fontFace; const wchar_t *fontFace;
hsColorRGBA fontColor; hsColorRGBA fontColor;
@ -2647,7 +2647,7 @@ void pfJournalBook::IRenderPage( UInt32 page, UInt32 whichDTMap, hsBool suppress
switch( chunk->fType ) switch( chunk->fType )
{ {
case pfEsHTMLChunk::kParagraph: case pfEsHTMLChunk::kParagraph:
if( ( chunk->fFlags & pfEsHTMLChunk::kAlignMask ) == pfEsHTMLChunk::kLeft ) if( ( chunk->fFlags & pfEsHTMLChunk::kAlignMask ) == pfEsHTMLChunk::kLeft )
{ {
dtMap->SetJustify( plDynamicTextMap::kLeftJustify ); dtMap->SetJustify( plDynamicTextMap::kLeftJustify );
@ -2668,10 +2668,14 @@ void pfJournalBook::IRenderPage( UInt32 page, UInt32 whichDTMap, hsBool suppress
width = (UInt16)(512 - fPageLMargin - fPageRMargin); width = (UInt16)(512 - fPageLMargin - fPageRMargin);
height = (UInt16)(512 - fPageBMargin - y); height = (UInt16)(512 - fPageBMargin - y);
UInt32 lastChar; UInt32 lastChar;
dtMap->CalcWrappedStringSize( chunk->fText.c_str(), &width, &height, &lastChar, &ascent, &lastX, &lastY ); const wchar_t *chunkTextStr; // initialize later to avoid compile errors inside case block
int chunkTextStrLen;
chunkTextStr = chunk->fText.c_str();
chunkTextStrLen = chunk->fText.length();
dtMap->CalcWrappedStringSize( chunkTextStr, &width, &height, &lastChar, &ascent, &lastX, &lastY );
width = (UInt16)(512 - fPageLMargin - fPageRMargin); width = (UInt16)(512 - fPageLMargin - fPageRMargin);
if( !suppressRendering ) if( !suppressRendering )
dtMap->DrawWrappedString( (UInt16)fPageLMargin, y, chunk->fText.c_str(), width, (UInt16)(512 - fPageBMargin - y), &lastX, &lastY ); dtMap->DrawWrappedString( (UInt16)fPageLMargin, y, chunkTextStr, width, (UInt16)(512 - fPageBMargin - y), &lastX, &lastY );
if( lastChar == 0 ) if( lastChar == 0 )
{ {
@ -2682,17 +2686,16 @@ void pfJournalBook::IRenderPage( UInt32 page, UInt32 whichDTMap, hsBool suppress
idx--; idx--;
break; break;
} }
if( chunk->fText[ lastChar ] != 0 ) if( chunkTextStr[ lastChar ] != L'\0' )
{ {
// Didn't get to render the whole paragraph in this go, so we're going to cheat // Didn't get to render the whole paragraph in this go, so we're going to cheat
// and split the paragraph up into two so that we can handle it properly. Note: // and split the paragraph up into two so that we can handle it properly. Note:
// this changes the chunk array beyond this point, so we need to invalidate the // this changes the chunk array beyond this point, so we need to invalidate the
// cache, but that's ok 'cause if we're doing this, it's probably invalid (or empty) // cache, but that's ok 'cause if we're doing this, it's probably invalid (or empty)
// anyway // anyway
int fTextLen = chunk->fText.length(); wchar_t *s = TRACKED_NEW wchar_t[chunkTextStrLen+1];
wchar_t *s = TRACKED_NEW wchar_t[fTextLen+1]; wcscpy(s,chunkTextStr);
wcscpy(s,chunk->fText.c_str()); s[chunkTextStrLen] = L'\0';
s[fTextLen] = L'\0';
// Note: Makes a copy of the string // Note: Makes a copy of the string
pfEsHTMLChunk *c2 = TRACKED_NEW pfEsHTMLChunk( &s[ lastChar ] ); pfEsHTMLChunk *c2 = TRACKED_NEW pfEsHTMLChunk( &s[ lastChar ] );
@ -2711,7 +2714,7 @@ void pfJournalBook::IRenderPage( UInt32 page, UInt32 whichDTMap, hsBool suppress
y += 512; y += 512;
break; break;
} }
x = lastX; x = lastX;
y = (UInt16)(lastY - dtMap->GetCurrFont()->GetAscent()); // Since our text is top-justified y = (UInt16)(lastY - dtMap->GetCurrFont()->GetAscent()); // Since our text is top-justified
@ -2750,13 +2753,13 @@ void pfJournalBook::IRenderPage( UInt32 page, UInt32 whichDTMap, hsBool suppress
{ {
// Mipmap overlaps the bottom of this page, so forcibly break so we'll // Mipmap overlaps the bottom of this page, so forcibly break so we'll
// end up marking the page break here (note that, unlike paragraphs, we // end up marking the page break here (note that, unlike paragraphs, we
// can't really break the mipmap into two...well, OK, we could, but it // can't really break the mipmap into two...well, OK, we could, but it
// wouldn't make much sense :) // wouldn't make much sense :)
y += (UInt16)(mip->GetHeight()); y += (UInt16)(mip->GetHeight());
// Wonderful, the break breaks us from the switch(), which means the for() // Wonderful, the break breaks us from the switch(), which means the for()
// loops runs once more and increments idx. So this is to counter that. // loops runs once more and increments idx. So this is to counter that.
// (We better check tho, just to make sure nobody feeds us an extra-large // (We better check tho, just to make sure nobody feeds us an extra-large
// image and sends us on an infinite loop) // image and sends us on an infinite loop)
if( idx > fPageStarts[ page ] ) if( idx > fPageStarts[ page ] )
idx--; idx--;
@ -2796,7 +2799,7 @@ void pfJournalBook::IRenderPage( UInt32 page, UInt32 whichDTMap, hsBool suppress
x = (UInt16)fPageLMargin; x = (UInt16)fPageLMargin;
break; break;
case pfEsHTMLChunk::kFontChange: case pfEsHTMLChunk::kFontChange:
IFindFontProps( idx, fontFace, fontSize, fontFlags, fontColor, fontSpacing ); IFindFontProps( idx, fontFace, fontSize, fontFlags, fontColor, fontSpacing );
dtMap->SetFont( fontFace, fontSize, fontFlags, false ); dtMap->SetFont( fontFace, fontSize, fontFlags, false );
dtMap->SetTextColor( fontColor, true ); dtMap->SetTextColor( fontColor, true );
@ -2824,7 +2827,7 @@ void pfJournalBook::IRenderPage( UInt32 page, UInt32 whichDTMap, hsBool suppress
// Wonderful, the break breaks us from the switch(), which means the for() // Wonderful, the break breaks us from the switch(), which means the for()
// loops runs once more and increments idx. So this is to counter that. // loops runs once more and increments idx. So this is to counter that.
// (We better check tho, just to make sure nobody feeds us an extra-large // (We better check tho, just to make sure nobody feeds us an extra-large
// image and sends us on an infinite loop) // image and sends us on an infinite loop)
if( idx > fPageStarts[ page ] ) if( idx > fPageStarts[ page ] )
idx--; idx--;
@ -2963,7 +2966,7 @@ void pfJournalBook::IDrawMipmap( pfEsHTMLChunk *chunk, UInt16 x, UInt16 y, plMip
else else
x -= xShift; x -= xShift;
} }
copy->SetCurrLevel(0); // resize the image so it will look unchanged when rendered on the altered book copy->SetCurrLevel(0); // resize the image so it will look unchanged when rendered on the altered book
copy->ResizeNicely((UInt16)width,(UInt16)height,plMipmap::kDefaultFilter); copy->ResizeNicely((UInt16)width,(UInt16)height,plMipmap::kDefaultFilter);
} }
@ -2978,7 +2981,7 @@ void pfJournalBook::IDrawMipmap( pfEsHTMLChunk *chunk, UInt16 x, UInt16 y, plMip
opts.fBlueTint = chunk->fCurrColor.b; opts.fBlueTint = chunk->fCurrColor.b;
opts.fOpacity = (UInt8)(chunk->fCurrColor.a * 255.f); opts.fOpacity = (UInt8)(chunk->fCurrColor.a * 255.f);
} }
else else
{ {
if( chunk->fFlags & pfEsHTMLChunk::kGlowing ) if( chunk->fFlags & pfEsHTMLChunk::kGlowing )
opts.fFlags = ( chunk->fFlags & pfEsHTMLChunk::kBlendAlpha ) ? 0 : plMipmap::kMaskSrcAlpha; opts.fFlags = ( chunk->fFlags & pfEsHTMLChunk::kBlendAlpha ) ? 0 : plMipmap::kMaskSrcAlpha;
@ -3174,7 +3177,7 @@ plLayerBink *pfJournalBook::IMakeMovieLayer(pfEsHTMLChunk *chunk, UInt16 x, UInt
else else
flipMat = hsMatrix44::IdentityMatrix(); flipMat = hsMatrix44::IdentityMatrix();
} }
hsMatrix44 xfm; hsMatrix44 xfm;
xfm = translateMat * scaleMat * flipMat; xfm = translateMat * scaleMat * flipMat;
@ -3547,7 +3550,7 @@ void pfJournalBook::ILoadAllImages( hsBool unload )
fBookGUIs[fCurBookGUI]->GetKey()->Release( fHTMLSource[ i ]->fImageKey ); fBookGUIs[fCurBookGUI]->GetKey()->Release( fHTMLSource[ i ]->fImageKey );
else else
{ {
plGenRefMsg *ref = TRACKED_NEW plGenRefMsg( fBookGUIs[fCurBookGUI]->GetKey(), plRefMsg::kOnCreate, -1, kRefImage ); plGenRefMsg *ref = TRACKED_NEW plGenRefMsg( fBookGUIs[fCurBookGUI]->GetKey(), plRefMsg::kOnCreate, -1, kRefImage );
hsgResMgr::ResMgr()->AddViaNotify( fHTMLSource[ i ]->fImageKey, ref, plRefFlags::kActiveRef ); hsgResMgr::ResMgr()->AddViaNotify( fHTMLSource[ i ]->fImageKey, ref, plRefFlags::kActiveRef );
} }
} }

Loading…
Cancel
Save