Compare commits

..

No commits in common. "647347c21d8a1ea99f06de95cf1ae78039039867" and "30c50ef45b5d2698ab82cb2b1fefcdf5d4f9279e" have entirely different histories.

5 changed files with 22 additions and 32 deletions

View File

@ -369,17 +369,6 @@ void GfxRenderer::restoreBwBuffer() {
Serial.printf("[%lu] [GFX] Restored and freed BW buffer chunks\n", millis());
}
/**
* Cleanup grayscale buffers using the current frame buffer.
* Use this when BW buffer was re-rendered instead of stored/restored.
*/
void GfxRenderer::cleanupGrayscaleWithFrameBuffer() const {
uint8_t* frameBuffer = einkDisplay.getFrameBuffer();
if (frameBuffer) {
einkDisplay.cleanupGrayscaleBuffers(frameBuffer);
}
}
void GfxRenderer::renderChar(const EpdFontFamily& fontFamily, const uint32_t cp, int* x, const int* y,
const bool pixelState, const EpdFontStyle style) const {
const EpdGlyph* glyph = fontFamily.getGlyph(cp, style);

View File

@ -67,7 +67,6 @@ class GfxRenderer {
void displayGrayBuffer() const;
bool storeBwBuffer(); // Returns true if buffer was stored successfully
void restoreBwBuffer();
void cleanupGrayscaleWithFrameBuffer() const;
// Low level functions
uint8_t* getFrameBuffer() const;

View File

@ -7,7 +7,6 @@
#include "XtcParser.h"
#include <FsHelpers.h>
#include <HardwareSerial.h>
#include <cstring>
@ -32,7 +31,9 @@ XtcError XtcParser::open(const char* filepath) {
}
// Open file
if (!FsHelpers::openFileForRead("XTC", filepath, m_file)) {
m_file = SD.open(filepath, FILE_READ);
if (!m_file) {
Serial.printf("[%lu] [XTC] Failed to open file: %s\n", millis(), filepath);
m_lastError = XtcError::FILE_NOT_FOUND;
return m_lastError;
}

View File

@ -40,11 +40,18 @@ void FileSelectionActivity::loadFiles() {
if (file.isDirectory()) {
files.emplace_back(filename + "/");
} else {
std::string ext4 = filename.length() >= 4 ? filename.substr(filename.length() - 4) : "";
std::string ext5 = filename.length() >= 5 ? filename.substr(filename.length() - 5) : "";
if (ext5 == ".epub" || ext5 == ".xtch" || ext4 == ".xtc") {
} else if (filename.length() >= 5 && filename.substr(filename.length() - 5) == ".epub") {
files.emplace_back(filename);
} else if (filename.length() >= 4) {
// Check for XTC format extensions (.xtc, .xtch)
std::string ext4 = filename.substr(filename.length() - 4);
if (ext4 == ".xtc") {
files.emplace_back(filename);
} else if (filename.length() >= 5) {
std::string ext5 = filename.substr(filename.length() - 5);
if (ext5 == ".xtch") {
files.emplace_back(filename);
}
}
}
file.close();

View File

@ -236,35 +236,29 @@ void XtcReaderActivity::renderPage() {
}
}
// Display BW with conditional refresh based on pagesUntilFullRefresh
if (pagesUntilFullRefresh <= 1) {
renderer.displayBuffer(EInkDisplay::HALF_REFRESH);
pagesUntilFullRefresh = pagesPerRefresh;
} else {
renderer.displayBuffer();
pagesUntilFullRefresh--;
}
// Display BW first with half refresh (clean base for grayscale overlay)
renderer.displayBuffer(EInkDisplay::HALF_REFRESH);
// Pass 2: LSB buffer - mark DARK gray only (XTH value 1)
// In LUT: 0 bit = apply gray effect, 1 bit = untouched
// README: "mark the **dark** grays pixels with `1`"
renderer.clearScreen(0x00);
for (uint16_t y = 0; y < pageHeight; y++) {
for (uint16_t x = 0; x < pageWidth; x++) {
if (getPixelValue(x, y) == 1) { // Dark grey only
renderer.drawPixel(x, y, false);
renderer.drawPixel(x, y, true);
}
}
}
renderer.copyGrayscaleLsbBuffers();
// Pass 3: MSB buffer - mark LIGHT AND DARK gray (XTH value 1 or 2)
// In LUT: 0 bit = apply gray effect, 1 bit = untouched
// README: "mark the **light and dark** grays pixels with `1`"
renderer.clearScreen(0x00);
for (uint16_t y = 0; y < pageHeight; y++) {
for (uint16_t x = 0; x < pageWidth; x++) {
const uint8_t pv = getPixelValue(x, y);
if (pv == 1 || pv == 2) { // Dark grey or Light grey
renderer.drawPixel(x, y, false);
renderer.drawPixel(x, y, true);
}
}
}
@ -283,8 +277,8 @@ void XtcReaderActivity::renderPage() {
}
}
// Cleanup grayscale buffers with current frame buffer
renderer.cleanupGrayscaleWithFrameBuffer();
// Reset refresh counter (grayscale display is a full refresh)
pagesUntilFullRefresh = pagesPerRefresh;
free(pageBuffer);