Patch title: Release 91 bulk changes
Abstract:
File: /graphic/vfilter/prototype.pli
Key:
    Removed line
    Added line
module "/pliant/language/compiler.pli"
module "/pliant/language/stream.pli"
module "/pliant/graphic/draw/prototype.pli"


public


method d smart_setup proto options -> status
  oarg_rw DrawPrototype d ; arg ImagePrototype proto ; arg Str options ; arg ExtendedStatus status
  if not ((options (options option_position "resolution" 0) options:len) parse word:"resolution" (var Float dpi_x) (var Float dpi_y) any)
    dpi_x := options option "resolution" Float 300 ; dpi_y := dpi_x
  if not ((options (options option_position "antialiasing" 0) options:len) parse word:"antialiasing" (var Int aa_x) (var Int aa_y) any)
    aa_x := options option "antialiasing" Int 1 ; aa_y := aa_x
  if dpi_x=defined
    d setup (image_prototype proto:x0 proto:y0 proto:x1 proto:y1 dpi_x dpi_y aa_x aa_y image_adjust_extend proto:gamut) options
  else
    d setup (image_prototype proto:x0 proto:y0 proto:x1 proto:y1 1 1 proto:gamut) options


type DrawReadFilter
  void

method f load stream options draw -> status
  oarg_rw DrawReadFilter f ; arg_rw Stream stream ; arg Str options ; oarg_rw DrawPrototype draw ; arg ExtendedStatus status
  generic


type DrawWriteFilter
  void


private

gvar Dictionary draw_read_filters # extension -> type
gvar Dictionary draw_write_filters # extension -> type

function draw_record_filters ext read_filter write_filter
  arg Str ext ; arg Type read_filter write_filter
  if read_filter<>Void
    draw_read_filters insert ext true addressof:read_filter
  if write_filter<>Void
    draw_write_filters insert ext true addressof:write_filter

function draw_read_filter filename -> f
  arg Str filename ; arg Link:DrawReadFilter f
  var Str ext := filename
  ext := ext (ext search_last "/" -1)+1 ext:len
  ext := ext (ext search "." ext:len) ext:len
  var Pointer:Arrow c :> draw_read_filters first ext
  if c=null
    console "There is no read filter for " ext eol
    f :> null map DrawReadFilter
    return
  f :> entry_new:(c map Type) map DrawReadFilter
 
function draw_write_filter filename -> f
  arg Str filename ; arg Link:DrawWriteFilter f
  var Str ext := filename
  ext := ext (ext search_last "/" -1)+1 ext:len
  ext := ext (ext search "." ext:len) ext:len
  var Pointer:Arrow c :> draw_write_filters first ext
  if c=null
    console "There is no write filter for " ext eol
    f :> null map DrawWriteFilter
    return
  f :> entry_new:(c map Type) map DrawWriteFilter


method d load stream options -> status
  oarg_rw DrawPrototype d ; arg_rw Stream stream ; arg Str options ; arg ExtendedStatus status
  var Link:DrawReadFilter f :> draw_read_filter (shunt (options option "filter") (options option "filter" Str) stream:name)
  if not exists:f
    return (failure "There is no filter for "+stream:name+" drawing")
  status := f load stream options d
 
method d load filename options -> status
  oarg_rw DrawPrototype d ; arg Str filename options ; arg ExtendedStatus status
  var Link:Stream s :> new Stream
  if (s open filename options in+safe+anyeol)=failure
    return (failure "Failed to open "+filename)
  status := d load s options
  if s=failure
    status := failure filename+" is corrupted"


export draw_record_filters draw_read_filter draw_write_filter
export '. smart_setup' '. load'
export '. load'