Show a basic storage type to handle a simple RGB raster graphics image,
and some primitive associated functions.

If possible provide a function to allocate an uninitialised image,
given its width and height, and provide 3 additional functions:

   one to fill an image with a plain RGB color,
   one to set a given pixel with a color,
   one to get the color of a pixel.


(If there are specificities about the storage or the allocation, explain those.)

These functions are used as a base for the articles in the category raster graphics operations, 
and a basic output function to check the results
is available in the article write ppm file.




/*REXX program demonstrates how to process/display a simple  RGB  raster graphics image.*/
red   = 'ff 00 00'x                              /*a method to define a   red   value.  */
blue  = '00 00 ff'x                              /*"    "    "    "   "   blue    "     */
@.    =                                          /*define entire  @.  array  to  nulls. */
outFN = 'image'                                  /*the filename of the output image PPM */
sWidth = 500;     sHeight= 500                   /*the screen width and height in pixels*/
call RGBfill      red                            /*set the entire   image   to red.     */
            x= 10;       y= 40                   /*set pixel's coördinates.             */
call RGBset x, y, blue                           /*set a pixel (at  10,40)  to blue.    */
color = RGBget(x, y)                             /*get the color of a pixel.            */
hexV  = c2x(color)                               /*get hex    value of pixel's color.   */
binV  = x2b(hexV)                                /* "  binary   "    "    "      "      */
bin3V = left(binV, 8)    substr(binV, 9, 8)    right(binV, 8)
hex3V = left(hexV, 2)    substr(hexV, 3, 2)    right(hexV, 2)
xy= '(' || x","y')'                              /*create a handy─dandy literal for SAY.*/
say  xy    ' pixel in binary: '     binV         /*show the binary value of  20,50      */
say  xy    ' pixel in binary: '     bin3V        /*show again, but with spaces.         */
say                                              /*show a blank between binary and hex. */
say  xy    ' pixel in hex:    '     hexV         /*show again, but in hexadecimal.      */
say  xy    ' pixel in hex:    '     hex3V        /*show again, but with spaces.         */
call PPMwrite outFN, sWidth, sHeight             /*create a PPM (output) file of image. */      /* ◄■■■■■■■■ not part of this task.*/
say                                              /*show a blank.                        */
say 'The file ' outFN".PPM  was created."        /*inform user that a file was created. */
exit                                             /*stick a fork in it,  we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
RGBfill:  @.=arg(1);                          return          /*fill image with a color.*/
RGBget:   parse arg px,py;                    return @.px.py  /*get a pixel's color.    */
RGBset:   parse arg px,py,p$;  @.px.py=p$;    return          /*set "    "      "       */
/*──────────────────────────────────────────────────────────────────────────────────────*/
PPMwrite: parse arg oFN, width, height           /*obtain output filename, width, height*/
          oFID= oFN'.PPM';   $='9'x;   #=255     /*fileID;  separator;  max color value.*/
          call charout oFID, ,  1                /*set the position of the file's output*/
          call charout oFID,'P6'width || $ || height || $ || # || $    /*write hdr info.*/
            do   j=1  for width
              do k=1  for height;     call charout oFID, @.j.k
              end   /*k*/                        /*  ↑          write the PPM file, ··· */
            end     /*j*/                        /*  └───────── ··· one pixel at a time.*/
          call charout oFID;      return         /*close the output file just to be safe*/