Patch title: Release 92 bulk changes
Abstract:
File: /graphic/image/pixmap.pli
Key:
    Removed line
    Added line
abstract
  [The basic, uncompressed image implementation.]

# 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"
submodule "prototype.pli"
module "/pliant/language/compiler/type/inherit.pli"

constant default_tile_size 2^16


type ImagePixmap
  inherit ImagePrototype
  field Address data
  field Int tile_y

ImagePrototype maybe ImagePixmap


method p line y -> adr
  arg ImagePixmap p ; arg Int y ; arg Address adr
  check y>=0 and y<p:size_y
  adr := p:data map Address y

method p pixel x y -> adr
  arg ImagePixmap p ; arg Int x y ; arg Address adr
  check x>=0 and x<p:size_x
  check y>=0 and y<p:size_y
  adr := (p:data map Address y) translate Byte x*p:pixel_size


function build p
  arg_w ImagePixmap p
  p data := null
  p size_x := 0
  p size_y := 0
  p tile_y := 1

function destroy p
  arg_w ImagePixmap p
  for (var Int y) 0 p:size_y-1
  for (var Int y) 0 p:size_y-1 step p:tile_y
    memory_free (p line y)
  memory_free p:data


method p setup proto options -> status
  oarg_rw ImagePixmap p ; arg ImagePrototype proto ; arg Str options ; arg ExtendedStatus status
  check proto:size_x>0 and proto:size_y>0
  for (var Int y) 0 p:size_y-1
  for (var Int y) 0 p:size_y-1 step p:tile_y
    memory_free (p:data translate Address y)
  memory_free p:data
  addressof:p map ImagePrototype := proto
  p data := memory_allocate p:size_y*Address:size null
  p tile_y := max (options option "tile_y" Int (options option "tile_size" Int default_tile_size)\p:line_size) 1
  for (var Int y) 0 p:size_y-1
    p:data map Address y := memory_allocate p:line_size addressof:p
    if y%p:tile_y=0
      p:data map Address y := memory_allocate p:line_size*(min p:tile_y p:size_y-y) addressof:p
    else
      p:data map Address y := (p:data map Address y-1) translate Byte p:line_size
  status := success


method p read x y count adr
  oarg_rw ImagePixmap p ; arg Int x y count ; arg Address adr
  check x>=0 and count>=0 and x+count<=p:size_x and y>=0 and y<p:size_y
  memory_copy (p pixel x y) adr count*p:pixel_size

method p write x y count adr
  oarg_rw ImagePixmap p ; arg Int x y count ; arg Address adr
  check x>=0 and count>=0 and x+count<=p:size_x and y>=0 and y<p:size_y
  memory_copy adr (p pixel x y) count*p:pixel_size


method p read_map x y mini maxi count -> adr
  oarg_rw ImagePixmap p ; arg Int x y mini maxi ; arg_w Int count ; arg Address adr
  check mini>0 and maxi>=mini and x>=0 and x+maxi<=p:size_x and y>=0 and y<p:size_y
  adr := p pixel x y ; count := maxi

method p write_map x y mini maxi count -> adr
  oarg_rw ImagePixmap p ; arg Int x y mini maxi ; arg_w Int count ; arg Address adr
  check mini>0 and maxi>=mini and x>=0 and x+maxi<=p:size_x and y>=0 and y<p:size_y
  adr := p pixel x y ; count := maxi


method p rectangle_read_map x y x0 y0 x1 y1 step_x step_y -> adr
  oarg_rw ImagePixmap p ; arg Int x y ; arg_w Int x0 y0 x1 y1 step_x step_y ; arg Address adr
  x0 := 0 ; y0 := y-(y%p:tile_y) ; x1 := p size_x ; y1 := min y0+p:tile_y p:size_y
  step_x := p pixel_size ; step_y := p line_size
  adr := p line y0


export ImagePixmap '. setup' '. line' '. pixel'