summaryrefslogtreecommitdiff
path: root/src/drivers/Xlib
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/Xlib')
-rw-r--r--src/drivers/Xlib/Fl_Xlib_Graphics_Driver_font_xft.cxx96
1 files changed, 40 insertions, 56 deletions
diff --git a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_font_xft.cxx b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_font_xft.cxx
index cdad1a2d9..584e128b1 100644
--- a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_font_xft.cxx
+++ b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_font_xft.cxx
@@ -103,22 +103,22 @@ static Fl_Fontdesc built_in_table[] = {
// The predefined fonts that FLTK has with Pango:
static Fl_Fontdesc built_in_table[] = {
- {" Sans"},
- {"BSans"},
- {"ISans"},
- {"PSans"},
- {" Monospace"},
- {"BMonospace"},
- {"IMonospace"},
- {"PMonospace"},
- {" Serif"},
- {"BSerif"},
- {"ISerif"},
- {"PSerif"},
- {" Sans"},
- {" Monospace"},
- {"BMonospace"},
- {" Sans"},
+ {"Sans"},
+ {"Sans Bold"},
+ {"Sans Italic"},
+ {"Sans Bold Italic"},
+ {"Monospace"},
+ {"Monospace Bold"},
+ {"Monospace Italic"},
+ {"Monospace Bold Italic"},
+ {"Serif"},
+ {"Serif Bold"},
+ {"Serif Italic"},
+ {"Serif Bold Italic"},
+ {"Sans"},
+ {"Monospace"},
+ {"Monospace Bold"},
+ {"Sans"},
};
#endif // USE_PANGO
@@ -971,18 +971,12 @@ const char* Fl_Xlib_Graphics_Driver::get_font_name(Fl_Font fnum, int* ap) {
if (!f->fontname[0]) {
const char* p = f->name;
int type;
- switch (p[0]) {
- case 'B': type = FL_BOLD; break;
- case 'I': type = FL_ITALIC; break;
- case 'P': type = FL_BOLD | FL_ITALIC; break;
- default: type = 0; break;
- }
-
+ type = 0;
+ if (strstr(p, " Bold")) type = FL_BOLD;
+ if (strstr(p, " Italic") || strstr(p, " Oblique")) type += FL_ITALIC;
// NOTE: This can cause duplications in fonts that already have Bold or Italic in
// their "name". Maybe we need to find a cleverer way?
- strlcpy(f->fontname, p+1, ENDOFBUFFER);
- if (type & FL_BOLD) strlcat(f->fontname, " bold", ENDOFBUFFER);
- if (type & FL_ITALIC) strlcat(f->fontname, " italic", ENDOFBUFFER);
+ strlcpy(f->fontname, p, ENDOFBUFFER);
f->fontname[ENDOFBUFFER] = (char)type;
}
if (ap) *ap = f->fontname[ENDOFBUFFER];
@@ -1360,10 +1354,25 @@ int Fl_Xlib_Graphics_Driver::descent_unscaled() {
else return -1;
}
+static int font_name_process(const char *name, char &face) {
+ int l = strlen(name);
+ face = ' ';
+ if (!memcmp(name + l - 8, " Regular", 8)) l -= 8;
+ else if (!memcmp(name + l - 6, " Plain", 6)) l -= 6;
+ else if (!memcmp(name + l - 12, " Bold Italic", 12)) {l -= 12; face='P';}
+ else if (!memcmp(name + l - 7, " Italic", 7)) {l -= 7; face='I';}
+ else if (!memcmp(name + l - 5, " Bold", 5)) {l -= 5; face='B';}
+ return l;
+}
+
typedef int (*sort_f_type)(const void *aa, const void *bb);
static int font_sort(Fl_Fontdesc *fa, Fl_Fontdesc *fb) {
- return strcmp(fa->name+1, fb->name+1);
+ char face_a, face_b;
+ int la = font_name_process(fa->name, face_a);
+ int lb = font_name_process(fb->name, face_b);
+ int c = memcmp(fa->name, fb->name, la >= lb ? lb : la);
+ return (c == 0 ? face_a - face_b : c);
}
Fl_Font Fl_Xlib_Graphics_Driver::set_fonts(const char* pattern_name)
@@ -1381,36 +1390,11 @@ Fl_Font Fl_Xlib_Graphics_Driver::set_fonts(const char* pattern_name)
int l = strlen(fam_name);
pango_font_family_list_faces(families[fam], &faces, &n_faces);
for (int j = 0; j < n_faces; j++) {
- char prefix = ' ';
- char *p = strdup(pango_font_face_get_face_name(faces[j]));
- int lp = strlen(p);
+ const char *p = pango_font_face_get_face_name(faces[j]);
// build the font's FLTK name
- if (strcmp(p + lp - 7, "Regular") == 0 ) {
- *(p+lp-7) = 0;
- }
- else if (strcmp(p + lp - 12, "Bold Oblique") == 0 ) {
- *(p+lp-12) = 0; prefix = 'P';
- }
- else if (strcmp(p + lp - 11, "Bold Italic") == 0 ) {
- *(p+lp-11) = 0; prefix = 'P';
- }
- else if (strcmp(p + lp - 6, "Italic") == 0 ) {
- *(p+lp-6) = 0; prefix = 'I';
- }
- else if (strcmp(p + lp - 7, "Oblique") == 0 ) {
- *(p+lp-7) = 0; prefix = 'I';
- }
- else if (strcmp(p + lp - 4, "Bold") == 0 ) {
- *(p+lp-4) = 0; prefix = 'B';
- }
- char *q = p + strlen(p) - 1;
- while (q > p && *q == ' ') {*q = 0; q--;}
- int lq = l+2;
- if (*p) lq += strlen(p) + 1;
- q = new char[lq];
- sprintf(q, "%c%s", prefix, fam_name);
- if (*p) sprintf(q + strlen(q), " %s", p);
- free(p);
+ l += strlen(p) + 2;
+ char *q = new char[l];
+ sprintf(q, "%s %s", fam_name, p);
Fl::set_font((Fl_Font)(count++ + FL_FREE_FONT), q);
}
/*g_*/free(faces); // glib source code shows that g_free is equivalent to free