Annotation of ntddk/src/print/pscrptui/ttfonts.c, revision 1.1.1.1

1.1       root        1: //--------------------------------------------------------------------------
                      2: //
                      3: // Module Name:  TTFONTS.C
                      4: //
                      5: // Brief Description:  This module contains the PSCRIPT driver's User
                      6: // TrueType font substitution functions and related routines.
                      7: //
                      8: // Author:  Kent Settle (kentse)
                      9: // Created: 27-May-1992
                     10: //
                     11: // Copyright (c) 1992 Microsoft Corporation
                     12: //--------------------------------------------------------------------------
                     13: 
                     14: #include <stddef.h>
                     15: #include <stdlib.h>
                     16: #include <string.h>
                     17: #include "pscript.h"
                     18: #include "enable.h"
                     19: #include <winspool.h>
                     20: #include "dlgdefs.h"
                     21: #include "pscrptui.h"
                     22: #include "help.h"
                     23: 
                     24: extern TT_FONT_MAPPING TTFontTable[]; // ..\pscript\tables.h.
                     25: 
                     26: // global data.
                     27: 
                     28: HANDLE  hPrinter;
                     29: 
                     30: // declarations of routines defined within this module.
                     31: 
                     32: LONG TTFontDialogProc(HWND, UINT, DWORD, LONG);
                     33: int iFontCallback (PLOGFONT, PTEXTMETRIC, ULONG, PENUMDATA);
                     34: int iFaceCallback (PLOGFONT, PTEXTMETRIC, ULONG, PENUMDATA);
                     35: BOOL SetDefaultTTMappings(HWND);
                     36: int TTToDefaultPF(HWND, int);
                     37: 
                     38: //--------------------------------------------------------------------------
                     39: // LONG TTFontDialogProc(hwnd, usMsg, wParam, lParam)
                     40: // HWND    hwnd;
                     41: // UINT    usMsg;
                     42: // DWORD   wParam;
                     43: // LONG    lParam;
                     44: //
                     45: // This routine services the TrueType Font Handling dialog box.
                     46: //
                     47: // History:
                     48: //   20-May-1992    -by-    Kent Settle     (kentse)
                     49: //  Wrote it.
                     50: //--------------------------------------------------------------------------
                     51: 
                     52: LONG TTFontDialogProc(hwnd, usMsg, wParam, lParam)
                     53: HWND    hwnd;
                     54: UINT    usMsg;
                     55: DWORD   wParam;
                     56: LONG    lParam;
                     57: {
                     58:     HDC             hdc;
                     59:     ENUMDATA        EnumData;
                     60:     PNTPD           pntpd;
                     61:     BYTE           *pfont;
                     62:     DWORD           i, iFont, rc;
                     63:     PNTFM           pntfm;
                     64:     HANDLE          hRes;
                     65:     HANDLE          hFontRes;
                     66:     PWSTR           pwstrFontName;
                     67:     int             iTTFont, iDevFont;
                     68:     WCHAR           wstrTTFont[MAX_FONTNAME], wstrDevFont[MAX_FONTNAME];
                     69:     PWSTR           pwstrTTFont, pwstrDevFont;
                     70:     WCHAR           wcbuf[MAX_FONTNAME];
                     71:     int             cTTFonts;
                     72:     DWORD           cb, dwType, cbTable;
                     73:     PRINTDATA      *pdata;
                     74:     WCHAR          *pbuf;
                     75:     WCHAR          *pbufsave;
                     76:     BOOL            bFound;
                     77: 
                     78:     switch(usMsg)
                     79:     {
                     80:         case WM_INITDIALOG:
                     81:             // get a local pointer to our PRINTER handle.
                     82: 
                     83:             pdata = (PRINTDATA *)lParam;
                     84:             hPrinter = pdata->hPrinter;
                     85: 
                     86:             // save the PRINTDATA.
                     87: 
                     88:             SetWindowLong(hwnd, GWL_USERDATA, lParam);
                     89: 
                     90:             // get the current DC so we can enumerate the TrueType fonts.
                     91: 
                     92:             hdc = GetDC(hwnd);
                     93: 
                     94:             // now enumerate the TrueType fonts, inserting them into the
                     95:             // appropriate list box.
                     96: 
                     97:             EnumData.hwnd = hwnd;
                     98:             EnumData.hdc = hdc;
                     99: 
                    100:             EnumFonts(hdc, (LPCWSTR)NULL, (FONTENUMPROC)iFontCallback, (LPARAM)&EnumData);
                    101: 
                    102:             // release the current DC.
                    103: 
                    104:             ReleaseDC(hwnd, hdc);
                    105: 
                    106:             // get a pointer to the current NTPD structure, from which we
                    107:             // can get the list of printer fonts supported.
                    108: 
                    109:             pntpd = MapPrinter(hPrinter);
                    110: 
                    111:             if (!pntpd)
                    112:             {
                    113:                 RIP("PSCRPTUI!TTFontDialogProc: MapPrinter Failed.\n");
                    114:                 return(FALSE);
                    115:             }
                    116: 
                    117:             // get a pointer to the fonts for the current device.
                    118: 
                    119:             pfont = (BYTE *)pntpd + pntpd->loFonts;
                    120: 
                    121:             for (i = 0; i < (DWORD)pntpd->cFonts; i++)
                    122:             {
                    123:                 iFont = (DWORD)pfont[i];
                    124: 
                    125:                 // find the font resource in question.
                    126: 
                    127:                 if (!(hRes = FindResource(hModule, MAKEINTRESOURCE(iFont),
                    128:                                          MAKEINTRESOURCE(MYFONT))))
                    129:                 {
                    130:                     RIP("PSCRPTUI!TTFontDialogProc: Couldn't find font resource\n");
                    131:                     return(FALSE);
                    132:                 }
                    133: 
                    134:                 // get the handle to the resource.
                    135: 
                    136:                 if (!(hFontRes = LoadResource(hModule, hRes)))
                    137:                 {
                    138:                     RIP("PSCRPTUI!TTFontDialogProc: LoadResource failed.\n");
                    139:                     return(FALSE);
                    140:                 }
                    141: 
                    142:                 // get a pointer to the resource data.
                    143: 
                    144:                 if (!(pntfm = (PNTFM)LockResource(hFontRes)))
                    145:                 {
                    146:                     RIP("PSCRPTUI!TTFontDialogProc: LockResource failed.\n");
                    147:                     FreeResource(hFontRes);
                    148:                     return(FALSE);
                    149:                 }
                    150: 
                    151:                 // get the name of the font.  this is what we will
                    152:                 // insert into the printer font list box.
                    153: 
                    154:                 pwstrFontName = wcbuf;
                    155:                 strcpy2WChar(pwstrFontName, (PSTR)pntfm + pntfm->loszFontName);
                    156: 
                    157:                 rc = SendDlgItemMessage(hwnd, IDD_PRINTER_FONT_LIST_BOX,
                    158:                                         LB_ADDSTRING, (WPARAM)0,
                    159:                                         (LPARAM)pwstrFontName);
                    160: 
                    161:                 if (rc == LB_ERR)
                    162:                 {
                    163:                     RIP("PSCRPTUI!TTFontDialogProc: LB_INSERTSTRING failed.\n");
                    164:                     UnlockResource(hFontRes);
                    165:                     FreeResource(hFontRes);
                    166:                     return(FALSE);
                    167:                 }
                    168: 
                    169:                 // free up the font resource.
                    170: 
                    171:                 UnlockResource(hFontRes);
                    172:                 FreeResource(hFontRes);
                    173:             }
                    174: 
                    175:             // free up the NTPD structure.
                    176: 
                    177:             if (pntpd)
                    178:                 GlobalFree((HGLOBAL)pntpd);
                    179: 
                    180:             // insert 'Download as Soft Font' as first entry in printer font
                    181:             // list box.
                    182: 
                    183:             LoadString(hModule, (IDS_DOWNLOAD_SOFTFONT + STRING_BASE),
                    184:                        wcbuf, (sizeof(wcbuf) / 2));
                    185: 
                    186:             rc = SendDlgItemMessage(hwnd, IDD_PRINTER_FONT_LIST_BOX,
                    187:                                     LB_INSERTSTRING, (WPARAM)0,
                    188:                                     (LPARAM)wcbuf);
                    189: 
                    190:             if (rc == LB_ERR)
                    191:             {
                    192:                 RIP("PSCRPTUI:TTFontDialogProc: 2nd LB_INSERTSTRING failed.\n");
                    193:                 return(FALSE);
                    194:             }
                    195: 
                    196:             if (!SetDefaultTTMappings(hwnd))
                    197:             {
                    198:                 RIP("PSCRPTUI!TTFontDialogProc: SetDefaultTTMappings failed.\n");
                    199:                 return(FALSE);
                    200:             }
                    201: 
                    202:             pwstrTTFont = wstrTTFont;
                    203:             pwstrDevFont = wstrDevFont;
                    204: 
                    205:             // now get the count of TrueType fonts in the list box.
                    206: 
                    207:             cTTFonts = SendDlgItemMessage(hwnd, IDD_TTFONT_LIST_BOX,
                    208:                                           LB_GETCOUNT, (WPARAM)0,
                    209:                                           (LPARAM)0);
                    210: 
                    211:             // see if the font substitution table has been written to the
                    212:             // registry.  the list boxes are currently set for the default,
                    213:             // so if the table is not there, leave the list boxes as is.
                    214: 
                    215:             LoadString(hModule, (IDS_FONT_SUBST_SIZE + STRING_BASE),
                    216:                       wcbuf, (sizeof(wcbuf) / sizeof(wcbuf[0])));
                    217: 
                    218:             rc = GetPrinterData(hPrinter, wcbuf, (DWORD *)&dwType,
                    219:                                 (LPBYTE)&cbTable, sizeof(cbTable), &cb);
                    220: 
                    221:             if ((rc == ERROR_SUCCESS) && (cbTable) && (cTTFonts))
                    222:             {
                    223:                 // create a buffer to read the substitution table into,
                    224:                 // then read it from the registry into the buffer.
                    225: 
                    226:                 // allocate buffer.
                    227: 
                    228:                 if (!(pbuf = (WCHAR *)GlobalAlloc(GMEM_FIXED |
                    229:                                                   GMEM_ZEROINIT, cbTable)))
                    230:                 {
                    231:                     RIP("PSCRPTUI!TTFontDialogProc: GlobalAlloc pbuf failed.\n");
                    232:                     return(FALSE);
                    233:                 }
                    234: 
                    235:                 pbufsave = pbuf;
                    236: 
                    237:                 // now copy the table to our buffer.
                    238: 
                    239:                 LoadString(hModule, (IDS_FONT_SUBST_TABLE + STRING_BASE),
                    240:                           wcbuf, (sizeof(wcbuf) / sizeof(wcbuf[0])));
                    241: 
                    242:                 rc = GetPrinterData(hPrinter, wcbuf, (DWORD *)&dwType,
                    243:                                     (LPBYTE)pbuf, cbTable, &cb);
                    244: 
                    245:                 // force the defaults.
                    246: 
                    247:                 if (rc == ERROR_SUCCESS)
                    248:                 {
                    249:                     // run through the entire list of TrueType fonts in
                    250:                     // the TT font list box.  get the TT font pairs that
                    251:                     // exist in the registry.
                    252: 
                    253:                     for (iTTFont = 0; iTTFont < cTTFonts; iTTFont++)
                    254:                     {
                    255:                         // get the name of the TT font.
                    256: 
                    257:                         rc = SendDlgItemMessage(hwnd, IDD_TTFONT_LIST_BOX,
                    258:                                                LB_GETTEXT, (WPARAM)iTTFont,
                    259:                                                (LPARAM)pwstrTTFont);
                    260: 
                    261:                         if (rc == LB_ERR)
                    262:                         {
                    263:                             RIP("PSCRPTUI!TTFontDialogProc: LB_GETTEXT failed.\n");
                    264:                             return(FALSE);
                    265:                         }
                    266: 
                    267:                         // now search the font substitution table for a matching TrueType font.
                    268:                         // the substitution table is in the following format:  a NULL terminated
                    269:                         // UNICODE TrueType font name followed by the matching NULL terminated
                    270:                         // device font name.  this sequence is repeated until a double NULL
                    271:                         // terminator ends the table.
                    272: 
                    273:                         pbuf = pbufsave;
                    274:                         bFound = FALSE;
                    275: 
                    276:                         while (*pbuf)
                    277:                         {
                    278:                             if (!(wcscmp(pbuf, pwstrTTFont)))
                    279:                             {
                    280:                                 // we found the TrueType font, now get the matching device font.
                    281: 
                    282:                                 pbuf += (wcslen(pbuf) + 1);
                    283:                                 wcsncpy(wstrDevFont, pbuf,
                    284:                                         (sizeof(wstrDevFont) / sizeof(wstrDevFont[0])));
                    285:                                 bFound = TRUE;
                    286:                                 break;
                    287:                             }
                    288:                             else
                    289:                             {
                    290:                                 // this was not the font in question.  skip over both font names.
                    291: 
                    292:                                 pbuf += (wcslen(pbuf) + 1);
                    293:                                 pbuf += (wcslen(pbuf) + 1);
                    294:                             }
                    295:                         }
                    296: 
                    297:                         // if we could not get a corresponding device font for
                    298:                         // any reason, ignore it.  the default device font will
                    299:                         // be set for this TrueType font.
                    300: 
                    301:                         if (!bFound)
                    302:                             break;
                    303: 
                    304:                         // find the index into the printer font list box
                    305:                         // of the corresponding printer font.
                    306: 
                    307:                         rc = SendDlgItemMessage(hwnd, IDD_PRINTER_FONT_LIST_BOX,
                    308:                                                 LB_FINDSTRING, (WPARAM)-1,
                    309:                                                 (LPARAM)pwstrDevFont);
                    310: 
                    311:                         if (rc != LB_ERR)
                    312:                             SendDlgItemMessage(hwnd, IDD_TTFONT_LIST_BOX,
                    313:                                                LB_SETITEMDATA, (WPARAM)iTTFont,
                    314:                                                (LPARAM)rc);
                    315:                     }
                    316:                 }
                    317:             }
                    318: 
                    319:             GlobalFree((HGLOBAL)pbufsave);
                    320: 
                    321:             // select the first item in the truetype fonts list box, then
                    322:             // select the corresponding item in the printer fonts list box.
                    323: 
                    324:             SendDlgItemMessage(hwnd, IDD_TTFONT_LIST_BOX, LB_SETCURSEL,
                    325:                                (WPARAM)0, (LPARAM)0);
                    326: 
                    327:             rc = SendDlgItemMessage(hwnd, IDD_TTFONT_LIST_BOX, LB_GETITEMDATA,
                    328:                                     (WPARAM)0, (LPARAM)0);
                    329: 
                    330:             SendDlgItemMessage(hwnd, IDD_PRINTER_FONT_LIST_BOX, LB_SETCURSEL,
                    331:                                (WPARAM)rc, (LPARAM)0);
                    332: 
                    333:             // intialize the help stuff.
                    334: 
                    335:             vHelpInit();
                    336: 
                    337:             // disable some stuff if the user does not have permission to
                    338:             // change anything.
                    339: 
                    340:             if (!pdata->bPermission)
                    341:             {
                    342:                 EnableWindow(GetDlgItem(hwnd, IDD_PRINTER_FONT_LIST_BOX), FALSE);
                    343:                 EnableWindow(GetDlgItem(hwnd, IDD_TT_DEFAULT_PUSH_BUTTON), FALSE);
                    344:             }
                    345: 
                    346:             return(TRUE);
                    347: 
                    348:         case WM_COMMAND:
                    349:             pdata = (PRINTDATA *)GetWindowLong(hwnd, GWL_USERDATA);
                    350: 
                    351:             switch(LOWORD(wParam))
                    352:             {
                    353:                 case IDOK:
                    354:                     // first write out the number of TT fonts we need to
                    355:                     // deal with.
                    356: 
                    357:                     cTTFonts = SendDlgItemMessage(hwnd, IDD_TTFONT_LIST_BOX,
                    358:                                                   LB_GETCOUNT, (WPARAM)0,
                    359:                                                   (LPARAM)0);
                    360: 
                    361:                     if (cTTFonts == LB_ERR)
                    362:                     {
                    363:                         EndDialog (hwnd, IDOK);
                    364:                         return(TRUE);
                    365:                     }
                    366: 
                    367:                     pwstrTTFont = wstrTTFont;
                    368:                     pwstrDevFont = wstrDevFont;
                    369: 
                    370:                     // run through the entire list of TrueType fonts in
                    371:                     // the TT font list box.  get the TT font name, and
                    372:                     // the corresponding device font name.  determine
                    373:                     // how large a buffer we need to allocate for our
                    374:                     // font substitution table.
                    375: 
                    376:                     // allow room for the double NULL terminator.
                    377: 
                    378:                     cb = 1;
                    379: 
                    380:                     for (iTTFont = 0; iTTFont < cTTFonts; iTTFont++)
                    381:                     {
                    382:                         // get the name of the TT font.
                    383: 
                    384:                         rc = SendDlgItemMessage(hwnd, IDD_TTFONT_LIST_BOX,
                    385:                                                LB_GETTEXT, (WPARAM)iTTFont,
                    386:                                                (LPARAM)pwstrTTFont);
                    387: 
                    388:                         if (rc == LB_ERR)
                    389:                         {
                    390:                             RIP("PSCRPTUI!TTFontDialogProc: LB_GETTEXT failed.\n");
                    391:                             return(FALSE);
                    392:                         }
                    393: 
                    394:                         // get the index of the corresponding printer font.
                    395: 
                    396:                         iDevFont = SendDlgItemMessage(hwnd, IDD_TTFONT_LIST_BOX,
                    397:                                                 LB_GETITEMDATA, (WPARAM)iTTFont,
                    398:                                                 (LPARAM)0);
                    399: 
                    400:                         if (iDevFont == LB_ERR)
                    401:                         {
                    402:                             RIP("PSCRPTUI!IDOK: LB_GETITEMDATA failed.\n");
                    403:                             return(FALSE);
                    404:                         }
                    405: 
                    406:                         // get the name of the corresponding printer font, if there is
                    407:                         // one.
                    408: 
                    409:                         rc = SendDlgItemMessage(hwnd, IDD_PRINTER_FONT_LIST_BOX,
                    410:                                                 LB_GETTEXT, (WPARAM)iDevFont,
                    411:                                                 (LPARAM)pwstrDevFont);
                    412:                         if (rc == LB_ERR)
                    413:                         {
                    414:                             RIP("PSCRPTUI!TTFontDialogProc: LB_GETTEXT failed.\n");
                    415:                             return(FALSE);
                    416:                         }
                    417: 
                    418:                         cb += (wcslen(pwstrTTFont) + 1);
                    419:                         cb += (wcslen(pwstrDevFont) + 1);
                    420:                     }
                    421: 
                    422:                     cb *= sizeof(WCHAR);
                    423: 
                    424:                     // allocate buffer.
                    425: 
                    426:                     if (!(pbuf = (WCHAR *)GlobalAlloc(GMEM_FIXED |
                    427:                                                       GMEM_ZEROINIT, cb)))
                    428:                     {
                    429:                         RIP("PSCRPTUI!TTFontDialogProc: GlobalAlloc pbuf failed.\n");
                    430:                         return(FALSE);
                    431:                     }
                    432: 
                    433:                     pbufsave = pbuf;
                    434: 
                    435:                     // run through the entire list of TrueType fonts in
                    436:                     // the TT font list box.  get the TT font name, and
                    437:                     // the corresponding device font name.  write out the
                    438:                     // font substitution table in the following form:
                    439:                     // a NULL terminated UNICODE TrueType font name followed
                    440:                     // by the matching NULL terminated device font name.
                    441:                     // this sequence is repeated until a double NULL
                    442:                     // terminator ends the table.
                    443: 
                    444:                     for (iTTFont = 0; iTTFont < cTTFonts; iTTFont++)
                    445:                     {
                    446:                         // get the name of the TT font.
                    447: 
                    448:                         rc = SendDlgItemMessage(hwnd, IDD_TTFONT_LIST_BOX,
                    449:                                                LB_GETTEXT, (WPARAM)iTTFont,
                    450:                                                (LPARAM)pwstrTTFont);
                    451: 
                    452:                         if (rc == LB_ERR)
                    453:                         {
                    454:                             RIP("PSCRPTUI!TTFontDialogProc: LB_GETTEXT failed.\n");
                    455:                             return(FALSE);
                    456:                         }
                    457: 
                    458:                         // get the index of the corresponding printer font.
                    459: 
                    460:                         iDevFont = SendDlgItemMessage(hwnd, IDD_TTFONT_LIST_BOX,
                    461:                                                 LB_GETITEMDATA, (WPARAM)iTTFont,
                    462:                                                 (LPARAM)0);
                    463: 
                    464:                         if (iDevFont == LB_ERR)
                    465:                         {
                    466:                             RIP("PSCRPTUI!IDOK: LB_GETITEMDATA failed.\n");
                    467:                             return(FALSE);
                    468:                         }
                    469: 
                    470:                         // get the name of the corresponding printer font, if there is
                    471:                         // one.
                    472: 
                    473:                         rc = SendDlgItemMessage(hwnd, IDD_PRINTER_FONT_LIST_BOX,
                    474:                                                 LB_GETTEXT, (WPARAM)iDevFont,
                    475:                                                 (LPARAM)pwstrDevFont);
                    476:                         if (rc == LB_ERR)
                    477:                         {
                    478:                             RIP("PSCRPTUI!TTFontDialogProc: LB_GETTEXT failed.\n");
                    479:                             return(FALSE);
                    480:                         }
                    481: 
                    482:                         wcscpy(pbuf, pwstrTTFont);
                    483:                         pbuf += (wcslen(pwstrTTFont) + 1);
                    484: 
                    485:                         wcscpy(pbuf, pwstrDevFont);
                    486:                         pbuf += (wcslen(pwstrDevFont) + 1);
                    487:                     }
                    488: 
                    489:                     // add the double NULL terminator.
                    490: 
                    491:                     *pbuf = (WCHAR)'\0';
                    492: 
                    493:                     // write out size of mapping table to registry.
                    494: 
                    495:                     LoadString(hModule, (IDS_FONT_SUBST_SIZE + STRING_BASE),
                    496:                               wcbuf, (sizeof(wcbuf) / sizeof(wcbuf[0])));
                    497: 
                    498:                     SetPrinterData(pdata->hPrinter, wcbuf, REG_DWORD,
                    499:                                    (LPBYTE)&cb, sizeof(cb));
                    500: 
                    501:                     // write out the mapping table itself to the registry.
                    502: 
                    503:                     LoadString(hModule, (IDS_FONT_SUBST_TABLE + STRING_BASE),
                    504:                               wcbuf, (sizeof(wcbuf) / sizeof(wcbuf[0])));
                    505: 
                    506:                     SetPrinterData(pdata->hPrinter, wcbuf, REG_BINARY,
                    507:                                    (LPBYTE)pbufsave, cb);
                    508: 
                    509:                     GlobalFree((HGLOBAL)pbufsave);
                    510: 
                    511:                     EndDialog (hwnd, IDOK);
                    512:                     return(TRUE);
                    513: 
                    514:                 case IDCANCEL:
                    515:                     EndDialog (hwnd, IDCANCEL);
                    516:                     return(TRUE);
                    517: 
                    518:                 case IDD_TT_DEFAULT_PUSH_BUTTON:
                    519:                     // reset the default font mappings.
                    520: 
                    521:                     SetDefaultTTMappings(hwnd);
                    522: 
                    523:                     // find the currently selected TT font, and select the
                    524:                     // corresponding default printer font.
                    525: 
                    526:                     iTTFont = SendDlgItemMessage(hwnd, IDD_TTFONT_LIST_BOX,
                    527:                                                   LB_GETCURSEL, (WPARAM)0,
                    528:                                                   (LPARAM)0);
                    529: 
                    530:                     // select the first TT font if there was a problem.
                    531: 
                    532:                     if (iTTFont == LB_ERR)
                    533:                         iTTFont = 0;
                    534: 
                    535:                     iDevFont = TTToDefaultPF(hwnd, iTTFont);
                    536: 
                    537:                     if (iDevFont == -1)
                    538:                     {
                    539:                         RIP("PSCRPTUI!IDD_DEFAULT_PUSH_BUTTON: TTToDefaultPF failed.\n");
                    540:                         return(FALSE);
                    541:                     }
                    542: 
                    543:                     SendDlgItemMessage(hwnd, IDD_PRINTER_FONT_LIST_BOX,
                    544:                                        LB_SETCURSEL, (WPARAM)iDevFont, (LPARAM)0);
                    545: 
                    546:                     return(TRUE);
                    547: 
                    548:                 case IDD_HELP_BUTTON:
                    549:                     vShowHelp(hwnd, HELP_CONTEXT, HLP_FONT_SUBST,
                    550:                               pdata->hPrinter);
                    551:                     return(TRUE);
                    552: 
                    553:                 case IDD_TTFONT_LIST_BOX:
                    554:                     if (HIWORD (wParam) != LBN_SELCHANGE)
                    555:                         return (FALSE);
                    556: 
                    557:                     // find the currently selected TT font, and select the
                    558:                     // corresponding default printer font.
                    559: 
                    560:                     iTTFont = SendDlgItemMessage(hwnd, IDD_TTFONT_LIST_BOX,
                    561:                                                   LB_GETCURSEL, (WPARAM)0,
                    562:                                                   (LPARAM)0);
                    563: 
                    564:                     // do nothing if nothing was selected.
                    565: 
                    566:                     if (iTTFont == LB_ERR)
                    567:                         return(FALSE);
                    568: 
                    569:                     // get the index of the corresponding printer font.
                    570: 
                    571:                     iDevFont = SendDlgItemMessage(hwnd, IDD_TTFONT_LIST_BOX,
                    572:                                             LB_GETITEMDATA, (WPARAM)iTTFont,
                    573:                                             (LPARAM)0);
                    574: 
                    575:                     if (iDevFont == LB_ERR)
                    576:                     {
                    577:                         RIP("PSCRPTUI!IDD_TTFONT_LIST_BOX: LB_GETITEMDATA failed.\n");
                    578:                         return(FALSE);
                    579:                     }
                    580: 
                    581:                     SendDlgItemMessage(hwnd, IDD_PRINTER_FONT_LIST_BOX,
                    582:                                        LB_SETCURSEL, (WPARAM)iDevFont, (LPARAM)0);
                    583: 
                    584:                     return(TRUE);
                    585: 
                    586:                 case IDD_PRINTER_FONT_LIST_BOX:
                    587:                     if (HIWORD (wParam) != LBN_SELCHANGE)
                    588:                         return (FALSE);
                    589: 
                    590:                     // set the item data for the currently selected TT font
                    591:                     // equal to the index of the currently selected printer
                    592:                     // font.
                    593: 
                    594:                     iTTFont = SendDlgItemMessage(hwnd, IDD_TTFONT_LIST_BOX,
                    595:                                                   LB_GETCURSEL, (WPARAM)0,
                    596:                                                   (LPARAM)0);
                    597: 
                    598:                     iDevFont = SendDlgItemMessage(hwnd, IDD_PRINTER_FONT_LIST_BOX,
                    599:                                                   LB_GETCURSEL, (WPARAM)0,
                    600:                                                   (LPARAM)0);
                    601: 
                    602:                     SendDlgItemMessage(hwnd, IDD_TTFONT_LIST_BOX,
                    603:                                        LB_SETITEMDATA, (WPARAM)iTTFont,
                    604:                                        (LPARAM)iDevFont);
                    605: 
                    606:                     return(TRUE);
                    607: 
                    608:                 default:
                    609:                     return(FALSE);
                    610:             }
                    611: 
                    612:             break;
                    613: 
                    614:         case WM_DESTROY:
                    615:             // clean up any used help stuff.
                    616: 
                    617:             vHelpDone(hwnd);
                    618:             return (TRUE);
                    619: 
                    620:         default:
                    621:             return (FALSE);
                    622:     }
                    623: 
                    624:     return (FALSE);
                    625: }
                    626: 
                    627: 
                    628: //--------------------------------------------------------------------------
                    629: // int iFontCallback (plf, ptm, ulFontType, pEnumData)
                    630: // PLOGFONT     plf;
                    631: // PTEXTMETRIC  ptm;
                    632: // ULONG        ulFontType;
                    633: // PENUMDATA    pEnumData;
                    634: //
                    635: // This function Enumerates the fonts for a given DC.
                    636: //
                    637: // Returns:
                    638: //   This routine returns the value returned by iFaceCallBack.
                    639: //
                    640: // History:
                    641: //   12-Feb-1992       -by-    Kent Settle     (kentse)
                    642: // Wrote it.
                    643: //--------------------------------------------------------------------------
                    644: 
                    645: int iFontCallback (plf, ptm, ulFontType, pEnumData)
                    646: PLOGFONT    plf;
                    647: PTEXTMETRIC ptm;
                    648: ULONG      ulFontType;
                    649: PENUMDATA   pEnumData;
                    650: {
                    651:     UNREFERENCED_PARAMETER (ptm);
                    652: 
                    653:     // we only care about the TrueType fonts.
                    654: 
                    655:     if (!(ulFontType & TRUETYPE_FONTTYPE))
                    656:         return(1);
                    657: 
                    658:     // enumerate all the face names within this family.
                    659: 
                    660:     return (EnumFonts(pEnumData->hdc, (LPCWSTR)plf->lfFaceName,
                    661:                       (FONTENUMPROC)iFaceCallback,
                    662:                       (LPARAM)pEnumData));
                    663: }
                    664: 
                    665: 
                    666: //--------------------------------------------------------------------------
                    667: // int iFaceCallback (plf, ptm, ulFontType, pEnumData)
                    668: // PLOGFONT     plf;
                    669: // PTEXTMETRIC  ptm;
                    670: // ULONG        ulFontType;
                    671: // PENUMDATA    pEnumData;
                    672: //
                    673: // This function Enumerates the fonts for a given DC.
                    674: //
                    675: // Returns:
                    676: //   This routine returns the 1 for success, 0 otherwise.
                    677: //
                    678: // History:
                    679: //   12-Feb-1992       -by-    Kent Settle     (kentse)
                    680: // Wrote it.
                    681: //--------------------------------------------------------------------------
                    682: 
                    683: int iFaceCallback (plf, ptm, ulFontType, pEnumData)
                    684: PLOGFONT    plf;
                    685: PTEXTMETRIC ptm;
                    686: ULONG      ulFontType;
                    687: PENUMDATA   pEnumData;
                    688: {
                    689:     int             rc;
                    690:     ENUMLOGFONT    *pelf;
                    691: 
                    692:     UNREFERENCED_PARAMETER (ptm);
                    693: 
                    694:     // we only care about the TrueType fonts.
                    695: 
                    696:     if (!(ulFontType & TRUETYPE_FONTTYPE))
                    697:         return(1);
                    698: 
                    699:     // we want to access the real font name.
                    700: 
                    701:     pelf = (ENUMLOGFONT *)plf;
                    702: 
                    703:     // insert this font into the listbox.
                    704: 
                    705:     rc = SendDlgItemMessage(pEnumData->hwnd, IDD_TTFONT_LIST_BOX,
                    706:                             LB_ADDSTRING, (WPARAM)0, (LPARAM)pelf->elfFullName);
                    707: 
                    708:     if (rc == LB_ERR)
                    709:     {
                    710:         RIP("PSCRPTUI!iFaceCallBack: LB_ADDSTRING failed.\n");
                    711:         return(0);
                    712:     }
                    713: 
                    714:     return(1);
                    715: }
                    716: 
                    717: 
                    718: //--------------------------------------------------------------------------
                    719: // BOOL SetDefaultTTMappings(hwnd)
                    720: // HWND    hwnd;
                    721: //
                    722: // This function gets each TT family name from the TT font list box, and
                    723: // looks for the corresponding entry in the Printer font list box.  If
                    724: // a printer font is found, the corresponding index into the printer font
                    725: // list box is stored with the TT family name.  Otherwise, zero is stored.
                    726: //
                    727: // Returns:
                    728: //   This routine returns TRUE for success, FALSE otherwise.
                    729: //
                    730: // History:
                    731: //   03-Jun-1992    -by-        Kent Settle     (kentse)
                    732: // Wrote it.
                    733: //--------------------------------------------------------------------------
                    734: 
                    735: BOOL SetDefaultTTMappings(hwnd)
                    736: HWND    hwnd;
                    737: {
                    738:     int     i, rc;
                    739:     int     cTTFonts, cDevFonts;
                    740:     int     PFIndex;
                    741: 
                    742:     // get the count of TrueType family names located in the TrueType
                    743:     // list box.
                    744: 
                    745:     cTTFonts = SendDlgItemMessage(hwnd, IDD_TTFONT_LIST_BOX, LB_GETCOUNT,
                    746:                                 (WPARAM)0, (LPARAM)0);
                    747: 
                    748:     if (cTTFonts == LB_ERR)
                    749:     {
                    750:         RIP("PSCRPTUI!SetDefaultTTMappings: LB_GETCOUNT for TT fonts failed.\n");
                    751:         return(FALSE);
                    752:     }
                    753: 
                    754:     // get the count of device family names located in the printer
                    755:     // font list box.
                    756: 
                    757:     cDevFonts = SendDlgItemMessage(hwnd, IDD_PRINTER_FONT_LIST_BOX,
                    758:                                    LB_GETCOUNT, (WPARAM)0, (LPARAM)0);
                    759: 
                    760:     if (cDevFonts == LB_ERR)
                    761:     {
                    762:         RIP("PSCRPTUI!SetDefaultTTMappings: LB_GETCOUNT for printer fonts failed.\n");
                    763:         return(FALSE);
                    764:     }
                    765: 
                    766:     // for each TrueType family name, locate the corresponding printer
                    767:     // font, if one exists.
                    768: 
                    769:     for (i = 0; i < cTTFonts; i++)
                    770:     {
                    771:         PFIndex = TTToDefaultPF(hwnd, i);
                    772: 
                    773:         if (PFIndex == -1)
                    774:         {
                    775:             RIP("PSCRPTUI!SetDefaultTTMappings: TTToDefaultPF failed.\n");
                    776:             return(FALSE);
                    777:         }
                    778: 
                    779:         // set the item data for the entry in the TT list box equal to
                    780:         // the index of the corresponding printer font.
                    781: 
                    782:         rc = SendDlgItemMessage(hwnd, IDD_TTFONT_LIST_BOX, LB_SETITEMDATA,
                    783:                                 (WPARAM)i, (LPARAM)PFIndex);
                    784:     }
                    785: 
                    786:     return(TRUE);
                    787: }
                    788: 
                    789: 
                    790: //--------------------------------------------------------------------------
                    791: // int TTToDefaultPF(hwnd, iCurrent)
                    792: // HWND    hwnd;
                    793: // int     iCurrent;
                    794: //
                    795: // This function takes an index into the TT font list box for the given
                    796: // TrueType font, and returns the index into the printer font list box
                    797: // of the default printer font.
                    798: //
                    799: // Returns:
                    800: //   This routine returns -1 for failure, otherwise it returns the
                    801: //   index of the printer font into the printer font list box.
                    802: //
                    803: // History:
                    804: //   03-Jun-1992    -by-        Kent Settle     (kentse)
                    805: // Wrote it.
                    806: //--------------------------------------------------------------------------
                    807: 
                    808: int TTToDefaultPF(hwnd, iCurrent)
                    809: HWND    hwnd;
                    810: int     iCurrent;
                    811: {
                    812:     int     rc;
                    813:     WCHAR   buf[64];
                    814:     PWSTR   pwstrDevFont;
                    815:     int     PFIndex;
                    816:     TT_FONT_MAPPING    *pTable;
                    817: 
                    818:     rc = SendDlgItemMessage(hwnd, IDD_TTFONT_LIST_BOX, LB_GETTEXT,
                    819:                             (WPARAM)iCurrent, (LPARAM)buf);
                    820: 
                    821:     if (rc == LB_ERR)
                    822:     {
                    823:         RIP("PSCRPTUI!TTToDefaultPF: LB_GETTEXT failed.\n");
                    824:         return(-1);
                    825:     }
                    826: 
                    827:     // get the corresponding printer font name.
                    828:     // assume no match found.
                    829: 
                    830:     pwstrDevFont = (PWSTR)NULL;
                    831:     pTable = TTFontTable;
                    832: 
                    833:     while (pTable->pwstrTTFont)
                    834:     {
                    835:        if (!wcscmp(buf, pTable->pwstrTTFont))
                    836:             pwstrDevFont = pTable->pwstrDevFont;
                    837: 
                    838:         pTable++;
                    839:     }
                    840: 
                    841:     // if a corresponding printer font name was found, locate it's
                    842:     // index into the printer font list box.  else, set the index
                    843:     // to zero.
                    844: 
                    845:     if (pwstrDevFont)
                    846:     {
                    847:         PFIndex = SendDlgItemMessage(hwnd, IDD_PRINTER_FONT_LIST_BOX,
                    848:                                      LB_FINDSTRING, (WPARAM)-1,
                    849:                                      (LPARAM)pwstrDevFont);
                    850: 
                    851:         if (PFIndex == LB_ERR)
                    852:             PFIndex = 0;
                    853:     }
                    854:     else
                    855:         PFIndex = 0;
                    856: 
                    857:     return(PFIndex);
                    858: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.