Проблема структуры таблицы шрифтов OTF / TTF - PullRequest
0 голосов
/ 26 сентября 2019

Я пытаюсь прочитать информацию таблицы 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 

Большое спасибо за вашу помощь заранее.

...