summaryrefslogtreecommitdiffstats
path: root/private/sdktools/fontedit/fontedit.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/sdktools/fontedit/fontedit.c')
-rw-r--r--private/sdktools/fontedit/fontedit.c1055
1 files changed, 1055 insertions, 0 deletions
diff --git a/private/sdktools/fontedit/fontedit.c b/private/sdktools/fontedit/fontedit.c
new file mode 100644
index 000000000..e60a19ac3
--- /dev/null
+++ b/private/sdktools/fontedit/fontedit.c
@@ -0,0 +1,1055 @@
+#define NOVIRTUALKEYCODES
+
+#include "windows.h"
+#include <port1632.h>
+#include "fontedit.h"
+#include "fcntl.h"
+#include <stdlib.h> // Causes redefinition warnings.
+#include <string.h>
+
+/****************************************************************************/
+/* Shared Variables (Home base) */
+/****************************************************************************/
+
+FARPROC lpHeaderProc; /* Pointer to Dialog Box Procedure */
+FARPROC lpReSizeProc; /* Pointer to Dialog Box Procedure */
+FARPROC lpWidthProc; /* Pointer to Dialog Box Procedure */
+
+FontHeaderType font; /* Structure of Font File Header */
+LONG lSizeOfOldFontHeader = 0; /* Old packed header size. */
+LONG lSizeOfOldFontHeader30 = 0; /* Old 3.0 packed header size. */
+LONG lSizeOfOldGlyph20 = 0; /* Old packed 2.0 glyph info size. */
+LONG lSizeOfOldGlyph30 = 0; /* Old packed 3.0 glyph info size. */
+extern CHAR szFontFile[]; /* Name of Font File */
+extern CHAR szFontFileFull[]; /* Name of Font File */
+extern CHAR szNewFile[]; /* Temporary Name */
+extern BOOL NewFile; /* flag indicating if file was opened
+ by selecting NEW menu item */
+HCURSOR hCross; /* handle to a "+" shaped cursor */
+HANDLE hInst; /* Handle to Window Instance */
+HANDLE hgPrev;
+INT swH = 0; /* Position in Show Window 0-100 */
+BYTE iChar = 65; /* Character being edited */
+BYTE jChar = 65; /* Last Char. of edit block */
+CHAR szFaceName[szNamesMax] = {""}; /* Face Name of Font */
+DWORD offsets[257]; /* Offsets Table */
+CHAR *vrgsz[CSTRINGS]; /* string table */
+CHAR gszHelpFile[MAX_PATH];
+
+BOOL fChanged = FALSE; /* Note if we did anything */
+BOOL fLoaded = FALSE; /* Set if a font is loaded */
+BOOL fEdited = FALSE; /* Character was edited */
+INT iFontFormat; /* Set to id of current font format */
+INT iFontFormatPrev; /* Set to id of prev. font format */
+BOOL fReadOnly;
+
+HWND hBox = NULL; /* Handle to Edit Window */
+HWND hFont = NULL; /* Handle to Show window */
+HDC hMemDC = NULL; /* Handle to Memory Display Context */
+HBITMAP hBitmap = NULL; /* Handle to our work bit map */
+
+CHAR matBox [wBoxLim] [kBoxLim]; /* array to hold Box */
+DWORD wBox = 10; /* Width of Character(s) */
+DWORD kBox = 16; /* Height of Characters */
+DWORD kStuff; /* Height of font window caption etc. */
+
+OFSTRUCT ofstrFile; /* holds info of file - filled in by dlgopen/save */
+//WORD fp = NULL; /* global fp of current file - " " " " " " */
+
+/*** string arrays for using stringtable ***/
+CHAR szAppName[MAX_STR_LEN];
+CHAR szIFN[MAX_STR_LEN]; /* illegal filename */
+CHAR szFNF[MAX_STR_LEN]; /* file not found */
+CHAR szREF[MAX_STR_LEN]; /* replace existing file */
+CHAR szSCC[MAX_STR_LEN]; /* save current changes */
+CHAR szEOF[MAX_STR_LEN]; /* error opening file */
+CHAR szECF[MAX_STR_LEN]; /* error creating file */
+CHAR szFRO[MAX_STR_LEN]; /* error creating file */
+CHAR szExt[MAX_STR_LEN]; /* .FNT */
+CHAR szExtDesc[MAX_STR_LEN]; /* Font Files(.FNT) */
+CHAR szNEWFONT[MAX_STR_LEN]; /* Font Files(.FNT) */
+CHAR szFilter[MAX_STR_LEN]; /* Font Files(.FNT) */
+
+
+/* size of system font */
+INT cSysWidth;
+INT cSysHeight;
+
+/****************************************************************************/
+/* Local Variables */
+/****************************************************************************/
+
+BYTE FindMouse(); /* Find where mouse is */
+
+HBRUSH hbrWhite;
+HBRUSH hbrBlack;
+HBRUSH hbrGray;
+HBRUSH hbrDkGray;
+HBRUSH hbrBackGround;
+
+BYTE downChar; /* Where mouse was pressed */
+BYTE lastChar; /* Where mouse was last */
+WORD wBoxOld; /* So we can catch any changes */
+RECT rectWin; /* Client Rectangle */
+LONG origin; /* Position in Show Window pixels */
+BOOL fFirstShow = TRUE; /* first time Show Window displayed? */
+
+/****************************************************************************/
+/* Local Functions */
+/****************************************************************************/
+
+VOID InvertFont(HDC, BYTE, BYTE);
+BOOL FontEditInit(HANDLE);
+VOID InitSizes(VOID);
+
+/*****************************************************************************
+ * FontShowHorzScroll(hFont, code, posNew)
+ *
+ * purpose: intepret scroll message for tiny window and call scroll funtion
+ * accordingly
+ *
+ * params: HWND hFont : handle to tiny window
+ * int code : scroll message
+ * int posNew : thumb position
+ * returns: none
+ *
+ * side effects: scroll position variable altered
+ *
+ ****************************************************************************/
+VOID
+FontShowHorzScroll(
+ HWND hFont,
+ INT code,
+ INT posNew
+ )
+{
+ WORD wChar;
+ RECT rect;
+
+ /* Get dimensions */
+ GetClientRect(hFont, (LPRECT)&rect);
+
+ /* Make a fair guess as to how many characters are in the window */
+ /* Convert sorta to hex too. */
+#ifdef JAPAN
+ if (font.AvgWidth == 0 ) {
+ font.AvgWidth = 1 ;
+ }
+#endif
+ wChar=(WORD)(11*(rect.right-rect.left)/(font.AvgWidth*16));
+
+ switch (code)
+ {
+ case SB_LINEUP: /* line left */
+ swH -= 1;
+ break;
+ case SB_LINEDOWN: /* line right */
+ swH += 1;
+ break;
+ case SB_PAGEUP: /* page left */
+ swH -= wChar;
+ break;
+ case SB_PAGEDOWN: /* page right */
+ swH += wChar;
+ break;
+ case SB_THUMBPOSITION:
+ swH = posNew;
+ break;
+ case SB_THUMBTRACK:
+ return;
+ }
+ ScrollFont();
+}
+
+/*****************************************************************************
+ * FontShowPaint(hDC)
+ *
+ * purpose: repaint the little window at the bottom
+ *
+ * params: HDC hDC : handle to display context.
+ *
+ * returns: none
+ *
+ * side effects: some scroll globals altered.
+ *
+ ****************************************************************************/
+
+VOID
+FontShowPaint(
+ HDC hDC
+ )
+{
+ DWORD range, nBits;
+ INT nx;
+
+ nx=GetSystemMetrics(SM_CXBORDER);
+ /* 320 --> 300 */
+ nBits = min(300, rectWin.right - rectWin.left-nx-nx) - 24;
+ /* Window width (pixels) */
+ /* 320 --> 300 */
+ range = max(0, (font.WidthBytes << 3) - min(300, nBits));
+ origin = (swH * range) / 100; /* Global variable */
+ BitBlt(hDC, 12, 2, nBits, font.PixHeight,
+ hMemDC, origin, 0, NOTSRCCOPY);
+ /* Now highlight the current value of iChar */
+ InvertFont(hDC, iChar, jChar);
+}
+
+
+/*****************************************************************************
+ * MouseInFont(ptMouse)
+ *
+ * purpose: Select new char in tiny Show window by inverting current char
+ * and un-inverting last one
+ *
+ * params: POINT ptMouse : mouse coordinates
+ *
+ * returns: none
+ *
+ * side effects: pixels inverted(uninverted) in bitmap.
+ *
+ ****************************************************************************/
+VOID
+MouseInFont(
+ POINT ptMouse /* .. to get new iChar */
+ )
+{
+ HDC hDC;
+
+ BoxToChar(iChar); /* Replace edited character in Box if changed */
+ hDC = GetDC(hFont);
+ /* UnInvert present inverted region */
+ InvertFont(hDC, iChar, jChar);
+ /* Find where mouse is */
+ lastChar = downChar = iChar = jChar = FindMouse(ptMouse);
+ /* Invert Character touched */
+ InvertFont(hDC, iChar, jChar);
+ ReleaseDC(hFont, hDC);
+}
+
+
+/*****************************************************************************
+ *
+ * purpose: God knows. Ask Him.
+ *
+ * params:
+ *
+ * returns:
+ *
+ * side effects:
+ *
+ ****************************************************************************/
+VOID
+MouseMoveFont(
+ POINT ptMouse
+ )
+ /* Mouse raised in font */
+ /* .. to get new jChar */
+{
+ UNREFERENCED_PARAMETER(ptMouse);
+ return; /********* NOT YET IN USE !! ********/
+
+#if 0
+ BYTE newChar;
+ HDC hDC;
+
+ newChar = FindMouse(ptMouse); /* Find where mouse is */
+ if (newChar == lastChar) /* Did we move ? */
+ return; /* No: return */
+ lastChar = newChar;
+ hDC = GetDC(hFont);
+ if (newChar > jChar)
+ {
+ InvertFont(hDC, jChar + 1, newChar); /* extend jChar */
+ jChar = newChar;
+ }
+ else if (newChar < iChar) /* iChar & jChar switch */
+ {
+ InvertFont(hDC, newChar, iChar - 1);
+ iChar = newChar;
+ }
+ else
+ {
+ if (newChar >= downChar) /* width reduced on right */
+ {
+ InvertFont(hDC, newChar + 1, jChar);
+ jChar = newChar;
+ }
+ if (newChar <= downChar) /* width reduced on left */
+ {
+ InvertFont(hDC, iChar, newChar - 1);
+ iChar = newChar;
+ }
+ }
+ ReleaseDC(hFont, hDC);
+#endif
+}
+
+
+/*****************************************************************************
+ * InvertFont(hDC, iChar, jChar)
+ *
+ * purpose: inverts color on selected chars (iChar thro' jChar) in the Show
+ * Window
+ *
+ * params: HDC hDC : handle to display context
+ * char iChar : start char
+ * char jChar : end char
+ *
+ * returns: none
+ *
+ * side effects: changes pixel values in bitmap
+ *
+ ****************************************************************************/
+VOID
+InvertFont(
+ HDC hDC,
+ BYTE iChar,
+ BYTE jChar
+ )
+{
+ PatBlt(hDC, /* Use Blt to Invert it */
+ 12 + offsets[iChar] - origin, /* X: Position */
+ 2, /* Y: Allow for top band */
+ offsets[jChar + 1] - offsets[iChar], /* dx: Compute width */
+ font.PixHeight, /* dy: Look up the Height */
+ DSTINVERT); /* Z: Tell it to invert it */
+}
+
+
+/*****************************************************************************
+ * MouseOutFont(ptMouse)
+ *
+ * purpose: brings selected char to edit box and sets up tiny window for
+ * repainting
+ *
+ * params: POINT ptMouse : mouse location
+ *
+ * returns: none
+ *
+ * side effects: changes matBox(2-d array containing ready pixel info. on
+ * char being edited)
+ *
+ ****************************************************************************/
+VOID
+MouseOutFont(
+ POINT ptMouse
+ )
+ /* Mouse raised in font */
+ /* .. to get new jChar */
+{
+ MouseMoveFont(ptMouse); /* Check on iChar and jChar */
+ CharToBox(iChar);
+ InvalidateRect(hFont, (LPRECT)NULL, TRUE); /* Cause repaint */
+}
+
+
+/*****************************************************************************
+ * BYTE FindMouse(ptMouse)
+ *
+ * purpose: Locate number of character(in tiny window at bottom) under mouse
+ *
+ * params: POINT ptMouse : mouse location
+ *
+ * returns: number of character
+ *
+ * side effects: alters scroll position variable
+ *
+ ****************************************************************************/
+
+BYTE
+FindMouse(
+ POINT ptMouse
+ )
+{
+ int iChar;
+ LONG x;
+
+
+ x = ptMouse.x + origin - 12; /* Horizontal position of mouse */
+ if (x < 0)
+ iChar = font.FirstChar;
+ else
+ {
+ iChar = x / font.AvgWidth + font.FirstChar;
+ /* Right if Fixed Pitch -- Best Guess if variable width */
+ if (!font.PixWidth) /* Scan for new iChar */
+ {
+ if (iChar > (int)font.LastChar)
+ iChar = (int)font.LastChar; /* Don't overshoot */
+
+ while (iChar < (int)font.LastChar && offsets[iChar] < (DWORD)x)
+ iChar++;
+ while (iChar > (int)font.FirstChar && offsets[iChar] > (DWORD)x)
+ iChar--;
+ }
+ }
+
+ /* Bug fix: prevent nil character from showing if mouse is pressed way
+ over on right side of font scroll with narrow fixed fonts. */
+ if (iChar > (int)font.LastChar)
+ iChar = (int)font.LastChar; /* Don't overshoot */
+
+ if (iChar < (int)font.FirstChar)
+ iChar = (int)font.FirstChar; /* Don't undershoot */
+
+ if (ptMouse.x <= 12L)
+ {
+ swH -= 1;
+ ScrollFont();
+ }
+ if (ptMouse.x > 308L)
+ {
+ swH += 1;
+ ScrollFont();
+ }
+ return (BYTE)iChar;
+}
+
+
+/*****************************************************************************
+ * ScrollFont()
+ *
+ * purpose: scrolls tiny window at bottom
+ *
+ * params: none
+ *
+ * returns: none
+ *
+ * side effects: alters scroll position variable
+ *
+ ****************************************************************************/
+VOID
+ScrollFont(
+ VOID
+ )
+{
+ HDC hDC;
+
+ swH = max(0, swH);
+ swH = min(100, swH); /* maintain 0 - 100 range */
+ SetScrollPos(hFont, SB_HORZ, swH, TRUE); /* Move thumb */
+ hDC = GetDC(hFont);
+ FontShowPaint(hDC);
+ ReleaseDC(hFont, hDC);
+}
+
+
+/*****************************************************************************
+ * BoxToChar(iChar)
+ *
+ * purpose: sets pixels in bitmap according to matBox(2-d array containing
+ * ready pixel info. on char being edited)
+ *
+ * params: BYTE iChar : index of char in bitmap offset array(offsets)
+ *
+ * returns: none
+ *
+ * side effects: changes font bitmap
+ *
+ ****************************************************************************/
+VOID
+BoxToChar(
+ BYTE iChar
+ )
+{
+ DWORD x, y, offset;
+
+ if (!fEdited)
+ return;
+
+ if (wBox != wBoxOld) /* I.e if width has changed */
+ CharWidth(iChar, wBox); /* .. go fix it */
+
+ offset = offsets[iChar];
+ for (x = 0; x < wBox; x++)
+ {
+ for (y = 0; y < kBox; y++)
+ SetPixel(hMemDC, offset + x, y,
+ matBox[x] [y] == TRUE ? WHITE : BLACK);
+ }
+ fEdited = FALSE;
+}
+
+
+/*****************************************************************************
+ * CharToBox(iChar)
+ *
+ * purpose: assigns matBox(2-d array containing ready pixel info. on char being
+ * edited) according to pixels in portion of bitmap corresp. to char.
+ *
+ * params: BYTE iChar : index of char in bitmap offset array(offsets)
+ *
+ * returns: none
+ *
+ * side effects: changes matBox
+ *
+ ****************************************************************************/
+VOID
+CharToBox(
+ BYTE iChar
+ )
+{
+ DWORD x, y, offset;
+ HMENU hMenu;
+
+ ClearBox();
+ offset = offsets[iChar];
+ wBox = (DWORD)(wBoxOld = (WORD) (offsets[iChar + 1] - offset)); /* Edit Box width */
+ kBox = font.PixHeight; /* Edit Box Height */
+ for (x = 0; x < wBox; x++)
+ for (y = 0; y < kBox; y++)
+ matBox[x][y] = (BYTE) (GetPixel(hMemDC, offset + x, y) ? 1 : 0);
+ InvalidateRect(hBox, (LPRECT)NULL, TRUE);
+ fEdited = FALSE; /* Not Changed Yet */
+ hMenu = GetMenu(hBox);
+ EnableMenuItem(hMenu, BOX_UNDO, MF_GRAYED);
+ EnableMenuItem(hMenu, BOX_REFRESH, MF_GRAYED);
+}
+
+
+/*****************************************************************************/
+/* WinMain and Friends */
+/*****************************************************************************/
+
+
+/* Procedure called every time a new instance of the application
+** is created */
+
+MMain(hInstance, hPrevInstance, lpszCmdLine, cmdShow)
+/* { */
+ MSG msg;
+ WORD message;
+ INT nx;
+ HANDLE hAccel;
+
+ hInst = hInstance;
+ hgPrev=hPrevInstance;
+ /*if (!hPrevInstance)
+ { */
+
+
+ if (!FontEditInit( hInstance ))
+ return FALSE;
+
+
+ /*}
+ /*else Hacked this out--why not just make our own again. Alleviates
+ problems with some strange RIPs
+ get data from previous instance */
+ /*{
+ /* Copy global instance variables from previous instance */
+ /*GetInstanceData( hPrevInstance, (PSTR)&hbrWhite, sizeof( hbrWhite));
+ GetInstanceData( hPrevInstance, (PSTR)&hbrBlack, sizeof( hbrBlack));
+ GetInstanceData( hPrevInstance, (PSTR)&hbrGray, sizeof( hbrGray));
+ GetInstanceData( hPrevInstance, (PSTR)&hbrDkGray, sizeof( hbrDkGray));
+ GetInstanceData( hPrevInstance, (PSTR)&hbrBackGround,
+ sizeof( hbrBackGround));
+ }*/
+
+ LoadString(hInstance, IDS_APPNAME, szAppName, MAX_STR_LEN);
+ LoadString(hInstance, IDS_IFN, szIFN, MAX_STR_LEN); /* illegal filename */
+ LoadString(hInstance, IDS_FNF, szFNF, MAX_STR_LEN); /* file not found */
+ LoadString(hInstance, IDS_REF, szREF, MAX_STR_LEN);
+ /* replace existing file */
+ LoadString(hInstance, IDS_SCC, szSCC, MAX_STR_LEN);
+ /* save current changes */
+ LoadString(hInstance, IDS_EOF, szEOF, MAX_STR_LEN); /* error opening file */
+ LoadString(hInstance, IDS_ECF, szECF, MAX_STR_LEN);
+ // File is read only.
+ LoadString(hInstance, IDS_FRO, szFRO, MAX_STR_LEN);
+ /* error creating file */
+ LoadString(hInstance, IDS_EXT, szExt, MAX_STR_LEN); /* default file ext. */
+
+ // File extension description for common dialog.
+ LoadString(hInstance, IDS_EXTDESC, szExtDesc, MAX_STR_LEN);
+ // Message for new font warning box.
+ LoadString(hInstance, IDS_NEW_FONT, szNEWFONT, MAX_STR_LEN);
+ memset(szFilter, 0, MAX_STR_LEN);
+ LoadString(hInstance, IDS_EXTDESC, szFilter, MAX_STR_LEN);
+ LoadString(hInstance, IDS_STARDOTFNT, szFilter+strlen(szFilter)+1,
+ MAX_STR_LEN-(strlen(szFilter)+1));
+
+
+ ClearBox();
+
+ /* Create a window instance of class "FontEdit" */
+
+ hBox = CreateWindow((LPSTR) vszFontEdit,
+ (LPSTR)szAppName,
+ WS_TILEDWINDOW,
+ 56,34,
+ GetSystemMetrics(SM_CXFULLSCREEN)/2,
+ GetSystemMetrics(SM_CYFULLSCREEN)/2,
+ (HWND)NULL, /* no parent */
+ (HMENU)NULL, /* use class menu */
+ (HANDLE)hInstance, /* handle to window instance */
+ (LPSTR)NULL /* no params to pass on */
+ );
+
+ ShowWindow(hBox, cmdShow);
+ UpdateWindow(hBox);
+ InitSizes(); /* 11/21/86 - linsh - get system char width & height */
+
+
+ GetWindowRect(hBox, (LPRECT)&rectWin);
+ nx=GetSystemMetrics(SM_CXBORDER);
+ hFont = CreateWindow((LPSTR) vszFontShow,
+ (LPSTR) "",
+ WS_BORDER|WS_HSCROLL|WS_CAPTION,
+ rectWin.left,
+ rectWin.bottom-56,
+ min(300, rectWin.right - rectWin.left-nx-nx),
+ 50 - GetSystemMetrics(SM_CYBORDER),
+ (HWND)hBox,
+ (HMENU)NULL,
+ (HANDLE)hInstance,
+ (LPSTR)NULL
+ );
+
+
+ /* Get address of Dialog Box procedure */
+ lpHeaderProc = MakeProcInstance((FARPROC)HeaderProc, hInstance);
+ lpReSizeProc = MakeProcInstance((FARPROC)ReSizeProc, hInstance);
+ lpWidthProc = MakeProcInstance((FARPROC)WidthProc, hInstance);
+
+ /* Start it loading if it's not iconic */
+ if (!IsIconic(hBox))
+ {
+ if (lpszCmdLine[0]) /* If we have a font name use it */
+ {
+ BOOL fDot;
+ INT i;
+
+ /* Copy the specified file and make it upper case */
+ lstrcpy((LPSTR)szFontFile, CharUpper((LPSTR)lpszCmdLine));
+
+ fDot = FALSE;
+ nx=lstrlen((LPSTR)szFontFile);
+
+ for (i = 0; i < nx; i++)
+ {
+ if (szFontFile[i] == '.') /* Add .FNT if none */
+ fDot = TRUE;
+
+ if (szFontFile[i] == ' ')
+ szFontFile[i]=0;
+ }
+
+ if (!fDot)
+ lstrcat((LPSTR)szFontFile, (LPSTR)vszDotFNT);
+
+ lstrcpy((LPSTR)szNewFile, (LPSTR)szFontFile);
+
+ /* Do this thing that someone forgot. THe dialog open does it
+ and affects the Save As initialization. */
+ MOpenFile((LPSTR)szNewFile, &ofstrFile, OF_READ);
+
+ message = FONT_START;
+ }
+ else /* Start by doing a regular file load */
+ message = FONT_LOAD;
+
+ SetFocus(hBox);
+ PostMessage(hBox, WM_COMMAND, message, (LONG)0);
+ }
+
+ if (!fLoaded)
+ ShowWindow(hFont, SW_HIDE);
+
+ hAccel=LoadAccelerators(hInstance, "FE");
+
+ /* Quit message will terminate application */
+ while (GetMessage((LPMSG)&msg, NULL, 0, 0))
+ {
+ if (!TranslateAccelerator (hBox, hAccel, &msg))
+ {
+ TranslateMessage((LPMSG)&msg);
+ DispatchMessage((LPMSG)&msg);
+ }
+ }
+
+ return msg.wParam;
+ (void)_argc; (void)_argv;
+ }
+
+/************************************************************************
+* FileInPath
+*
+* This function takes a path and returns a pointer to the file name
+* portion of it. For instance, it will return a pointer to
+* "abc.res" if it is given the following path: "c:\windows\abc.res".
+*
+* Arguments:
+* PSTR pstrPath - Path to look through.
+*
+* History:
+* 29-Jul-1994 JonPa copied from imagedit
+************************************************************************/
+
+PSTR FileInPath(
+ PSTR pstrPath)
+{
+ PSTR pstr;
+
+ pstr = pstrPath + strlen(pstrPath);
+ while (pstr > pstrPath) {
+ pstr = AnsiPrev(pstrPath, pstr);
+ if (*pstr == '\\' || *pstr == ':' || *pstr == '/') {
+ pstr = AnsiNext(pstr);
+ break;
+ }
+ }
+
+ return pstr;
+}
+
+/*****************************************************************************
+ * int FontEditInit( hInstance )
+ *
+ * purpose: Initialises a whole lot of stuff
+ *
+ * params: HANDLE hInstance : handle to instance of application
+ *
+ * returns: TRUE : if everything goes off well
+ * FALSE : error in initialisation
+ *
+ * side effects: a whole lot
+ *
+ ****************************************************************************/
+
+/* Procedure called when the application is loaded */
+BOOL
+FontEditInit(
+ HANDLE hInstance
+ )
+{
+ INT cch; /* all variables used to load srings from .RC file */
+ INT cchRemaining;
+ CHAR *pch;
+ HANDLE hStrings;
+ INT i;
+ CHAR ColorStr[CCHCOLORSTRING]; /* background color inf. fronm win.ini */
+ BYTE bR, bG, bB; /* the three primary color values ret. from win.ini */
+ // CHAR cDummy; /* dummy char to hold the " " char */
+ PWNDCLASS pFontEditClass; /* Edit Box window class */
+ PWNDCLASS pFontShowClass; /* Show Font window class */
+
+ //
+ // Initialize the conversion routines to read in the old font structure
+ // off of disk.
+ //
+
+ if (fConvStructInit () == FALSE) {
+
+ return FALSE;
+ }
+
+ /* load strings from resource file */
+ if (!(pch = (CHAR *)(hStrings =
+ LocalAlloc (LPTR, cchRemaining = CCHSTRINGSMAX))))
+ return FALSE; /* unable to alloc. Try increasing initial
+ heapsize in .DEf file */
+ for (i=0; i< CSTRINGS; i++){
+ cch = 1+LoadString (hInstance, (WORD) i, (LPTSTR)pch, cchRemaining);
+ if (cch < 2){
+ return FALSE;
+ }
+ vrgsz[i] = pch;
+ pch += cch;
+ if ((cchRemaining -= cch ) <= 0)
+ return FALSE;
+ }
+
+ /* Allocate class structure in local heap */
+ pFontEditClass = (PWNDCLASS)LocalAlloc( LPTR, sizeof(WNDCLASS) );
+ if (pFontEditClass == NULL)
+ return FALSE;
+
+ /* set up some default brushes */
+ hbrWhite = GetStockObject( WHITE_BRUSH );
+ hbrBlack = GetStockObject( BLACK_BRUSH );
+ hbrGray = GetStockObject( GRAY_BRUSH );
+ hbrDkGray = GetStockObject( DKGRAY_BRUSH );
+
+ /* get App. Workspace color from win.ini - LR */
+ if (GetProfileString(vszcolors, vszAppWorkspace, "",ColorStr,
+ CCHCOLORSTRING)){
+ bR = (BYTE)atoi((const char *)strtok (ColorStr, " "));
+ bG = (BYTE)atoi((const char *)strtok (NULL, " "));
+ bB = (BYTE)atoi((const char *)strtok (NULL, "\n"));
+ hbrBackGround = CreateSolidBrush(RGB(bR, bG, bB));
+ }
+ else /* set to lt. blue background */
+ hbrBackGround = CreateSolidBrush((LONG)0x00FF8000);
+
+ /* get necessary resources */
+ pFontEditClass->hCursor = LoadCursor( NULL, IDC_ARROW);
+ pFontEditClass->hIcon = LoadIcon( hInstance,(LPSTR)vszFontEdit);
+ pFontEditClass->lpszMenuName = (LPSTR)vszFontEdit;
+ pFontEditClass->lpszClassName = (LPSTR)vszFontEdit;
+ pFontEditClass->hbrBackground = hbrBackGround;
+ pFontEditClass->hInstance = hInstance;
+
+ pFontEditClass->style = CS_VREDRAW | CS_HREDRAW;
+
+ /* Register our Window Proc */
+ pFontEditClass->lpfnWndProc = (WNDPROC)FontEditWndProc;
+
+ /* register this new class with WINDOWS */
+ if (!hgPrev)
+ if (!RegisterClass( (LPWNDCLASS)pFontEditClass ) )
+ return FALSE; /* Initialization failed */
+
+ /* Now repeat the performance for the Show window */
+
+ pFontShowClass = pFontEditClass;
+ /* get necessary resources */
+ pFontShowClass->hCursor = LoadCursor(NULL,IDC_ARROW);
+ pFontShowClass->hIcon = (HICON)NULL;
+ pFontShowClass->lpszMenuName = NULL;
+ pFontShowClass->lpszClassName = (LPSTR)vszFontShow;
+ pFontShowClass->hbrBackground = hbrGray;
+ pFontShowClass->hInstance = hInstance;
+ pFontShowClass->style = CS_VREDRAW | CS_HREDRAW;
+
+ /* Register our Window Proc */
+ pFontShowClass->lpfnWndProc = (WNDPROC)FontShowWndProc;
+
+ /* register this new class with WINDOWS */
+ if (!hgPrev)
+ if (!RegisterClass( (LPWNDCLASS)pFontShowClass ) )
+ return FALSE; /* Initialization failed */
+
+ LocalFree( (HANDLE)pFontShowClass );
+
+ /*
+ * Build the help file name path. Assume the help file is in the
+ * same directory as the executable.
+ */
+ GetModuleFileName(hInstance, gszHelpFile, MAX_PATH);
+ *FileInPath(gszHelpFile) = '\0';
+ lstrcat(gszHelpFile, vrgsz[IDS_HELPFILE]);
+
+ return TRUE; /* Initialization succeeded */
+}
+
+/*****************************************************************************
+ * InitSizes()
+ *
+ * purpose: gets system char width and height
+ *
+ * params: none
+ *
+ * returns: none
+ *
+ * side effects: sets width and height globals
+ *
+ ****************************************************************************/
+VOID
+InitSizes(
+ VOID
+ )
+{
+ HDC hDC;
+ TEXTMETRIC tm;
+
+ hDC = GetDC(hFont);
+ GetTextMetrics(hDC, (LPTEXTMETRIC) &tm);
+ cSysHeight = tm.tmHeight + tm.tmExternalLeading;;
+ cSysWidth = tm.tmAveCharWidth;
+ ReleaseDC(hFont, hDC);
+}
+
+
+/*****************************************************************************
+ * long APIENTRY FontShowWndProc(hFont, message, wParam, lParam)
+ *
+ * purpose: Window function for tiny window at the bottom (showing font chars)
+ * Independently processes paint, scroll, keyboard and mouse
+ * messages for the window
+ *
+ * params: as for window functions
+ *
+ * side effects: lots
+ *
+ ****************************************************************************/
+
+/* Procedures which make up the window class. */
+LONG APIENTRY
+FontShowWndProc(
+ HWND hFont,
+ WORD message,
+ WPARAM wParam,
+ LONG lParam
+ )
+{
+ PAINTSTRUCT ps;
+ // RECT rectWin;
+ POINT pt;
+
+ MPOINT2POINT(MAKEMPOINT(lParam), pt);
+
+ switch (message)
+ {
+
+ case WM_SIZE :
+ switch (wParam){
+ /* if main window is iconised, hide the child window */
+ case SIZEICONIC :
+ ShowWindow(hFont, SW_HIDE);
+ break;
+ default:
+ return(DefWindowProc(hFont, message, wParam, lParam));
+ break;
+ }
+ break;
+
+
+ case WM_PAINT:
+ /* Time for the window to draw itself. */
+ BeginPaint(hFont, (LPPAINTSTRUCT)&ps);
+ FontShowPaint(ps.hdc);
+ EndPaint(hFont, (LPPAINTSTRUCT)&ps);
+ break;
+
+ /* For each of following mouse window messages, wParam contains
+ ** bits indicating whether or not various virtual keys are down,
+ ** and lParam is a POINT containing the mouse coordinates. The
+ ** keydown bits of wParam are: MK_LBUTTON (set if Left Button is
+ ** down); MK_RBUTTON (set if Right Button is down); MK_SHIFT (set
+ ** if Shift Key is down); MK_ALTERNATE (set if Alt Key is down);
+ ** and MK_CONTROL (set if Control Key is down). */
+
+ case WM_LBUTTONDOWN:
+ MouseInFont(pt); /* .. set iChar */
+ break;
+ case WM_LBUTTONUP:
+ MouseOutFont(pt); /* .. set jChar */
+ break;
+ case WM_RBUTTONDOWN:
+ case WM_RBUTTONUP:
+ case WM_MOUSEMOVE: /* If mouse is down */
+ if (wParam & MK_LBUTTON)
+ MouseMoveFont(pt); /* .. set jChar */
+ break;
+ case WM_LBUTTONDBLCLK:
+ case WM_RBUTTONDBLCLK:
+ break;
+
+ case WM_HSCROLL:
+ /* wParam contains the scroll code.
+ ** For the thumb movement codes, the low
+ ** word of lParam contain the new scroll position.
+ ** Possible values for wParam are: SB_LINEUP, SB_LINEDOWN,
+ ** SB_PAGEUP, SB_PAGEDOWN, SB_THUMBPOSITION, SB_THUMBTRACK */
+ /* Horizontal scroll bar input. Parameters same as for
+ ** WM_HSCROLL. UP and DOWN should be interpreted as LEFT
+ ** and RIGHT, respectively. */
+ FontShowHorzScroll(hFont, GET_WM_HSCROLL_CODE(wParam,lParam),
+ GET_WM_HSCROLL_POS(wParam,lParam));
+ break;
+ case WM_CLOSE:
+ break; /* don't allow this window to be closed before
+ bigger one */
+
+ default:
+
+ /* Everything else comes here. This call MUST exist
+ ** in your window proc. */
+
+ return(DefWindowProc(hFont, message, wParam, lParam));
+ break;
+
+ }
+
+ /* A window proc should always return something */
+ return(0L);
+}
+
+
+VOID
+FontRename(
+ CHAR * szError
+ )
+{
+ CHAR *szTitle[MAX_STR_LEN+MAX_FNAME_LEN];
+
+ if (szError[0])
+ ErrorBox(hBox, szError);
+ else
+ {
+ lstrcpy((LPSTR)szFontFileFull, (LPSTR)szNewFile);
+ lstrcpy((LPSTR)szTitle, (LPSTR)szAppName);
+ lstrcat((LPSTR)szTitle, (LPSTR)vszBlankDashBlank);
+ lstrcat((LPSTR)szTitle, (LPSTR)szFontFile);
+ SetWindowText(hBox, (LPSTR)szTitle);
+ }
+}
+
+
+/*****************************************************************************
+ * ResizeShow()
+ *
+ * purpose: resize tiny window at bottom (showing font chars) in proportion
+ * to large window
+ *
+ * params: none
+ *
+ * returns: none
+ *
+ * side effects:
+ *
+ ****************************************************************************/
+
+VOID
+ResizeShow(
+ VOID
+ )
+{
+ INT height;
+ INT nx;
+
+ /* size message for hbox goes thru before hfont created. 06-Jul-1987. */
+ if (!hFont)
+ return;
+
+ GetWindowRect(hBox, (LPRECT)&rectWin);
+ kStuff = GetkStuff(); /* For check on second pass */
+
+#if 0
+ height = font.PixHeight + kStuff + 20; /* 4 Height we want box */
+#else
+ height = font.PixHeight + GetSystemMetrics(SM_CYHSCROLL)
+ + GetSystemMetrics(SM_CYCAPTION)
+ + 4*GetSystemMetrics(SM_CYBORDER)/*20*/; /* 4*/
+#endif
+
+ nx=GetSystemMetrics(SM_CXBORDER);
+ MoveWindow(hFont,
+ rectWin.left +nx+4,
+ rectWin.bottom - (height + GetSystemMetrics(SM_CYBORDER)+2),
+ min(300, rectWin.right - rectWin.left-nx-nx),
+ height,
+ TRUE);
+ if (!IsWindowVisible(hFont) && fLoaded)
+ ShowWindow(hFont, SW_SHOW);
+}
+
+
+DWORD
+GetkStuff(
+ VOID
+ ) /* Get size of menu, scrollbar etc. */
+{
+ RECT rect, rectWin;
+
+ /* size message for hbox goes thru before hfont created. 06-Jul-1987. */
+ if (!hFont)
+ return 0;
+
+ GetClientRect(hFont, (LPRECT)&rect); /* How much do WE get? */
+ GetWindowRect(hFont, (LPRECT)&rectWin);
+ return (DWORD) (rectWin.bottom - rectWin.top) - (rect.bottom - rect.top);
+}
+