Annotation of ntddk/src/print/pscrptui/ttfonts.c, revision 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.