Patch title: Release 93 bulk changes
Abstract:
File: /graphic/draw/displaylist.pli
Key:
    Removed line
    Added line
   
module "/pliant/language/compiler.pli"
module "/pliant/math/transform.pli"
module "prototype.pli"
module "misc.pli"


method d play draw options
  oarg_rw DrawDisplayList d ; oarg_rw DrawPrototype draw ; a
  var ImagePrototype proto := draw image_prototype options
  var Link:DrawPrototype clipped
  var Link:DrawPrototype target :> draw
  var Pointer:Arrow c :> d:list first
module "/pliant/language/compiler.pli"
module "/pliant/math/transform.pli"
module "prototype.pli"
module "misc.pli"


method d play draw options
  oarg_rw DrawDisplayList d ; oarg_rw DrawPrototype draw ; a
  var ImagePrototype proto := draw image_prototype options
  var Link:DrawPrototype clipped
  var Link:DrawPrototype target :> draw
  var Pointer:Arrow c :> d:list first
  var Float outline_minimum := options option "outline_minimum" Float
  while c<>null
    var Pointer:Type t :> entry_type c
    if t=DisplayListImage
      var Link:DisplayListImage di :> c map DisplayListImage
      if not clip_image or proto:x0=undefined or (di:x0<prot
        target image di:img di:t
    eif t=DisplayListRectangle
      var Link:DisplayListRectangle dr :> c map DisplayListR
      if not clip_rectangle or proto:x0=undefined or (dr:x0<
        target rectangle dr:x0 dr:y0 dr:x1 dr:y1 (addressof 
    eif t=DisplayListFill
      var Link:DisplayListFill df :> c map DisplayListFill
      if not clip_fill or proto:x0=undefined or (df:x0<proto
  while c<>null
    var Pointer:Type t :> entry_type c
    if t=DisplayListImage
      var Link:DisplayListImage di :> c map DisplayListImage
      if not clip_image or proto:x0=undefined or (di:x0<prot
        target image di:img di:t
    eif t=DisplayListRectangle
      var Link:DisplayListRectangle dr :> c map DisplayListR
      if not clip_rectangle or proto:x0=undefined or (dr:x0<
        target rectangle dr:x0 dr:y0 dr:x1 dr:y1 (addressof 
    eif t=DisplayListFill
      var Link:DisplayListFill df :> c map DisplayListFill
      if not clip_fill or proto:x0=undefined or (df:x0<proto
        target fill df:curves df:mode df:t (addressof df:col
        part draw_outline
          if outline_minimum=defined
            var Point2 p0 := df:t (point df:x0 df:y0)   
            var Point2 p1 := df:t (point df:x1 df:y1)
            var Float d2 := (p1:x-p0:x)*(p1:x-p0:x)+(p1:y-p0:y)*(p1:y-p0:y)
            if d2<outline_minimum*outline_minimum
              leave draw_outline
          target fill df:curves df:mode df:t (addressof df:color)
    eif t=DisplayListText
      var Link:DisplayListText dt :> c map DisplayListText
      if not clip_text or proto:x0=undefined or (dt:x0<proto
        target text dt:txt dt:font dt:kerning:characters dt:
    eif t=DisplayListClipOpen
      var Link:DisplayListClipOpen dc :> c map DisplayListCl
      if not clip_clip or proto:x0=undefined or dc:x0=undefi
        clipped :> draw clip_open dc:x0 dc:y0 dc:x1 dc:y1
      else
        var Int level := 1
        while level>0
          c :> d:list next c
          var Pointer:Type t :> entry_type c
          if t=DisplayListClipOpen
            level += 1
          eif t=DisplayListClipClose
            level -= 1
    eif t=DisplayListClipDrawOpen
      target :> clipped
    eif t=DisplayListClipDrawClose
      target :> draw
    eif t=DisplayListClipClose
      draw clip_close
    eif t=DisplayListInclude
      var Link:DisplayListInclude sub :> c map DisplayListIn
      var Link:DrawPrototype filter
      if (exists sub:filter)
        var Link:DrawPrototype filter :> (entry_new sub:filt
        filter bind draw sub:options
      else
        filter :> draw
      sub:list play filter options
    c :> d:list next c



method d image_prototype options -> proto
  oarg DrawDisplayList d ; arg Str options ; arg ImageProtot
  proto := d proto
  if (options option "bbox")
    var BoundingBox b
    var Pointer:Arrow c :> d:list first
    while c<>null
      var Pointer:Type t :> entry_type c
      if t=DisplayListImage
        var Link:DisplayListImage di :> c map DisplayListIma
        if clip_image
          b apply di:x0 di:y0 di:x1 di:y1
        else
          b apply di:img:x0 di:img:y0 di:img:x1 di:img:y1 di
      eif t=DisplayListRectangle
        var Link:DisplayListRectangle dr :> c map DisplayLis
        b apply dr:x0 dr:y0 dr:x1 dr:y1
      eif t=DisplayListFill
        var Link:DisplayListFill df :> c map DisplayListFill
        if clip_fill
          b apply df:x0 df:y0 df:x1 df:y1
        else
          for (var Int i) 0 df:curves:size-1
            df:curves:i bbox (var Float xx0) (var Float yy0)
            b apply xx0 yy0 xx1 yy1 df:t
      eif t=DisplayListText
        var Link:DisplayListText dt :> c map DisplayListText
        if clip_text
          b apply dt:x0 dt:y0 dt:x1 dt:y1
        else
          dt:font bbox dt:txt dt:kerning:characters dt:lengt
          b apply xx0 yy0 xx1 yy1 dt:t
      eif t=DisplayListInclude
        var Link:DisplayListInclude sub :> c map DisplayList
        var ImagePrototype pr := sub:list image_prototype op
        var Transform2 tr
        var Str op := sub options
        if (op option "translate") or (op option "scale") or
          if not ((op (op option_position "translate" 0) op:
            tx := op option "translate" Float 0
            ty := tx
          if not ((op (op option_position "scale" 0) op:len)
            sx := op option "scale" Float 1
            sy := sx
          if not ((op (op option_position "rotate" 0) op:len
            rx := op option "rotate" Float 0
            ry := rx
          tr := transform tx ty sx sy rx ry
        else
          tr xx := op option "xx" Float 1
          tr xy := op option "xy" Float 0
          tr xt := op option "xt" Float 0
          tr yx := op option "yx" Float 0
          tr yy := op option "yy" Float 1
          tr yt := op option "yt" Float 0
          tr compute
        b apply pr:x0 pr:y0 pr:x1 pr:y1 tr
      c :> d:list next c
    proto x0 := b x0 ; proto y0 := b y0 ; proto x1 := b x1 ;
    eif t=DisplayListText
      var Link:DisplayListText dt :> c map DisplayListText
      if not clip_text or proto:x0=undefined or (dt:x0<proto
        target text dt:txt dt:font dt:kerning:characters dt:
    eif t=DisplayListClipOpen
      var Link:DisplayListClipOpen dc :> c map DisplayListCl
      if not clip_clip or proto:x0=undefined or dc:x0=undefi
        clipped :> draw clip_open dc:x0 dc:y0 dc:x1 dc:y1
      else
        var Int level := 1
        while level>0
          c :> d:list next c
          var Pointer:Type t :> entry_type c
          if t=DisplayListClipOpen
            level += 1
          eif t=DisplayListClipClose
            level -= 1
    eif t=DisplayListClipDrawOpen
      target :> clipped
    eif t=DisplayListClipDrawClose
      target :> draw
    eif t=DisplayListClipClose
      draw clip_close
    eif t=DisplayListInclude
      var Link:DisplayListInclude sub :> c map DisplayListIn
      var Link:DrawPrototype filter
      if (exists sub:filter)
        var Link:DrawPrototype filter :> (entry_new sub:filt
        filter bind draw sub:options
      else
        filter :> draw
      sub:list play filter options
    c :> d:list next c



method d image_prototype options -> proto
  oarg DrawDisplayList d ; arg Str options ; arg ImageProtot
  proto := d proto
  if (options option "bbox")
    var BoundingBox b
    var Pointer:Arrow c :> d:list first
    while c<>null
      var Pointer:Type t :> entry_type c
      if t=DisplayListImage
        var Link:DisplayListImage di :> c map DisplayListIma
        if clip_image
          b apply di:x0 di:y0 di:x1 di:y1
        else
          b apply di:img:x0 di:img:y0 di:img:x1 di:img:y1 di
      eif t=DisplayListRectangle
        var Link:DisplayListRectangle dr :> c map DisplayLis
        b apply dr:x0 dr:y0 dr:x1 dr:y1
      eif t=DisplayListFill
        var Link:DisplayListFill df :> c map DisplayListFill
        if clip_fill
          b apply df:x0 df:y0 df:x1 df:y1
        else
          for (var Int i) 0 df:curves:size-1
            df:curves:i bbox (var Float xx0) (var Float yy0)
            b apply xx0 yy0 xx1 yy1 df:t
      eif t=DisplayListText
        var Link:DisplayListText dt :> c map DisplayListText
        if clip_text
          b apply dt:x0 dt:y0 dt:x1 dt:y1
        else
          dt:font bbox dt:txt dt:kerning:characters dt:lengt
          b apply xx0 yy0 xx1 yy1 dt:t
      eif t=DisplayListInclude
        var Link:DisplayListInclude sub :> c map DisplayList
        var ImagePrototype pr := sub:list image_prototype op
        var Transform2 tr
        var Str op := sub options
        if (op option "translate") or (op option "scale") or
          if not ((op (op option_position "translate" 0) op:
            tx := op option "translate" Float 0
            ty := tx
          if not ((op (op option_position "scale" 0) op:len)
            sx := op option "scale" Float 1
            sy := sx
          if not ((op (op option_position "rotate" 0) op:len
            rx := op option "rotate" Float 0
            ry := rx
          tr := transform tx ty sx sy rx ry
        else
          tr xx := op option "xx" Float 1
          tr xy := op option "xy" Float 0
          tr xt := op option "xt" Float 0
          tr yx := op option "yx" Float 0
          tr yy := op option "yy" Float 1
          tr yt := op option "yt" Float 0
          tr compute
        b apply pr:x0 pr:y0 pr:x1 pr:y1 tr
      c :> d:list next c
    proto x0 := b x0 ; proto y0 := b y0 ; proto x1 := b x1 ;