Fix full map screenshots (#1220).

Fixed upperboard, borders when screenshotting while at the side of the map and issues when multiple viewports were open.
issue1247
Sven Eberhardt 2015-02-03 00:59:46 +01:00
parent 041532505b
commit c714e5e3b2
2 changed files with 21 additions and 11 deletions

View File

@ -249,9 +249,14 @@ bool C4GraphicsSystem::DoSaveScreenshot(bool fSaveAll, const char *szFilename, f
C4TargetFacet bkFct;
// mark background to be redrawn
InvalidateBg();
// draw on one big viewport
pVP->SetOutputSize(0,0,0,0, bkWdt, bkHgt);
// backup and clear sky parallaxity
int32_t iParX=::Landscape.Sky.ParX; ::Landscape.Sky.ParX=10;
int32_t iParY=::Landscape.Sky.ParY; ::Landscape.Sky.ParY=10;
// backup and clear viewport borders
FLOAT_RECT vp_borders = { pVP->BorderLeft, pVP->BorderRight, pVP->BorderTop, pVP->BorderBottom };
pVP->BorderLeft = pVP->BorderRight = pVP->BorderTop = pVP->BorderBottom = 0.0f;
// temporarily change viewport player
int32_t iVpPlr=pVP->Player; pVP->Player=NO_OWNER;
// blit all tiles needed
@ -280,9 +285,16 @@ bool C4GraphicsSystem::DoSaveScreenshot(bool fSaveAll, const char *szFilename, f
}
// restore viewport player
pVP->Player=iVpPlr;
// restore viewport borders
pVP->BorderLeft = vp_borders.left;
pVP->BorderTop = vp_borders.top;
pVP->BorderRight = vp_borders.right;
pVP->BorderBottom = vp_borders.bottom;
// restore parallaxity
::Landscape.Sky.ParX=iParX;
::Landscape.Sky.ParY=iParY;
// restore viewport size
::Viewports.RecalculateViewports();
// save!
return png.Save(szFilename);
}

View File

@ -194,20 +194,18 @@ void C4Viewport::Draw(C4TargetFacet &cgo0, bool fDrawOverlay)
GameZoom.X = cgo.X; GameZoom.Y = cgo.Y;
GameZoom.Zoom = cgo.Zoom;
if (fDrawOverlay)
{
// Draw landscape borders. Only if overlay, so complete map screenshots don't get messed up
if (BorderLeft > 0.0f) pDraw->BlitSurfaceTile(::GraphicsResource.fctBackground.Surface,cgo.Surface,DrawX,DrawY,BorderLeft,ViewHgt,-DrawX,-DrawY);
if (BorderTop > 0.0f) pDraw->BlitSurfaceTile(::GraphicsResource.fctBackground.Surface,cgo.Surface,DrawX+BorderLeft,DrawY,ViewWdt-BorderLeft-BorderRight,BorderTop,-DrawX-BorderLeft,-DrawY);
if (BorderRight > 0.0f) pDraw->BlitSurfaceTile(::GraphicsResource.fctBackground.Surface,cgo.Surface,DrawX+ViewWdt-BorderRight,DrawY,BorderRight,ViewHgt,-DrawX-ViewWdt+BorderRight,-DrawY);
if (BorderBottom > 0.0f) pDraw->BlitSurfaceTile(::GraphicsResource.fctBackground.Surface,cgo.Surface,DrawX+BorderLeft,DrawY+ViewHgt-BorderBottom,ViewWdt-BorderLeft-BorderRight,BorderBottom,-DrawX-BorderLeft,-DrawY-ViewHgt+BorderBottom);
}
// Draw landscape borders
if (BorderLeft > 0.0f) pDraw->BlitSurfaceTile(::GraphicsResource.fctBackground.Surface, cgo.Surface, DrawX, DrawY, BorderLeft, ViewHgt, -DrawX, -DrawY);
if (BorderTop > 0.0f) pDraw->BlitSurfaceTile(::GraphicsResource.fctBackground.Surface, cgo.Surface, DrawX + BorderLeft, DrawY, ViewWdt - BorderLeft - BorderRight, BorderTop, -DrawX - BorderLeft, -DrawY);
if (BorderRight > 0.0f) pDraw->BlitSurfaceTile(::GraphicsResource.fctBackground.Surface, cgo.Surface, DrawX + ViewWdt - BorderRight, DrawY, BorderRight, ViewHgt, -DrawX - ViewWdt + BorderRight, -DrawY);
if (BorderBottom > 0.0f) pDraw->BlitSurfaceTile(::GraphicsResource.fctBackground.Surface, cgo.Surface, DrawX + BorderLeft, DrawY + ViewHgt - BorderBottom, ViewWdt - BorderLeft - BorderRight, BorderBottom, -DrawX - BorderLeft, -DrawY - ViewHgt + BorderBottom);
// Compute non-bordered viewport area
cgo.X += BorderLeft; cgo.Y += BorderTop; cgo.Wdt -= (BorderLeft+BorderRight)/cgo.Zoom; cgo.Hgt -= (BorderTop+BorderBottom)/cgo.Zoom;
GameZoom.X = cgo.X; GameZoom.Y = cgo.Y;
cgo.TargetX += BorderLeft/Zoom; cgo.TargetY += BorderTop/Zoom;
cgo.X += BorderLeft; cgo.Y += BorderTop; cgo.Wdt -= (BorderLeft + BorderRight) / cgo.Zoom; cgo.Hgt -= (BorderTop + BorderBottom) / cgo.Zoom;
cgo.TargetX += BorderLeft / Zoom; cgo.TargetY += BorderTop / Zoom;
// Apply Zoom
GameZoom.X = cgo.X; GameZoom.Y = cgo.Y;
pDraw->SetZoom(GameZoom);
// Set clipper to integer bounds around floating point viewport region
const FLOAT_RECT clipRect = { DrawX + BorderLeft, DrawX + ViewWdt - BorderRight, DrawY + BorderTop, DrawY + ViewHgt - BorderBottom };