diff --git a/Sources/Plasma/FeatureLib/pfJournalBook/pfJournalBook.cpp b/Sources/Plasma/FeatureLib/pfJournalBook/pfJournalBook.cpp index 4b29c28c..404c9bb9 100644 --- a/Sources/Plasma/FeatureLib/pfJournalBook/pfJournalBook.cpp +++ b/Sources/Plasma/FeatureLib/pfJournalBook/pfJournalBook.cpp @@ -125,7 +125,7 @@ class pfEsHTMLChunk hsScalar fCurrOpacity; // For SFX images hsScalar fSFXTime; // For SFX images - hsScalar fMinOpacity, fMaxOpacity; + hsScalar fMinOpacity, fMaxOpacity; hsColorRGBA fCurrColor; hsColorRGBA fOffColor, fOnColor; @@ -156,7 +156,7 @@ class pfEsHTMLChunk kCanLink = 0x00000008, kFloating = 0x00000010, 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 // is "on opacity" kChecked = 0x00000080, // Only for kActAsCB, set if it's currently "checked" @@ -469,7 +469,7 @@ pfBookData::pfBookData(const char *guiName /* = nil */) fTurnFrontEditCtrl = fTurnBackEditCtrl = nil; fEditable = false; fAdjustCursorTo = -1; - + if (guiName) fGUIName = guiName; else @@ -542,7 +542,7 @@ hsBool pfBookData::MsgReceive(plMessage *pMsg) else if( fCurrentlyTurning ) { if( callback->fUser & 0x04 ) - IFillUncoveringPage( (hsBool)( callback->fUser & 0x01 ) ? true : false ); + IFillUncoveringPage( (hsBool)( callback->fUser & 0x01 ) ? true : false ); else if( callback->fUser & 0x02 ) StartTriggeredFlip( (hsBool)( callback->fUser & 0x01 ) ? true : false ); else @@ -564,7 +564,7 @@ hsBool pfBookData::MsgReceive(plMessage *pMsg) if( time != nil && fCurrSFXPages != kNoSides && !fCurrentlyTurning && fCurrentlyOpen ) { IHandleSFX( (hsScalar)time->DSeconds() ); - return true; + return true; } plTimerCallbackMsg* timerMsg = plTimerCallbackMsg::ConvertNoRef(pMsg); @@ -590,13 +590,13 @@ void pfBookData::IInitTemplate(pfGUIDialogMod *templateDlg) hsAssert(templateDlg != nil, "Nil template in pfBookData::IInitTemplate()!"); // 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 templateDlg->SetHandlerForAll(TRACKED_NEW pfJournalDlgProc(this)); // Find our animation keys - + // And other interesting pointers fCoverButton = pfGUICheckBoxCtrl::ConvertNoRef(templateDlg->GetControlFromTag(pfJournalDlgProc::kTagBookCover)); fTurnPageButton = pfGUICheckBoxCtrl::ConvertNoRef(templateDlg->GetControlFromTag(pfJournalDlgProc::kTagTurnPageCtrl)); @@ -621,7 +621,7 @@ void pfBookData::IInitTemplate(pfGUIDialogMod *templateDlg) // Grab and ref the default cover mipmap plLayer *lay = plLayer::ConvertNoRef(fCoverLayer); 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); fRightPageMap->SetFlag(pfGUIClickMapCtrl::kReportHovering); @@ -663,7 +663,7 @@ void pfBookData::IInitTemplate(pfGUIDialogMod *templateDlg) } //// IGetDTMap /////////////////////////////////////////////////////////////// -// Just a quick helper +// Just a quick helper plDynamicTextMap *pfBookData::GetDTMap(UInt32 which) { @@ -691,7 +691,7 @@ pfGUIMultiLineEditCtrl *pfBookData::GetEditCtrl(UInt32 which) } //// 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 void pfBookData::RegisterForSFX(WhichSide whichPages) @@ -705,7 +705,7 @@ void pfBookData::RegisterForSFX(WhichSide whichPages) } else plgDispatch::Dispatch()->UnRegisterForExactType(plTimeMsg::Index(), GetKey()); - + 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++) { pfEsHTMLChunk *chunk = fCurrBook->fHTMLSource[idx]; - + if(chunk->fFlags & pfEsHTMLChunk::kGlowing) { // 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 id = 98; } - + // 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); 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->AddReceivers(keys); - + // 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. plEventCallbackMsg *eventMsg = TRACKED_NEW plEventCallbackMsg; @@ -920,7 +920,7 @@ void pfBookData::ITriggerPageFlip(hsBool flipBackwards, hsBool immediate) } //// 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) 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 // key is the keyed object to send event messages to (see 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 */ ) { 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()); fBookGUIs[fCurBookGUI]->LoadGUI(); } - + fCurrentPage = 0; fLastPage = -1; fCoverMipKey = coverImageKey; @@ -1242,7 +1242,7 @@ pfJournalBook::pfJournalBook( const char *esHTMLSource, plKey coverImageKey, plK 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 */ ) { 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()); fBookGUIs[fCurBookGUI]->LoadGUI(); } - + fCurrentPage = 0; fLastPage = -1; fCoverMipKey = coverImageKey; @@ -1498,7 +1498,7 @@ void pfJournalBook::ITriggerCloseWithNotify( hsBool closeNotOpen, hsBool immedia } msg->SetAnimName( animName ); msg->AddReceivers( keys ); - + plEventCallbackMsg *eventMsg = TRACKED_NEW plEventCallbackMsg; eventMsg->AddReceiver( fBookGUIs[fCurBookGUI]->GetKey() ); eventMsg->fRepeats = 0; @@ -1548,7 +1548,7 @@ void pfJournalBook::NextPage( void ) fVisibleLinks.Reset(); // 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 plDynamicTextMap *turnFront = fBookGUIs[fCurBookGUI]->GetDTMap( pfJournalDlgProc::kTagTurnFrontDTMap ); 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 fCurrentPage -= 2; // just making sure that this doesn't go below zero (and therefore wrap around) - + pfGUIMultiLineEditCtrl *right = fBookGUIs[fCurBookGUI]->GetEditCtrl(pfJournalDlgProc::kTagRightEditCtrl); pfGUIMultiLineEditCtrl *left = fBookGUIs[fCurBookGUI]->GetEditCtrl(pfJournalDlgProc::kTagLeftEditCtrl); 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 // starts so that nothing flashes or overdraws. - + fBookGUIs[fCurBookGUI]->StartTriggeredFlip( true ); fBookGUIs[fCurBookGUI]->TurnPageButton()->PlaySound( pfGUICheckBoxCtrl::kMouseUp ); ISendNotify(kNotifyPreviousPage); @@ -1618,7 +1618,7 @@ void pfJournalBook::PreviousPage( void ) fVisibleLinks.Reset(); // 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 plDynamicTextMap *turnBack = fBookGUIs[fCurBookGUI]->GetDTMap( pfJournalDlgProc::kTagTurnBackDTMap ); 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 ); 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 if( start == c ) { @@ -1855,7 +1855,7 @@ hsBool pfJournalBook::ICompileSource( const wchar_t *source, const plLocation &h else if( lastParChunk != nil ) { UInt32 count = ((UInt32)c - (UInt32)start)/2; // wchar_t is 2 bytes - + wchar_t *temp = TRACKED_NEW wchar_t[ count + 1 ]; wcsncpy( temp, start, count ); temp[count] = L'\0'; @@ -2010,7 +2010,7 @@ hsBool pfJournalBook::ICompileSource( const wchar_t *source, const plLocation &h break; 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 c += 6; while( IGetNextOption( c, name, option ) ) @@ -2181,7 +2181,7 @@ hsBool pfJournalBook::ICompileSource( const wchar_t *source, const plLocation &h } fHeightScale = 1.f - bookHeight; fWidthScale = 1.f - bookWidth; - + // Still gotta create a new par chunk lastParChunk = TRACKED_NEW pfEsHTMLChunk( nil ); lastParChunk->fFlags = IFindLastAlignment(); @@ -2316,7 +2316,7 @@ hsBool pfJournalBook::ICompileSource( const wchar_t *source, const plLocation &h lastParChunk = TRACKED_NEW pfEsHTMLChunk( nil ); lastParChunk->fFlags = IFindLastAlignment(); break; - + case pfEsHTMLChunk::kEditable: c += 9; SetEditable(true); @@ -2350,12 +2350,12 @@ hsBool pfJournalBook::ICompileSource( const wchar_t *source, const plLocation &h else if( lastParChunk != nil ) { UInt32 count = (UInt32)c - (UInt32)start; - + wchar_t *temp = TRACKED_NEW wchar_t[ count + 1 ]; wcsncpy( temp, start, count + 1 ); lastParChunk->fText = temp; delete [] temp; - + // Special case to remove any last trailing carriage return // if( count > 1 && lastParChunk->fText[ count - 1 ] == '\n' ) // lastParChunk->fText[ count - 1 ] = 0; @@ -2370,7 +2370,7 @@ hsBool pfJournalBook::ICompileSource( const wchar_t *source, const plLocation &h fLastPage = 0; else fLastPage = -1; - + return true; } @@ -2394,7 +2394,7 @@ UInt8 pfJournalBook::IGetTagType( const wchar_t *string ) { L"movie", pfEsHTMLChunk::kMovie }, { L"editable", pfEsHTMLChunk::kEditable }, { nil, pfEsHTMLChunk::kEmpty } }; - + UInt32 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 wcsncpy( option, c, len ); option[len] = L'\0'; - + if( *string == L'\"' ) 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 wcsncpy( option, c, len ); option[len] = L'\0'; - + return true; } void pfJournalBook::IFreeSource( void ) { UInt32 i; - + for( i = 0; i < fHTMLSource.GetCount(); i++ ) delete fHTMLSource[ i ]; fHTMLSource.Reset(); @@ -2573,7 +2573,7 @@ void pfJournalBook::IRenderPage( UInt32 page, UInt32 whichDTMap, hsBool suppress { if (fAreEditing) return; // we don't render if we are editing the book - + // Grab the DTMap via the GUI system plDynamicTextMap *dtMap = fBookGUIs[fCurBookGUI]->GetDTMap( whichDTMap ); 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 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 { UInt32 idx; UInt16 width, height, y, x, ascent, lastX, lastY; - + UInt8 fontFlags, fontSize; const wchar_t *fontFace; hsColorRGBA fontColor; @@ -2647,7 +2647,7 @@ void pfJournalBook::IRenderPage( UInt32 page, UInt32 whichDTMap, hsBool suppress switch( chunk->fType ) { - case pfEsHTMLChunk::kParagraph: + case pfEsHTMLChunk::kParagraph: if( ( chunk->fFlags & pfEsHTMLChunk::kAlignMask ) == pfEsHTMLChunk::kLeft ) { dtMap->SetJustify( plDynamicTextMap::kLeftJustify ); @@ -2668,10 +2668,14 @@ void pfJournalBook::IRenderPage( UInt32 page, UInt32 whichDTMap, hsBool suppress width = (UInt16)(512 - fPageLMargin - fPageRMargin); height = (UInt16)(512 - fPageBMargin - y); 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); 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 ) { @@ -2682,17 +2686,16 @@ void pfJournalBook::IRenderPage( UInt32 page, UInt32 whichDTMap, hsBool suppress idx--; 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 // 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 // cache, but that's ok 'cause if we're doing this, it's probably invalid (or empty) // anyway - int fTextLen = chunk->fText.length(); - wchar_t *s = TRACKED_NEW wchar_t[fTextLen+1]; - wcscpy(s,chunk->fText.c_str()); - s[fTextLen] = L'\0'; + wchar_t *s = TRACKED_NEW wchar_t[chunkTextStrLen+1]; + wcscpy(s,chunkTextStr); + s[chunkTextStrLen] = L'\0'; // Note: Makes a copy of the string pfEsHTMLChunk *c2 = TRACKED_NEW pfEsHTMLChunk( &s[ lastChar ] ); @@ -2711,7 +2714,7 @@ void pfJournalBook::IRenderPage( UInt32 page, UInt32 whichDTMap, hsBool suppress y += 512; break; } - + x = lastX; 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 // 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 :) y += (UInt16)(mip->GetHeight()); // 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. - // (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) if( idx > fPageStarts[ page ] ) idx--; @@ -2796,7 +2799,7 @@ void pfJournalBook::IRenderPage( UInt32 page, UInt32 whichDTMap, hsBool suppress x = (UInt16)fPageLMargin; break; - case pfEsHTMLChunk::kFontChange: + case pfEsHTMLChunk::kFontChange: IFindFontProps( idx, fontFace, fontSize, fontFlags, fontColor, fontSpacing ); dtMap->SetFont( fontFace, fontSize, fontFlags, false ); 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() // 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) if( idx > fPageStarts[ page ] ) idx--; @@ -2963,7 +2966,7 @@ void pfJournalBook::IDrawMipmap( pfEsHTMLChunk *chunk, UInt16 x, UInt16 y, plMip else x -= xShift; } - + 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); } @@ -2978,7 +2981,7 @@ void pfJournalBook::IDrawMipmap( pfEsHTMLChunk *chunk, UInt16 x, UInt16 y, plMip opts.fBlueTint = chunk->fCurrColor.b; opts.fOpacity = (UInt8)(chunk->fCurrColor.a * 255.f); } - else + else { if( chunk->fFlags & pfEsHTMLChunk::kGlowing ) opts.fFlags = ( chunk->fFlags & pfEsHTMLChunk::kBlendAlpha ) ? 0 : plMipmap::kMaskSrcAlpha; @@ -3174,7 +3177,7 @@ plLayerBink *pfJournalBook::IMakeMovieLayer(pfEsHTMLChunk *chunk, UInt16 x, UInt else flipMat = hsMatrix44::IdentityMatrix(); } - + hsMatrix44 xfm; xfm = translateMat * scaleMat * flipMat; @@ -3547,7 +3550,7 @@ void pfJournalBook::ILoadAllImages( hsBool unload ) fBookGUIs[fCurBookGUI]->GetKey()->Release( fHTMLSource[ i ]->fImageKey ); 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 ); } }