summaryrefslogtreecommitdiff
path: root/src/fl_set_fonts_x.cxx
diff options
context:
space:
mode:
authorBill Spitzak <spitzak@gmail.com>2003-03-09 00:22:20 +0000
committerBill Spitzak <spitzak@gmail.com>2003-03-09 00:22:20 +0000
commit5eb2576cfc612e5d720da13b85f7b88ab4e153ba (patch)
treed809aaee922a1d9e91975a0098a9642ecf8caa1c /src/fl_set_fonts_x.cxx
parenteca1c6cc4cc350c5e5f232263b39db4ec5f7e87c (diff)
The attribute argument to Fl::get_font_name() was set correctly only
the first time it was called for a given font, otherwise it was left unchanged. Warning: only the X11 version has been tested! The Win32, Xft, and Mac versions (which are all identical to each other) probably work but I did not test them. Try the "fonts" demo. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@2948 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/fl_set_fonts_x.cxx')
-rw-r--r--src/fl_set_fonts_x.cxx108
1 files changed, 55 insertions, 53 deletions
diff --git a/src/fl_set_fonts_x.cxx b/src/fl_set_fonts_x.cxx
index 5cdda8abb..c1e41a881 100644
--- a/src/fl_set_fonts_x.cxx
+++ b/src/fl_set_fonts_x.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: fl_set_fonts_x.cxx,v 1.1.2.6 2003/01/30 21:44:17 easysw Exp $"
+// "$Id: fl_set_fonts_x.cxx,v 1.1.2.7 2003/03/09 00:22:20 spitzak Exp $"
//
// X11 font utilities for the Fast Light Tool Kit (FLTK).
//
@@ -79,10 +79,17 @@ static int use_registry(const char *p) {
return *p && *p!='*' && strcmp(p,fl_encoding);
}
+// Bug: older versions calculated the value for *ap as a side effect of
+// making the name, and then forgot about it. To avoid having to change
+// the header files I decided to store this value in the last character
+// of the font name array.
+#define ENDOFBUFFER 127 // sizeof(Fl_Font.fontname)-1
+
// turn a stored (with *'s) X font name into a pretty name:
const char* Fl::get_font_name(Fl_Font fnum, int* ap) {
Fl_Fontdesc *f = fl_fonts + fnum;
if (!f->fontname[0]) {
+ int type = 0;
const char* p = f->name;
if (!p) {
if (ap) *ap = 0;
@@ -91,70 +98,65 @@ const char* Fl::get_font_name(Fl_Font fnum, int* ap) {
char *o = f->fontname;
if (*p != '-') { // non-standard font, just replace * with spaces:
- if (ap) {
- int type = 0;
- if (strstr(p,"bold")) type = FL_BOLD;
- if (strstr(p,"ital")) type |= FL_ITALIC;
- *ap = type;
- }
+ if (strstr(p,"bold")) type = FL_BOLD;
+ if (strstr(p,"ital")) type |= FL_ITALIC;
for (;*p; p++) {
if (*p == '*' || *p == ' ' || *p == '-') {
do p++; while (*p == '*' || *p == ' ' || *p == '-');
if (!*p) break;
- if (o < (f->fontname + sizeof(f->fontname) - 1)) *o++ = ' ';
+ if (o < (f->fontname + ENDOFBUFFER - 1)) *o++ = ' ';
}
- if (o < (f->fontname + sizeof(f->fontname) - 1)) *o++ = *p;
+ if (o < (f->fontname + ENDOFBUFFER - 1)) *o++ = *p;
}
*o = 0;
- return f->fontname;
- }
- // get the family:
- const char *x = fl_font_word(p,2); if (*x) x++; if (*x=='*') x++;
- if (!*x) {
- if (ap) *ap = 0;
- return p;
- }
- const char *e = fl_font_word(x,1);
- if ((e - x) < (int)(sizeof(f->fontname) - 1)) {
- // MRS: we want strncpy here, not strlcpy...
- strncpy(o,x,e-x);
- o += e-x;
- } else {
- strlcpy(f->fontname,x,sizeof(f->fontname));
- return f->fontname;
- }
+ } else { // standard dash-seperated font:
- // collect all the attribute words:
- int type = 0;
- for (int n = 3; n <= 6; n++) {
- // get the next word:
- if (*e) e++; x = e; e = fl_font_word(x,1);
- int t = attribute(n,x);
- if (t < 0) {
- if (o < (f->fontname + sizeof(f->fontname) - 1)) *o++ = ' ';
- if ((e - x) < (int)(sizeof(f->fontname) - (o - f->fontname) - 1)) {
- // MRS: we want strncpy here, not strlcpy...
- strncpy(o,x,e-x);
- o += e-x;
- } else {
- strlcpy(o,x,sizeof(f->fontname) - (o - f->fontname) - 1);
- return f->fontname;
- }
- } else type |= t;
- }
+ // get the family:
+ const char *x = fl_font_word(p,2); if (*x) x++; if (*x=='*') x++;
+ if (!*x) {
+ if (ap) *ap = 0;
+ return p;
+ }
+ const char *e = fl_font_word(x,1);
+ if ((e - x) < (int)(ENDOFBUFFER - 1)) {
+ // MRS: we want strncpy here, not strlcpy...
+ strncpy(o,x,e-x);
+ o += e-x;
+ } else {
+ strlcpy(f->fontname, x, ENDOFBUFFER);
+ o = f->fontname+ENDOFBUFFER-1;
+ }
- // skip over the '*' for the size and get the registry-encoding:
- x = fl_font_word(e,2);
- if (*x) {x++; *o++ = '('; while (*x) *o++ = *x++; *o++ = ')';}
+ // collect all the attribute words:
+ for (int n = 3; n <= 6; n++) {
+ // get the next word:
+ if (*e) e++; x = e; e = fl_font_word(x,1);
+ int t = attribute(n,x);
+ if (t < 0) {
+ if (o < (f->fontname + ENDOFBUFFER - 1)) *o++ = ' ';
+ if ((e - x) < (int)(ENDOFBUFFER - (o - f->fontname) - 1)) {
+ // MRS: we want strncpy here, not strlcpy...
+ strncpy(o,x,e-x);
+ o += e-x;
+ } else {
+ strlcpy(o,x, ENDOFBUFFER - (o - f->fontname) - 1);
+ o = f->fontname+ENDOFBUFFER-1;
+ }
+ } else type |= t;
+ }
- *o = 0;
- if (type & FL_BOLD) strlcat(f->fontname, " bold", sizeof(f->fontname));
- if (type & FL_ITALIC) strlcat(f->fontname, " italic", sizeof(f->fontname));
+ // skip over the '*' for the size and get the registry-encoding:
+ x = fl_font_word(e,2);
+ if (*x) {x++; *o++ = '('; while (*x) *o++ = *x++; *o++ = ')';}
- if (ap) *ap = type;
+ *o = 0;
+ if (type & FL_BOLD) strlcat(f->fontname, " bold", ENDOFBUFFER);
+ if (type & FL_ITALIC) strlcat(f->fontname, " italic", ENDOFBUFFER);
+ }
+ f->fontname[ENDOFBUFFER] = (char)type;
}
-
+ if (ap) *ap = f->fontname[ENDOFBUFFER];
return f->fontname;
}
@@ -342,5 +344,5 @@ int Fl::get_font_sizes(Fl_Font fnum, int*& sizep) {
}
//
-// End of "$Id: fl_set_fonts_x.cxx,v 1.1.2.6 2003/01/30 21:44:17 easysw Exp $".
+// End of "$Id: fl_set_fonts_x.cxx,v 1.1.2.7 2003/03/09 00:22:20 spitzak Exp $".
//