summaryrefslogtreecommitdiff
path: root/dviware/dvisvgm/src/ttf/NameTable.cpp
blob: 312ddf973ba54dea8561ebbe41e6c94611c2ba2f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/*************************************************************************
** NameTable.cpp                                                        **
**                                                                      **
** This file is part of dvisvgm -- a fast DVI to SVG converter          **
** Copyright (C) 2005-2024 Martin Gieseking <martin.gieseking@uos.de>   **
**                                                                      **
** This program is free software; you can redistribute it and/or        **
** modify it under the terms of the GNU General Public License as       **
** published by the Free Software Foundation; either version 3 of       **
** the License, or (at your option) any later version.                  **
**                                                                      **
** This program 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 General Public License for more details.                         **
**                                                                      **
** You should have received a copy of the GNU General Public License    **
** along with this program; if not, see <http://www.gnu.org/licenses/>. **
*************************************************************************/

#include <array>
#include "NameTable.hpp"
#include "TTFWriter.hpp"
#include "../Font.hpp"
#include "../version.hpp"

using namespace std;
using namespace ttf;

enum NameID {
	COPYRIGHT_NOTICE = 0,
	FONT_FAMILY = 1,
	FONT_SUBFAMILY = 2,
	FONT_ID = 3,
	FULL_FONT_NAME = 4,
	VERSION_STRING = 5,
	PS_NAME = 6,
	TRADEMARK = 7,
	MANUFACTURER_NAME = 8,
	DESIGNER = 9,
	DESCRIPTION = 10,
	URL_VENDOR = 11,
	URL_DESIGNER = 12,
	LICENSE_DESCRIPTION = 13,
	LICENSE_INFO_URL = 14,
	TYPOGRAPHIC_FAMILY_NAME = 16,
	TYPOGRAPHIC_SUBFAMILY_NAME = 17,
	COMPATIBLE_FULL = 18,
	SAMPLE_TEXT = 19,
	PS_CID_FINDFONT_NAME = 20,
	WWS_FAMILY_NAME = 21,
	WWS_SUBFAMILY_NAME = 22,
	LIGHT_BG_PALLETTE = 23,
	DARK_BG_PALLETTE = 24,
	VAR_PS_NAME_PREFIX = 25
};


void NameTable::write (ostream &os) const {
	struct NameEntry {
		NameID nameID;
		std::string name;
	};
	array<NameEntry,5> nameEntries {{
		{FONT_FAMILY, ttfWriter()->getFont().familyName()},
		{FULL_FONT_NAME, ttfWriter()->getFont().name()},
		{VERSION_STRING, string("Version 1.0")},
		{PS_NAME, ttfWriter()->getFont().name()},
		{DESCRIPTION, string("Generated by ")+PROGRAM_NAME+" "+PROGRAM_VERSION}
	}};
	writeUInt16(os, 0);  // table format
	writeUInt16(os, 2*nameEntries.size());  // number of name records
	writeUInt16(os, 6+2*12*nameEntries.size());  // offset to start of string storage
	size_t offset=0;
	// write name entry records ordered by platform ID
	for (const NameEntry &entry : nameEntries) {
		writeUInt16(os, 1);  // Mac
		writeUInt16(os, 0);  // Roman, UTF-8 encoding
		writeUInt16(os, 0);  // English
		writeUInt16(os, entry.nameID);
		writeUInt16(os, entry.name.length());
		writeUInt16(os, offset);
		offset += entry.name.length();
	}
	for (const NameEntry &entry : nameEntries) {
		writeUInt16(os, 3);  // Windows
		writeUInt16(os, 1);  // UCS-2 encoding
		writeUInt16(os, 0x0409);  // US English
		writeUInt16(os, entry.nameID);
		writeUInt16(os, 2*entry.name.length());
		writeUInt16(os, offset);
		offset += 2*entry.name.length();
	}
	// write string data
	for (const NameEntry &entry : nameEntries) {
		for (char c : entry.name)
			writeUInt8(os, c);
	}
	for (const NameEntry &entry : nameEntries) {
		for (char c : entry.name) {
			writeUInt8(os, 0);
			writeUInt8(os, c);
		}
	}
}