From b048f6b6ff1dfb8d553015d3d45749aaa812a772 Mon Sep 17 00:00:00 2001 From: Lactozilla Date: Tue, 28 Nov 2023 15:28:50 -0300 Subject: [PATCH] Implement I_ReadScreenTransposed --- src/android/i_video.c | 5 +++++ src/dummy/i_video.c | 5 +++++ src/i_video.h | 8 ++++++++ src/m_anigif.c | 4 ++-- src/m_misc.c | 4 ++-- src/sdl/i_video.c | 19 +++++++++++++++++++ 6 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/android/i_video.c b/src/android/i_video.c index bf0decb74..b4e1d979f 100644 --- a/src/android/i_video.c +++ b/src/android/i_video.c @@ -87,6 +87,11 @@ void I_ReadScreen(UINT8 *scr) (void)scr; } +void I_ReadScreenTransposed(UINT8 *scr) +{ + (void)scr; +} + void I_BeginRead(void){} void I_EndRead(void){} diff --git a/src/dummy/i_video.c b/src/dummy/i_video.c index bb796b676..7d5884728 100644 --- a/src/dummy/i_video.c +++ b/src/dummy/i_video.c @@ -75,6 +75,11 @@ void I_ReadScreen(UINT8 *scr) (void)scr; } +void I_ReadScreenTransposed(UINT8 *scr) +{ + (void)scr; +} + void I_BeginRead(void){} void I_EndRead(void){} diff --git a/src/i_video.h b/src/i_video.h index 8efca5f9a..1b0720d3c 100644 --- a/src/i_video.h +++ b/src/i_video.h @@ -143,6 +143,14 @@ void I_WaitVBL(INT32 count); */ void I_ReadScreen(UINT8 *scr); +/** \brief The I_ReadScreenTransposed function + + \param scr buffer to copy screen to + + \return void +*/ +void I_ReadScreenTransposed(UINT8 *scr); + /** \brief Start disk icon */ void I_BeginRead(void); diff --git a/src/m_anigif.c b/src/m_anigif.c index 5bc7717e0..a44f28629 100644 --- a/src/m_anigif.c +++ b/src/m_anigif.c @@ -565,7 +565,7 @@ static void GIF_framewrite(void) // blit to temp screen if (rendermode == render_soft) - I_ReadScreen(movie_screen); + I_ReadScreenTransposed(movie_screen); #ifdef HWRENDER else if (rendermode == render_opengl) { @@ -594,7 +594,7 @@ static void GIF_framewrite(void) // Copy the first frame into the movie screen // OpenGL already does the same above. if (gif_frames == 0 && rendermode == render_soft) - I_ReadScreen(movie_screen); + I_ReadScreenTransposed(movie_screen); movie_screen = screens[0]; } diff --git a/src/m_misc.c b/src/m_misc.c index d4b272f1d..42534a92b 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -1280,7 +1280,7 @@ void M_SaveFrame(void) { // munge planar buffer to linear linear = screens[2]; - I_ReadScreen(linear); + I_ReadScreenTransposed(linear); } #ifdef HWRENDER else @@ -1590,7 +1590,7 @@ void M_DoScreenShot(void) { // munge planar buffer to linear linear = screens[2]; - I_ReadScreen(linear); + I_ReadScreenTransposed(linear); } if (!freename) diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index 46b6ee9b3..42db204fc 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -1306,6 +1306,25 @@ void I_ReadScreen(UINT8 *scr) vid.rowbytes, vid.rowbytes); } +// +// I_ReadScreenTransposed +// The screen buffers in SRB2 are transposed, meaning they are ordered by columns instead of rows. +// This function copies the buffer transposed so that it's arranged by rows, for things that expect the buffer to be that way. +// +void I_ReadScreenTransposed(UINT8 *scr) +{ + if (rendermode != render_soft) + I_Error("I_ReadScreenTransposed: called while in non-software mode"); + + UINT8 *buffer = screens[0]; + + size_t dest_rowbytes = vid.width * vid.bpp; + + for (int y = 0; y < vid.height; y++) + for (int x = 0; x < vid.width; x++) + scr[(y * dest_rowbytes) + x] = buffer[(x * vid.rowbytes) + y]; +} + // // I_SetPalette //