Patch title: Release 90 bulk changes
Abstract:
File: /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
  highlight "warning: " ; [reading is not available yet.]


method f open stream options h -> status
  arg_rw ImageWriteFilterPng f ; arg_rw Stream stream ; arg 
abstract
  [The PNG file format interface.] ; eol
  [PNG is a clear, highly recommended file format.] ; eol
  highlight "warning: " ; [reading is not available yet.]


method f open stream options h -> status
  arg_rw ImageWriteFilterPng f ; arg_rw Stream stream ; arg 
  if h:gamut:name<>"rgb" and h:gamut:name<>"rgba"
  if h:gamut:name<>"rgb" and h:gamut:name<>"rgba" and h:gamut:name<>"grey"
    return failure:"Only RGB images are currently supported 
  f line_size := h:pixel_size*h:size_x
  f stream :> stream
  stream raw_write8 137
  stream raw_write8 80
  stream raw_write8 78
  stream raw_write8 71
  stream raw_write8 13
  stream raw_write8 10
  stream raw_write8 26
  stream raw_write8 10

  stream raw_write32 PNGHeader:size
  stream writechars "IHDR"
  var PNGHeader hdr
  hdr size_x := h size_x
  hdr size_y := h size_y
  hdr depth := 8
    return failure:"Only RGB images are currently supported 
  f line_size := h:pixel_size*h:size_x
  f stream :> stream
  stream raw_write8 137
  stream raw_write8 80
  stream raw_write8 78
  stream raw_write8 71
  stream raw_write8 13
  stream raw_write8 10
  stream raw_write8 26
  stream raw_write8 10

  stream raw_write32 PNGHeader:size
  stream writechars "IHDR"
  var PNGHeader hdr
  hdr size_x := h size_x
  hdr size_y := h size_y
  hdr depth := 8
  hdr color := shunt h:gamut:name="rgb" 2 h:gamut:name="rgba
  hdr color := shunt h:gamut:name="grey" 0 h:gamut:name="rgb" 2 h:gamut:name="rgba" 6 0
  hdr compression := 0
  hdr filter := 0
  hdr interlace := 0
  stream raw_write addressof:hdr PNGHeader:size
  (var PNG_CRC table) init ; table update "IHDR":characters 
  table update addressof:hdr PNGHeader:size
  stream raw_write32 table:terminate


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
  hdr compression := 0
  hdr filter := 0
  hdr interlace := 0
  stream raw_write addressof:hdr PNGHeader:size
  (var PNG_CRC table) init ; table update "IHDR":characters 
  table update addressof:hdr PNGHeader:size
  stream raw_write32 table:terminate


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)
  if hdr:depth<>8 or (hdr:color<>0 and 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 72 ; dpi_y :=
  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
    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 72 ; dpi_y :=
  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/
  h := image_prototype 0 0 hdr:size_x/dpi_x*25.4 hdr:size_y/dpi_y*25.4 hdr:size_x hdr:size_y color_gamut:(shunt hdr:color=0 "grey" hdr:color=2 "rgb" hdr:color=6 "rgba" "")
  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


image_record_filters ".png" ImageReadFilterPng ImageWriteFil
  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


image_record_filters ".png" ImageReadFilterPng ImageWriteFil