현재 버전 v1.3.0-ko.1

릴리즈 노트

CrossPoint Reader 한국어 펌웨어 버전별 변경사항

v1.2.0-ko.7

1.2.0-ko.72026년 4월 20일
GitHub

요약

TXT 파일 읽기 경험을 두 가지 축에서 크게 개선합니다:
  1. 파일 크기 무관 즉시 열기 — 이전에는 첫 진입 시 전체 파일을 스캔해 모든 페이지 경계를 계산하느라 1MB 에서 수 초, 40MB 에서는 분 단위로 걸렸습니다. 타 리더기(Murphy 3.7 등)가 같은 파일을 바로 여는 것과 같은 방식인 바이트 오프셋 기반 네비게이션으로 전환했습니다.
  2. 양쪽 정렬 동작 — 기존에는 TXT 에서 "양쪽 정렬"을 선택해도 조용히 왼쪽 정렬로 렌더링되던 문제를 수정해 실제로 양쪽 끝을 맞춥니다.

한국어 버전 변경 사항

성능

  • TXT 파일 인덱싱 제거 — 파일 크기 무관하게 즉시 열림 (TxtReaderActivity)
    • 이전 방식: 첫 진입 시 전체 파일을 스캔해 모든 페이지 시작 오프셋을 pageOffsets 벡터에 저장. O(N) 시간·메모리. "Indexing..." 팝업이 수 초~분 단위 표시됨.
    • 새 방식: 현재 페이지의 바이트 오프셋 currentOffset 만 보관. 렌더링 부산물로 다음 페이지 시작 currentEndOffset 을 얻음. 페이지 인덱스를 만들지 않으므로 O(1).
    • 뒤로 가기: 최근 256 페이지의 시작 오프셋을 스택에 보관. 그 이상은 샘플링된 페이지당 평균 바이트로 역산해 근사치 계산 (실제 이전 페이지와 한 페이지 이내 차이).
    • 총 페이지 수 표시 (N/M): 첫 렌더된 페이지의 바이트 수를 기반으로 추정. 진행도 %currentOffset / fileSize 로 정확.
  • progress.bin 캐시 단순화: 페이지 오프셋 배열(파일당 수십 KB) 대신 현재 오프셋 1 개만 저장. 40MB TXT 의 캐시가 수십 바이트로 축소.

수정

  • TXT 양쪽 정렬 실제 동작loadPageAtOffset 이 각 디스플레이 라인을 문단 끝 (소스의 \n 직전) vs 소프트 래핑된 중간 줄로 구분해 출력. renderPage 가 소프트 래핑 줄에서는 (contentWidth - textWidth) 를 UTF-8 문자 사이 간격으로 고르게 분산하고, 문단 마지막 줄·페이지 마지막 줄은 왼쪽 정렬 유지. CJK (한국어) 는 문자 단위로 간격이 벌어지고, 영어는 대부분의 gap 이 공백 위치라 자연스럽게 단어 간 간격이 넓어지는 효과.

기술적 배경

측면이전 (1.2.0-ko.6)이후 (1.2.0-ko.7)
첫 진입 시간O(파일 크기), 1MB ~= 수 초, 40MB = 수 분O(1), 파일 크기 무관
메모리 사용pageOffsets 벡터 (페이지당 4 바이트)오프셋 + 256 항목 히스토리 스택
% 진행도페이지 번호 기반바이트 오프셋 기반 (정확)
N/M 페이지정확첫 페이지 샘플 기반 추정
캐시 파일 크기페이지 수에 비례고정 ~40 바이트
양쪽 정렬왼쪽 정렬로 폴백 (효과 없음)실제로 양쪽 끝 정렬
설정 변경 시 동작전체 파일 재스캔현재 오프셋 유지, 즉시 재렌더

