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


type DrawTransform
  field Link:DrawPrototype draw
  field Transform2 t

DrawPrototype maybe DrawTransform


function apply x0 y0 x1 y1 t tx0 ty0 tx1 ty1
  arg Float x0 y0 x1 y1 ; arg Transform2 t ; arg_w Float tx0 ty0 tx1 ty1
  var Point2 p := t (point x0 y0) ; tx0 := p x ; ty0 := p y ; tx1 := p x ; ty1 := p y
  var Point2 p := t (point x1 y0) ; tx0 := min tx0 p:x ; ty0 := min ty0 p:y ; tx1 := max tx1 p:x ; ty1 := max ty1 p:y
  var Point2 p := t (point x1 y1) ; tx0 := min tx0 p:x ; ty0 := min ty0 p:y ; tx1 := max tx1 p:x ; ty1 := max ty1 p:y
  var Point2 p := t (point x0 y1) ; tx0 := min tx0 p:x ; ty0 := min ty0 p:y ; tx1 := max tx1 p:x ; ty1 := max ty1 p:y


method d bind draw t
  oarg_rw DrawTransform d ; oarg_rw DrawPrototype draw ; arg Transform2 t
  d draw :> draw
  d t := t


method d setup proto options -> status
  oarg_rw DrawTransform d ; arg ImagePrototype proto ; arg Str options ; arg ExtendedStatus status
  status := d:draw setup proto options
  var ImagePrototype proto2 := proto
  apply proto:x0 proto:y0 proto:x1 proto:y1 d:t proto2:x0 proto2:y0 proto2:x1 proto2:y1
  status := d:draw setup proto2 options


method d bind draw options -> status
  oarg_rw DrawTransform d ; oarg_rw DrawPrototype draw ; arg Str options ; arg ExtendedStatus status
  d draw :> draw
  if (options option "translate") or (options option "scale") or (options option "rotate")
    if not ((options (options option_position "translate" 0) options:len) parse word:"translate" (var Float tx) (var Float ty) any)
      tx := options option "translate" Float 0
      ty := tx
    if not ((options (options option_position "scale" 0) options:len) parse word:"scale" (var Float sx) (var Float sy) any)
      sx := options option "scale" Float 1
      sy := sx
    if not ((options (options option_position "rotate" 0) options:len) parse word:"rotate" (var Float rx) (var Float ry) any)
      rx := options option "rotate" Float 0
      ry := rx
    d t := transform tx ty sx sy rx ry
  else
    d:t xx := options option "xx" Float 1
    d:t xy := options option "xy" Float 0
    d:t xt := options option "xt" Float 0
    d:t yx := options option "yx" Float 0
    d:t yy := options option "yy" Float 1
    d:t yt := options option "yt" Float 0
    d:t compute


method d image_prototype options -> proto
  oarg DrawTransform d ; arg Str options ; arg ImagePrototype proto
  proto := d:draw image_prototype options
  if proto:x0=defined
    var Transform2 r := reverse d:t
    var Float x0 := proto x0
    var Float y0 := proto y0
    var Float x1 := proto x1
    var Float y1 := proto y1
    apply x0 y0 x1 y1 r proto:x0 proto:y0 proto:x1 proto:y1
  

method d image img t
  oarg_rw DrawTransform d ; oarg_rw ImagePrototype img ; arg Transform2 t
  d:draw image img (compose t d:t)


method d rectangle x0 y0 x1 y1 color
  oarg_rw DrawTransform d ; arg Float x0 y0 x1 y1 ; arg Address color
  (var Array:Curve curves) size := 1
  var Pointer:Curve c :> curves 0
  c angle x0 y0
  c angle x1 y0
  c angle x1 y1
  c angle x0 y1
  c compute outline
  d:draw fill curves fill_evenodd d:t color
  if d:t:level<=transform_translate
    var Point2 p0 := d:t (point x0 y0)
    var Point2 p1 := d:t (point x1 y1)
    d:draw rectangle p0:x p0:y p1:x p1:y color
  else
    (var Array:Curve curves) size := 1
    var Pointer:Curve c :> curves 0
    c angle x0 y0
    c angle x1 y0
    c angle x1 y1
    c angle x0 y1
    c compute outline
    d:draw fill curves fill_evenodd d:t color

   
method d fill curves mode t color
  oarg_rw DrawTransform d ; arg Array:Curve curves ; arg Int mode ; arg Transform2 t ; arg Address color
  d:draw fill curves mode (compose t d:t) color


method d text txt font kerning length t color
  oarg_rw DrawTransform d ; arg Str32 txt ; arg Font font ; arg Address kerning ; arg Float length ; arg Transform2 t ; arg Address color
  d:draw text txt font kerning length (compose t d:t) color


method d clip_open x0 y0 x1 y1 -> dc
  oarg_rw DrawTransform d ; arg Float x0 y0 x1 y1 ; arg Link:DrawPrototype dc
  if x0=defined
    apply x0 y0 x1 y1 d:t (var Float tx0) (var Float ty0) (var Float tx1) (var Float ty1)
  else
    tx0 := undefined ; ty0 := undefined ; tx1 := undefined ; ty1 := undefined
  var Link:DrawTransform dct :> new DrawTransform
  dct draw :> d:draw clip_open tx0 ty0 tx1 ty1
  dct t := d t
  dc :> dct

method d clip_close
  oarg_rw DrawTransform d
  d:draw clip_close


method d tag_open id
  oarg_rw DrawTransform d ; arg Str id
  d:draw tag_open id

method d tag_attribute attr value
  oarg_rw DrawTransform d ; arg Str attr value
  d:draw tag_attribute attr value

method d tag_close
  oarg_rw DrawTransform d
  d:draw tag_close


method d warning message
  oarg_rw DrawTransform d ; arg Str message
  d:draw warning message

method d trouble_open -> dt
  oarg_rw DrawTransform d ; arg Link:DrawPrototype dt
  var Link:DrawTransform dtt :> new DrawTransform
  dtt draw :> d:draw trouble_open
  dtt t := d t
  dt :> dtt

method d trouble_close
  oarg_rw DrawTransform d
  d:draw trouble_close
method d transform -> tr
  arg DrawTransform d ; arg_C Transform2 tr
  tr :> d t

export DrawTransform '. bind'
export DrawTransform '. bind' '. transform'