blob: eefb41055d83def26c49883e8554eb7f5d1959f0 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @author Dmitriy S. Matveev
*/
#ifndef __TABLES_H__
#define __TABLES_H__
#include "TTCurve.h"
#include "TTFont.h"
#include "TypeDefinition.h"
#define CMAP_TABLE "cmap" /* character to glyph mapping */
#define GLYF_TABLE "glyf" /* glyph data */
#define HEAD_TABLE "head" /* font header */
#define HHEA_TABLE "hhea" /* horizontal header */
#define HMTX_TABLE "hmtx" /* horizontal metrics */
#define LOCA_TABLE "loca" /* index to location */
#define MAXP_TABLE "maxp" /* maximum profile */
#define NAME_TABLE "name" /* naming */
#define POST_TABLE "post" /* PostScript */
#define TTCF_TABLE "ttcf" /* TrueType font collection */
#define KERN_TABLE "kern" /* Kerning table */
#define BASE_TABLE "BASE" /* Baseline table */
#define OS2_TABLE "OS/2" /* OS-metrics table */
#define WINDOWS_PLATFORM_ID 3 /* Windows platform identifier */
#define FAMILY_NAME_ID 1 /* Family name identifier */
#define SUBFAMILY_NAME_ID 2 /* Family name identifier */
#define FULL_NAME_ID 4 /* Family name identifier */
#define POSTSCRIPT_NAME_ID 6 /* Family name identifier */
#define SYMBOL_ENCODING 0
#define UNICODE_ENCODING 1
#define SHIFT_JIS_ENCODING 2
#define BIG5_ENCODING 3
#define PRC_ENCODING 4
typedef flong Fixed;
typedef long long LONGDT;
enum
{
ON_CURVE = 0x01, // on curve or not
REPEAT = 0x08, // next byte specifies the number of
//additional times this set of flags is to be repeated
X_POSITIVE = 0x12, // positive x-value
X_NEGATIVE = 0x02, // negative x-value
X_SAME = 0x10, // x is same
X_DWORD = 0x00,
Y_POSITIVE = 0x24, // positive y-value
Y_NEGATIVE = 0x04, // negative y-value
Y_SAME = 0x20, // y is same
Y_DWORD = 0x00,
};
/* From Win GDI
typedef struct {
ufchar bFamilyType;
ufchar bSerifStyle;
ufchar bWeight;
ufchar bProportion;
ufchar bContrast;
ufchar bStrokeVariation;
ufchar bArmStyle;
ufchar bLetterform;
ufchar bMidline;
ufchar bXHeight;
} PANOSE; */
typedef struct
{
Fixed version;
ufshort num_tables;
ufshort search_range;
ufshort entry_selector;
ufshort range_shift;
} Table_Offset;
typedef struct
{
fchar tag[4];
uflong checkSum;
uflong offset;
uflong length;
} Table_Directory;
typedef struct
{
ufshort platformID;
ufshort encodingID;
ufshort languageID;
ufshort nameID;
ufshort string_length;
ufshort string_offset;
} Name_Entry;
typedef struct
{
ufshort format;
ufshort num_name_records;
ufshort storage_offset;
Name_Entry name_record[1];
} Table_name;
/* TrueType 'maxp' table */
typedef struct
{
Fixed version;
ufshort numGlyphs; // number of Glyphs
ufshort maxPoints;
ufshort maxContours;
ufshort maxCompositePoints;
ufshort maxCompositeContours;
ufshort maxZones;
ufshort maxTwilightPoints;
ufshort maxStorage;
ufshort maxFunctionDefs;
ufshort maxInstructionDefs;
ufshort maxStackElements;
ufshort maxSizeOfInstructions;
ufshort maxComponentElements;
ufshort maxComponentDepth;
} Table_maxp;
/* TrueType Font Header table */
typedef struct
{
Fixed table_version;
Fixed font_revision;
uflong checksum_adjust;
uflong magic_number;
ufshort flags;
ufshort units_per_EM;
LONGDT created;
LONGDT modified;
fshort xMin;
fshort yMin;
fshort xMax;
fshort yMax;
ufshort mac_style;
ufshort lowest_rec_PPEM;
fshort font_direction;
fshort index_to_loc_format; // format of 'loca' table
fshort glyph_data_format;
} Table_head;
typedef struct
{
Fixed table_version;
fshort ascender; /* typographic ascent */
fshort descender; /* typographic descent */
fshort line_gap; /* typographic line gap */
ufshort advance_width_max; /* Maximum advance width value in 'hmtx' table */
fshort min_left_sidebearing;
fshort min_right_sidebearing; /* Min(aw - lsb - (xMax - xMin)) */
fshort xMaxExtent; /* Max(lsb + (xMax - xMin)) */
fshort caret_slope_rise;
fshort caret_slope_run;
fshort first_reserved;
fshort second_reserved;
fshort third_reserved;
fshort fourth_reserved;
fshort fifth_reserved;
fshort metric_data_format;
ufshort number_of_hMetrics;
} Table_hhea;
typedef struct
{
ufshort table_version;
fshort xAvgCharWidth;
ufshort usWeightClass;
ufshort usWidthClass;
fshort fsType;
fshort ySubscriptXSize;
fshort ySubscriptYSize;
fshort ySubscriptXOffset;
fshort ySubscriptYOffset;
fshort ySuperscriptXSize;
fshort ySuperscriptYSize;
fshort ySuperscriptXOffset;
fshort ySuperscriptYOffset;
fshort yStrikeoutSize;
fshort yStrikeoutPosition;
fshort sFamilyClass;
// PANOSE panose;
ufchar panose[10];
uflong ulUnicodeRange1;
uflong ulUnicodeRange2;
uflong ulUnicodeRange3;
uflong ulUnicodeRange4;
ufchar achVendID[4];
ufshort fsSelection;
ufshort usFirstCharIndex;
ufshort usLastCharIndex;
ufshort sTypoAscender;
ufshort sTypoDescender;
ufshort sTypoLineGap;
ufshort sWinAscent;
ufshort sWinDescent;
uflong ulCodePageRange1;
uflong ulCodePageRange2;
} Table_os2;
typedef struct
{
ufshort platform; //identifier of platform
ufshort encodingID; //identifier fo encoding
uflong table_offset; //offset of the encoding table
} Cmap_Entry;
typedef struct
{
ufshort table_version; // =0
ufshort numSubTables; //number subtables
Cmap_Entry tableHeaders[1]; //headers of subtables
} Table_cmap;
typedef struct
{
Fixed format; //format type
Fixed italic_angle;
fshort underlineOffset;
fshort underlineThickness;
uflong isFixedPitch;
uflong minMemType42;
uflong maxMemType42;
uflong minMemType1;
uflong maxMemType1;
} Table_post;
/* first part of the encoding table identical for all format of them */
typedef struct
{
ufshort format;
ufshort length; //length in bytes
ufshort version;
} Table_encode_header;
/*
typedef struct
{
ufshort format; // =0,2,4,6
ufshort length; // size
ufshort version;
ufchar map[256];
} Table_encode_0;
typedef struct
{
// ufshort segCountX2; // 2 x segCount
ufshort search_range; // 2 x (2**floor(log_2(segCount)))
ufshort entry_selector; // log_2(search_range/2)
ufshort range_shift; // 2 x segCount - search_range
ufshort end_count[1]; // end characterCode for each segment, last =0xFFFF, length = segCount
ufshort reservedPad; // = 0
ufshort start_count[1]; // Start character code for each segment, length = segCount
ufshort idDelta[1]; // Delta for all character codes in segment, length = segCount
ufshort idRangeOffset[1]; // Offsets into glyphIdArray or 0, length = segCount
ufshort glyphIdArray[]; // Glyph index array (arbitrary length)
} Table_encode_4;
*/
typedef struct
{
fshort number_of_contours; // <0 for composite glyph
fshort xMin;
fshort yMin;
fshort xMax;
fshort yMax;
} Glyph_header;
template<fshort n> // n = number_of_contours from Glyph_header
struct SimpleGlyphDescription
{
ufshort endPtsOfContours[n];
ufshort instruction_length;
// ufchar instructions[instruction_length];
// ufchar flags[n];
// ufchar(fshort) xCoordinates[n];
// ufchar(fshort) yCoordinates[n];
};
fint parseCmapTable(FILE* tt_file, TableEncode* te);
fint parseNameTable(FILE* tt_file, fwchar_t** familyName, fwchar_t** psName, StyleName* fontStyle);
fint parseHeadTable(FILE* tt_file, ffloat* bbox, fshort* format, ufshort* unitsPerEm);
fint parseHheaTable(FILE* tt_file, ufshort* numOfHMetrics, ffloat* ascent, ffloat* descent, ffloat* lineGap);
fint parseMaxpTable(FILE* tt_file, ufshort *numGlyphs);
fint parseLocaTable(FILE* tt_file, GlyphOffsets* gOffsets, ufshort numGlyphs);
fint parseOs2Table(FILE* tt_file, ffloat* strikeOutSize, ffloat* strikeOutOffset);
fint parsePostTable(FILE* tt_file, fshort* uOffset, fshort* uThickness);
fint parseGlyphData(FILE* tt_file, const GlyphOffsets gO, ufshort numGlyphs, ufshort glyphIndex, TTCurve *curve, fshort* bRect, ffloat transform);
fint parseHmtxTable(FILE* tt_file, ufshort numOfHMetrics, HMetrics** hm);
bool isCompositeGlyph(FILE* tt_file, const GlyphOffsets gO, ufshort numGlyphs, ufshort glyphIndex);
#endif