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
  
106
  
107
  
108
  
109
  
110
  
111
  
112
  
113
  
114
  
115
  
116
  
117
  
118
  
119
  
120
  
121
  
// This file is part of Roxen WebServer. 
// Copyright © 1996 - 2000, Roxen IS. 
 
#include <config.h> 
constant cvs_version = "$Id: old.pike,v 1.9 2001/05/04 14:30:42 jonasw Exp $"; 
 
constant name = "Compatibility bitmap fonts"; 
constant doc =  
"Compatibility (bitmapped) fonts for Roxen 1.3 and earlier." 
" Compact image file fonts are preferable to this format, since they are " 
"almost always smaller, and easier to create."; 
 
inherit FontHandler; 
 
array available_fonts() 
{ 
  array res = ({}); 
  foreach(roxen->query("font_dirs"), string dir) 
  { 
    dir+="32/"; 
    if(array d = r_get_dir(dir)) 
    { 
      foreach(d,string f) 
      { 
        if(f=="CVS") continue; 
        Stat a; 
        if((a=r_file_stat(dir+f)) && (a[1]==-2))  
        { 
          array d=r_get_dir(dir+f); 
          foreach( ({ "nn", "ni", "li", "ln", "Bi", "Bn", "bi", "bn" }), 
                   string style) 
            if(has_value(d, style))  
            { 
              res |= ({ replace(f,"_", " ") }); 
              break; 
            } 
        } 
      } 
    } 
  } 
  return res; 
} 
 
array(mapping) font_information( string fnt ) 
{ 
  string ofnt = fnt; 
  fnt = replace(lower_case( fnt ), " ", "_"); 
  array font_infos=({}); 
  foreach(roxen->query("font_dirs"), string dir) 
  { 
    dir+="32/"; 
    if( r_file_stat( dir+fnt ) ) 
    // the font file exists in this dir.. 
    { 
      array d = r_get_dir(dir+fnt); 
      foreach( ({ "nn", "ni", "li", "ln", "Bi", "Bn", "bi", "bn" }), 
               string style) 
        if(has_value(d, style))  
        { 
          mapping font_info = ([ "name":fnt, 
                                 "family":ofnt, 
                                 "path":dir+fnt, 
                                 "style":"", 
                                 "format":"bitmap dump" ]); 
          switch(style[0]) { 
          case 'l': font_info->style+="light"; break; 
          case 'b': font_info->style+="bold"; break; 
          case 'B': font_info->style+="black"; break; 
          } 
          if(style[1]=='i') font_info->style+="italic"; 
          if(style[1]=='I') font_info->style+="oblique"; 
          font_infos+=({ font_info }); 
        } 
    } 
  } 
  return font_infos; 
} 
 
string fix_name( string what ) 
{ 
  return replace( lower_case(what), " ", "_" ); 
} 
 
array has_font( string name, int size ) 
{ 
  string base_dir; 
  array available, fallback_available; 
  if( String.width( name ) > 8 ) 
    return 0; 
  foreach(roxen->query("font_dirs"), string dir) 
  { 
    base_dir = dir+size+"/"+fix_name(name); 
    if (available = r_get_dir(base_dir)) 
      break; 
    if (!fallback_available) { 
      base_dir=dir+"/32/"+fix_name(name); 
      fallback_available = r_get_dir(base_dir); 
    } 
  } 
  if(!available && !fallback_available) return 0; 
  return (available ? available : fallback_available) - ({ "CVS" }); 
} 
 
Font open( string name, int size, int bold, int italic ) 
{ 
  if( String.width( name ) > 8 ) 
    return 0; 
  string f = make_font_name( name, size, bold, italic ); 
  Image.Font fn = Image.Font(); 
  foreach( roxen->query( "font_dirs"), string dir ) 
    foreach( ({ size, 32 }), int sz ) 
    { 
      if( r_file_stat( dir+"/"+sz+"/"+f ) ) 
      { 
        if( fn->load( roxen_path( dir+"/"+sz+"/"+f ) ) ) 
          return fn; 
      } 
    } 
}