사용자 영향

  • TXT 파일 열기가 파일 크기에 무관하게 즉시. 양쪽 정렬이 실제로 동작. 설정(폰트/여백/줄 간격 등) 변경 시에도 재스캔 대기 없음.
  • 한 번에 매우 깊이 뒤로 가기(256 페이지 이상) 시 이전 페이지 위치가 실제보다 한 페이지 이내로 어긋날 수 있음. 일반 독서에는 영향 없음.

v1.2.0-ko.6

1.2.0-ko.62026년 4월 20일
GitHub

요약

1.2.0-ko.5 에서 XTC 홈 화면 커버를 살렸지만 EPUB 홈 화면 커버가 첫 진입 시 제대로 안 뜨는 회귀가 생겼고, 일부 EPUB 에서 CSS 파싱 중 abort() 크래시가 관찰되어 수정합니다.
  1. EPUB 홈 커버 첫 시도 실패: 1.2.0-ko.5 의 빈 커버 폴백(fillRect + 아이콘)이 썸네일 파일이 없을 때 캐시된 프레임에 검은 픽셀을 남김. EPUB 썸네일은 1-bit BMP 라 drawBitmap1Bit 가 검은 픽셀만 그리고 흰 픽셀은 배경 그대로 두므로, 다음 렌더에서 커버의 흰 부분으로 이전 폴백의 검정이 비쳐 반전된 모양으로 나옴.
  2. CSS 파싱 크래시: 자동 생성된 수백 개 클래스가 있는 EPUB에서 heap 단편화 상태에서 unordered_map 재해시 실패로 bad_alloc → abort(). 첫 페이지는 렌더되지만 이후 페이지 넘길 때 ZIP inflate(~32KB) 할당이 실패.

한국어 버전 변경 사항

수정

  • EPUB 홈 커버 첫 진입 아티팩트 제거LyraTheme / Lyra3CoversTheme 가 썸네일 파일 부재 시 그리던 빈 커버 폴백을 되돌려 업스트림 동작에 맞춤. hasCover 는 이제 coverBmpPath 가 비었거나 BMP 파싱이 실패할 때만 false 가 됨. 디스크에 파일이 없으면 아무 것도 그리지 않고 썸네일 생성 후 다음 렌더에서 실제 커버가 표시됨.
  • HomeActivity 단순화 — 슬립 검증이 썸네일을 지우던 근본 원인은 1.2.0-ko.5 의 f47b549 에서 이미 수정되었으므로, 썸네일 생성 실패 시 coverBmpPath 를 비우는 구 업스트림 로직 제거. 이전 펌웨어가 coverBmpPath="" 로 저장해둔 SD 상태도 책 경로의 해시를 통해 복구 (Xtc/Epub 객체 인스턴스화 없이 해시 인라인).
  • CSS 파서 heap 안전장치processRuleBlockWithStyleloadFromCache 양쪽에 8 규칙마다 ESP.getMaxAllocHeap() 체크 추가. 48KB 이하로 떨어지면 파싱 중단. ZIP inflate(~32KB) + grayscale pass(~8KB) 에 필요한 연속 블록 확보. 부분 CSS 는 크래시/멈춤보다 낫다는 판단 — 스타일이 빠진 채라도 책이 정상 열림.

업스트림 미변경

업스트림 1.2.0 마스터 기준 파티션 레이아웃 유지 (OTA 호환 유지).

알려진 제한

  • 3.1M 픽셀을 초과하는 JPEG/PNG 이미지 (예: 1711×2507 표지)는 업스트림과 동일하게 디코딩 실패. 화면에 해당 이미지만 비게 표시되고 책 읽기는 정상.

v1.2.0-ko.5

1.2.0-ko.52026년 4월 19일
GitHub

요약

