Patch title: Release 87 bulk changes
Abstract:
File: /pliant/graphic/draw/image.pli
Key:
    Removed line
    Added line
   
module "/pliant/language/compiler.pli"
module "/pliant/math/transform.pli"
module "prototype.pli"
module "/pliant/graphic/image/prototype.pli"
module "/pliant/graphic/color/gamut.pli"
module "/pliant/graphic/vector/outline.pli"
module "/pliant/graphic/vector/font.pli"
module "/pliant/graphic/image/transform.pli"
module "/pliant/graphic/image/convert.pli"
module "/pliant/graphic/image/clip.pli"


type DrawImage
  field Link:ImagePrototype image
  field Link:ImagePrototype clip
  field List:Arrow stack

DrawPrototype maybe DrawImage


method d bind image options
  oarg_rw DrawImage d ; arg ImagePrototype image ; arg Str options
  d image :> image

method d gamut -> g
  oarg_rw DrawImage d ; oarg_R ColorGamut g
  g :> d:image gamut


method d image img t
  oarg_rw DrawImage d ; oarg_rw ImagePrototype img ; arg Transform2 t
  var Link:ImageTransform timg :> new ImageTransform
  timg bind img t d:image ""
  var Int tx := cast (timg:x0-d:image:x0)/(d:image:x1-d:image:x0)*d:image:size_x Int
  var Int ty := cast (timg:y0-d:image:y0)/(d:image:y1-d:image:y0)*d:image:size_y Int
  var Link:ImagePrototype final
  if timg:gamut:name<>d:image:gamut:name
    var Link:ImageConvert conv :> new ImageConvert
    conv bind timg d:image:gamut ""
    final :> conv
  else
    final :> timg
  if tx<0 or tx+final:size_x>d:image:size_x or ty<0 or ty+final:size_y>d:image:size_y
    error error_id_unexpected "transformed image does not fit" ?
  var Address buffer := memory_allocate final:line_size null
  for (var Int y) 0 final:size_y-1
    final read 0 y final:size_x buffer
    d:image write tx y+ty final:size_x buffer
  memory_free buffer

method d rectangle x0 y0 x1 y1 color
  oarg_rw DrawImage d ; arg Float x0 y0 x1 y1 ; arg Address color
  d:image rectangle x0 y0 x1 y1 color

method d fill curves mode t color
  oarg_rw DrawImage d ; arg Array:Curve curves ; arg Int mode ; arg Transform2 t ; arg Address color
  d:image fill curves mode t color

method d text txt font kerning length t color
  oarg_rw DrawImage d ; arg Str32 txt ; arg Font font ; arg Address kerning ; arg Float length ; arg Transform2 t ; arg Address color
  d:image text txt font kerning length t color


method d clip_open x0 y0 x1 y1
  oarg_rw DrawImage d ; arg Float x0 y0 x1 y1
  var Arrow a := addressof d:image ; d:stack += a
  var Arrow a := addressof d:clip ; d:stack += a
  var Link:ImageClip clipped :> new ImageClip
  clipped bind d:image undefined undefined undefined undefined "" d:clip
  d image :> clipped

method d clip_draw_open
  oarg_rw DrawImage d
  var Arrow a := addressof d:image ; d:stack += a
  d image :> d clip

method d clip_draw_close
  oarg_rw DrawImage d
  d image :> d:stack:last map ImagePrototype
  d:stack remove d:stack:last
 
method d clip_close
  oarg_rw DrawImage d
  d clip :> d:stack:last map ImagePrototype
  d:stack remove d:stack:last
  d image :> d:stack:last map ImagePrototype
  d:stack remove d:stack:last


method d tag line mode
  oarg_rw DrawImage d ; arg Str line ; arg Int mode


export DrawImage '. bind'