Patch title: Release 92 bulk changes
Abstract:
File: /graphic/filter/ppm.pli
Key:
    Removed line
    Added line
abstract
  [The popular among free softwares PPM file format interface.] ; eol
  [PPM is not recommended because the header (3 lines) is sadely designed ]
  [(it should be any nomber of lines, followed by a blank line), but it's ]
  [still a trivial file format that you may need in order to pipe an image ]
  [to another software.]

# Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 2
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# version 2 along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.


module "/pliant/language/compiler.pli"
module "/pliant/language/stream.pli"
module "prototype.pli"
module "/pliant/graphic/color/gamut.pli"


type ImageReadFilterPpm
  field Pointer:Stream stream
  field Int line_size

ImageReadFilter maybe ImageReadFilterPpm


method f open stream options h -> status
  arg_rw ImageReadFilterPpm f ; arg_rw Stream stream ; arg Str options ; arg_w ImagePrototype h ; arg ExtendedStatus status
  f stream :> stream
  var Str mode := stream readline ; var Str gamut_name ; var Int pixel_size
  if mode="P6"
    gamut_name := "rgb" ; pixel_size := 3
  eif mode="P5"
    gamut_name := "grey" ; pixel_size := 1
  else
    return (failure "This is not a ppmraw or pgmraw image ("+(mode 0 16)+")")
  stream readline # comment
  if not (stream:readline parse (var Int size_x) (var Int size_y))
    return failure:"Invalid image header"
  stream readline # maximal value
  var Float rx ry
  if ((options (options option_position "resolution" options:len) options:len) parse word:"resolution" rx ry any)
    void
  eif ((options (options option_position "resolution" options:len) options:len) parse word:"resolution" rx any)
    ry := rx
  else
    rx := 72 ; ry := 72
  h := image_prototype 0 0 size_x/rx*25.4 size_y/ry*25.4 size_x size_y color_gamut:gamut_name
  f line_size := h line_size
 status := success

method f readline adr -> status
  arg_rw ImageReadFilterPpm f ; arg Address adr ; arg Status status
  f:stream raw_read adr f:line_size
  status := success

method f close -> status
  arg_rw ImageReadFilterPpm f ; arg ExtendedStatus status
  status := success


#-------------------------------------------------------------------------


type ImageWriteFilterPpm
  field Pointer:Stream stream
  field Int line_size

ImageWriteFilter maybe ImageWriteFilterPpm


method f open stream options h -> status
  arg_rw ImageWriteFilterPpm f ; arg_rw Stream stream ; arg Str options ; arg ImagePrototype h ; arg ExtendedStatus status
  if h:gamut:name<>"rgb" and h:gamut:pixel_size<>1
    return failure:"Only RGB or grey images can be saved as .ppm or .pgm"
  f stream :> stream
  f line_size := h line_size
  stream writeline (shunt h:gamut:pixel_size=1 "P5" "P6")
  stream writeline "# Pliant GhostScript postprocessor"
  stream writeline (string h:size_x)+" "+(string h:size_y)
  stream writeline "255"
  status := success

method f writeline adr -> status
  arg_rw ImageWriteFilterPpm f ; arg Address adr ; arg Status status
  f:stream raw_write adr f:line_size
  status := success

method f close -> status
  arg_rw ImageWriteFilterPpm f ; arg ExtendedStatus status
  status := success

image_record_filters ".ppm" ImageReadFilterPpm ImageWriteFilterPpm
image_record_filters ".pgm" ImageReadFilterPpm ImageWriteFilterPpm
image_record_filters ".ppm" ImageReadFilterPpm false ImageWriteFilterPpm false
image_record_filters ".pgm" ImageReadFilterPpm false ImageWriteFilterPpm false