diff options
| author | Philipp Gesang <phg42.2a@gmail.com> | 2013-08-31 20:40:33 +0200 | 
|---|---|---|
| committer | Philipp Gesang <phg42.2a@gmail.com> | 2013-08-31 20:40:33 +0200 | 
| commit | 4ae6dab28fdf719fd10ba165d1b2414bef6794d8 (patch) | |
| tree | 55a29b744af6f0c05822cba844586957167ead46 | |
| parent | 55ba70c6d8f76706f083818e7dd38006e88dcfb7 (diff) | |
| download | luaotfload-4ae6dab28fdf719fd10ba165d1b2414bef6794d8.tar.gz | |
[db] refactor texmf and system font scanning
| -rw-r--r-- | luaotfload-database.lua | 74 | 
1 files changed, 49 insertions, 25 deletions
| diff --git a/luaotfload-database.lua b/luaotfload-database.lua index 5d662e0..0139d89 100644 --- a/luaotfload-database.lua +++ b/luaotfload-database.lua @@ -240,7 +240,7 @@ This is a sketch of the luaotfload db:      type dbobj = {          families    : familytable;          filenames   : filemap; -        index       : filestatus; +        status      : filestatus;          mappings    : fontentry list;          meta        : metadata;          names       : namedata; // TODO: check for relevance after db is finalized @@ -301,10 +301,11 @@ This is a sketch of the luaotfload db:          location     : local | system | texmf;          weight       : int;          width        : int; -        units_per_em : int;        // mainly 1000, but also 2048 or 256 +        units_per_em : int;         // mainly 1000, but also 2048 or 256      } -    and filestatus = (fullname, -                      { index : int list; timestamp : int }) dict +    and filestatus = (string,       // fullname +                      { index       : int list; // pointer into mappings +                        timestamp   : int;      }) dict  beware that this is a reconstruction and may be incomplete. @@ -350,7 +351,7 @@ local fontnames_init = function (formats) --- returns dbobj              system     = { },              texmf      = { },          }, -        index           = { }, -- was: status; map abspath -> mapping +        status          = { }, -- was: status; map abspath -> mapping          mappings        = { }, -- TODO: check if still necessary after rewrite          names           = { },  --      filenames       = { }, -- created later @@ -1404,17 +1405,22 @@ local loaders = {      pfa     = t1_fullinfo,  } ---- we return true if the fond is new or re-indexed +--- we return true if the font is new or re-indexed  --- string -> dbobj -> dbobj -> bool -local load_font = function (fullname, fontnames, newfontnames, texmf) + +local read_font_names = function (fullname, +                                  fontnames, +                                  newfontnames, +                                  texmf) +      local newmappings   = newfontnames.mappings      local newstatus     = newfontnames.status --- by full path      local mappings      = fontnames.mappings      local status        = fontnames.status -    local basename      = filebasename(fullname) -    local barename      = filenameonly(fullname) +    local basename      = filebasename (fullname) +    local barename      = filenameonly (fullname)      local format        = stringlower (filesuffix (basename)) @@ -1438,7 +1444,7 @@ local load_font = function (fullname, fontnames, newfontnames, texmf)      local newentrystatus = newstatus[fullname]      --- newentrystatus: nil | false | table      if newentrystatus and newentrystatus.timestamp == new_timestamp then -        -- already indexed this run +        -- already statused this run          return false      end @@ -1824,6 +1830,7 @@ end  --doc]]--  --- string -> dbobj -> dbobj -> bool -> bool -> (int * int) +  local scan_dir = function (dirname, fontnames, newfontnames,                             dry_run, texmf)      if lpegmatch (p_blacklist, dirname) then @@ -1849,12 +1856,13 @@ local scan_dir = function (dirname, fontnames, newfontnames,          local new          if dry_run == true then              report ("both", 1, "db", -                    "Would have been loading %q", fullname) +                    "Would have been extracting metadata from %q", +                    fullname)          else              report ("both", 4, "db", -                    "Loading font %q", fullname) -            local new = load_font (fullname, fontnames, -                                   newfontnames, texmf) +                    "Extracting metadata from font %q", fullname) +            local new = read_font_names (fullname, fontnames, +                                         newfontnames, texmf)              if new == true then                  n_new = n_new + 1              end @@ -1890,6 +1898,7 @@ local path_separator = ostype == "windows" and ";" or ":"  --doc]]--  --- dbobj -> dbobj -> bool? -> (int * int) +  local scan_texmf_fonts = function (fontnames, newfontnames, dry_run)      local n_scanned, n_new, fontdirs = 0, 0 @@ -2301,6 +2310,24 @@ local gen_fast_lookups = function (fontnames)      return fontnames  end +local retrieve_namedata = function (fontnames, newfontnames, dry_run) +    local n_rawnames, n_new = 0, 0 + +    local rawnames, new = scan_texmf_fonts (fontnames, +                                            newfontnames, +                                            dry_run) + +    n_rawnames    = n_rawnames + rawnames +    n_new         = n_new + new + +    rawnames, new = scan_os_fonts (fontnames, newfontnames, dry_run) + +    n_rawnames    = n_rawnames + rawnames +    n_new         = n_new + new + +    return n_rawnames, n_new +end +  --- force:      dictate rebuild from scratch  --- dry_dun:    don’t write to the db, just scan dirs @@ -2314,8 +2341,8 @@ update_names = function (fontnames, force, dry_run)          return fontnames or names.data      end -    local starttime = os.gettimeofday() -    local n_scanned, n_new = 0, 0 +    local starttime            = os.gettimeofday() +    local n_rawnames, n_new    = 0, 0      --[[      The main function, scans everything @@ -2340,14 +2367,11 @@ update_names = function (fontnames, force, dry_run)      local newfontnames = fontnames_init (get_font_filter ())      read_blacklist () -    local scanned, new -    scanned, new = scan_texmf_fonts (fontnames, newfontnames, dry_run) -    n_scanned = n_scanned + scanned -    n_new     = n_new     + new - -    scanned, new = scan_os_fonts (fontnames, newfontnames, dry_run) -    n_scanned = n_scanned + scanned -    n_new     = n_new     + new +    local rawnames, new = retrieve_namedata (fontnames, +                                             newfontnames, +                                             dry_run) +    n_rawnames = n_rawnames + rawnames +    n_new      = n_new + new      --- we always generate the file lookup tables because      --- non-texmf entries are redirected there and the mapping @@ -2359,7 +2383,7 @@ update_names = function (fontnames, force, dry_run)      ---   partial:         804 ms   |   701 ms      ---   forced:        45384 ms   | 44714 ms      report("info", 3, "db", -           "Scanned %d font files; %d new entries.", n_scanned, n_new) +           "Scanned %d font files; %d new entries.", n_rawnames, n_new)      report("info", 3, "db",             "Rebuilt in %0.f ms", 1000*(os.gettimeofday()-starttime))      names.data = newfontnames | 
