F3 — 진짜 박스블러 그림자(opcode 805) + 감마보정 블렌딩
개요
갭마감 트랙 F3. crownyc.c VM에 진짜 박스블러 드롭섀도(opcode 805)를 추가하고,
감마보정(2.2 근사) 블렌딩 함수를 도입. 기존 804(링근사)는 보존(재작성 없음).
목표: Cocoa NSShadow 동급의 부드러운 연속 그라데이션 그림자.
무엇을 했는지
1. opcode 805 — 박스블러그림자 (FB_RGB_BOXBLUR_SHADOW)
- 가우시안 근사 = 박스블러 3패스 (슬라이딩 윈도우 합, O(n) per pass).
- 박스 영역에 알파(=al) 채운 알파맵 생성 → 수평/수직 3패스 박스블러 → fb_blend_pixel로 검정 합성.
- margin = 2*blur 로 블러 퍼짐 폭 확보. blur 1~64 클램프, 알파맵 8M 셀 상한 가드.
- 804(링근사)는 그대로 보존. 805는 별도 case로 추가.
2. 감마보정 블렌딩 (fb_blend_pixel_gamma)
- sRGB→선형광(12bit LUT 256) 합성 → 선형→sRGB(LUT 4096) 역변환. pow(2.2) 근사.
- AA 글리프 가장자리 품질 향상용. 기존 fb_blend_pixel 경로 완전 보존(별도 함수).
- 미배선(정직): C 헬퍼로 컴파일·심볼 확인은 됐으나(nm 확인) 아직 opcode/내장함수에
바인딩하지 않음. 호출자 연결은 후속 작업.
3. 컴파일러 + 라이브러리 배선
- hanseonc_high.c 내장함수 테이블:
{"박스블러그림자", 805, 6} 추가.
- libs/컴포지터.한선:
박스블러그림자직접(x,y,w,h,blur,알파) 함수 추가 (HiDPI _물리 변환 + BBSHADOW cmd 발행). 반환 1 검증.
검증 (실측)
crownyc.c 재빌드 EXIT=0 (Security/CoreFoundation/Accelerate -lm).
hanseonc_high.c 재빌드 EXIT=0.
통합여정(원크라우니_통합여정.한선) 전체통과 — 검증1~6 모두 1, [결과] 티. 회귀 0.
PPM 실측 (tests/박스블러그림자검증.한선, 320x240 흰배경, 박스 100,80,120,80 blur10 알파200):
805: 가장자리 fade 28 distinct 레벨, max adjacent step 8, reversal 0 → 연속 그라데이션.
804(비교): 10 레벨, max step 100 (255→155 급점프 후 255 복귀) → 링/밴딩 아티팩트.
그림자 코어(160,120)=55, 배경 코너=255.
컴포지터 자가검증 [결과] 티 유지 + 박스블러그림자직접 반환 1.관련 파일
- /Users/ef/CrownyOS/crownyc/crownyc.c (opcode 805, fb_blend_pixel_gamma + LUT)
- /Users/ef/CrownyOS/crownyc/hanseonc_high.c (805 내장함수 등록)
- /Users/ef/CrownyOS/crownyc/libs/컴포지터.한선 (박스블러그림자직접)
- /Users/ef/CrownyOS/crownyc/tests/박스블러그림자검증.한선 (PPM 검증 테스트)
잔여 이슈
- fb_blend_pixel_gamma 미배선: AA 텍스트(텍스트AA/788) 경로에 감마 옵션 플래그로 연결 필요.
- 박스블러그림자직접의 BBSHADOW cmd를 렌더브라우저/브라우저크롬 cmd 파서에 추가하면
네이티브 m 렌더러에서도 동작.
- 시각 픽셀은 PPM 헤드리스 실측으로만 검증(디스플레이 미실측).