Roxen.git / server / font_handlers / old.pike

version» Context lines:

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.10 2001/05/04 14:26:14 jonasw 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:77:   }      string fix_name( string what )   {    return replace( lower_case(what), " ", "_" );   }      array has_font( string name, int size )   {    string base_dir; -  array available, fallback_available; +  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; -  if (!fallback_available) { -  base_dir=dir+"/32/"+fix_name(name); -  fallback_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 && !fallback_available) return 0; -  return (available ? available : fallback_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;    }    }   }