2 * PROJECT: ReactOS VGA Font Editor
3 * LICENSE: GNU General Public License Version 2.0 or any later version
4 * FILE: devutils/vgafontedit/editglyphdlg.c
5 * PURPOSE: Dialog for editing a glyph
6 * COPYRIGHT: Copyright 2008 Colin Finck <mail@colinfinck.de>
12 AddToolboxButton(IN HWND hToolbar
, IN INT iBitmap
, IN INT idCommand
, IN BYTE fsState
)
16 tbb
.fsState
= fsState
;
17 tbb
.fsStyle
= BTNS_CHECKGROUP
;
18 tbb
.iBitmap
= iBitmap
;
19 tbb
.idCommand
= idCommand
;
21 SendMessageW( hToolbar
, TB_ADDBUTTONSW
, 1, (LPARAM
)&tbb
);
25 InitToolbox(IN PEDIT_GLYPH_INFO Info
)
31 hToolbar
= GetDlgItem(Info
->hSelf
, IDC_EDIT_GLYPH_TOOLBOX
);
33 // Identify the used Common Controls version
34 SendMessageW(hToolbar
, TB_BUTTONSTRUCTSIZE
, sizeof(TBBUTTON
), 0);
36 // Set the button size to 24x24
37 SendMessageW( hToolbar
, TB_SETBUTTONSIZE
, 0, MAKELONG(24, 24) );
38 SendMessageW( hToolbar
, TB_SETBITMAPSIZE
, 0, MAKELONG(24, 24) );
40 // Add the Toolbox bitmaps
41 tbab
.hInst
= hInstance
;
42 tbab
.nID
= IDB_EDIT_GLYPH_TOOLBOX
;
43 iBitmap
= SendMessageW(hToolbar
, TB_ADDBITMAP
, 0, (LPARAM
)&tbab
);
45 AddToolboxButton(hToolbar
, iBitmap
+ TOOLBOX_PEN
, ID_TOOLBOX_PEN
, TBSTATE_ENABLED
| TBSTATE_CHECKED
);
49 GetBitRect(IN PEDIT_GLYPH_INFO Info
, IN UINT uRow
, IN UINT uColumn
, OUT LPRECT BitRect
)
51 BitRect
->left
= uColumn
* Info
->lEditSpacing
+ 1;
52 BitRect
->top
= uRow
* Info
->lEditSpacing
+ 1;
53 BitRect
->right
= BitRect
->left
+ Info
->lEditSpacing
- 1;
54 BitRect
->bottom
= BitRect
->top
+ Info
->lEditSpacing
- 1;
58 SetPixelBit(IN PEDIT_GLYPH_INFO Info
, IN UINT uRow
, IN UINT uColumn
, IN BOOL uBit
)
60 // Set the bit in the bitfield
62 Info
->CharacterBits
[uRow
] |= 1 << (7 - uColumn
);
64 Info
->CharacterBits
[uRow
] &= ~( 1 << (7 - uColumn
) );
67 InvalidateRect(Info
->hEdit
, NULL
, FALSE
);
68 InvalidateRect(Info
->hPreview
, NULL
, FALSE
);
72 EditGlyphCommand(IN INT idCommand
, IN PEDIT_GLYPH_INFO Info
)
82 RtlCopyMemory( Info
->FontWndInfo
->Font
->Bits
+ Info
->uCharacter
* 8, Info
->CharacterBits
, sizeof(Info
->CharacterBits
) );
84 GetCharacterPosition(Info
->uCharacter
, &uRow
, &uColumn
);
85 GetCharacterRect(uRow
, uColumn
, &rect
);
86 InvalidateRect(Info
->FontWndInfo
->hFontBoxesWnd
, &rect
, FALSE
);
88 Info
->FontWndInfo
->OpenInfo
->bModified
= TRUE
;
93 // This is the equivalent of WM_DESTROY for dialogs
95 EndDialog(Info
->hSelf
, 0);
97 // Remove the window from the linked list
98 if(Info
->PrevEditGlyphWnd
)
99 Info
->PrevEditGlyphWnd
->NextEditGlyphWnd
= Info
->NextEditGlyphWnd
;
101 Info
->FontWndInfo
->FirstEditGlyphWnd
= Info
->NextEditGlyphWnd
;
103 if(Info
->NextEditGlyphWnd
)
104 Info
->NextEditGlyphWnd
->PrevEditGlyphWnd
= Info
->PrevEditGlyphWnd
;
106 Info
->FontWndInfo
->LastEditGlyphWnd
= Info
->PrevEditGlyphWnd
;
108 SetWindowLongW(Info
->hSelf
, GWLP_USERDATA
, 0);
109 SetWindowLongW(Info
->hEdit
, GWLP_USERDATA
, 0);
110 SetWindowLongW(Info
->hPreview
, GWLP_USERDATA
, 0 );
112 HeapFree(hProcessHeap
, 0, Info
);
120 EditGlyphDlgProc(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
122 PEDIT_GLYPH_INFO Info
;
124 Info
= (PEDIT_GLYPH_INFO
) GetWindowLongW(hwnd
, GWLP_USERDATA
);
126 if(Info
|| uMsg
== WM_INITDIALOG
)
131 return EditGlyphCommand( LOWORD(wParam
), Info
);
134 Info
= (PEDIT_GLYPH_INFO
) lParam
;
136 Info
->hEdit
= GetDlgItem(hwnd
, IDC_EDIT_GLYPH_EDIT
);
137 Info
->hPreview
= GetDlgItem(hwnd
, IDC_EDIT_GLYPH_PREVIEW
);
139 SetWindowLongW(hwnd
, GWLP_USERDATA
, (LONG
)Info
);
140 SetWindowLongW(Info
->hEdit
, GWLP_USERDATA
, (LONG
)Info
);
141 SetWindowLongW(Info
->hPreview
, GWLP_USERDATA
, (LONG
)Info
);
152 static LRESULT CALLBACK
153 EditGlyphEditWndProc(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
155 PEDIT_GLYPH_INFO Info
;
157 Info
= (PEDIT_GLYPH_INFO
) GetWindowLongW(hwnd
, GWLP_USERDATA
);
167 SetPixelBit(Info
, GET_Y_LPARAM(lParam
) / Info
->lEditSpacing
, GET_X_LPARAM(lParam
) / Info
->lEditSpacing
, 1);
171 SetPixelBit(Info
, GET_Y_LPARAM(lParam
) / Info
->lEditSpacing
, GET_X_LPARAM(lParam
) / Info
->lEditSpacing
, 0);
184 BeginPaint(hwnd
, &ps
);
187 GetClientRect(hwnd
, &rect
);
188 Info
->lEditSpacing
= rect
.right
/ 8;
190 hPen
= CreatePen( PS_SOLID
, 1, RGB(128, 128, 128) );
191 hOldPen
= SelectObject(ps
.hdc
, hPen
);
193 for(i
= 1; i
< 8; i
++)
195 MoveToEx(ps
.hdc
, i
* Info
->lEditSpacing
, 0, NULL
);
196 LineTo (ps
.hdc
, i
* Info
->lEditSpacing
, rect
.right
);
198 MoveToEx(ps
.hdc
, 0, i
* Info
->lEditSpacing
, NULL
);
199 LineTo (ps
.hdc
, rect
.right
, i
* Info
->lEditSpacing
);
202 SelectObject(ps
.hdc
, hOldPen
);
206 for(i
= 0; i
< 8; i
++)
208 for(j
= 0; j
< 8; j
++)
210 bBit
= (BOOL
) (Info
->CharacterBits
[i
] << j
& 0x80);
212 GetBitRect(Info
, i
, j
, &rect
);
213 FillRect( ps
.hdc
, &rect
, (HBRUSH
) GetStockObject(bBit
? BLACK_BRUSH
: WHITE_BRUSH
) );
217 // Draw the bounding rectangle
218 SelectObject( ps
.hdc
, GetStockObject(NULL_BRUSH
) );
219 Rectangle(ps
.hdc
, 0, 0, rect
.right
, rect
.right
);
227 return DefWindowProcW(hwnd
, uMsg
, wParam
, lParam
);
230 static LRESULT CALLBACK
231 EditGlyphPreviewWndProc(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
233 PEDIT_GLYPH_INFO Info
;
235 Info
= (PEDIT_GLYPH_INFO
) GetWindowLongW(hwnd
, GWLP_USERDATA
);
254 BeginPaint(hwnd
, &ps
);
256 // Draw the bounding rectangle
257 GetClientRect(hwnd
, &rect
);
258 Rectangle(ps
.hdc
, 0, 0, rect
.right
, rect
.bottom
);
261 iLeft
= rect
.right
/ 2 - 8 / 2;
262 iTop
= rect
.bottom
/ 2 - 8 / 2;
264 for(i
= 0; i
< 8; i
++)
266 for(j
= 0; j
< 8; j
++)
268 bBit
= (BOOL
) (Info
->CharacterBits
[i
] << j
& 0x80);
269 SetPixel( ps
.hdc
, j
+ iLeft
, i
+ iTop
, (bBit
? 0 : 0xFFFFFF) );
280 return DefWindowProcW(hwnd
, uMsg
, wParam
, lParam
);
284 InitEditGlyphWndClasses(VOID
)
288 wc
.lpfnWndProc
= EditGlyphEditWndProc
;
289 wc
.hInstance
= hInstance
;
290 wc
.hCursor
= LoadCursor( NULL
, IDC_ARROW
);
291 wc
.lpszClassName
= EDIT_GLYPH_EDIT_CLASSW
;
293 if( !RegisterClassW(&wc
) )
296 wc
.lpfnWndProc
= EditGlyphPreviewWndProc
;
297 wc
.lpszClassName
= EDIT_GLYPH_PREVIEW_CLASSW
;
299 return RegisterClassW(&wc
) != 0;
303 UnInitEditGlyphWndClasses(VOID
)
305 UnregisterClassW(EDIT_GLYPH_EDIT_CLASSW
, hInstance
);
306 UnregisterClassW(EDIT_GLYPH_PREVIEW_CLASSW
, hInstance
);