Modest/include/myfont/cmap.h

220 lines
5.4 KiB
C

/*
Copyright (C) 2016 Alexander Borisov
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Author: lex.borisov@gmail.com (Alexander Borisov)
*/
#ifndef MyFONT_CMAP_H
#define MyFONT_CMAP_H
#pragma once
#include <myfont/myosi.h>
#ifdef __cplusplus
extern "C" {
#endif
// table cmap
// + formats
// for Format 8 and 12
struct myfont_tcmap_group {
uint32_t startCharCode;
uint32_t endCharCode;
uint32_t startGlyphID;
}
typedef myfont_tcmap_group_t;
// ++ Format 0: Byte encoding table
struct myfont_tcmap_format_0 {
uint16_t length;
uint16_t language;
uint8_t glyphIdArray[256];
}
typedef myfont_tcmap_format_0_t;
// ++ Format 2: High-byte mapping through table
struct myfont_tcmap_format_2_subHeader {
uint16_t firstCode;
uint16_t entryCount;
int16_t idDelta;
uint16_t idRangeOffset;
}
typedef myfont_tcmap_f2_sub_header_t;
struct myfont_tcmap_format_2 {
uint16_t length;
uint16_t language;
uint16_t subHeaderKeys[256];
myfont_tcmap_f2_sub_header_t *subHeaders;
uint16_t *glyphIndexArray;
}
typedef myfont_tcmap_format_2_t;
// ++ Format 4: Segment mapping to delta values
// from length to rangeShift
#define MyFONT_TCMAP_FORMAT_4_FIRST_LENGTH (2 * 6)
struct myfont_tcmap_format_4 {
uint16_t length;
uint16_t language;
uint16_t segCountX2;
uint16_t searchRange;
uint16_t entrySelector;
uint16_t rangeShift;
uint16_t *endCount; // [segCountX2 / 2]
uint16_t reservedPad;
uint16_t *startCount; // [segCountX2 / 2]
int16_t *idDelta; // [segCountX2 / 2]
uint16_t *idRangeOffset; // [segCountX2 / 2]
uint16_t *glyphIdArray;
/* user def */
uint16_t numGlyphId;
uint16_t segCount;
}
typedef myfont_tcmap_format_4_t;
// ++ Format 6: Trimmed table mapping
struct myfont_tcmap_format_6 {
uint16_t length;
uint16_t language;
uint16_t firstCode;
uint16_t entryCount;
uint16_t *glyphIdArray; // [entryCount]
}
typedef myfont_tcmap_format_6_t;
// +++ Format 8: mixed 16-bit and 32-bit coverage
struct myfont_tcmap_format_8 {
uint16_t reserved;
uint32_t length;
uint32_t language;
uint8_t is32[8192];
uint32_t nGroups; // follow myfont_tcmap_group_t
}
typedef myfont_tcmap_format_8_t;
// +++ Format 10: Trimmed array
struct myfont_tcmap_format_10 {
uint16_t reserved;
uint32_t length;
uint32_t language;
uint32_t startCharCode;
uint32_t numChars;
uint16_t *glyphs;
}
typedef myfont_tcmap_format_10_t;
// +++ Format 12: Segmented coverage
struct myfont_tcmap_format_12 {
uint16_t reserved;
uint32_t length;
uint32_t language;
uint32_t nGroups; // follow myfont_tcmap_group_t
}
typedef myfont_tcmap_format_12_t;
// +++ Format 13: Many-to-one range mappings.
struct myfont_tcmap_format_13 {
uint16_t reserved;
uint32_t length;
uint32_t language;
// Glyph index to be used for all the characters in the group's range.
uint32_t nGroups; // follow myfont_tcmap_group_t
}
typedef myfont_tcmap_format_13_t;
// +++ Format 14: Unicode Variation Sequences
struct myfont_tcmap_format_14 {
uint8_t varSelector[3]; // uint24_t
uint32_t length;
uint32_t numVarSelectorRecords;
}
typedef myfont_tcmap_format_14_t;
struct myfont_tcmap_f14_records {
uint32_t defaultUVSOffset;
uint32_t nonDefaultUVSOffset;
}
typedef myfont_tcmap_f14_records_t;
// Default UVS Table
struct myfont_tcmap_f14_val_range {
uint8_t startUnicodeValue[3]; // uint24_t
uint8_t additionalCount;
}
typedef myfont_tcmap_f14_val_range_t;
struct myfont_tcmap_f14_def_uvs {
uint32_t numUnicodeValueRanges;
myfont_tcmap_f14_val_range_t *value_ranges;
}
typedef myfont_tcmap_f14_def_uvs_t;
// Non-Default UVS Table
struct myfont_tcmap_f14_mapp {
uint8_t startUnicodeValue[3]; // uint24_t
uint8_t additionalCount;
}
typedef myfont_tcmap_f14_mapp_t;
struct myfont_tcmap_f14_non_def_uvs {
uint32_t numUVSMappings;
myfont_tcmap_f14_mapp_t *mappings;
}
typedef myfont_tcmap_f14_non_def_uvs_t;
// cmap headers
struct myfont_tcmap_header {
uint16_t version;
uint16_t numTables;
}
typedef myfont_tcmap_header_t;
struct myfont_tcmap_record {
uint16_t platformID;
uint16_t encodingID;
uint32_t offset;
}
typedef myfont_tcmap_record_t;
struct myfont_tcmap_entry {
uint16_t format;
void *header;
}
typedef myfont_tcmap_entry_t;
struct myfont_table_cmap {
myfont_tcmap_header_t header;
myfont_tcmap_record_t *records;
myfont_tcmap_entry_t *entries;
}
typedef myfont_table_cmap_t;
#include <myfont/myfont.h>
myfont_status_t myfont_load_table_cmap(myfont_font_t *mf);
uint16_t myfont_glyph_index_by_codepoint(myfont_font_t *mf, unsigned long char_code, myfont_status_t* status);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* MyFONT_CMAP_H */