b82467 | 2000-09-03 | Martin Nilsson | |
|
f41b98 | 2009-05-07 | Martin Stjernholm | |
|
b82467 | 2000-09-03 | Martin Nilsson | |
#include <config.h>
|
f41b98 | 2009-05-07 | Martin Stjernholm | | constant cvs_version = "$Id: old.pike,v 1.15 2009/05/07 14:15:53 mast Exp $";
|
c6fd2e | 2000-09-03 | Per Hedbor | |
constant name = "Compatibility bitmap fonts";
|
0bd4d9 | 2000-09-04 | Per Hedbor | | constant doc =
"Compatibility (bitmapped) fonts for Roxen 1.3 and earlier."
|
c6239d | 2000-09-04 | Per Hedbor | | " Compact image file fonts are preferable to this format, since they are "
"almost always smaller, and easier to create.";
|
c6fd2e | 2000-09-03 | Per Hedbor | |
inherit FontHandler;
|
631e74 | 2008-11-13 | Jonas Wallden | | Thread.Mutex lock = Thread.Mutex();
protected mapping font_cache;
protected void build_font_cache()
|
c6fd2e | 2000-09-03 | Per Hedbor | | {
|
631e74 | 2008-11-13 | Jonas Wallden | | mapping res = ([ ]);
|
c6fd2e | 2000-09-03 | Per Hedbor | | 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))
{
|
631e74 | 2008-11-13 | Jonas Wallden | | res["32/" + f + "/" + style] = replace(f, "_", " ");
|
c6fd2e | 2000-09-03 | Per Hedbor | | }
}
}
}
}
|
631e74 | 2008-11-13 | Jonas Wallden | | 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));
|
c6fd2e | 2000-09-03 | Per Hedbor | | }
|
b82467 | 2000-09-03 | Martin Nilsson | | array(mapping) font_information( string fnt )
|
c6fd2e | 2000-09-03 | Per Hedbor | | {
|
a6bf1d | 2000-09-04 | Per Hedbor | | string ofnt = fnt;
fnt = replace(lower_case( fnt ), " ", "_");
|
b82467 | 2000-09-03 | Martin Nilsson | | array font_infos=({});
|
c6fd2e | 2000-09-03 | Per Hedbor | | foreach(roxen->query("font_dirs"), string dir)
{
dir+="32/";
if( r_file_stat( dir+fnt ) )
|
d3a682 | 2000-09-03 | Martin Nilsson | |
|
c6fd2e | 2000-09-03 | Per Hedbor | | {
array d = r_get_dir(dir+fnt);
foreach( ({ "nn", "ni", "li", "ln", "Bi", "Bn", "bi", "bn" }),
string style)
if(has_value(d, style))
{
|
b82467 | 2000-09-03 | Martin Nilsson | | mapping font_info = ([ "name":fnt,
|
a6bf1d | 2000-09-04 | Per Hedbor | | "family":ofnt,
|
b82467 | 2000-09-03 | Martin Nilsson | | "path":dir+fnt,
|
a6bf1d | 2000-09-04 | Per Hedbor | | "style":"",
|
b82467 | 2000-09-03 | Martin Nilsson | | "format":"bitmap dump" ]);
switch(style[0]) {
|
a6bf1d | 2000-09-04 | Per Hedbor | | case 'l': font_info->style+="light"; break;
case 'b': font_info->style+="bold"; break;
case 'B': font_info->style+="black"; break;
|
b82467 | 2000-09-03 | Martin Nilsson | | }
|
a6bf1d | 2000-09-04 | Per Hedbor | | if(style[1]=='i') font_info->style+="italic";
if(style[1]=='I') font_info->style+="oblique";
|
b82467 | 2000-09-03 | Martin Nilsson | | font_infos+=({ font_info });
|
c6fd2e | 2000-09-03 | Per Hedbor | | }
}
}
|
b82467 | 2000-09-03 | Martin Nilsson | | return font_infos;
|
c6fd2e | 2000-09-03 | Per Hedbor | | }
string fix_name( string what )
{
return replace( lower_case(what), " ", "_" );
}
array has_font( string name, int size )
{
string base_dir;
|
6ac69d | 2009-02-06 | Jonas Wallden | | array available;
|
6dea54 | 2001-03-23 | Per Hedbor | | if( String.width( name ) > 8 )
return 0;
|
631e74 | 2008-11-13 | Jonas Wallden | |
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;
}
|
bea638 | 2001-05-04 | Jonas Wallden | | }
|
631e74 | 2008-11-13 | Jonas Wallden | | key = 0;
return has_font(name, 32);
|
c6fd2e | 2000-09-03 | Per Hedbor | | }
|
631e74 | 2008-11-13 | Jonas Wallden | | return 0;
|
c6fd2e | 2000-09-03 | Per Hedbor | | }
|
11b6b7 | 2001-02-02 | Martin Nilsson | | 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 );
}
|
7319b6 | 2001-08-29 | Martin Nilsson | |
string _sprintf() {
return sprintf( "OldFont" );
}
|
11b6b7 | 2001-02-02 | Martin Nilsson | | }
|
c6fd2e | 2000-09-03 | Per Hedbor | | Font open( string name, int size, int bold, int italic )
{
|
6dea54 | 2001-03-23 | Per Hedbor | | if( String.width( name ) > 8 )
return 0;
|
c6fd2e | 2000-09-03 | Per Hedbor | | string f = make_font_name( name, size, bold, italic );
|
11b6b7 | 2001-02-02 | Martin Nilsson | | Image.Font fn = MyFont();
|
c6fd2e | 2000-09-03 | Per Hedbor | | 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;
}
}
}
|