Screenshot fixes and optimizations.

* There was an off-by-one-error causing a blank line at the screen upper screen border.
* Remove ApplyGamma. It is always applied because Gamma is just part of the drawing shaders now.
* Save by copying rows instead of pixels for whole map screenshots.
shapetextures
Sven Eberhardt 2015-09-28 18:54:34 -04:00
parent f1970c5bc1
commit 59d7c761fc
7 changed files with 14 additions and 14 deletions

View File

@ -1874,7 +1874,7 @@ bool C4Game::SaveGameTitle(C4Group &hGroup)
sfcPic,0,0,iSfcWdt,iSfcHgt);
bool fOkay=true;
fOkay = sfcPic->SavePNG(Config.AtTempPath(C4CFN_TempTitle), false, true, false);
fOkay = sfcPic->SavePNG(Config.AtTempPath(C4CFN_TempTitle), false, false);
StdStrBuf destFilename = FormatString("%s.png",C4CFN_ScenarioTitle);
delete sfcPic; if (!fOkay) return false;
if (!hGroup.Move(Config.AtTempPath(C4CFN_TempTitle),destFilename.getData())) return false;

View File

@ -272,9 +272,10 @@ bool C4GraphicsSystem::DoSaveScreenshot(bool fSaveAll, const char *szFilename, f
if (FullScreen.pSurface->Lock())
{
// transfer each pixel - slooow...
for (int32_t iY2=0; iY2<bkHgt2; ++iY2)
for (int32_t iX2=0; iX2<bkWdt2; ++iX2)
png.SetPix(iX+iX2, iY+iY2, pDraw->ApplyGammaTo(FullScreen.pSurface->GetPixDw(iX2, iY2, false)));
for (int32_t iY2 = 0; iY2 < bkHgt2; ++iY2)
glReadPixels(0, FullScreen.pSurface->Hgt - iY2 - 1, bkWdt2, 1, GL_BGR, GL_UNSIGNED_BYTE, reinterpret_cast<BYTE *>(png.GetRow(iY + iY2)) + iX * 3);
/*for (int32_t iX2=0; iX2<bkWdt2; ++iX2)
png.SetPix(iX+iX2, iY+iY2, FullScreen.pSurface->GetPixDw(iX2, iY2, false));*/
// done; unlock
FullScreen.pSurface->Unlock();
}
@ -295,7 +296,7 @@ bool C4GraphicsSystem::DoSaveScreenshot(bool fSaveAll, const char *szFilename, f
return png.Save(szFilename);
}
// Save primary surface
return FullScreen.pSurface->SavePNG(szFilename, false, true, false);
return FullScreen.pSurface->SavePNG(szFilename, false, false);
}
void C4GraphicsSystem::DeactivateDebugOutput()

View File

