Review comments
This commit is contained in:
@@ -1399,11 +1399,12 @@ void GfxRenderer::fillRoundedRect(const int x, const int y, const int width, con
|
|||||||
}
|
}
|
||||||
|
|
||||||
void GfxRenderer::drawImage(const uint8_t bitmap[], const int x, const int y, const int width, const int height) const {
|
void GfxRenderer::drawImage(const uint8_t bitmap[], const int x, const int y, const int width, const int height) const {
|
||||||
|
const auto currentOrientation = getOrientation();
|
||||||
int rotatedX = 0;
|
int rotatedX = 0;
|
||||||
int rotatedY = 0;
|
int rotatedY = 0;
|
||||||
rotateCoordinates(getOrientation(), x, y, &rotatedX, &rotatedY, panelWidth, panelHeight);
|
rotateCoordinates(currentOrientation, x, y, &rotatedX, &rotatedY, panelWidth, panelHeight);
|
||||||
// Rotate origin corner
|
// Rotate origin corner
|
||||||
switch (getOrientation()) {
|
switch (currentOrientation) {
|
||||||
case Portrait:
|
case Portrait:
|
||||||
rotatedY = rotatedY - height;
|
rotatedY = rotatedY - height;
|
||||||
break;
|
break;
|
||||||
@@ -1476,6 +1477,7 @@ void GfxRenderer::drawBitmap(const Bitmap& bitmap, const int x, const int y, con
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const auto renderModeSnapshot = getRenderMode();
|
||||||
for (int bmpY = 0; bmpY < (bitmap.getHeight() - cropPixY); bmpY++) {
|
for (int bmpY = 0; bmpY < (bitmap.getHeight() - cropPixY); bmpY++) {
|
||||||
// The BMP's (0, 0) is the bottom-left corner (if the height is positive, top-left if negative).
|
// The BMP's (0, 0) is the bottom-left corner (if the height is positive, top-left if negative).
|
||||||
// Screen's (0, 0) is the top-left corner.
|
// Screen's (0, 0) is the top-left corner.
|
||||||
@@ -1519,12 +1521,11 @@ void GfxRenderer::drawBitmap(const Bitmap& bitmap, const int x, const int y, con
|
|||||||
|
|
||||||
const uint8_t val = outputRow[bmpX / 4] >> (6 - ((bmpX * 2) % 8)) & 0x3;
|
const uint8_t val = outputRow[bmpX / 4] >> (6 - ((bmpX * 2) % 8)) & 0x3;
|
||||||
|
|
||||||
const auto currentRenderMode = getRenderMode();
|
if (renderModeSnapshot == BW && val < 3) {
|
||||||
if (currentRenderMode == BW && val < 3) {
|
|
||||||
drawPixel(screenX, screenY);
|
drawPixel(screenX, screenY);
|
||||||
} else if (currentRenderMode == GRAYSCALE_MSB && (val == 1 || val == 2)) {
|
} else if (renderModeSnapshot == GRAYSCALE_MSB && (val == 1 || val == 2)) {
|
||||||
drawPixel(screenX, screenY, false);
|
drawPixel(screenX, screenY, false);
|
||||||
} else if (currentRenderMode == GRAYSCALE_LSB && val == 1) {
|
} else if (renderModeSnapshot == GRAYSCALE_LSB && val == 1) {
|
||||||
drawPixel(screenX, screenY, false);
|
drawPixel(screenX, screenY, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1685,17 +1686,32 @@ void GfxRenderer::invertScreen() const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static constexpr unsigned int encodeRefreshMode(const HalDisplay::RefreshMode mode) {
|
||||||
|
return static_cast<unsigned int>(mode) + 1u;
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr HalDisplay::RefreshMode decodeRefreshMode(const unsigned int value) {
|
||||||
|
return static_cast<HalDisplay::RefreshMode>(value - 1u);
|
||||||
|
}
|
||||||
|
|
||||||
void GfxRenderer::setNextDisplayRefreshMode(const HalDisplay::RefreshMode refreshMode) const {
|
void GfxRenderer::setNextDisplayRefreshMode(const HalDisplay::RefreshMode refreshMode) const {
|
||||||
useNextRefreshOverride.store(true, std::memory_order_relaxed);
|
refreshOverride.store(encodeRefreshMode(refreshMode), std::memory_order_release);
|
||||||
nextRefreshOverride.store(static_cast<int>(refreshMode), std::memory_order_relaxed);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GfxRenderer::displayBuffer(const HalDisplay::RefreshMode refreshMode) const {
|
void GfxRenderer::displayBuffer(const HalDisplay::RefreshMode refreshMode) const {
|
||||||
const auto effectiveMode =
|
auto effectiveMode = refreshMode;
|
||||||
useNextRefreshOverride.load(std::memory_order_relaxed)
|
unsigned int overrideValue = refreshOverride.load(std::memory_order_acquire);
|
||||||
? static_cast<HalDisplay::RefreshMode>(nextRefreshOverride.load(std::memory_order_relaxed))
|
if (overrideValue != REFRESH_OVERRIDE_NONE) {
|
||||||
: refreshMode;
|
unsigned int expected = overrideValue;
|
||||||
useNextRefreshOverride.store(false, std::memory_order_relaxed);
|
if (refreshOverride.compare_exchange_strong(expected, REFRESH_OVERRIDE_NONE, std::memory_order_acq_rel,
|
||||||
|
std::memory_order_acquire)) {
|
||||||
|
effectiveMode = decodeRefreshMode(overrideValue);
|
||||||
|
} else if (expected != REFRESH_OVERRIDE_NONE) {
|
||||||
|
effectiveMode = decodeRefreshMode(expected);
|
||||||
|
refreshOverride.store(REFRESH_OVERRIDE_NONE, std::memory_order_release);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
auto elapsed = millis() - start_ms;
|
auto elapsed = millis() - start_ms;
|
||||||
LOG_DBG("GFX", "Time = %lu ms from clearScreen to displayBuffer", elapsed);
|
LOG_DBG("GFX", "Time = %lu ms from clearScreen to displayBuffer", elapsed);
|
||||||
display.displayBuffer(effectiveMode, fadingFix.load(std::memory_order_relaxed));
|
display.displayBuffer(effectiveMode, fadingFix.load(std::memory_order_relaxed));
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ class GfxRenderer {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr size_t BW_BUFFER_CHUNK_SIZE = 8000; // 8KB chunks to allow for non-contiguous memory
|
static constexpr size_t BW_BUFFER_CHUNK_SIZE = 8000; // 8KB chunks to allow for non-contiguous memory
|
||||||
|
static constexpr unsigned int REFRESH_OVERRIDE_NONE = 0;
|
||||||
|
|
||||||
HalDisplay& display;
|
HalDisplay& display;
|
||||||
std::atomic<int> renderMode;
|
std::atomic<int> renderMode;
|
||||||
@@ -60,8 +61,7 @@ class GfxRenderer {
|
|||||||
// recording to the (non-const) FontCacheManager. Same pragmatic compromise
|
// recording to the (non-const) FontCacheManager. Same pragmatic compromise
|
||||||
// as before, concentrated in a single pointer instead of four fields.
|
// as before, concentrated in a single pointer instead of four fields.
|
||||||
mutable FontCacheManager* fontCacheManager_ = nullptr;
|
mutable FontCacheManager* fontCacheManager_ = nullptr;
|
||||||
mutable std::atomic<bool> useNextRefreshOverride = false;
|
mutable std::atomic<unsigned int> refreshOverride = REFRESH_OVERRIDE_NONE;
|
||||||
mutable std::atomic<int> nextRefreshOverride = static_cast<int>(HalDisplay::FAST_REFRESH);
|
|
||||||
|
|
||||||
void renderChar(const EpdFontFamily& fontFamily, uint32_t cp, int* x, int* y, bool pixelState,
|
void renderChar(const EpdFontFamily& fontFamily, uint32_t cp, int* x, int* y, bool pixelState,
|
||||||
EpdFontFamily::Style style) const;
|
EpdFontFamily::Style style) const;
|
||||||
|
|||||||
Reference in New Issue
Block a user