Patch title: Release 94 bulk changes
Abstract:
File: /pliant/graphic/layout/restyle.pli
Key:
    Removed line
    Added line
module "/pliant/language/compiler.pli"
module "/pliant/graphic/draw/prototype.pli"
module "prototype.pli"
module "helper/recurse.pli"
module "helper/position.pli"


public
  type LayoutAttribute
    field Int offset
    field Int size
    field Arrow value

  type LayoutRestyle
    field Link:LayoutPrototype next
    field Int parent_and_flags <- 0
    field LayoutArea bbox
    field Link:LayoutPrototype first_son
    field Link:LayoutStyle style
    field List:LayoutAttribute attributes

  LayoutPrototype maybe LayoutRestyle


function build s
  arg_w LayoutRestyle s
  s:bbox x0 := undefined


function memory_swap a b tsize
  arg Address a b ; arg Int tsize
  var Address pa := a ; var Address pb := b ; var Int remain := tsize
  while remain>=uInt:size
    var uInt i := pa map uInt
    pa map uInt := pb map uInt
    pb map uInt := i
    pa := pa translate uInt 1
    pb := pb translate uInt 1
    remain -= uInt size
  while remain>0
    var uInt i := pa map uInt8
    pa map uInt8 := pb map uInt8
    pb map uInt8 := i
    pa := pa translate uInt8 1
    pb := pb translate uInt8 1
    remain -= uInt8 size


method s position c -> b
  oarg_rw LayoutRestyle s ; arg_rw LayoutPC c ; arg LayoutArea b
  var Pointer:LayoutStyle memo :> c style
  if (exists s:style)
    c style :> s style
  each attr s:attributes
    memory_swap ((addressof c:style) translate Byte attr:offset) attr:value attr:size
  b := s position_recurse c
  each attr s:attributes
    memory_swap ((addressof c:style) translate Byte attr:offset) attr:value attr:size
  c style :> memo
  s set_position b


method s draw d c
  oarg_rw LayoutRestyle s ; oarg_rw DrawPrototype d ; arg_rw LayoutDC c
  if s:bbox:x0=undefined or (s:bbox intersects c:bbox)
    var Pointer:LayoutStyle memo :> c style
    if (exists s:style)
      c style :> s style
    each attr s:attributes
      memory_swap ((addressof c:style) translate Byte attr:offset) attr:value attr:size
    s draw_recurse d c
    each attr s:attributes
      memory_swap ((addressof c:style) translate Byte attr:offset) attr:value attr:size
    c style :> memo


method s event c
  oarg_rw LayoutRestyle s ; arg_rw LayoutEC c
  if c:mode=layout_event_pointer and (s:bbox:x0=undefined or s:bbox:x0<=c:x and s:bbox:y0<=c:y and s:bbox:x1>=c:x and s:bbox:y1>=c:y)
    var Pointer:LayoutStyle memo :> c style
    if (exists s:style)
      c style :> s style
    each attr s:attributes
      memory_swap ((addressof c:style) translate Byte attr:offset) attr:value attr:size
    s event_recurse c
    each attr s:attributes
      memory_swap ((addressof c:style) translate Byte attr:offset) attr:value attr:size
    c style :> memo


method s first -> p
  oarg_rw LayoutRestyle s ; arg_C Link:LayoutPrototype p
  p :>> s first_son


function restyle_enter base_style target -> final_style
  arg LayoutStyle base_style ; arg LayoutPrototype target ; arg_C LayoutStyle final_style
  var Pointer:LayoutPrototype p :> target
  while exists:p and (entry_type addressof:p)<>LayoutRestyle
    p :> p parent
  if exists:p
    final_style :> restyle_enter base_style p:parent
    var Pointer:LayoutRestyle s :> addressof:p map LayoutRestyle
    if (exists s:style)
      final_style :> s style
    each attr s:attributes
      memory_swap (addressof:final_style translate Byte attr:offset) attr:value attr:size
  else
    final_style :> base_style

function what_style base_style target -> final_style
  arg LayoutStyle base_style ; arg LayoutPrototype target ; arg_C LayoutStyle final_style
  var Pointer:LayoutPrototype p :> target
  while exists:p
    if (entry_type addressof:p)=LayoutRestyle
      var Pointer:LayoutRestyle s :> addressof:p map LayoutRestyle
      if (exists s:style)
        final_style :> s style
        return
    p :> p parent
  final_style :> base_style

function restyle_leave base_style target
  arg LayoutStyle base_style ; arg LayoutPrototype target
  var Pointer:LayoutPrototype p :> target
  while exists:p
    if (entry_type addressof:p)=LayoutRestyle
      var Pointer:LayoutRestyle s :> addressof:p map LayoutRestyle
      var Pointer:LayoutStyle style :> what_style base_style p
      each attr s:attributes
        memory_swap (addressof:style translate Byte attr:offset) attr:value attr:size
    p :> p parent


export memory_swap
export restyle_enter restyle_leave