Patch title: Release 92 bulk changes
Abstract:
File: /graphic/draw/convert.pli
Key:
    Removed line
    Added line
module "/pliant/language/unsafe.pli"
module "/pliant/graphic/color/gamut.pli"
module "/pliant/graphic/draw/prototype.pli"
module "/pliant/graphic/misc/bytes.pli"


function pixel_is_transparent pixel gamut -> t
  arg Address pixel ; arg ColorGamut gamut ; arg CBool t
  for (var Int i) 0 gamut:transparency-1
    if (pixel map uInt8 gamut:dimension+i)<>0
      return false
  t := true


type DrawConvert
  field Link:DrawPrototype draw
  field Link:ColorGamut src_gamut
  field Link:ColorGamut dest_gamut
  field Arrow speedup
  field Str options

DrawPrototype maybe DrawConvert


method d setup proto options -> status
  oarg_rw DrawConvert d ; arg ImagePrototype proto ; arg Str options ; arg ExtendedStatus status
  d src_gamut :> proto gamut
  d speedup := d:dest_gamut speedup d:src_gamut options
  d options := options
  var ImagePrototype proto2 := proto
  proto2 gamut :> d dest_gamut
  status := d:draw setup proto2 options


method d bind draw options -> status
  oarg_rw DrawConvert d ; oarg_rw DrawPrototype draw ; arg Str options ; arg ExtendedStatus status
  d draw :> draw
  var Str gamutname := options option "dest_gamut" Str
  if gamutname<>""
    d dest_gamut :> color_gamut gamutname
    if d:dest_gamut=failure
      return (failure "no '"+gamutname+"' gamut")
  else
    d dest_gamut :> (draw image_prototype options) gamut
  var Str gamutname := options option "src_gamut" Str (options option "gamut" Str)
  if gamutname<>""
    d src_gamut :> color_gamut gamutname
    if d:src_gamut=failure
      return (failure "no '"+gamutname+"' gamut")
    d speedup := d:dest_gamut speedup d:src_gamut options
  else
    void # might be provided later by 'setup' instruction
  d options := options
  status := success


method d image_prototype options -> proto
  oarg DrawConvert d ; arg Str options ; arg ImagePrototype proto
  proto := d:draw image_prototype options
  proto gamut :> d src_gamut


method d image img t
  oarg_rw DrawConvert d ; oarg_rw ImagePrototype img ; arg Transform2 t
  bytes_fill addressof:(var ColorBuffer src_pixel) 1 img:gamut:pixel_size
  var Address speedup := d:dest_gamut speedup img:gamut d:options
  d:dest_gamut convert img:gamut addressof:src_pixel addressof:(var ColorBuffer dest_pixel) 1 speedup
  if not (pixel_is_transparent addressof:dest_pixel d:dest_gamut)
    d:draw image img t


method d rectangle x0 y0 x1 y1 color
  oarg_rw DrawConvert d ; arg Float x0 y0 x1 y1 ; arg Address color
  d:dest_gamut convert d:src_gamut color addressof:(var ColorBuffer dest_color) 1 d:speedup
  if not (pixel_is_transparent addressof:dest_color d:dest_gamut)
    d:draw rectangle x0 y0 x1 y1 addressof:dest_color


method d fill curves mode t color
  oarg_rw DrawConvert d ; arg Array:Curve curves ; arg Int mode ; arg Transform2 t ; arg Address color
  d:dest_gamut convert d:src_gamut color addressof:(var ColorBuffer dest_color) 1 d:speedup
  if not (pixel_is_transparent addressof:dest_color d:dest_gamut)
    d:draw fill curves mode t addressof:dest_color


method d text txt font kerning length t color
  oarg_rw DrawConvert d ; arg Str32 txt ; arg Font font ; arg Address kerning ; arg Float length ; arg Transform2 t ; arg Address color
  d:dest_gamut convert d:src_gamut color addressof:(var ColorBuffer dest_color) 1 d:speedup
  if not (pixel_is_transparent addressof:dest_color d:dest_gamut)
    d:draw text txt font kerning length t addressof:dest_color


method d clip_open x0 y0 x1 y1 -> dc
  oarg_rw DrawConvert d ; arg Float x0 y0 x1 y1 ; arg Link:DrawPrototype dc
  dc :> d:draw clip_open x0 y0 x1 y1
  
method d clip_close
  oarg_rw DrawConvert d
  d:draw clip_close


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

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

method d tag_close
  oarg_rw DrawConvert d
  d:draw tag_close


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


export DrawConvert