Я пытаюсь прочитать информацию таблицы OS / 2 о шрифтах TrueType и OpenType, используя определение структуры ниже (см. Определение здесь: https://docs.microsoft.com/en-us/typography/opentype/spec/os2#fc и здесь: https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6OS2.html):
typedef struct _Panose{
uint8_t bFamilyType;
uint8_t bSerifStyle;
uint8_t bWeight;
uint8_t bProportion;
uint8_t bContrast;
uint8_t bStrokeVariation;
uint8_t bArmStyle;
uint8_t bLetterform;
uint8_t bMidline;
uint8_t bXHeight;
}Panose;
typedef struct _TT_OS2Table{ //Byte Nr.
uint16_t version; //00
int16_t xAvgcharWidth; //02
uint16_t usWeightClass; //04
uint16_t usWidthClass; //06
int16_t fsType; //08
int16_t ySubscriptXSize; //10
int16_t ySubscriptYSize; //12
int16_t ySubscriptXOffset; //14
int16_t ySubscriptYOffset; //16
int16_t ySuperscriptXSize; //18
int16_t ySuperscriptYSize; //20
int16_t ySuperscriptXOffset; //22
int16_t ySuperscriptYOffset; //24
int16_t yStrikeoutSize; //26
int16_t yStrikeoutPosition; //28
int16_t sFamilyClass; //30
Panose panose; //32
uint32_t ulUnicodeRange1; //42
uint32_t ulUnicodeRange2; //46
uint32_t ulUnicodeRange3; //50
uint32_t ulUnicodeRange4; //56
uint8_t achVendID[4]; //60 - in fact it's 58??
uint16_t fsSelection;
uint16_t usFirstcharIndex;
uint16_t usLastcharIndex;
}TT_OS2Table;
все вверхPanose, кажется, работает хорошо - дает мне те же результаты, что и fontforge (я еще не сравнивал часть диапазона Юникода). Но, как вы видите в моем комментарии - всякий раз, когда я получаю доступ к achVendID (пробовал с несколькими файлами шрифтов), я получаю неправильныйбайты / символы - правильные символы находятся в байтах с 58 по 61, в то время как achVendID возвращает мне байты с 60 по 63 - где моя ошибка?
/* the ostable data comes from an objective-c/Mac OS part (see below) but I don't think that matters - earlier values like panose are working and the offset to achVendID is 60 (as expected, when counting the sizes in the struct - see my comments)
*/
CGDataProviderRef provider;
CGFontRef font;
NSString *path = @"/Volumes/ ... /XYZ.otf";
NSData *data = [NSData dataWithContentsOfFile:path];
if (data == nil) {
NSLog(@"Failed to load font. Data at path %@ is null", path);
return nil;
}
provider = CGDataProviderCreateWithCFData((CFDataRef)data);
font = CGFontCreateWithDataProvider(provider);
NSData *oTable = (__bridge NSData *)CGFontCopyTableForTag(font, 'OS/2');
Byte ostable[oTable.length];
[oTable getBytes:ostable length:oTable.length];
TT_OS2Table *os2table = (TT_OS2Table *)ostable;
//....
char achVend[5] = "XXXX";
strncpy(achVend, ffOs2Table->achVendID, 4);
printf("achVendID1: %s\n",achVend); // outputs: BE
char achVend2[5] = "XXXX";
memcpy(achVend2, ostable+58, 4);
printf("achVendID2: %s\n",achVend2); // outputs: ADBE
Большое спасибо за вашу помощь заранее.