# GDI 直送列印實作計畫

## 目標
列印時繞過 PDF → SumatraPDF 路徑，改用 Windows GDI 直接送印。
預覽仍用 PDF（已完成，品質可接受）。

## 為什麼需要
| | PDF 路徑（現況） | GDI 直送（目標） |
|---|---|---|
| 字型品質 | HScale 壓縮 → 筆畫變形 | CreateFont(H,W) → 自然比例 |
| ~TX/~TY | 只能用一個，另一個靠 HScale | 兩個獨立設定 |
| 字型切換 | HPDF 字型限制 | 系統任意字型 |
| 列印品質 | 多層轉換損失 | 直接送印 |

## 架構

```
目前路徑（預覽 + 列印都走 PDF）：
  PRN → PrnToPdf() → PDF → PrnAsk HTML 預覽
                         → SumatraPDF → 印表機

新架構（預覽走 PDF，列印走 GDI）：
  PRN → PrnToPdf() → PDF → PrnAsk HTML 預覽
      → PrnToGdi() → Windows GDI → 印表機（直送）
```

## 關鍵技術

### 1. PrnToGdi() 新函式
- 跟 PrnToPdf() 共用 ParseAndRender 的控制碼解析
- 輸出目標改為 Windows GDI（HDC）而非 HPDF

### 2. GDI 渲染（#pragma BEGINDUMP C 函式）
```c
// 核心 C 函式
HB_FUNC( GDI_STARTDOC )    // StartDoc + StartPage
HB_FUNC( GDI_ENDDOC )      // EndPage + EndDoc
HB_FUNC( GDI_CREATEFONT )  // CreateFont(nHeight, nWidth, ...)
HB_FUNC( GDI_TEXTOUT )     // TextOutW / ExtTextOutW
HB_FUNC( GDI_MOVETO )      // 位置控制
HB_FUNC( GDI_DRAWLINE )    // 底線/上線
HB_FUNC( GDI_SELECTPRINTER ) // 選擇印表機
```

### 3. 字型對應
```
~FM → CreateFont(..., "MingLiU")     或 "新細明體"
~FK → CreateFont(..., "DFKai-SB")    或 "標楷體"
~FG → CreateFont(..., "MingLiU") + Helvetica
~FE → CreateFont(..., "Courier New")
```

### 4. 尺寸轉換
```
CreateFont 參數（邏輯單位）：
  nHeight = -(TY * Z * ScaleY/100) * DPI/180
  nWidth  = (TX * W * ScaleX/100) / 2 * DPI/180
  
或用 SetMapMode(MM_LOENGLISH) 配合 mil 單位
```

### 5. USRFONT 造字處理
- BCACHE/24M/UMAP 的 bitmap 改用 GDI BitBlt 繪製
- 或轉為 DIB → StretchDIBits

## 實作步驟

### Phase 1: 基礎框架
1. 建立 gdi_print.prg（或嵌入 prn_to_pdf.prg）
2. 實作 GDI C 函式（BEGINDUMP）
3. 實作 PrnToGdi() 基本流程（開文件、逐行渲染、關文件）
4. 支援基本文字輸出（ASCII + CJK）

### Phase 2: 控制碼支援
5. ~T/~TX/~TY/~W/~Z 字型大小
6. ~F 字體切換
7. ~X/~L 字距行距
8. ~S 加粗、~U 底線/上線、~R 反白
9. ~O 顏色
10. ~[P] 絕對位置、~[JL/JM/JR] 對齊

### Phase 3: 進階功能
11. USRFONT 造字渲染
12. ~[G] 圖片
13. 頁眉頁尾
14. 多頁/換頁
15. 紙張/邊界

### Phase 4: 整合
16. PrnAsk 列印按鈕改走 GDI（預覽仍用 PDF）
17. 印表機選擇/紙張設定
18. 測試各種報表

## 工作量估計
- Phase 1: 基礎框架（C 函式 + 基本渲染）
- Phase 2: 控制碼（最大工作量，需逐一對照）
- Phase 3: 進階（造字和圖片）
- Phase 4: 整合測試

## 可重用的部分
- ParseAndRender() 的控制碼解析邏輯可共用
- 只需替換 FlushText → GdiFlushText
- USRFONT 載入邏輯可共用
- 紙張/邊界計算可共用

## 風險
- GDI 列印需要跨 process 操作（PrnAsk 執行列印）
- 不同印表機驅動的行為差異
- USRFONT bitmap 的 GDI 渲染品質
- 雙路徑維護成本（PDF + GDI）
