← 목록
기타 2026-07-12 6KB 읽기 6분

GUI 재건축 판정 (적대검증 4축 종합, 2026-07-12)

확정 원인 (오케스트레이터 직접 재현)

  1. [치명·VM단·전앱공통] FB_MAX 하드캡 — crownyc.c:378 #define FB_MAX (1280*800) = 1,024,000픽셀 고정배열. 브라우저는 레티나 물리픽셀(backingScaleFactor 2배)을 CW/CH로 넘김(crowny-browser.m:1437) → 일반 창도 2560×1424=3.6배 초과. fb_fill_rect가 FB_MAX로 클램프 안 함 → 직접 재현: 1400×900 렌더 시 731행부터 전부 검정(0,0,0), 레티나 크기(2560×1424)는 SIGBUS(exit138) 크래시. ★이걸 안 고치면 어떤 UI를 만들어도 레티나 맥에서 하단 잘림/크래시.
  2. [국지·계산기/시계만] 800×600 좌표 하드코딩 — 계산기앱 GX/GY/BW·시계앱 x좌표가 상수라 캔버스 커져도 좌상단 고정. 메모앱·터미널앱은 CW/CH 반응형(정상) = 참조 템플릿.
  3. [부재] 아이콘 프리미티브 0 — 화면.한선에 아이콘 함수 없음. 전 앱이 색카드+영문/약어 텍스트로 임시대체. 이미지()/CIF는 능력 있으나 미사용.
  4. [경미] 글자폭추정 vs CIF advance 불일치 — 정렬·캐럿 미세 어긋남.
  5. [오해정정] 좌표 히트테스트는 정상 — mouseDown이 rep/bounds 비율 역스케일 정확. "엉뚱한 클릭"은 #2(버튼이 구석에만 존재)의 결과.

기반 판정 (네이티브 AppKit vs 한선씨 툴킷)

  • 네이티브 AppKit: 맥 "정상" 최단경로(런처카드·콘솔·피드백폼 선례). 단 크로스플랫폼 격차 확대(윈/리눅스 방치)·자립 원칙 충돌. 크롬엔 이미 적합(유지).
  • 한선씨 툴킷: 자립·크로스플랫폼·헌법 정합. 재사용 자산=텍스트렌더러.한선(워드랩/커닝) + 뷰.한선(스택레이아웃/히트테스트) + Coherence v2 벡터씬 설계. 단 페이지배선.py Python/PIL 의존 제거 전엔 "완전 자립" 거짓.
  • 결론 = 하이브리드(로직·레이아웃 명세=한선씨 / 렌더=PPM 파이프라인 정밀화). 네이티브 위젯 전면전환은 크로스플랫폼 격차 때문에 기각. 크롬만 네이티브 유지.

재건축 로드맵 (빅뱅 금지·점진)

  • P0 (선행·불가결): ①crownyc.c FB_MAX을 레티나 대형창 대응으로 확장(예 1920×1920↑) or 초과 시 다운스케일/명시실패 — VM 회귀 게이트 필수 ②비율유지 letterbox blit(크라우니앱뷰어.m + mouseDown 역변환, crownyc_window.m 패턴 이식)로 스트레치·비율왜곡 해소. → 이 둘만으로 현 앱들이 "정상 표시"됨.
  • P1 (프리미티브 완성): 아이콘 프리미티브 신설(벡터/CIF) + 글자폭추정→CIF advance 테이블 교체(정렬정확). 각 프리미티브 다크/라이트·다크기 선명도 적대검증.
  • P2 (앱 반응형화): 계산기·시계를 CVW/CVH 비례식으로 재작성(메모·터미널 패턴 준용). 나머지 앱 점진.
  • 살릴 것: 상주 VM 세션(0.5~2ms), 프리워밍, 입력도구 v1, 포커스 클레임, 페이지 파이프라인. 버릴 것: 800×600 고정좌표, 색카드 아이콘 임시대체.

