Roxen.git
/
server
/
font_handlers
/
old.pike
version
»
Context lines:
10
20
40
80
file
none
3
Roxen.git/server/font_handlers/old.pike:1:
// This file is part of Roxen WebServer.
-
// Copyright © 1996 -
2000
, Roxen IS.
+
// Copyright © 1996 -
2009
, Roxen IS.
#include <config.h>
-
constant cvs_version = "
$Id: old.pike,v 1.9 2001/03/23 03:13:19 per Exp $
";
+
constant cvs_version = "
$Id$
";
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
()
+
Thread.Mutex
lock = Thread.Mutex();
+
+
protected mapping font
_
cache;
+
+
protected void build_font_cache
()
{
-
array
res = (
{}
);
+
mapping
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;
+
res
["32/"
+ f + "/" + style]
= replace(f,
"_", " ");
} } } } }
-
return
res;
+
font_cache
=
res;
}
-
+
array available_fonts(int(0..1)|void force_reload)
+
{
+
Thread.MutexKey key = lock->lock();
+
if (!font_cache || force_reload)
+
build_font_cache();
+
return Array.uniq(values(font_cache));
+
}
+
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..
Roxen.git/server/font_handlers/old.pike:80:
{ return replace( lower_case(what), " ", "_" ); } array has_font( string name, int size ) { string base_dir; array 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;
-
base
_
dir=dir+
"/
32/
"
+fix_
name
(name)
;
-
available
=
r_get_dir(base_dir)
;
+
+
Thread.MutexKey key = lock->lock();
+
if (!font_cache)
+
build_font_cache();
+
+
string match_prefix = size + "/" + fix_name(name) + "/";
+
array matches = filter(indices(font_cache), has_prefix, match_prefix);
+
if (sizeof(matches))
+
return map(matches, `[], sizeof(match_prefix), 99999);
+
+
if (size != 32) {
+
foreach(roxen->query("font_dirs"), string dir) {
+
string key
=
size +
"/"
+ fix
_name(name);
+
base_dir = dir + key;
+
if
(available = r_get_dir(base_dir))
{
+
foreach(available - ({ "CVS" }
)
,
string style)
+
font
_
cache[key +
"/"
+ style] =
name;
+
return available
;
}
-
if(!available) return 0;
-
return available - ({ "CVS" });
+
}
-
+
key = 0;
+
return has_font(name, 32);
+
}
+
return 0;
+
}
class MyFont { inherit Image.Font; void set_x_spacing(int|float delta) { if(intp(delta)) ::set_x_spacing( (100.0+delta)/100.0 ); else ::set_x_spacing( delta ); } void set_y_spacing(int|float delta) { if(intp(delta)) ::set_y_spacing( (100.0+delta)/100.0 ); else ::set_y_spacing( (float)delta ); }
-
+
+
string _sprintf() {
+
return sprintf( "OldFont" );
}
-
+
}
+
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 = MyFont(); 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; } } }