diff --git a/sysmodules/rosalina/include/draw.h b/sysmodules/rosalina/include/draw.h index 30c523d..5de1753 100644 --- a/sysmodules/rosalina/include/draw.h +++ b/sysmodules/rosalina/include/draw.h @@ -97,4 +97,4 @@ void Draw_FlushFramebuffer(void); u32 Draw_GetCurrentFramebufferAddress(bool top, bool left); void Draw_CreateBitmapHeader(u8 *dst, u32 width, u32 heigth); -void Draw_ConvertFrameBufferLine(u8 *line, bool top, bool left, u32 y); +void Draw_ConvertFrameBufferLines(u8 *buf, u32 startingLine, u32 numLines, bool top, bool left); diff --git a/sysmodules/rosalina/source/draw.c b/sysmodules/rosalina/source/draw.c index 94260aa..8b1674b 100644 --- a/sysmodules/rosalina/source/draw.c +++ b/sysmodules/rosalina/source/draw.c @@ -308,7 +308,7 @@ static inline void Draw_ConvertPixelToBGR8(u8 *dst, const u8 *src, GSPGPU_Frameb } } -void Draw_ConvertFrameBufferLine(u8 *line, bool top, bool left, u32 y) +void Draw_ConvertFrameBufferLines(u8 *buf, u32 startingLine, u32 numLines, bool top, bool left) { GSPGPU_FramebufferFormats fmt = top ? (GSPGPU_FramebufferFormats)(GPU_FB_TOP_FMT & 7) : (GSPGPU_FramebufferFormats)(GPU_FB_BOTTOM_FMT & 7); u32 width = top ? 400 : 320; @@ -318,6 +318,9 @@ void Draw_ConvertFrameBufferLine(u8 *line, bool top, bool left, u32 y) u32 pa = Draw_GetCurrentFramebufferAddress(top, left); u8 *addr = (u8 *)PA_PTR(pa); - for(u32 x = 0; x < width; x++) - Draw_ConvertPixelToBGR8(line + x * 3 , addr + x * stride + y * formatSizes[(u8)fmt], fmt); + for (u32 y = startingLine; y < startingLine + numLines; y++) + { + for(u32 x = 0; x < width; x++) + Draw_ConvertPixelToBGR8(buf + (x + width * y) * 3 , addr + x * stride + y * formatSizes[(u8)fmt], fmt); + } } diff --git a/sysmodules/rosalina/source/menus.c b/sysmodules/rosalina/source/menus.c index 9e843b1..7d3e5c7 100644 --- a/sysmodules/rosalina/source/menus.c +++ b/sysmodules/rosalina/source/menus.c @@ -171,7 +171,7 @@ static Result RosalinaMenu_WriteScreenshot(IFile *file, bool top, bool left) Draw_CreateBitmapHeader(framebufferCache, dimX, 240); buf += 54; - u32 n = 0; + u32 y = 0; // Our buffer might be smaller than the size of the screenshot... while (remaining != 0) { @@ -179,14 +179,14 @@ static Result RosalinaMenu_WriteScreenshot(IFile *file, bool top, bool left) u32 available = (u32)(framebufferCacheEnd - buf); u32 size = available < remaining ? available : remaining; u32 nlines = size / lineSize; - for (u32 y = 0; y < nlines; y++) - Draw_ConvertFrameBufferLine(buf + lineSize * y, top, left, y); + Draw_ConvertFrameBufferLines(buf, y, nlines, top, left); s64 t1 = svcGetSystemTick(); timeSpentConvertingScreenshot += t1 - t0; - TRY(IFile_Write(file, &total, framebufferCache, (n == 0 ? 54 : 0) + lineSize * nlines, 0)); // don't forget to write the header + TRY(IFile_Write(file, &total, framebufferCache, (y == 0 ? 54 : 0) + lineSize * nlines, 0)); // don't forget to write the header timeSpentWritingScreenshot += svcGetSystemTick() - t1; + y += nlines; remaining -= lineSize * nlines; buf = framebufferCache; }