⚠️ Warning: This is a draft ⚠️

This means it might contain formatting issues, incorrect code, conceptual problems, or other severe issues.

If you want to help to improve and eventually enable this page, please fork RosettaGit's repository and open a merge request on GitHub.

{{collection|Basic bitmap storage}}

Array.oz:

functor
export
   New
   Get
   Set
   Fold
   ForAll
   Transform
   Map
   Clone
define
   fun {New Width Height Init}
      C = {Array.new 1 Height unit}
   in
      for Row in 1..Height do
	 C.Row := {Array.new 1 Width Init}
      end

      array2d(width:Width
	      height:Height
	      contents:C)
   end

   fun {Get array2d(contents:C ...) X Y}
      C.Y.X
   end

   proc {Set array2d(contents:C ...) X Y Val}
      C.Y.X := Val
   end

   proc {Transform array2d(contents:C width:W height:H ...) Fun}
      for Y in 1..H do
	 for X in 1..W do
	    C.Y.X := {Fun C.Y.X}
	 end
      end
   end

   fun {Clone array2d(contents:C width:W height:H ...)}
      NC = {Array.clone C}
   in
      for Y in 1..H do
	 NC.Y := {Array.clone NC.Y}
      end
      array2d(width:W
	      height:H
	      contents:NC)
   end
   
   fun {Map Arr Fun}
      R = {Clone Arr}
   in
      {Transform R Fun}
      R
   end

   fun {Fold array2d(contents:C width:W height:H ...) Fun}
      Acc = {NewCell C.1.1}
   in
      for X in 2..W do
	 Acc := {Fun @Acc C.1.X}
      end
      for Y in 2..H do
	 for X in 1..W do
	    Acc := {Fun @Acc C.Y.X}
	 end
      end
      @Acc
   end

   proc {ForAll array2d(contents:C width:W height:H ...) Proc}
      for Y in 1..H do
	 for X in 1..W do
	    {Proc C.Y.X}
	 end
      end
   end
end

Bitmap.oz:

%% For real task prefer QTk's images:
%% http://www.mozart-oz.org/home/doc/mozart-stdlib/wp/qtk/html/node38.html

functor
import
   Array2D
export
   New
   Fill
   GetPixel
   SetPixel
   MaxValue
   ForAllPixels
   Transform
define
   Black = color(0x00 0x00 0x00)
   
   fun {New Width Height}
      bitmap( {Array2D.new Width Height Black} )
   end

   proc {Fill bitmap(Arr) Color}
      {Array2D.transform Arr fun {$ _} Color end}
   end
   
   fun {GetPixel bitmap(Arr) X Y}
      {Array2D.get Arr X Y}
   end
   
   proc {SetPixel bitmap(Arr) X Y Color}
      {Array2D.set Arr X Y Color}
   end

   fun {MaxValue bitmap(Arr)}
      {MaxColorValue {Array2D.fold Arr MaxColor}}
   end
   
   fun {MaxColorValue color(R G B)}
      {FoldL [R G B] Max 0}
   end

   fun {MaxColor C1 C2}
      if {MaxColorValue C1} > {MaxColorValue C2} then C1 else C2 end
   end
   
   proc {ForAllPixels bitmap(Arr) Proc}
      {Array2D.forAll Arr Proc}
   end

   proc {Transform bitmap(Arr) Fun}
      {Array2D.transform Arr Fun}
   end
end

makefile.oz:

makefile(
   lib:['Array2D.ozf' 'Bitmap.ozf']
   )