/*++ Copyright (c) 1996-1997 Microsoft Corporation Module Name: ctt2gtt.c Abstract: Environment: Windows NT PostScript driver Revision History: --*/ #include "precomp.h" // // Macros // #define FILENAME_SIZE 256 #define CMD_SIZE 256 DWORD gdwOutputFlags; // // flag definitions for gdwOutputFlags // #define OUTPUT_VERBOSE 0x00000001 // // Local function prototypes // BOOL BiArgcheck(IN int, IN char**, IN OUT PWSTR, IN OUT PWSTR, IN OUT PWSTR); // // Globals // BYTE gcstrError1[] = "Usage: ctt2gtt [-v] CP_file CTT_file GLY_file\n"; BYTE gcstrError2[] = "ctt2gtt: HeapCreate() failed\n."; BYTE gcstrError3[] = "Cannot open file \"%ws\".\n"; BYTE gcstrError4[] = "Cannot create output file '%ws'.\n"; BYTE gcstrError5[] = "Failed to convert CTT to GlyphSetData.\n"; BYTE gcstrError6[] = "WriteFile fails: writes %ld bytes\n"; BYTE gcstrError7[] = "Failure of BGetInfo\n"; PSTR gcstrCTTType[] = { "CTT_WTYPE_COMPOSE", "CTT_WTYPE_DIRECT", "CTT_WTYPE_PAIRED"}; INT __cdecl main( IN INT iArgc, IN CHAR **ppArgv) /*++ Routine Description: main Arguments: iArgc - Number of parameters in the following ppArgv - The parameters, starting with our name Return Value: Return error code Note: --*/ { HANDLE hHeap; // Acces to heap, to simulate driver environment HANDLE hOutput; PWSTR pwstrCTTName; // The file name being processed PWSTR pwstrGlyName; // The output file PWSTR pwstrCPTName; // The Codepage info text WCHAR awchCTTName[FILENAME_SIZE]; // The file name being processed WCHAR awchGlyName[FILENAME_SIZE]; // The output file WCHAR awchCPTName[FILENAME_SIZE]; // The Codepage info text BYTE aubSelectCmd[CMD_SIZE]; BYTE aubUnSelectCmd[CMD_SIZE]; PBYTE pubSelectCmd, pubUnSelectCmd; BYTE aubFormatCmd[256]; PBYTE pCommand; WORD wSize, wJ; PTRANSTAB pCTTData; DWORD dwCTTSize; PUNI_GLYPHSETDATA pGlyphSetData; DWORD dwGlySize; DWORD dwCodePage; PBYTE pCPText; DWORD dwCPTextSize; DWORD dwWrittenSize; // Returned size from WriteFile HFILEMAP hCTTFile, hCPText, hGlyphFile; pwstrCTTName = awchCTTName; pwstrGlyName = awchGlyName; pwstrCPTName = awchCPTName; if (!BiArgcheck(iArgc, ppArgv, pwstrCPTName, pwstrCTTName, pwstrGlyName)) { fprintf( stderr, gcstrError1); return -1; } if (gdwOutputFlags & OUTPUT_VERBOSE) { printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"); printf(" GlyphSetData\n"); printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"); printf("\n"); printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"); printf("CODEPAGEINFO file\n"); printf("Codepage info text file: %ws\n", pwstrCPTName); printf("CTT file : %ws\n", pwstrCTTName); printf("Glyphset data : %ws\n", pwstrGlyName); } hCPText = MapFileIntoMemory( (PWSTR)pwstrCPTName, (PVOID)&pCPText, &dwCPTextSize ); if (!hCPText) { fprintf( stderr, gcstrError3, pwstrCPTName); return -2; } pubSelectCmd = aubSelectCmd; pubUnSelectCmd = aubUnSelectCmd; if (!BGetInfo(pCPText, dwCPTextSize, &dwCodePage, pubSelectCmd, pubUnSelectCmd)) { return -2; } if (gdwOutputFlags & OUTPUT_VERBOSE) { printf("\n"); printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"); printf("CODEPAGE\n"); printf ("Codepage: %d\n : %s\n : %s\n", dwCodePage, pubSelectCmd, pubUnSelectCmd); } if (*pubSelectCmd == (BYTE)NULL) pubSelectCmd = NULL; if (*pubUnSelectCmd == (BYTE)NULL) pubUnSelectCmd = NULL; UnmapFileFromMemory(hCPText); hHeap = HeapCreate( HEAP_NO_SERIALIZE, 0x10000, 0x100000 ); if (!hHeap) { fprintf( stderr, gcstrError2); return -2; } hCTTFile = MapFileIntoMemory( (PTSTR)pwstrCTTName, (PVOID)&pCTTData, &dwCTTSize ); if (!pCTTData || dwCTTSize == 0) { fprintf( stderr, gcstrError3, pwstrCTTName); return -2; } if (gdwOutputFlags & OUTPUT_VERBOSE) { printf("\n"); printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"); printf("CTT FILE INFORMATION\n"); printf( "Type: %s\nFirst Char = 0x%x\nLast Char = 0x%x\n", gcstrCTTType[ pCTTData->wType ], pCTTData->chFirstChar, pCTTData->chLastChar ); } hGlyphFile = MapFileIntoMemory( (PTSTR)pwstrGlyName, (PVOID)&pGlyphSetData, &dwGlySize ); if (!hGlyphFile) { pGlyphSetData = NULL; dwGlySize = 0; } if (!BConvertCTT2GTT( hHeap, pCTTData, dwCodePage, 0x20, 0xFF, pubSelectCmd, pubUnSelectCmd, &pGlyphSetData, dwGlySize)) { fprintf( stderr, gcstrError5); return -3; } if (gdwOutputFlags & OUTPUT_VERBOSE) { PUNI_CODEPAGEINFO pCodePageInfo; PGLYPHRUN pGlyphRun; PMAPTABLE pMapTable; TRANSDATA *pTrans; DWORD dwI; printf("\n"); printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"); printf("GLYPHSETDATA\n"); printf ("GLYPHSETDATA.dwSize : %d\n", pGlyphSetData->dwSize); printf (" dwVersion : %d\n", pGlyphSetData->dwVersion); printf (" dwFlags : %d\n", pGlyphSetData->dwFlags); printf (" lPredefinedID : %d\n", pGlyphSetData->lPredefinedID); printf (" dwGlyphCount : %d\n", pGlyphSetData->dwGlyphCount); printf (" loRunOffset : 0x%x\n", pGlyphSetData->loRunOffset); printf (" dwRunCount : %d\n", pGlyphSetData->dwRunCount); printf (" dwCodePageCount : 0x%d\n", pGlyphSetData->dwCodePageCount); printf (" loCodePageOffset : 0x%x\n", pGlyphSetData->loCodePageOffset); printf (" loMapTableOffset : 0x%x\n", pGlyphSetData->loMapTableOffset); printf("\n"); pCodePageInfo = (PUNI_CODEPAGEINFO)((PBYTE) pGlyphSetData + pGlyphSetData->loCodePageOffset); printf("\n"); printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"); printf("CODEPAGEINFO\n"); for (dwI = 0; dwI < pGlyphSetData->dwCodePageCount; dwI ++) { printf ("UNI_CODEPAGEINFO[%d].dwCodePage = %d\n", dwI, pCodePageInfo->dwCodePage); printf ("UNI_CODEPAGEINFO[%d].SelectSymbolSet.dwCount = %d\n", dwI, pCodePageInfo->SelectSymbolSet.dwCount); printf ("UNI_CODEPAGEINFO[%d].SelectSymbolSet:Command = %s\n", dwI, (PBYTE)pCodePageInfo+pCodePageInfo->SelectSymbolSet.loOffset); printf ("UNI_CODEPAGEINFO[%d].UnSelectSymbolSet.dwCount = %d\n", dwI, pCodePageInfo->UnSelectSymbolSet.dwCount); printf ("UNI_CODEPAGEINFO[%d].UnSelectSymbolSet:Command = %s\n", dwI, (PBYTE)pCodePageInfo+pCodePageInfo->UnSelectSymbolSet.loOffset); pCodePageInfo++; } pGlyphRun = (PGLYPHRUN) ((PBYTE)pGlyphSetData + pGlyphSetData->loRunOffset); printf("\n"); printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"); printf("GLYPHRUN\n"); for (dwI = 0; dwI < pGlyphSetData->dwRunCount; dwI ++) { printf("GLYPHRUN[%2d].wcLow = 0x%-4x\n", dwI, pGlyphRun->wcLow); printf("GLYPHRUN[%2d].wGlyphCount = %d\n", dwI, pGlyphRun->wGlyphCount); pGlyphRun++; } pMapTable = (PMAPTABLE) ((PBYTE)pGlyphSetData + pGlyphSetData->loMapTableOffset); pTrans = pMapTable->Trans; printf("\n"); printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"); printf("MAPTABLE\n"); printf("MAPTABLE.dwSize = %d\n", pMapTable->dwSize); printf("MAPTABLE.dwGlyphNum = %d\n", pMapTable->dwGlyphNum); for (dwI = 0; dwI < pMapTable->dwGlyphNum; dwI ++) { printf("MAPTABLE.pTrans[%5d].ubCodePageID = %d\n", dwI, pTrans[dwI].ubCodePageID); printf("MAPTABLE.pTrans[%5d].ubType = %d\n", dwI, pTrans[dwI].ubType); switch(pTrans[dwI].ubType) { case MTYPE_DIRECT: printf("MAPTABLE.pTrans[%5d].ubCode = %d\n", dwI+1, pTrans[dwI].uCode.ubCode); break; case MTYPE_PAIRED: printf("MAPTABLE.pTrans[%5d].ubPairs[0] = %d\n", dwI+1, pTrans[dwI].uCode.ubPairs[0]); printf("MAPTABLE.pTrans[%5d].ubPairs[1] = %d\n", dwI+1, pTrans[dwI].uCode.ubPairs[1]); break; case MTYPE_COMPOSE: printf("MAPTABLE.pTrans[%5d].sCode = %x\n", dwI+1, pTrans[dwI].uCode.sCode); pCommand = (PBYTE)pMapTable + pTrans[dwI].uCode.sCode; wSize = *(WORD*)pCommand; pCommand += 2; printf("Size = 0x%d\n", wSize); printf("Command = 0x"); for (wJ = 0; wJ < wSize; wJ ++) { printf("%02x",pCommand[wJ]); } printf("\n"); break; } } } UnmapFileFromMemory(hCTTFile); hOutput = CreateFile(pwstrGlyName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); if( hOutput == INVALID_HANDLE_VALUE ) { fprintf( stderr, gcstrError4, pwstrGlyName); return -2; } WriteFile( hOutput, pGlyphSetData, pGlyphSetData->dwSize, &dwWrittenSize, NULL ); if( dwWrittenSize != pGlyphSetData->dwSize) { fprintf( stderr, gcstrError6, dwWrittenSize); return -4; } HeapDestroy(hHeap); return 0; } BOOL BiArgcheck( IN INT iArgc, IN CHAR **ppArgv, IN OUT PWSTR pwstrCPTName, IN OUT PWSTR pwstrCTTName, IN OUT PWSTR pwstrGlyName) /*++ Routine Description: iArgcheck Arguments: iArgc - Number of parameters in the following ppArgv - The parameters, starting with our name pwstrCPTName - pwstrCTTName - pwstrGlyName - Return Value: If TRUE, function succeeded. Othewise FALSE. Note: --*/ { INT iI; INT iRet; if (iArgc > 5 || iArgc < 4) { return FALSE; } if (iArgc == 5) { gdwOutputFlags |= OUTPUT_VERBOSE; ppArgv++; } ppArgv++; iRet = MultiByteToWideChar(CP_ACP, 0, *ppArgv, strlen(*ppArgv), pwstrCPTName, FILENAME_SIZE); *(pwstrCPTName + iRet) = (WCHAR)NULL; ppArgv++; iRet = MultiByteToWideChar(CP_ACP, 0, *ppArgv, strlen(*ppArgv), pwstrCTTName, FILENAME_SIZE); *(pwstrCTTName + iRet) = (WCHAR)NULL; ppArgv++; iRet = MultiByteToWideChar(CP_ACP, 0, *ppArgv, strlen(*ppArgv), pwstrGlyName, FILENAME_SIZE); *(pwstrGlyName + iRet) = (WCHAR)NULL; return TRUE; }