/* clear the 'embedding' bit in a TrueType font */ #include #include #include #include int GetD(unsigned char* buffer, int offset) { union { unsigned char c[4]; int x; } u; buffer += offset; for (int i = 0; i < 4; i++) u.c[i] = buffer[3 - i]; return u.x; } void SetD(unsigned char* buffer, int offset, int value) { *(int *)&buffer[offset] = GetD((unsigned char *)&value, 0); } int Get(unsigned char* buffer, int offset) { union { unsigned char c[2]; unsigned short x; } u; buffer += offset; u.c[0] = buffer[1]; u.c[1] = buffer[0]; return (int)u.x; } int CalcTableChecksum(unsigned char* table, int length) { int sum = 0; long* barrier = (long *)&table[length]; long gap = *barrier; *barrier = 0; int len = length; while (len > 0) { sum += GetD(table, 0); table += 4; len -= 4; } *barrier = gap; return sum; } int main(int argc, char* argv[]) { char *filename = argv[1]; HANDLE ttfFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if (ttfFile == INVALID_HANDLE_VALUE) return -4; DWORD length = GetFileSize(ttfFile, NULL); if (length <= 0) return -4; unsigned char* buffer = new unsigned char [length]; DWORD got = 0; ReadFile(ttfFile, (void *)buffer, length, &got, NULL); if (got <= 0) return -4; CloseHandle(ttfFile); int CheckVersion = GetD(buffer, 0); int numTables = Get(buffer, 4); if (CheckVersion != 0x10000) return -4; for (int id = 0; id < numTables; id++) { int ResourceName = 12 + 16 * id; // unsigned char c = buffer[ResourceName + 4]; buffer[ResourceName + 4] = 0; // printf("%s\n", &buffer[ResourceName]); // buffer[ResourceName + 4] = c; if (strncmp((char *)&buffer[ResourceName], "OS/2", 4) == 0) { int tableChecksum = GetD(buffer, ResourceName + 4); int tableOffset = GetD(buffer, ResourceName + 8); int tableLength = GetD(buffer, ResourceName + 12); int actualSum = CalcTableChecksum(&buffer[tableOffset], tableLength); if (actualSum != tableChecksum) printf("warning: bad checksum\n"); int version = Get(buffer, tableOffset); int fsType = Get(buffer, tableOffset + 8); if (fsType != 0) { printf("%s: fsType = %x - setting to zero\n", filename, fsType); *(short *)&buffer[tableOffset + 8] = 0; /* set fsType = 0 */ SetD(buffer, ResourceName + 4, CalcTableChecksum(&buffer[tableOffset], tableLength)); } int _f = _open(filename, O_RDWR|O_CREAT|O_BINARY|O_TRUNC, 0666); _write(_f, buffer, length); _close(_f); break; } } return 0; } /* end */