@ -457,7 +457,7 @@ bool C4Surface::ReadBMP(CStdStream &hGroup, int iFlags)
return true;
}
bool C4Surface::SavePNG(const char *szFilename, bool fSaveAlpha, bool fApplyGamma, bool fSaveOverlayOnly)
bool C4Surface::SavePNG(const char *szFilename, bool fSaveAlpha, bool fSaveOverlayOnly)
{
// Lock - WARNING - maybe locking primary surface here...
if (!Lock()) return false;
@ -475,7 +475,7 @@ bool C4Surface::SavePNG(const char *szFilename, bool fSaveAlpha, bool fApplyGamm
{
// Take shortcut. FIXME: Check Endian
for (int y = 0; y < Hgt; ++y)
glReadPixels(0, Hgt - y, Wdt, 1, fSaveAlpha ? GL_BGRA : GL_BGR, GL_UNSIGNED_BYTE, png.GetImageData() + y * Wdt * (3 + fSaveAlpha));
glReadPixels(0, Hgt - y - 1, Wdt, 1, fSaveAlpha ? GL_BGRA : GL_BGR, GL_UNSIGNED_BYTE, png.GetImageData() + y * Wdt * (3 + fSaveAlpha));
}
else
#endif
@ -485,7 +485,6 @@ bool C4Surface::SavePNG(const char *szFilename, bool fSaveAlpha, bool fApplyGamm
for (int x=0; x<Wdt; ++x)
{
DWORD dwClr = GetPixDw(x, y, false);
if (fApplyGamma) dwClr = pDraw->ApplyGammaTo(dwClr);
png.SetPix(x, y, dwClr);
}
}

View File

@ -147,8 +147,8 @@ public:
bool LoadAny(C4GroupSet &hGroupset, const char *szFilename, bool fOwnPal, bool fNoErrIfNotFound, int iFlags);
bool Load(C4Group &hGroup, const char *szFilename, bool fOwnPal, bool fNoErrIfNotFound, int iFlags);
bool Save(C4Group &hGroup, const char *szFilename);
bool SavePNG(C4Group &hGroup, const char *szFilename, bool fSaveAlpha=true, bool fApplyGamma=false, bool fSaveOverlayOnly=false);
bool SavePNG(const char *szFilename, bool fSaveAlpha, bool fApplyGamma, bool fSaveOverlayOnly);
bool SavePNG(C4Group &hGroup, const char *szFilename, bool fSaveAlpha=true, bool fSaveOverlayOnly=false);
bool SavePNG(const char *szFilename, bool fSaveAlpha, bool fSaveOverlayOnly);
bool Read(CStdStream &hGroup, const char * extension, int iFlags);
bool ReadPNG(CStdStream &hGroup, int iFlags);
bool ReadJPEG(CStdStream &hGroup, int iFlags);

View File

@ -224,7 +224,7 @@ bool C4Surface::ReadPNG(CStdStream &hGroup, int iFlags)
return fSuccess;
}
bool C4Surface::SavePNG(C4Group &hGroup, const char *szFilename, bool fSaveAlpha, bool fApplyGamma, bool fSaveOverlayOnly)
bool C4Surface::SavePNG(C4Group &hGroup, const char *szFilename, bool fSaveAlpha, bool fSaveOverlayOnly)
{
// Using temporary file at C4Group temp path
char szTemp[_MAX_PATH+1];
@ -232,7 +232,7 @@ bool C4Surface::SavePNG(C4Group &hGroup, const char *szFilename, bool fSaveAlpha
SAppend(GetFilename(szFilename),szTemp);
MakeTempFilename(szTemp);
// Save to temporary file
if (!C4Surface::SavePNG(szTemp, fSaveAlpha, fApplyGamma, fSaveOverlayOnly)) return false;
if (!C4Surface::SavePNG(szTemp, fSaveAlpha, fSaveOverlayOnly)) return false;
// Move temp file to group
if (!hGroup.Move(szTemp,GetFilename(szFilename))) return false;
// Success

View File

@ -53,7 +53,7 @@ public:
bool Load(BYTE *pFile, int iSize); // load from file that is completely in mem
DWORD GetPix(int iX, int iY); // get pixel value (rgba) - note that NO BOUNDS CHECKS ARE DONE due to performance reasons!
// Use ONLY for PNG_COLOR_TYPE_RGB_ALPHA!
const uint32_t * GetRow(int iY)
uint32_t * GetRow(int iY)
{
return reinterpret_cast<uint32_t *>(pImageData+iY*iRowSize);
}

View File

@ -153,7 +153,7 @@ bool C4MapFolderData::Load(C4Group &hGroup, C4ScenarioListLoader::Folder *pScenL
fctDump.Surface,
0, 0,
fctDump.Wdt, fctDump.Hgt);
fSuccess = fctDump.Surface->SavePNG(pScen->sBaseImage.getData(), true, false, false);
fSuccess = fctDump.Surface->SavePNG(pScen->sBaseImage.getData(), true, false);
}
if (!fSuccess)
DebugLogF("C4MapFolderData::Load(%s): Could not dump graphic \"%s\"", hGroup.GetName(), pScen->sBaseImage.getData());