void CheckSurfaceRecreation(LPRDATA rdPtr) { fprh rhPtr = rdPtr->rHo.hoAdRunHeader; LPSURFACE ps = WinGetSurface((int)rhPtr->rhIdEditWin); LPSURFACE pProto = NULL; ParallaxFrame current = *rdPtr->currentPframe; //Recreate surface if nessecary. if( (rdPtr->direction == HORIZONTAL && rdPtr->rHo.hoImgWidth != rdPtr->oldWidth) || (rdPtr->direction == VERTICAL && rdPtr->rHo.hoImgHeight != rdPtr->oldHeight) || (rdPtr->finalImage == NULL) ) { if( rdPtr->finalImage != NULL ) { rdPtr->finalImage->Delete(); delete rdPtr->finalImage; } rdPtr->finalImage = new cSurface(); if ( GetSurfacePrototype( &pProto, ps->GetDepth(), ST_MEMORY, SD_DIB) ) { int newWidth = (rdPtr->direction == HORIZONTAL) ? rdPtr->rHo.hoImgWidth : current.parallaxImage->GetWidth(); int newHeight = (rdPtr->direction == HORIZONTAL) ? current.parallaxImage->GetHeight() : rdPtr->rHo.hoImgHeight; rdPtr->finalImage->Create(newWidth, newHeight, pProto); if( !rdPtr->finalImage->IsValid() ) { rdPtr->finalImage->Delete(); delete rdPtr->finalImage; } } } rdPtr->oldWidth = rdPtr->rHo.hoImgWidth; rdPtr->oldHeight = rdPtr->rHo.hoImgHeight; }
void LoadImageFile(LPRDATA rdPtr, LPSTR pFileName) { LPRH rhPtr = rdPtr->rHo.hoAdRunHeader; HANDLE hf = INVALID_HANDLE_VALUE; do { if ( pFileName == NULL || *pFileName == 0 ) break; // Copy filename to temp buffer char fname[MAX_PATH]; strcpy(fname, pFileName); // Get surface prototype LPSURFACE wSurf = WinGetSurface((int)rhPtr->rhIdEditWin); LPSURFACE proto; GetSurfacePrototype(&proto, (wSurf != NULL) ? wSurf->GetDepth() : 24, ST_MEMORYWITHDC, SD_DIB); if ( proto == NULL ) break; // Ask MMF2 to open the file (opens external file and embedded files, and downloads files in Vitalize mode) DWORD dwSize; hf = rhPtr->rh4.rh4Mv->mvOpenHFile(fname, &dwSize, 0); if ( hf == INVALID_HANDLE_VALUE ) break; // Create CInpuBufFile object associated with the file handle DWORD dwOff = File_GetPosition((HFILE)hf); CInputBufFile bf; if ( bf.Create((HFILE)hf, dwOff, dwSize) != 0 ) break; // Create surface cSurface* psf = NewSurface(); if ( psf == NULL ) break; psf->Create(4, 4, proto); psf->Fill(RGB(0,0,0)); if ( psf->GetDepth() == 8 ) psf->SetPalette (*wSurf); // Load picture CImageFilterMgr* pImgMgr = rhPtr->rh4.rh4Mv->mvImgFilterMgr; if ( ImportImageFromInputFile(pImgMgr, &bf, psf, NULL, IMPORT_IMAGE_USESURFACEDEPTH | IMPORT_IMAGE_USESURFACEPALETTE) ) { // Copy filename if file successfully loaded strcpy(rdPtr->sFilename, fname); rdPtr->nWidth = rdPtr->rHo.hoImgWidth = psf->GetWidth(); rdPtr->nHeight = rdPtr->rHo.hoImgHeight = psf->GetHeight(); // Replace picture surface if ( rdPtr->pSf != NULL ) DeleteSurface(rdPtr->pSf); rdPtr->pSf = psf; // Free collision mask FreeColMask(rdPtr); // Set transparent color if ( psf->GetTransparentColor() == RGB(0,0,0) ) { COLORREF trspColor = rdPtr->dwTranspColor; if ( (rdPtr->dwOptions & SPICTFLAGS_TRANSP_FIRSTPIXEL) != 0 ) psf->GetPixel(0,0,trspColor); psf->SetTransparentColor(trspColor); } } else DeleteSurface(psf); } while(FALSE); // Close picture file (opened with mvOpenHFile) if ( hf != INVALID_HANDLE_VALUE ) rhPtr->rh4.rh4Mv->mvCloseHFile(hf); }