Patch title: Release 85 bulk changes
Abstract:
File: /pliant/graphic/filter/png.pli
Key:
    Removed line
    Added line
   
abstract
  [The PNG file format interface.] ; eol
  [PNG is a clear, highly recommended file format.] ; eol
abstract
  [The PNG file format interface.] ; eol
  [PNG is a clear, highly recommended file format.] ; eol
  warning "warning: " [reading is not available yet.]
  highlight "warning: " ; [reading is not available yet.]


method f open stream options h -> status
  arg_rw ImageReadFilterPng f ; arg_rw Stream stream ; arg S
  var Str sign := ".PNG...."
  stream raw_read sign:characters sign:len
  if sign<>character:137+"PNG[cr][lf]"+character:26+"[lf]"
    return failure:"This is not a .png image"
  stream raw_read addressof:(var uInt32_hi len) uInt32:size
  var Str tag := "1234" ; stream raw_read tag:characters tag
  if tag<>"IHDR" or len<>PNGHeader:size
    return failure:"Expected PNG header tag to be the first 
  stream raw_read addressof:(var PNGHeader hdr) PNGHeader:si
  if hdr:depth<>8 or (hdr:color<>2 and hdr:color<>6)
    return failure:"Only 24 bits or 32 bits per pixel PNG fi
  if hdr:compression<>0 or hdr:filter<>0 or hdr:interlace<>0
    return failure:"This PNG file encoding is not supported 
  # FIXME: rather scan all tags until iDAT
  if not ((options (options option_position "resolution" 0) 


method f open stream options h -> status
  arg_rw ImageReadFilterPng f ; arg_rw Stream stream ; arg S
  var Str sign := ".PNG...."
  stream raw_read sign:characters sign:len
  if sign<>character:137+"PNG[cr][lf]"+character:26+"[lf]"
    return failure:"This is not a .png image"
  stream raw_read addressof:(var uInt32_hi len) uInt32:size
  var Str tag := "1234" ; stream raw_read tag:characters tag
  if tag<>"IHDR" or len<>PNGHeader:size
    return failure:"Expected PNG header tag to be the first 
  stream raw_read addressof:(var PNGHeader hdr) PNGHeader:si
  if hdr:depth<>8 or (hdr:color<>2 and hdr:color<>6)
    return failure:"Only 24 bits or 32 bits per pixel PNG fi
  if hdr:compression<>0 or hdr:filter<>0 or hdr:interlace<>0
    return failure:"This PNG file encoding is not supported 
  # FIXME: rather scan all tags until iDAT
  if not ((options (options option_position "resolution" 0) 
    dpi_x := options option "resolution" Float ; dpi_y := dp
    dpi_x := options option "resolution" Float 72 ; dpi_y := dpi_x
  if read_resolution and not stream:atend and (cast stream:s
    var uInt32_hi len := (stream:stream_read_cur translate B
    tag set (stream:stream_read_cur translate Byte 8) 4 fals
    if tag="pHYs" and len=PNGResolution:size
      stream:stream_read_cur := stream:stream_read_cur trans
      stream raw_read addressof:(var PNGResolution res) PNGR
      dpi_x := res:rx/1000*25.4
      dpi_y := res:ry/1000*25.4
  h := image_prototype 0 0 hdr:size_x/dpi_x*25.4 hdr:size_y/
  f s :> stream
  f pixel_size := h pixel_size
  f line_size := h line_size
  f remain := 0
  var Pointer:z_stream_s r :> f r
  memory_clear addressof:r z_stream_s:size
  r data_type := 2
  if pliant_alloc
    r zalloc := (the_function pliant_zalloc Address uInt uIn
    r zfree := (the_function pliant_zfree Address Address) e
  if (inflateInit r)<>0
    return failure:"failed to initialize Zlib"
  f remain := 0
  f y := 0
  f buffer := (memory_zallocate h:line_size+h:pixel_size add
  f previous := (memory_zallocate h:line_size+h:pixel_size a
  status := success


method f readline adr -> status
  arg_rw ImageReadFilterPng f ; arg Address adr ; arg Status
  var Pointer:z_stream_s r :> f r
  var Pointer:Stream s :> f s
  r next_out := addressof (var uInt8 filter)
  r avail_out := 1
  var CBool mode := false
  while r:avail_out<>0 or not mode
    if r:avail_out=0
      r next_out := f buffer
      r avail_out := f line_size
      mode := true
    if r:avail_in=0
      while f:remain=0
        s raw_read addressof:(var uInt32_hi crc) uInt32:size
        if s:atend
          return failure
        s raw_read addressof:(var uInt32_hi len) uInt32:size
        var Str tag := "1234" ; s raw_read tag:characters ta
        if tag="IDAT"
          f remain := len
        else
          for (var Int i) 0 len-1
            s raw_read addressof:(var uInt8 drop) 1
      if s:atend
        return failure
      r next_in := s stream_read_cur
      r avail_in := min (cast s:stream_read_stop Int)-(cast 
      s stream_read_cur := s:stream_read_cur translate Byte 
      f remain -= r avail_in
    inflate r 0
  var Address cur := f buffer
  var Address stop := f:buffer translate Byte f:line_size
  if read_resolution and not stream:atend and (cast stream:s
    var uInt32_hi len := (stream:stream_read_cur translate B
    tag set (stream:stream_read_cur translate Byte 8) 4 fals
    if tag="pHYs" and len=PNGResolution:size
      stream:stream_read_cur := stream:stream_read_cur trans
      stream raw_read addressof:(var PNGResolution res) PNGR
      dpi_x := res:rx/1000*25.4
      dpi_y := res:ry/1000*25.4
  h := image_prototype 0 0 hdr:size_x/dpi_x*25.4 hdr:size_y/
  f s :> stream
  f pixel_size := h pixel_size
  f line_size := h line_size
  f remain := 0
  var Pointer:z_stream_s r :> f r
  memory_clear addressof:r z_stream_s:size
  r data_type := 2
  if pliant_alloc
    r zalloc := (the_function pliant_zalloc Address uInt uIn
    r zfree := (the_function pliant_zfree Address Address) e
  if (inflateInit r)<>0
    return failure:"failed to initialize Zlib"
  f remain := 0
  f y := 0
  f buffer := (memory_zallocate h:line_size+h:pixel_size add
  f previous := (memory_zallocate h:line_size+h:pixel_size a
  status := success


method f readline adr -> status
  arg_rw ImageReadFilterPng f ; arg Address adr ; arg Status
  var Pointer:z_stream_s r :> f r
  var Pointer:Stream s :> f s
  r next_out := addressof (var uInt8 filter)
  r avail_out := 1
  var CBool mode := false
  while r:avail_out<>0 or not mode
    if r:avail_out=0
      r next_out := f buffer
      r avail_out := f line_size
      mode := true
    if r:avail_in=0
      while f:remain=0
        s raw_read addressof:(var uInt32_hi crc) uInt32:size
        if s:atend
          return failure
        s raw_read addressof:(var uInt32_hi len) uInt32:size
        var Str tag := "1234" ; s raw_read tag:characters ta
        if tag="IDAT"
          f remain := len
        else
          for (var Int i) 0 len-1
            s raw_read addressof:(var uInt8 drop) 1
      if s:atend
        return failure
      r next_in := s stream_read_cur
      r avail_in := min (cast s:stream_read_stop Int)-(cast 
      s stream_read_cur := s:stream_read_cur translate Byte 
      f remain -= r avail_in
    inflate r 0
  var Address cur := f buffer
  var Address stop := f:buffer translate Byte f:line_size
  var Int left := -(f:pixel_size)
  var Int left := -(f pixel_size)
  var Int top := (cast f:previous Int).-.(cast f:buffer Int)
  var Int topleft := left+top
  if filter=0
    void
  eif filter=1
    while cur<>stop
      cur map uInt8 := (cur map uInt8)+(cur map uInt8 left) 
      cur := cur translate uInt8 1
  eif filter=2
    while cur<>stop
      cur map uInt8 := (cur map uInt8)+(cur map uInt8 top) .
      cur := cur translate uInt8 1
  eif filter=3
    while cur<>stop
      cur map uInt8 := (cur map uInt8)+((cur map uInt8 left)
      cur := cur translate uInt8 1
  eif filter=4
    while cur<>stop
      cur map uInt8 := (cur map uInt8)+(predicator (cur map 
      cur := cur translate uInt8 1
  else
    return failure
  memory_copy f:buffer adr f:line_size
  memory_copy adr f:previous f:line_size
  f y += 1
  status := success


image_record_filters ".png" ImageReadFilterPng ImageWriteFil
  var Int top := (cast f:previous Int).-.(cast f:buffer Int)
  var Int topleft := left+top
  if filter=0
    void
  eif filter=1
    while cur<>stop
      cur map uInt8 := (cur map uInt8)+(cur map uInt8 left) 
      cur := cur translate uInt8 1
  eif filter=2
    while cur<>stop
      cur map uInt8 := (cur map uInt8)+(cur map uInt8 top) .
      cur := cur translate uInt8 1
  eif filter=3
    while cur<>stop
      cur map uInt8 := (cur map uInt8)+((cur map uInt8 left)
      cur := cur translate uInt8 1
  eif filter=4
    while cur<>stop
      cur map uInt8 := (cur map uInt8)+(predicator (cur map 
      cur := cur translate uInt8 1
  else
    return failure
  memory_copy f:buffer adr f:line_size
  memory_copy adr f:previous f:line_size
  f y += 1
  status := success


image_record_filters ".png" ImageReadFilterPng ImageWriteFil