Xteink-X4-crosspoint-reader/lib/Xtc
Eunchurn Park 76a1c30a87
fix(xtc): address PR review feedback for grayscale rendering
- Use FsHelpers::openFileForRead for consistency (XtcParser.cpp)
- Simplify file extension checking logic (FileSelectionActivity.cpp)
- Fix grayscale rendering bugs (XtcReaderActivity.cpp):
  - Use drawPixel(x, y, false) for LSB/MSB passes (LUT: 0=apply effect)
  - Add cleanupGrayscaleWithFrameBuffer() after re-rendering BW
  - Use conditional HALF_REFRESH based on pagesUntilFullRefresh
  - Decrement refresh counter instead of resetting
- Add cleanupGrayscaleWithFrameBuffer() helper (GfxRenderer)
2025-12-28 20:57:10 +09:00
..
Xtc fix(xtc): address PR review feedback for grayscale rendering 2025-12-28 20:57:10 +09:00
README feat(xtc): add XTCH format support (2-bit grayscale) 2025-12-28 12:40:34 +09:00
Xtc.cpp feat(xtc): add XTCH format support (2-bit grayscale) 2025-12-28 12:40:34 +09:00
Xtc.h feat(xtc): add XTCH format support (2-bit grayscale) 2025-12-28 12:40:34 +09:00

# XTC/XTCH Library

XTC ebook format support for CrossPoint Reader.

## Supported Formats

| Format | Extension | Description                                  |
|--------|-----------|----------------------------------------------|
| XTC    | `.xtc`    | Container with XTG pages (1-bit monochrome)  |
| XTCH   | `.xtch`   | Container with XTH pages (2-bit grayscale)   |

## Format Overview

XTC/XTCH are container formats designed for ESP32 e-paper displays. They store pre-rendered bitmap pages optimized for the XTeink X4 e-reader (480x800 resolution).

### Container Structure (XTC/XTCH)

- 56-byte header with metadata offsets
- Optional metadata (title, author, etc.)
- Page index table (16 bytes per page)
- Page data (XTG or XTH format)

### Page Formats

#### XTG (1-bit monochrome)

- Row-major storage, 8 pixels per byte
- MSB first (bit 7 = leftmost pixel)
- 0 = Black, 1 = White

#### XTH (2-bit grayscale)

- Two bit planes stored sequentially
- Column-major order (right to left)
- 8 vertical pixels per byte
- Grayscale: 0=White, 1=Dark Grey, 2=Light Grey, 3=Black

## Reference

Original format info: <https://gist.github.com/CrazyCoder/b125f26d6987c0620058249f59f1327d>