Xteink-X4-crosspoint-reader/lib/Xtc
Eunchurn Park 30c50ef45b
perf(xtc): optimize XTCH grayscale rendering and memory usage
- Remove storeBwBuffer() requirement for grayscale rendering
  - Peak memory reduced from 144KB to 96KB
  - Use 4-pass rendering: BW display → LSB → MSB → grayscale → BW restore

- Optimize PageInfo struct (24→16 bytes)
  - Change offset from uint64_t to uint32_t (4GB file limit)
  - Saves ~15KB for large books (e.g., 1883 pages: 45KB → 30KB)

- Add storeBwBuffer() return value for error handling
- Add pixel distribution logging for debugging
- Fix LSB/MSB grayscale mapping per README spec
2025-12-28 18:04:48 +09:00
..
Xtc perf(xtc): optimize XTCH grayscale rendering and memory usage 2025-12-28 18:04:48 +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>