xref: /haiku/src/bin/listfont.cpp (revision a127b88ecbfab58f64944c98aa47722a18e363b2)
1 /*
2  * Copyright 2007, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
3  * Copyright 2004, François Revol. All rights reserved.
4  * Distributed under the terms of the MIT License.
5  */
6 
7 
8 #include <getopt.h>
9 #include <stdio.h>
10 
11 #include <Application.h>
12 #include <Font.h>
13 #include <String.h>
14 
15 
16 static struct option const kLongOptions[] = {
17 	{"styles", no_argument, 0, 's'},
18 	{"long", no_argument, 0, 'l'},
19 	{"tuned", no_argument, 0, 't'},
20 	{"help", no_argument, 0, 'h'},
21 	{NULL}
22 };
23 
24 extern const char *__progname;
25 static const char *sProgramName = __progname;
26 
27 
28 void
29 usage(void)
30 {
31 	printf("%s [-s] [-l]\n", sProgramName);
32 	printf("lists currently installed font families.\n");
33 	printf("\t-s  --styles  list styles for each family\n");
34 	printf("\t-l  --long    long listing with more info (spacing, encoding,\n"
35 		"\t\t\theight (ascent/descent/leading), ...)\n");
36 	printf("\t-t  --tuned   display tuned fonts\n");
37 #ifndef __HAIKU__
38 	printf("\t-u            update font families\n");
39 #endif
40 }
41 
42 
43 int
44 main(int argc, char **argv)
45 {
46 	// parse command line parameters
47 
48 	bool displayStyles = false;
49 	bool displayLong = false;
50 	bool displayTuned = false;
51 #ifndef __HAIKU__
52 	bool updateFamilies = false;
53 #endif
54 
55 	int c;
56 	while ((c = getopt_long(argc, argv, "sltuh", kLongOptions, NULL)) != -1) {
57 		switch (c) {
58 			case 0:
59 				break;
60 			case 'h':
61 				usage();
62 				return 0;
63 			default:
64 				usage();
65 				return 1;
66 
67 			case 't':
68 				displayTuned = true;
69 			case 'l':
70 				displayLong = true;
71 			case 's':
72 				displayStyles = true;
73 				break;
74 #ifndef __HAIKU__
75 			case 'u':
76 				updateFamilies = true;
77 				break;
78 #endif
79 		}
80 	}
81 
82 	BApplication app("application/x-vnd.Haiku-listfont");
83 
84 #ifndef __HAIKU__
85 	if (updateFamilies) {
86 		bool changed = update_font_families(true);
87 		printf("font families %s.\n", changed ? "changed" : "did not change");
88 		return 0;
89 	}
90 #endif
91 
92 	int32 familyCount = count_font_families();
93 
94 	if (displayLong) {
95 		printf("name/style                            face  spc. enc. "
96 			"height (a, d, l)  flags\n\n");
97 	}
98 
99 	for (int32 f = 0; f < familyCount; f++) {
100 		font_family family;
101 		if (get_font_family(f, &family) < B_OK)
102 			continue;
103 		if (!displayStyles) {
104 			printf("%s\n", family);
105 			continue;
106 		}
107 
108 		int32 styleCount = count_font_styles(family);
109 
110 		for (int32 s = 0; s < styleCount; s++) {
111 			font_style style;
112 			uint16 face;
113 			uint32 flags;
114 			if (get_font_style(family, s, &style, &face, &flags) < B_OK)
115 				continue;
116 
117 			if (!displayLong) {
118 				printf("%s/%s\n", family, style);
119 				continue;
120 			}
121 
122 			BString fontName;
123 			fontName << family << "/" << style;
124 			printf("%-37s", fontName.String());
125 
126 			BFont font;
127 			font.SetFamilyAndStyle(family, style);
128 			printf(" 0x%02x  %-4d %-4d", face, font.Spacing(), font.Encoding());
129 
130 			font_height fh;
131 			font.GetHeight(&fh);
132 			printf(" %5.2f, %4.2f, %4.2f ", fh.ascent, fh.descent, fh.leading);
133 			if ((flags & B_IS_FIXED) != 0)
134 				printf("fixed");
135 
136 			if ((flags & B_HAS_TUNED_FONT) != 0) {
137 				if (displayTuned)
138 					printf("\n    ");
139 				else if ((flags & B_IS_FIXED) != 0)
140 					printf(", ");
141 
142 				int32 tunedCount = font.CountTuned();
143 				printf("%" B_PRId32 " tuned", tunedCount);
144 
145 				if (displayTuned) {
146 					printf(":");
147 					for (int32 i = 0; i < tunedCount; i++) {
148 						tuned_font_info info;
149 						font.GetTunedInfo(i, &info);
150 						printf("\n\t(size %4.1f, "
151 							"shear %5.3f, "
152 							"rot. %5.3f, "
153 							"flags 0x%" B_PRIx32 ", "
154 							"face 0x%x)",
155 								info.size,
156 								info.shear,
157 								info.rotation,
158 								info.flags,
159 								info.face);
160 					}
161 				}
162 			}
163 			putchar('\n');
164 		}
165 	}
166 	return 0;
167 }
168