Merge pull request #50 from jpirnay/chore-x3-render
chore: Integrate upstream x3 antialiasing PR 1607 by juicecultus
This commit is contained in:
@@ -30,14 +30,14 @@ struct DirectPixelWriter {
|
|||||||
void init(GfxRenderer& renderer) {
|
void init(GfxRenderer& renderer) {
|
||||||
fb = renderer.getFrameBuffer();
|
fb = renderer.getFrameBuffer();
|
||||||
mode = renderer.getRenderMode();
|
mode = renderer.getRenderMode();
|
||||||
displayWidthBytes = display.getDisplayWidthBytes();
|
displayWidthBytes = renderer.getDisplayWidthBytes();
|
||||||
|
|
||||||
const int phyW = display.getDisplayWidth();
|
const int phyW = renderer.getDisplayWidth();
|
||||||
const int phyH = display.getDisplayHeight();
|
const int phyH = renderer.getDisplayHeight();
|
||||||
|
|
||||||
switch (renderer.getOrientation()) {
|
switch (renderer.getOrientation()) {
|
||||||
case GfxRenderer::Portrait:
|
case GfxRenderer::Portrait:
|
||||||
// phyX = y, phyY = (DISPLAY_HEIGHT-1) - x
|
// phyX = y, phyY = (phyH-1) - x
|
||||||
phyXBase = 0;
|
phyXBase = 0;
|
||||||
phyYBase = phyH - 1;
|
phyYBase = phyH - 1;
|
||||||
phyXStepX = 0;
|
phyXStepX = 0;
|
||||||
@@ -46,7 +46,7 @@ struct DirectPixelWriter {
|
|||||||
phyYStepY = 0;
|
phyYStepY = 0;
|
||||||
break;
|
break;
|
||||||
case GfxRenderer::LandscapeClockwise:
|
case GfxRenderer::LandscapeClockwise:
|
||||||
// phyX = (DISPLAY_WIDTH-1) - x, phyY = (DISPLAY_HEIGHT-1) - y
|
// phyX = (phyW-1) - x, phyY = (phyH-1) - y
|
||||||
phyXBase = phyW - 1;
|
phyXBase = phyW - 1;
|
||||||
phyYBase = phyH - 1;
|
phyYBase = phyH - 1;
|
||||||
phyXStepX = -1;
|
phyXStepX = -1;
|
||||||
@@ -55,7 +55,7 @@ struct DirectPixelWriter {
|
|||||||
phyYStepY = -1;
|
phyYStepY = -1;
|
||||||
break;
|
break;
|
||||||
case GfxRenderer::PortraitInverted:
|
case GfxRenderer::PortraitInverted:
|
||||||
// phyX = (DISPLAY_WIDTH-1) - y, phyY = x
|
// phyX = (phyW-1) - y, phyY = x
|
||||||
phyXBase = phyW - 1;
|
phyXBase = phyW - 1;
|
||||||
phyYBase = 0;
|
phyYBase = 0;
|
||||||
phyXStepX = 0;
|
phyXStepX = 0;
|
||||||
|
|||||||
@@ -1521,7 +1521,7 @@ void GfxRenderer::drawBitmap(const Bitmap& bitmap, const int x, const int y, con
|
|||||||
|
|
||||||
if (renderMode == BW && val < 3) {
|
if (renderMode == BW && val < 3) {
|
||||||
drawPixel(screenX, screenY);
|
drawPixel(screenX, screenY);
|
||||||
} else if (renderMode == GRAYSCALE_MSB && (val == 1 || (gpio.deviceIsX4() && val == 2))) {
|
} else if (renderMode == GRAYSCALE_MSB && (val == 1 || val == 2)) {
|
||||||
drawPixel(screenX, screenY, false);
|
drawPixel(screenX, screenY, false);
|
||||||
} else if (renderMode == GRAYSCALE_LSB && val == 1) {
|
} else if (renderMode == GRAYSCALE_LSB && val == 1) {
|
||||||
drawPixel(screenX, screenY, false);
|
drawPixel(screenX, screenY, false);
|
||||||
|
|||||||
@@ -188,4 +188,7 @@ class GfxRenderer {
|
|||||||
// Low level functions
|
// Low level functions
|
||||||
uint8_t* getFrameBuffer() const;
|
uint8_t* getFrameBuffer() const;
|
||||||
size_t getBufferSize() const;
|
size_t getBufferSize() const;
|
||||||
|
uint16_t getDisplayWidth() const { return panelWidth; }
|
||||||
|
uint16_t getDisplayHeight() const { return panelHeight; }
|
||||||
|
uint16_t getDisplayWidthBytes() const { return panelWidthBytes; }
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -14,8 +14,8 @@ void ScreenshotUtil::takeScreenshot(GfxRenderer& renderer) {
|
|||||||
const uint8_t* fb = renderer.getFrameBuffer();
|
const uint8_t* fb = renderer.getFrameBuffer();
|
||||||
if (fb) {
|
if (fb) {
|
||||||
String filename_str = "/screenshots/screenshot-" + String(millis()) + ".bmp";
|
String filename_str = "/screenshots/screenshot-" + String(millis()) + ".bmp";
|
||||||
if (ScreenshotUtil::saveFramebufferAsBmp(filename_str.c_str(), fb, display.getDisplayWidth(),
|
if (ScreenshotUtil::saveFramebufferAsBmp(filename_str.c_str(), fb, renderer.getDisplayWidth(),
|
||||||
display.getDisplayHeight())) {
|
renderer.getDisplayHeight())) {
|
||||||
LOG_DBG("SCR", "Screenshot saved to %s", filename_str.c_str());
|
LOG_DBG("SCR", "Screenshot saved to %s", filename_str.c_str());
|
||||||
} else {
|
} else {
|
||||||
LOG_ERR("SCR", "Failed to save screenshot");
|
LOG_ERR("SCR", "Failed to save screenshot");
|
||||||
@@ -26,7 +26,7 @@ void ScreenshotUtil::takeScreenshot(GfxRenderer& renderer) {
|
|||||||
|
|
||||||
// Display a border around the screen to indicate a screenshot was taken
|
// Display a border around the screen to indicate a screenshot was taken
|
||||||
if (renderer.storeBwBuffer()) {
|
if (renderer.storeBwBuffer()) {
|
||||||
renderer.drawRect(6, 6, display.getDisplayHeight() - 12, display.getDisplayWidth() - 12, 2, true);
|
renderer.drawRect(6, 6, renderer.getDisplayHeight() - 12, renderer.getDisplayWidth() - 12, 2, true);
|
||||||
renderer.displayBuffer();
|
renderer.displayBuffer();
|
||||||
delay(1000);
|
delay(1000);
|
||||||
renderer.restoreBwBuffer();
|
renderer.restoreBwBuffer();
|
||||||
@@ -45,7 +45,7 @@ bool ScreenshotUtil::saveFramebufferAsBmp(const char* filename, const uint8_t* f
|
|||||||
|
|
||||||
std::string path(filename);
|
std::string path(filename);
|
||||||
size_t last_slash = path.find_last_of('/');
|
size_t last_slash = path.find_last_of('/');
|
||||||
if (last_slash != std::string::npos && last_slash > 0) {
|
if (last_slash != std::string::npos) {
|
||||||
std::string dir = path.substr(0, last_slash);
|
std::string dir = path.substr(0, last_slash);
|
||||||
if (!Storage.exists(dir.c_str())) {
|
if (!Storage.exists(dir.c_str())) {
|
||||||
if (!Storage.mkdir(dir.c_str())) {
|
if (!Storage.mkdir(dir.c_str())) {
|
||||||
@@ -76,7 +76,7 @@ bool ScreenshotUtil::saveFramebufferAsBmp(const char* filename, const uint8_t* f
|
|||||||
}
|
}
|
||||||
|
|
||||||
const uint32_t rowSizePadded = (phyWidth + 31) / 32 * 4;
|
const uint32_t rowSizePadded = (phyWidth + 31) / 32 * 4;
|
||||||
// Max row size for 528px width (X3) = 68 bytes; use fixed buffer to avoid VLA
|
// Max row size for 528px height (X3) after rotation = 68 bytes; use fixed buffer to avoid VLA
|
||||||
constexpr size_t kMaxRowSize = 68;
|
constexpr size_t kMaxRowSize = 68;
|
||||||
if (rowSizePadded > kMaxRowSize) {
|
if (rowSizePadded > kMaxRowSize) {
|
||||||
LOG_ERR("SCR", "Row size %u exceeds buffer capacity", rowSizePadded);
|
LOG_ERR("SCR", "Row size %u exceeds buffer capacity", rowSizePadded);
|
||||||
|
|||||||
Reference in New Issue
Block a user