forked from Mirrors/openclonk
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
parent
f1970c5bc1
commit
59d7c761fc
|
@ -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;
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
|
|
Loading…
Reference in New Issue