Patch title: Release 94 bulk changes
Abstract:
File: /pliant/graphic/layout/helper/text.pli
Key:
    Removed line
    Added line
module "/pliant/language/compiler.pli"
module "/pliant/language/stream.pli"
module "/pliant/language/type/text/str32.pli"
module "/pliant/util/pml/io.pli"
module "/pliant/util/pml/body.pli"
module "/pliant/graphic/vector/font.pli"
module "/pliant/math/vector.pli"
module "/pliant/math/curve.pli"
module "/pliant/graphic/browser/client/context.pli"
module "/pliant/graphic/browser/client/connect.pli"

constant trace false


method session font_load name0 -> f
  arg_rw BrowserSession session ; arg Str name0 ; arg Link:Font f
  if trace
    console "load font " name0 eol
  f :> null map Font
  var Str name := name0
  if (name eparse any:(var Str protocol) "://" any:(var Str server) "/" any) and (protocol search "/" undefined)=undefined
    void
  eif (session:url eparse any:(var Str protocol) "://" any:(var Str server) "/" any) and (protocol search "/" undefined)=undefined
    name := protocol+"://"+server+"/"+name
  eif (session:url eparse any:(var Str protocol) ":/" any) and (protocol search "/" undefined)=undefined
    name := protocol+":/"+name
  else
    name := "/"+name
  var Pointer:BrowserConsole c :> session console
  f :> (c:fonts first name) map Font
  if not exists:f
    url_split name (var Str protocol) (var Str server) (var Str path)
    if c:font_server<>server or not (exists c:font_stream)
      var Link:Stream s :> new Stream
      if (session connect_another name (var Dictionary no_context) s)=failure
        if trace
          console "failed to connect to font '"+name+"'" eol
        return
      c font_server := server
      c font_stream :> s
    else
      s :> c font_stream
    s oraw open (cast "font" Ident) path
    s oraw (cast "bbox" Ident)
    s oraw (cast "vector" Ident)
    s oraw body
    s oraw close
    s flush anytime
    if (s itag "font")
      f :> new Font
      f file := name
      f options := "browser"
      s iattr "bbox" f:bbox_x0 f:bbox_y0 f:bbox_x1 f:bbox_y1
      s iattr "vector" f:vector:x f:vector:y
      c:fonts insert name true addressof:f
      s ibody_begin
      while s:ibody_more
        s iskip
      s ibody_end
    eif (s ipick (var Void v))
      void


method session font_complete f text
  arg_rw BrowserSession session ; arg_rw Font f ; arg Str32 text
  if not (f:options option "browser")
    return
  var List:Int extra
  for (var Int i) 0 text:len-1
    var Int n := text:i number
    var Pointer:FontChar pch :> f:chars first n
    if not exists:pch
      part add_it
        each e extra
          if e=n
            leave add_it
      # console "complete " f:file " " n eol
      extra += n
  if not (exists extra:first)
    return
  var Pointer:BrowserConsole c :> session console
  url_split f:file (var Str protocol) (var Str server) (var Str path)
  if c:font_server<>server or not (exists c:font_stream)
    var Link:Stream s :> new Stream
    if (session connect_another f:file (var Dictionary no_context) s)=failure
      if trace
        console "failed to connect to font '"+f:file+"'" eol
      return
    c font_server := server
    c font_stream :> s
  else
    s :> c font_stream
  s oraw open (cast "font" Ident) path body
  each e extra
    s oraw e
  s oraw close
  s flush anytime
  if (s itag "font")
    s ibody_begin
    while s:ibody_more
      if (s itag "char" (var Int index))
        var FontChar ch := var FontChar empty_char
        s iattr "bbox" ch:bbox_x0 ch:bbox_y0 ch:bbox_x1 ch:bbox_y1  
        s iattr "vector" ch:vector:x ch:vector:y
        s ibody_begin
        while s:ibody_more
          if (s itag "c" (var Int mode))
            (var Curve curve) reset
            s ibody_begin
            while s:ibody_more
              if (s itag "p" (var Float x) (var Float y))
                var CurvePoint p := curve_point x y true
                if (s iattr "i" (var Int m) p:in_x p:in_y)
                  p in_mode := m
                if (s iattr "o" (var Int m) p:out_x p:out_y)
                  p out_mode := m
                s ibody_none
                curve += p
              eif (s itag "t" (var Float x) (var Float y))
                s ibody_none
                curve through x y
              eif (s itag "a" (var Float x) (var Float y)) # same as 'p'
                s ibody_none
                curve angle x y
              else
                console "point oops" eol
            s ibody_end
            curve compute mode
            if curve=success
              ch curves += curve
          else
            console "char oops" eol
        s ibody_end
        f:chars insert index ch
    s ibody_end


export '. font_load' '. font_complete'