리스크

  • FB_MAX 확장=정적배열 4개(fb_rgb/present/zbuf 등)×4바이트 메모리↑, VM 전체 회귀 필요(중~고).
  • 하이브리드 cmd IR 위젯스키마 추가는 신규 설계 — 과설계 주의.
  • "완전 자립"은 페이지배선.py 한선씨 대체 전엔 미달(정직 표기).

P0-1 완료 (2026-07-12, 신중검증) — FB_MAX 크래시·검은잘림 제거 (저위험 브라우저측 클램프)

  • 선택: VM(crownyc.c FB_MAX 정적배열) 직접 확장은 crownyc 쓰는 수백 서비스의 메모리·회귀 영향(고위험) → 보류. 대신 브라우저 canvasSize()가 FB_MAX 초과 캔버스를 요청하지 않도록 클램프(crowny-browser.m:1443 부근).
  • 정확성 증명: fb 쓰기 opcode가 fb_width/fb_height로 클램프하므로 CW×CH ≤ FB_MAX면 모든 index=yfb_width+x < fb_widthfb_height ≤ FB_MAX = 배열 안. 완전 방어(부분 아님).
  • 구현: permille 이분탐색 종횡비 유지 축소(math.h 불요, 순수 정수). 검증: 7개 창크기(1280x712~2560x1440@2x) 전부 CW×CH ≤ 1,024,000 + 종횡비 오차 0%. 클램프 크기 렌더=하단 검은잘림 0/4, 정상 배경색.
  • 효과: 메모·터미널(반응형)=모든 창크기 정상 표시. 전 앱=크래시·검은잘림 0. 잔존(P2): 계산기·시계는 800x600 절대좌표라 크래시는 없지만 버튼이 구석 클러스터(반응형 재작성 필요).
  • 배포 3곳 sha 동일, 회귀 스모크 통과. GUI 육안 확인=사용자 몫(레티나 창서 하단 안 잘리고 비율 정상인지).
  • P0-2 (VM 근본 — 별도 승인 대기): crownyc.c 프레임버퍼를 정적배열→동적 malloc(화면초기화 시 CW×CH 할당)로 전환하면 상한 자체 제거+레티나 풀해상도 크리스프. 단 VM 핵심부라 전체 회귀 게이트 필수(중~고 리스크). 클램프로 급한 불 껐으므로 신중히 별도 진행.

P2 계산기·시계 반응형 완료 (2026-07-12) — 실제 "그림만·비율이상"의 소재지

  • 핵심 정정: 사용자 "메모/터미널 전혀 개선 안됨"이 맞았음. 렌더 이미지를 직접 눈으로 확인한 결과: 메모·터미널은 이미 정상 렌더(반응형), FB_MAX 수정은 큰 창 검은잘림만 막아 보통 창에선 무변화. 실제 깨져 보인 건 계산기·시계(800×600 절대좌표 → 좌상단 구석 뭉침).
  • 수정: 계산기앱.한선/시계앱.한선을 균일 스케일(permille=min(CVW/800,CVH/600))+센터 오프셋으로 리팩터. 설계 800×600 좌표 유지, 렌더 시 _sx/_sy/_s로 스케일. 종횡비 왜곡 0, 구석 뭉침 제거.
  • 검증(육안): 1356×754·1168×876 렌더를 PNG로 변환해 직접 확인 — 계산기 버튼그리드·디스플레이가 캔버스 중앙 꽉 채움, 시계 제목·시각·버튼 중앙정렬. 컴파일 exit0. .한선 소스 수정이라 렌더스크립트 자가치유로 자동 반영(브라우저 재빌드 불요).
  • 교훈(★): 픽셀 샘플링만으로 "정상"이라 판정한 게 반복 오진의 원인. 렌더 PPM을 PNG로 변환해 Read로 직접 봐야 실제 레이아웃 결함이 보인다. 이후 GUI 검증은 이미지 육안 필수.
  • 미세 잔여: 시계 시각 글로우박스가 시폭 계산(글자폭추정 근사)로 살짝 우측 치우침. 계산기 디스플레이 그림자 우측 약간 넘침. 둘 다 경미(글자폭추정→실 advance 교체 시 해소, P1).