void CMouse::Draw(C4FacetEx &cgo, bool fDrawToolTip) { // only if owned if (!fActive) return; // dbg: some cursor... //lpDDraw->DrawFrame(lpDDraw->lpBack, x-5,y-5,x+5,y+5,2); int32_t iOffsetX, iOffsetY; if (GfxR->fOldStyleCursor) { iOffsetX = iOffsetY = 0; } else { iOffsetX = -GfxR->fctMouseCursor.Wdt/2; iOffsetY = -GfxR->fctMouseCursor.Hgt/2; } GfxR->fctMouseCursor.Draw(cgo.Surface,x+iOffsetX,y+iOffsetY,0); if (Game.MouseControl.IsHelp()) GfxR->fctMouseCursor.Draw(cgo.Surface,x+iOffsetX+5,y+iOffsetY-5,29); // ToolTip if (fDrawToolTip && pMouseOverElement) { const char *szTip = pMouseOverElement->GetToolTip(); if (szTip && *szTip) { C4FacetEx cgoTip; cgoTip.Set(cgo.Surface, cgo.X, cgo.Y, cgo.Wdt, cgo.Hgt); Screen::DrawToolTip(szTip, cgoTip, x, y); } } // drag line //if (LDown) lpDDraw->DrawLine(cgo.Surface, LDownX, LDownY, x,y, 4); }
void Screen::Render(bool fDoBG) { // get output cgo C4FacetEx cgo; cgo.Set(lpDDraw->lpBack, 0,0, Config.Graphics.ResX, Config.Graphics.ResY); // draw to it Draw(cgo, fDoBG); }
void C4Video::Draw() { // Not active if (!Active) return; // Get viewport C4Viewport *pViewport; if (pViewport = Game.GraphicsSystem.GetFirstViewport()) { C4FacetEx cgo; cgo.Set(Surface,pViewport->DrawX,pViewport->DrawY,pViewport->ViewWdt,pViewport->ViewHgt,pViewport->ViewX,pViewport->ViewY); Draw(cgo); } }
BOOL C4GraphicsSystem::DoSaveScreenshot(bool fSaveAll, const char *szFilename) { // Fullscreen only if (!Application.isFullScreen) return FALSE; // back surface must be present if (!Application.DDraw->lpBack) return FALSE; // save landscape if (fSaveAll) { // get viewport to draw in C4Viewport *pVP=GetFirstViewport(); if (!pVP) return FALSE; // create image large enough to hold the landcape CPNGFile png; int32_t lWdt=GBackWdt,lHgt=GBackHgt; if (!png.Create(lWdt, lHgt, false)) return FALSE; // get backbuffer size int32_t bkWdt=Config.Graphics.ResX,bkHgt=Config.Graphics.ResY; if (!bkWdt || !bkHgt) return FALSE; // facet for blitting C4FacetEx bkFct; // mark background to be redrawn InvalidateBg(); // backup and clear sky parallaxity int32_t iParX=Game.Landscape.Sky.ParX; Game.Landscape.Sky.ParX=10; int32_t iParY=Game.Landscape.Sky.ParY; Game.Landscape.Sky.ParY=10; // temporarily change viewport player int32_t iVpPlr=pVP->Player; pVP->Player=NO_OWNER; // blit all tiles needed for (int32_t iY=0; iY<lHgt; iY+=bkHgt) for (int32_t iX=0; iX<lWdt; iX+=bkWdt) { // get max width/height int32_t bkWdt2=bkWdt,bkHgt2=bkHgt; if (iX+bkWdt2>lWdt) bkWdt2-=iX+bkWdt2-lWdt; if (iY+bkHgt2>lHgt) bkHgt2-=iY+bkHgt2-lHgt; // update facet bkFct.Set(Application.DDraw->lpBack, 0, 0, bkWdt2, bkHgt2, iX, iY); // draw there pVP->Draw(bkFct, false); // render Application.DDraw->PageFlip(); Application.DDraw->PageFlip(); // get output (locking primary!) if (Application.DDraw->lpBack->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, Application.DDraw->ApplyGammaTo(Application.DDraw->lpBack->GetPixDw(iX2, iY2, false))); // done; unlock Application.DDraw->lpBack->Unlock(); } } // restore viewport player pVP->Player=iVpPlr; // restore parallaxity Game.Landscape.Sky.ParX=iParX; Game.Landscape.Sky.ParY=iParY; // save! return png.Save(szFilename); } // Save primary surface return Application.DDraw->lpBack->SavePNG(szFilename, false, true, false); }
C4FacetEx C4FacetEx::GetPhase(int iPhaseX, int iPhaseY) { C4FacetEx fctResult; fctResult.Set(Surface, X + Wdt * iPhaseX, Y + Hgt * iPhaseY, Wdt, Hgt, 0, 0); return fctResult; }
C4FacetEx C4FacetEx::GetSection(int iSection) { C4FacetEx fctResult; fctResult.Set(Surface, X + Hgt * iSection, Y, Hgt, Hgt, 0, 0); return fctResult; }