XTC / XTCH / TXT 책 관련 네 가지 회귀를 수정합니다.
  1. 잠자기 화면 커버: XTC/XTCH/TXT 를 읽던 중 슬립 진입 시 책 표지가 아니라 기본 슬립 화면이 뜨던 버그 (1.0.0-ko.1 부터 조용히 깨져 있었음).
  2. 홈 화면 썸네일 영구 유실: Heap 단편화로 malloc 실패하면 coverBmpPath 가 빈 값으로 영구 저장되어 재부팅해도 돌아오지 않던 문제.
  3. 홈 화면 흰색 카드: 썸네일 재시도 대기 중 Lyra / Lyra3Covers 테마가 fallback 아이콘을 안 그리고 빈 흰색 사각형만 표시.
  4. 대용량 XTC 책의 썸네일/페이지 로딩 실패 → 흰색 카드 재발: 2000+ 페이지 XTC 파일은 XtcParser::open() 이 페이지 테이블 전체를 한 번에 메모리에 올려(2871페이지 → ~46KB 연속 블록) 이후 썸네일용 48KB 할당이 실패. upstream #1648 을 cherry-pick 해 페이지 테이블을 on-demand 읽기로 전환.

한국어 버전 변경 사항

수정

  • 잠자기 커버 화면 복구 (XTC / XTCH / TXT)SleepActivity 의 BMP 무결성 검증이 헤더 크기를 70바이트로 하드코딩. 1-bit BMP 실제 헤더는 62바이트라 XTC/TXT 커버가 매번 8바이트 부족으로 판정돼 삭제. Bitmap::getDataOffset() 으로 파싱된 실제 헤더 오프셋 사용.
    • 480×800 1-bit XTC 커버 검증: 62 + 60 × 800 = 48062 bytes → 기존 60 × 800 + 70 = 48070 bytes (FAIL) → 수정 후 48062 = PASS.
  • 홈 화면 XTC 썸네일 영구 유실 방지generateThumbBmp 실패 시 coverBmpPath 를 지우지 않도록 변경하고, 이미 빈 값이 저장된 기기 복구를 위해 홈 진입 시 확장자 기준으로 템플릿 경로 재구성.
  • Lyra / Lyra3Covers 테마: 썸네일 파일 없을 때 fallback 렌더openFileForRead 실패도 hasCover = false 로 떨어뜨려 빈 사각형 대신 책 아이콘 fallback 이 나오도록.
  • 대용량 XTC 페이지 테이블 lazy-loading (upstream #1648 cherry-pick, fedcb2f)XtcParser::open() 이 페이지 테이블 전체를 메모리에 올리던 것을 on-demand 방식으로 변경.
    • Before: 페이지 수 × 16B 연속 블록 (2871 페이지 → 46KB, 4187 페이지 → 65KB)
    • After: 0 bytes — 페이지 접근 시마다 SD 카드에서 16B 씩 읽기
    • 페이지 전환 오버헤드는 SD seek+read (~0.1–0.5ms) 로 e-ink refresh (1–2초) 대비 무시 수준
    • 모비 딕처럼 2000+ 페이지 XTC 도 이제 홈 썸네일 정상 생성

유지된 한국어 전용 기능

  • UnifiedFontFamily / SdFontFamily 글꼴 시스템
  • 합성 볼드(Synthetic Bold) 렌더링
  • 자간 조절 / 첫 줄 들여쓰기 / 글자 단위 줄바꿈
  • SD 카드 커스텀 글꼴 로딩 (KoPub Batang 기본)
  • 1.2.0-ko.3: BW 버퍼 할당 실패 시 abort() 크래시 방지
  • 1.2.0-ko.4: v1→v2 i18n 마이그레이션으로 업그레이드 후 키릴 표기 버그 수정

주의

  • [env:default] 로컬 빌드는 LOG_DBG 문자열 용량으로 파티션 한계 (6,881,280 B) 를 약간 초과할 수 있습니다. 로컬 디버깅에는 pio run -e gh_release -t upload 권장 (LOG_ERR/LOG_INF 는 그대로 출력).
30개의 릴리즈 중 16-18