Patch title: Release 90 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"

type ImagePixmap
  inherit ImagePrototype
  field Address data

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

function destroy p
  arg_w ImagePixmap p
  for (var Int y) 0 p:size_y-1
    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
    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
  for (var Int y) 0 p:size_y-1
    p:data map Address y := memory_allocate p:line_size addressof:p
  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


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