# 카드뉴스 로고 오버레이 — 첫 카드(커버) + 마지막 카드(CTA) 우측 상단

## 배경
제이회장님이 카드뉴스의 첫 카드(커버)와 마지막 카드(CTA)에 "서울대보험쌤" 로고를 우측 상단에 삽입하도록 요청.
어두운 테마일 경우 흰색 로고를 사용해야 함.

## 대상 파일
- **메인 수정**: `/home/jay/projects/ThreadAuto/renderer/cardnews.py` (2435줄)
- **로고 원본**: `/home/jay/projects/ThreadAuto/static/logo_snu_insurance.jpg` (551×453px, JPG)

## 작업 내용

### 1. 로고 전처리 — PNG 투명 배경 2벌 생성
PIL로 로고 JPG를 처리하여 static/ 디렉토리에 PNG 2벌을 생성하는 스크립트 작성 후 실행:

**`static/logo_snu_insurance_dark.png`** (일반용 — 밝은 테마에서 사용):
- 원본 로고의 흰색/밝은 배경을 투명화
- 네이비/파란 로고 부분만 남김
- 방법: 픽셀의 밝기가 높은 부분(예: luminance > 0.9)을 투명 처리

**`static/logo_snu_insurance_white.png`** (다크테마용):
- 위 dark.png에서 모든 유색 픽셀을 흰색(#FFFFFF)으로 변환
- 투명 배경은 유지

### 2. `_draw_logo_overlay()` 헬퍼 메서드 추가
`CardNewsRenderer` 클래스에 새 메서드 추가:

```python
def _draw_logo_overlay(self, theme: Theme, position: str = "top-right") -> None:
```

**로직**:
1. 테마 밝기 판단: `_get_effective_bg(theme.bg_gradient)` 사용
   - luminance < 0.5 → 어두운 테마 → `logo_snu_insurance_white.png` 사용
   - luminance >= 0.5 → 밝은 테마 → `logo_snu_insurance_dark.png` 사용
2. 로고 리사이즈: 가로 120px 기준, 종횡비 유지 (LANCZOS)
3. 위치 계산 (우측 상단):
   - x = WIDTH - MARGIN - logo_width  (약 1080 - 72 - 120 = 888)
   - y = 20 (accent line 아래)
4. RGBA 레이어에 로고 paste → `Image.alpha_composite()` → RGB 변환
   - 기존 `_draw_watermark()` 메서드 (574-594줄)와 동일한 합성 패턴 사용

### 3. 커버 슬라이드에 로고 삽입
`render_cover()` 메서드 (786-924줄)에서:
- `_draw_accent_line(theme)` 호출 직후 (약 803줄 이후)
- `self._draw_logo_overlay(theme)` 호출 추가
- 텍스트 그룹보다 먼저 그려져야 함 (텍스트가 로고 위에 올라가지 않도록)

### 4. CTA 슬라이드에 로고 삽입
`render_summary_cta()` 메서드 (1899-2286줄)에서:
- `_draw_decorative_bg()` 호출 직후 (약 1911줄 이후)
- `self._draw_logo_overlay(theme)` 호출 추가

### 5. 테마별 밝기 참고
| 테마 | 배경 | 밝기 | 타입 | 사용할 로고 |
|------|------|------|------|-------------|
| NAVY_GOLD | #0A1628 → #1B3A6B | ~0.15 | 어두움 | white.png |
| BLACK_RED | #1A0000 → #3D0000 | ~0.05 | 매우 어두움 | white.png |
| GREEN_WHITE | #E8F5EE → #FFFFFF | ~0.90 | 밝음 | dark.png |
| PURPLE_PINK | #2D0045 → #6B0057 | ~0.10 | 어두움 | white.png |
| ORANGE_CREAM | #FFF3E0 → #FFE0B2 | ~0.92 | 밝음 | dark.png |

## 체크리스트
- [ ] 로고 PNG 2벌 생성 (dark.png, white.png) — 투명 배경 확인
- [ ] `_draw_logo_overlay()` 메서드 구현
- [ ] `render_cover()`에 로고 삽입 호출 추가
- [ ] `render_summary_cta()`에 로고 삽입 호출 추가
- [ ] 테스트: 밝은 테마(GREEN_WHITE)로 렌더링 → 네이비 로고 확인
- [ ] 테스트: 어두운 테마(NAVY_GOLD)로 렌더링 → 흰색 로고 확인
- [ ] 테스트 이미지를 `/home/jay/projects/ThreadAuto/output/` 에 저장하여 검증 가능하게 할 것

## 기존 코드 참고 패턴
### RGBA 합성 패턴 (`_draw_watermark()` 574-594줄):
```python
wm_layer = Image.new("RGBA", (self.WIDTH, self.HEIGHT), (0, 0, 0, 0))
wm_draw = ImageDraw.Draw(wm_layer)
wm_draw.text((x, y), text, fill=(r, g, b, alpha), font=font)
base_rgba = self.img.convert("RGBA")
base_rgba = Image.alpha_composite(base_rgba, wm_layer)
self.img = base_rgba.convert("RGB")
self.draw = ImageDraw.Draw(self.img)
```

### 밝기 판단 함수 (`_contrast_text_color()` 112-125줄):
```python
r, g, b = hex_to_rgb(bg_hex)
luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255
# luminance < 0.5 → 어두운 배경 → 흰색 로고
```

### 유효 배경색 계산 (`_get_effective_bg()` 170줄):
```python
def _get_effective_bg(bg_gradient: tuple[str, str]) -> str:
    r1, g1, b1 = hex_to_rgb(bg_gradient[0])
    r2, g2, b2 = hex_to_rgb(bg_gradient[1])
    return f"#{(r1+r2)//2:02X}{(g1+g2)//2:02X}{(b1+b2)//2:02X}"
```

## 주의사항
- 로고 크기는 120px 가로 기준. 너무 크면 안 됨.
- 로고가 텍스트와 겹치지 않도록 위치 조정
- 커버/CTA 외의 슬라이드(card_list, detail 등)에는 로고를 넣지 말 것
- 기존 _draw_watermark()는 건드리지 말 것 (하단 워터마크는 유지)
- 테스트 이미지를 output/ 에 저장하여 제이회장님이 확인할 수 있도록 할 것
