/* this file is generated. do not modify. */ typedef struct TableRecord TableRecord; typedef struct TableDirectory TableDirectory; typedef struct EncodingRecord EncodingRecord; typedef struct TableCmap TableCmap; typedef struct TableHead TableHead; struct TableRecord { u32int tableTag; u32int checksum; u32int offset; u32int length; }; int read_TableRecord(Ctx *ctx, TableRecord *v); struct TableDirectory { u32int sfntVersion; u16int numTables; u16int searchRange; u16int entrySelector; u16int rangeShift; TableRecord *tableRecords; }; int read_TableDirectory(Ctx *ctx, TableDirectory *v); struct EncodingRecord { u16int platformID; u16int encodingID; u32int subtableOffset; }; int read_EncodingRecord(Ctx *ctx, EncodingRecord *v); struct TableCmap { // u16int version; u16int numTables; EncodingRecord *encodingRecords; }; int read_TableCmap(Ctx *ctx, TableCmap *v); struct TableHead { // u16int majorVersion; // u16int minorVersion; // float fontRevision; // u32int checksumAdjustment; // u32int magicNumber; u16int flags; u16int unitsPerEm; // u64int created; // u64int modified; s16int xMin; s16int yMin; s16int xMax; s16int yMax; u16int macStyle; u16int lowestRecPPEM; // s16int fontDirectionHint; s16int indexToLocFormat; // s16int glyphDataFormat; }; int read_TableHead(Ctx *ctx, TableHead *v); /* this file is generated. do not modify. */ int read_TableRecord(Ctx *ctx, TableRecord *v) { u8int *b; if((b = ctxreadn(ctx, 16)) == nil) goto err; v->tableTag = b[0]<<24 | b[1]<<16 | b[2]<<8 | b[3]; v->checksum = b[4]<<24 | b[5]<<16 | b[6]<<8 | b[7]; v->offset = b[8]<<24 | b[9]<<16 | b[10]<<8 | b[11]; v->length = b[12]<<24 | b[13]<<16 | b[14]<<8 | b[15]; return 0; err: werrstr("%s: %r", "TableRecord"); return -1; } int read_TableDirectory(Ctx *ctx, TableDirectory *v) { u8int *b; if((b = ctxreadn(ctx, 12)) == nil) goto err; v->sfntVersion = b[0]<<24 | b[1]<<16 | b[2]<<8 | b[3]; if(v->sfntVersion != 0x100000 && v->sfntVersion != 0x4f54544f){ werror("%s: invalid value: %d", "sfntVersion", v->sfntVersion); goto err; } v->numTables = b[4]<<8 | b[5]; v->searchRange = b[6]<<8 | b[7]; v->entrySelector = b[8]<<8 | b[9]; v->rangeShift = b[10]<<8 | b[11]; if(read_array(ctx, &v->tableRecords, read_TableRecord, v->numTables) < 0){ werror("%s: %r", "tableRecords"); goto err; } return 0; err: werrstr("%s: %r", "TableDirectory"); return -1; } int read_EncodingRecord(Ctx *ctx, EncodingRecord *v) { u8int *b; if((b = ctxreadn(ctx, 8)) == nil) goto err; v->platformID = b[0]<<8 | b[1]; if(v->platformID != 0 && v->platformID != 1 && v->platformID != 2 && v->platformID != 3 && v->platformID != 4){ werror("%s: invalid value: %d", "platformID", v->platformID); goto err; } v->encodingID = b[2]<<8 | b[3]; v->subtableOffset = b[4]<<24 | b[5]<<16 | b[6]<<8 | b[7]; return 0; err: werrstr("%s: %r", "EncodingRecord"); return -1; } int read_TableCmap(Ctx *ctx, TableCmap *v) { u8int *b; if((b = ctxreadn(ctx, 4)) == nil) goto err; u16int version = b[0]<<8 | b[1]; if(version != 0){ werror("%s: invalid value: %d", "version", version); goto err; } v->numTables = b[2]<<8 | b[3]; if(read_array(ctx, &v->encodingRecords, read_EncodingRecord, v->numTables) < 0){ werror("%s: %r", "encodingRecords"); goto err; } return 0; err: werrstr("%s: %r", "TableCmap"); return -1; } int read_TableHead(Ctx *ctx, TableHead *v) { u8int *b; if((b = ctxreadn(ctx, 54)) == nil) goto err; u16int majorVersion = b[0]<<8 | b[1]; if(majorVersion != 1){ werror("%s: invalid value: %d", "majorVersion", majorVersion); goto err; } u16int minorVersion = b[2]<<8 | b[3]; if(minorVersion != 0){ werror("%s: invalid value: %d", "minorVersion", minorVersion); goto err; } u32int magicNumber = b[12]<<24 | b[13]<<16 | b[14]<<8 | b[15]; if(magicNumber != 0x5f0f3cf5){ werror("%s: invalid value: %d", "magicNumber", magicNumber); goto err; } v->flags = b[16]<<8 | b[17]; v->unitsPerEm = b[18]<<8 | b[19]; v->xMin = b[36]<<8 | b[37]; v->yMin = b[38]<<8 | b[39]; v->xMax = b[40]<<8 | b[41]; v->yMax = b[42]<<8 | b[43]; v->macStyle = b[44]<<8 | b[45]; v->lowestRecPPEM = b[46]<<8 | b[47]; s16int fontDirectionHint = b[48]<<8 | b[49]; if(fontDirectionHint != -2 && fontDirectionHint != -1 && fontDirectionHint != 0 && fontDirectionHint != 1 && fontDirectionHint != 2){ werror("%s: invalid value: %d", "fontDirectionHint", fontDirectionHint); goto err; } v->indexToLocFormat = b[50]<<8 | b[51]; if(v->indexToLocFormat != 0 && v->indexToLocFormat != 1){ werror("%s: invalid value: %d", "indexToLocFormat", v->indexToLocFormat); goto err; } s16int glyphDataFormat = b[52]<<8 | b[53]; if(glyphDataFormat != 0){ werror("%s: invalid value: %d", "glyphDataFormat", glyphDataFormat); goto err; } return 0; err: werrstr("%s: %r", "TableHead"); return -1; }