| 68 | } |
| 69 | |
| 70 | void ScreenshotUtil::takeScreenshot(GfxRenderer& renderer) { |
| 71 | const uint8_t* fb = renderer.getFrameBuffer(); |
| 72 | if (!fb) { |
| 73 | LOG_ERR("SCR", "Framebuffer not available"); |
| 74 | return; |
| 75 | } |
| 76 | |
| 77 | ScreenshotInfo info = activityManager.getScreenshotInfo(); |
| 78 | char filename[256]; |
| 79 | buildFilename(info, filename, sizeof(filename)); |
| 80 | |
| 81 | bool saved = saveFramebufferAsBmp(filename, fb, renderer.getDisplayWidth(), renderer.getDisplayHeight()); |
| 82 | if (saved) { |
| 83 | LOG_DBG("SCR", "Screenshot saved to %s", filename); |
| 84 | } else { |
| 85 | LOG_ERR("SCR", "Failed to save screenshot"); |
| 86 | return; |
| 87 | } |
| 88 | |
| 89 | // Display a border around the screen to indicate a screenshot was taken |
| 90 | if (renderer.storeBwBuffer()) { |
| 91 | int marginTop, marginRight, marginBottom, marginLeft; |
| 92 | renderer.getOrientedViewableTRBL(&marginTop, &marginRight, &marginBottom, &marginLeft); |
| 93 | int width = renderer.getScreenWidth() - marginLeft - marginRight - 1; |
| 94 | int height = renderer.getScreenHeight() - marginTop - marginBottom - 1; |
| 95 | // Add extra margin to the border to make it more visible |
| 96 | renderer.drawRect(marginLeft + 1, marginTop + 1, width - 2, height - 2, 2, true); |
| 97 | renderer.displayBuffer(); |
| 98 | delay(1000); |
| 99 | renderer.restoreBwBuffer(); |
| 100 | renderer.displayBuffer(HalDisplay::RefreshMode::HALF_REFRESH); |
| 101 | } |
| 102 | } |
| 103 | |
| 104 | bool ScreenshotUtil::saveFramebufferAsBmp(const char* filename, const uint8_t* framebuffer, int width, int height) { |
| 105 | if (!framebuffer) { |
nothing calls this directly
no test coverage detected