Patch title: Release 92 bulk changes
File: /appli/browser/context.pli
    Removed line
    Added line
module "/pliant/language/compiler.pli"
module "/pliant/graphic/draw/prototype.pli"
module "document.pli"

type DocumentArea
  field Float x0 y0 x1 y1

type DocumentContext
  field Pointer:Document document
  # attributes forwarding
  field (Dictionary Str Str) values
  field (List List:Str) stack
  field Link:DrawPrototype draw
  field Float clip_x0 clip_y0 clip_x1 clip_y1
  # available space
  field Float area_x0 area_y0 area_x1 area_y1
  field List:DocumentArea areas
  # current line
  field Float line_y0 line_x line_y
  field (List Pointer:DocumentArea) line_content
  field CBool line_center
  # event
  field Str url
  field Str key
  field Float x y


method c mark
  arg_rw DocumentContext c
  c stack += var List:Str empty_list

method c set tag
  arg_rw DocumentContext c ; arg Str tag
  c:values insert tag "[0]"
  var (Pointer List:Str) l :> c:stack last
  l += tag

method c reset tag
  arg_rw DocumentContext c ; arg Str tag
  c:values insert tag ""
  var (Pointer List:Str) l :> c:stack last
  l += tag

method c query tag -> value
  arg DocumentContext c ; arg Str tag ; arg CBool value
  var Pointer:Str p :> c:values first tag
  if exists:p
    value := p:len<>0
    value := false

method c set tag attr value
  arg_rw DocumentContext c ; arg Str tag attr value
  c:values insert tag+" "+attr value
  var (Pointer List:Str) l :> c:stack last
  l += tag+" "+attr

method c query tag attr -> value
  arg DocumentContext c ; arg Str tag attr value
  var Pointer:Str p :> c:values first tag+" "+attr
  if exists:p
    value := p
    value := ""

method c rewind
  arg_rw DocumentContext c
  var (Pointer List:Str) l :> c:stack last
  var Pointer:Str p :> l last
  while exists:p
    c:values remove (c:values first p)
    p :> l previous p
  c:stack remove l


method n has_area -> c
  arg_rw DocumentNode n ; arg CBool c
  c := n:extra<>null

method n area -> a
  arg_rw DocumentNode n ; arg_C DocumentArea a
  if n:extra=null
    n extra := memory_allocate DocumentArea:size addressof:n
    a :> n:extra map DocumentArea
    a x0 := undefined ; a y0 := undefined ; a x1 := undefined ; a y1 := undefined
    a :> n:extra map DocumentArea

method c newline
  arg_rw DocumentContext c
  if c:line_center
    var Float move_x := 0.5*(c:area_x1-c:line_x)
    each lc c:line_content
      lc x0 += move_x
      lc x1 += move_x
  c line_y0 := c area_y0
  c line_x := c area_x0 ; c line_y := c area_y0
  c line_content := var (List Pointer:DocumentArea) empty_list
  c line_center := false

method c addtoline a
  arg_rw DocumentContext c ; arg_rw DocumentArea a
  # vcenter is not covered yet
  var Float move_y := (-a:y0)-(c:line_y-c:line_y0)
  if move_y>0
    each lc c:line_content
      lc y0 += move_y
      lc y1 += move_y
    c line_y += move_y
    c area_y0 += move_y
  var Float move_y := a:y1-(c:area_y0-c:line_y)
  if move_y>0
    c area_y0 += move_y
    # might need to switch to next area
  a x0 += c line_x ; a y0 += c line_y
  a x1 += c line_x ; a y1 += c line_y
  var Pointer:DocumentArea p :> a ; c line_content += p
  c line_x += a:x1-a:x0

method c addtoline n
  arg_rw DocumentContext c ; arg_rw DocumentNode n
  c addtoline n:area

method c newarea
  arg_rw DocumentContext c
  var Pointer:DocumentArea a :> c:areas first
  c area_x0 := a x0 ; c area_y0 := a y0 ; c area_x1 := a x1 ; c area_y1 := a y1
  c:areas remove a
  c newline


method c bind url doc
  arg_rw DocumentContext c ; arg Str url ; arg_rw Document doc
  c url := url
  c document :> doc

method c position_setup x0 y0 x1 y1
  arg_rw DocumentContext c ; arg Float x0 y0 x1 y1
  c area_x0 := x0
  c area_y0 := y0
  c area_x1 := x1
  c area_y1 := y1
  c areas := var List:DocumentArea empty_areas_list
  c newline

method c draw_setup draw x0 y0 x1 y1
  arg_rw DocumentContext c ; oarg_rw DrawPrototype draw ; arg Float x0 y0 x1 y1
  c draw :> draw
  c clip_x0 := x0 ; c clip_y0 := y0 ; c clip_x1 := x1 ; c clip_y1 := y1

method c gamut -> g
  arg_rw DocumentContext c ; oarg_R ColorGamut g
  g :> c:draw:query gamut

method c image img t
  arg_rw DocumentContext c ; oarg_rw ImagePrototype img ; arg Transform2 t
  c:draw image img t

method c rectangle x0 y0 x1 y1 color
  arg_rw DocumentContext c ; arg Float x0 y0 x1 y1 ; arg Address color
  c:draw rectangle x0 y0 x1 y1 color

method c fill curves mode t color
  arg_rw DocumentContext c ; arg Array:Curve curves ; arg Int mode ; arg Transform2 t ; arg Address color
  c:draw fill curves mode t color

method c text txt font kerning length t color
  arg_rw DocumentContext c ; arg Str32 txt ; arg Font font ; arg Address kerning ; arg Float length ; arg Transform2 t ; arg Address color
  c:draw text txt font kerning length t color

method c event_setup key x y
  arg_rw DocumentContext c ; arg Str key ; arg Float x y
  c key := key ; c x := x ; c y := y

export DocumentArea '. x0' '. y0' '. x1' '. y1'
export '. has_area' '. area'

export DocumentContext '. url' '. key' '. x' '. y'
export '. mark' '. set' '. query' '. rewind'
export '. bind' '. document'
export '. area_x0' '. area_y0' '. area_x1' '. area_y1'
export '. line_x' '. line_y' '. newline' '. addtoline' '. line_center' '. newarea'
export '. position_setup'
export '. draw_setup' '. clip_x0' '. clip_y0' '. clip_x1' '. clip_y1'
export '. gamut' '. image' '. rectangle' '. fill' '. text'
export '. event_setup' '. url' '. key' '. x' '. y'