void Image::SaveImage(const char * filename) { int len = strlen(filename); if(strcmp(".bmp", filename+len-4)==0){ SaveBMP(filename); }else{ SaveTGA(filename); } }
int CParticleImageManager::Load (int nType) { nType = particleImageManager.GetType (nType); tParticleImageInfo& pii = ParticleImageInfo (nType); if (pii.bHave) return 1; if (!LoadAddonBitmap (&pii.bmP, pii.szName, &pii.bHave)) return 0; #if MAKE_SMOKE_IMAGE { tTgaHeader h; TGAInterpolate (bmP, 2); if (TGAMakeSquare (bmP)) { memset (&h, 0, sizeof (h)); SaveTGA (ParticleImageInfo (nType).szName, gameFolders.szDataDir, &h, bmP); } } #endif pii.bmP->SetFrameCount (); pii.bmP->SetupTexture (0, 1); pii.xBorder = pii.yBorder = 0; if (nType <= SMOKE_PARTICLES) ;//pii.nFrames = 8; else if (nType == BUBBLE_PARTICLES) ;//pii.nFrames = 4; else if (nType == WATERFALL_PARTICLES) ;//pii.nFrames = 8; else if (nType == FIRE_PARTICLES) { ;//pii.nFrames = 4; pii.xBorder = 1.0f / float (pii.bmP->Width ()); pii.yBorder = 1.0f / float (pii.bmP->Height ()); } else { pii.nFrames = pii.bmP->FrameCount (); pii.bAnimate = pii.nFrames > 1; } return 1; }
void save_frames(char *filename,int count) { int f; char outfile[256]; if(dry) { for(f=0;f<count;f++) { frame++; vid_drawcursor(1); usleep(dry*1000); } } else { for(f=0;f<count;f++) { sprintf(outfile,filename,frame); frame++; vid_drawcursor(1); if(SaveTGA(screen,outfile,1)) { printf("SaveTGA failed ! (filename: %s)\n",outfile); } else printf("Saved %s\n",outfile); } } }
int PageInBitmap (CBitmap *bmP, const char *bmName, int nIndex, int bD1, bool bHires) { CBitmap *altBmP = NULL; int nFile, nSize, nOffset, nFrames, nShrinkFactor, nBestShrinkFactor, bRedone = 0, bTGA; sbyte nFlags; bool bDefault = false; CFile cf, *cfP = &cf; char fn [6][FILENAME_LEN]; #if DBG if (!bmName) return 0; if ((nDbgTexture > 0) && (nIndex == nDbgTexture)) nDbgTexture = nDbgTexture; #endif if (bmP->Buffer ()) return 1; StopTime (); nShrinkFactor = 8 >> min (gameOpts->render.textures.nQuality, gameStates.render.nMaxTextureQuality); if (nShrinkFactor < 4) { if (nShrinkFactor == 1) nShrinkFactor = 2; // cap texture quality at 256x256 (x frame#) else if (IsPowerup (bmName) || IsWeapon (bmName)) // force downscaling of powerup hires textures nShrinkFactor <<= 1; } nSize = (int) bmP->FrameSize (); if (nIndex >= 0) GetFlagData (bmName, nIndex); #if DBG if (strstr (bmName, "metl139")) bmName = bmName; #endif if (gameStates.app.bNostalgia) gameOpts->render.textures.bUseHires [0] = 0; bTGA = 0; nFlags = (nIndex < 0) ? 0 : gameData.pig.tex.bitmapFlags [bD1][nIndex]; if (bmP->Texture ()) bmP->Texture ()->Release (); bmP->SetBPP (1); if ((*bmName && /*!gameStates.app.bDemoData &&*/ ((nIndex < 0) || IsCockpit (bmName) || bHires || gameOpts->render.textures.bUseHires [0])) && !(gameOpts->render.powerups.b3D && IsWeapon (bmName) && !gameStates.app.bHaveMod)) { #if 0 if ((nIndex >= 0) && ReadS3TC (gameData.pig.tex.altBitmaps [bD1] + nIndex, gameFolders.szTextureCacheDir [bD1], bmName)) { altBmP = gameData.pig.tex.altBitmaps [bD1] + nIndex; altBmP->nType = BM_TYPE_ALT; bmP->SetOverride (altBmP); BM_FRAMECOUNT (altBmP) = 1; nFlags &= ~BM_FLAG_RLE; nFlags |= BM_FLAG_TGA; bmP = altBmP; altBmP = NULL; } else #endif if (*gameFolders.szTextureDir [2]) { char szLevelFolder [FILENAME_LEN]; if (gameData.missions.nCurrentLevel < 0) sprintf (szLevelFolder, "slevel%02d", -gameData.missions.nCurrentLevel); else sprintf (szLevelFolder, "level%02d", gameData.missions.nCurrentLevel); sprintf (gameFolders.szTextureDir [3], "%s/%s", gameFolders.szTextureDir [2], szLevelFolder); sprintf (gameFolders.szTextureCacheDir [3], "%s/%s", gameFolders.szTextureCacheDir [2], szLevelFolder); } else *gameFolders.szTextureDir [3] = *gameFolders.szTextureCacheDir [3] = '\0'; MakeBitmapFilenames (bmName, gameFolders.szTextureDir [3], gameFolders.szTextureCacheDir [3], fn [1], fn [0], nShrinkFactor); MakeBitmapFilenames (bmName, gameFolders.szTextureDir [2], gameFolders.szTextureCacheDir [2], fn [3], fn [2], nShrinkFactor); MakeBitmapFilenames (bmName, gameFolders.szTextureDir [bD1], gameFolders.szTextureCacheDir [bD1], fn [5], fn [4], nShrinkFactor); if (0 <= (nFile = OpenBitmapFile (fn, cfP))) { cfP->Close (); PrintLog ("loading hires texture '%s' (quality: %d)\n", fn [nFile], min (gameOpts->render.textures.nQuality, gameStates.render.nMaxTextureQuality)); if (nFile < 2) //was level specific mod folder MakeTexSubFolders (gameFolders.szTextureCacheDir [3]); if (nIndex < 0) altBmP = &gameData.pig.tex.addonBitmaps [-nIndex - 1]; else altBmP = &gameData.pig.tex.altBitmaps [bD1][nIndex]; if (!ReadTGA (fn [nFile], "", altBmP)) { altBmP = NULL; if (!bDefault) cfP->Close (); throw (EX_OUT_OF_MEMORY); } else { bTGA = 1; if (strstr (fn [nFile], "omegblob#") && strstr (fn [nFile], "/mods/")) gameStates.render.bOmegaModded = 1; altBmP->SetType (BM_TYPE_ALT); bmP->SetOverride (altBmP); bmP = altBmP; bmP->DelFlags (BM_FLAG_RLE); nSize = bmP->Size (); nFrames = (bmP->Height () % bmP->Width ()) ? 1 : bmP->Height () / bmP->Width (); bmP->SetFrameCount (ubyte (nFrames)); nOffset = -1; if (nIndex >= 0) { nFlags = bmP->Flags (); if (bmP->Height () > bmP->Width ()) { tEffectClip *ecP = NULL; tWallClip *wcP; tVideoClip *vcP; while ((ecP = FindEffect (ecP, nIndex))) { //e->vc.nFrameCount = nFrames; ecP->flags |= EF_ALTFMT; //ecP->vClipInfo.flags |= WCF_ALTFMT; } if (!ecP) { if ((wcP = FindWallAnim (nIndex))) { //w->nFrameCount = nFrames; wcP->flags |= WCF_ALTFMT; } else if ((vcP = FindVClip (nIndex))) { //v->nFrameCount = nFrames; vcP->flags |= WCF_ALTFMT; } else { PrintLog (" couldn't find animation for '%s'\n", bmName); } } } } } } } if (!altBmP) { if (nIndex < 0) { StartTime (0); return 0; } cfP = cfPiggy + bD1; if (!cfP->File ()) PiggyInitPigFile (NULL); nOffset = bitmapOffsets [bD1][nIndex]; bDefault = true; } bRedone = 1; if ((nOffset >= 0) && cfP->Seek (nOffset, SEEK_SET)) { if (!bDefault) cfP->Close (); throw (EX_IO_ERROR); } #if 1//DBG bmP->SetName (bmName); #endif #if TEXTURE_COMPRESSION if (bmP->Compressed ()) UseBitmapCache (bmP, bmP->CompressedSize ()); else #endif { if (bTGA || bmP->CreateBuffer ()) UseBitmapCache (bmP, nSize); } if (!bmP->Buffer () || (bitmapCacheUsed > bitmapCacheSize)) { if (!bDefault) cfP->Close (); throw (EX_OUT_OF_MEMORY); } if (!bTGA && (nIndex >= 0)) bmP->SetFlags (nFlags); bmP->SetId (nIndex); #if DBG if (nIndex == nDbgTexture) nDbgTexture = nDbgTexture; #endif int i = ReadBitmap (bmP, nSize, cfP, bDefault, bD1 != 0, bHires); if (i) { if (i < 0) { if (!bDefault) cfP->Close (); throw (EX_IO_ERROR); } } else #if TEXTURE_COMPRESSION if (!bmP->Compressed ()) #endif { bmP->SetType (BM_TYPE_ALT); bmP->SetTranspType (-1); if (IsOpaqueDoor (nIndex)) { bmP->DelFlags (BM_FLAG_TRANSPARENT); bmP->TransparentFrames () [0] &= ~1; } #if TEXTURE_COMPRESSION if (CompressTGA (bmP)) bmP->SaveS3TC (gameFolders.szTextureCacheDir [(nFile < 2) ? 3 : (nFile < 4) ? 2 : bD1], bmName); else { #endif nBestShrinkFactor = BestShrinkFactor (bmP, nShrinkFactor); if ((nBestShrinkFactor > 1) && ShrinkTGA (bmP, nBestShrinkFactor, nBestShrinkFactor, 1)) { nSize /= (nBestShrinkFactor * nBestShrinkFactor); if (gameStates.app.bCacheTextures) { tTgaHeader h; memset (&h, 0, sizeof (h)); h.bits = bmP->BPP () * 8; h.width = bmP->Width (); h.height = bmP->Height (); h.imageType = 2; // nFile < 2: mod level texture folder // nFile < 4: mod texture folder // otherwise standard D1 or D2 texture folder SaveTGA (bmName, gameFolders.szTextureCacheDir [(nFile < 2) ? 3 : (nFile < 4) ? 2 : bD1], &h, bmP); } } } #if TEXTURE_COMPRESSION } #endif #if DBG nPrevIndex = nIndex; strcpy (szPrevBm, bmName); #endif tRgbColorf color; if (0 <= (bmP->AvgColor (&color))) bmP->SetAvgColorIndex (ubyte (bmP->Palette ()->ClosestColor (&color))); StartTime (0); if (!bDefault) cfP->Close (); return 1; }