Transforms the three AIS files red,green and blue into the single AIS file: rgb using the user supplied map procedure and applying Floyd-Steinberg error distribution.
redFD, greenFD, blueFD, rgbFD:AIS.FRef;
temp, this, next:PixelBuf; -- 'this' holds current line's data, 'next - the one below
r:AIS.Raster;
redW, blueW, greenW, rgbW:AIS.WRef;
scan, top, bottom, left, right:CARDINAL;
Open the input files and get hold of the raster info. for use in generating the rgb ouput file
redFD ← AIS.OpenFile[redFn];
redW ← AIS.OpenWindow[redFD];
greenFD ← AIS.OpenFile[greenFn];
greenW ← AIS.OpenWindow[greenFD];
blueFD ← AIS.OpenFile[blueFn];
blueW ← AIS.OpenWindow[blueFD];
Create the output file
r ← AIS.ReadRaster[redFD];
[] ← AIS.DeleteFile[rgbFn ! FS.Error => CONTINUE];
rgbFD ← AIS.CreateFile[name:rgbFn, raster:r];
rgbW ← AIS.OpenWindow[rgbFD];
Create two working buffers for scan lines
[top, bottom, left, right] ← AIS.GetWindowParams[redW];
this ← NEW[PixelBufRec[right+2]]; -- make it a bit bigger to catch error propogation
next ← NEW[PixelBufRec[right+2]];
initialise the 'next' buffer with the first scan line
ReadRGB[redW, greenW, blueW, left, right, 1, next];
FOR scan IN [top..bottom]
DO
advance the scan line buffers to the next line
temp ← this; this ← next; next ← temp;
IF scan < bottom
THEN
ReadRGB[redW, greenW, blueW, left, right, scan+1, next];
SquashScan[this, next, left,right, map];
Writergb[rgbW, left, right, scan, this];
ENDLOOP;
AIS.CloseWindow[redW];
AIS.CloseWindow[blueW];
AIS.CloseWindow[greenW];
AIS.CloseWindow[rgbW];
AIS.CloseFile[redFD];
AIS.CloseFile[blueFD];
AIS.CloseFile[greenFD];
AIS.CloseFile[rgbFD];
};
redFD, greenFD, blueFD, rgbFD:AIS.FRef;
raster:AIS.Raster;
redW, blueW, greenW, rgbW:AIS.WRef;
scan, pixel, top, bottom, left, right:CARDINAL;
r,g,b:CARDINAL;
Open the input file and get hold of the raster info. for use in generating the ouput files
rgbFD ← AIS.OpenFile[name:rgbFn];
rgbW ← AIS.OpenWindow[rgbFD];
raster ← AIS.ReadRaster[rgbFD];
[] ← AIS.DeleteFile[redFn];
redFD ← AIS.CreateFile[name:redFn, raster:raster];
redW ← AIS.OpenWindow[redFD];
[] ← AIS.DeleteFile[greenFn];
greenFD ← AIS.CreateFile[name:greenFn, raster:raster];
greenW ← AIS.OpenWindow[greenFD];
[] ← AIS.DeleteFile[blueFn];
blueFD ← AIS.CreateFile[name:blueFn, raster:raster];
blueW ← AIS.OpenWindow[blueFD];
[top, bottom, left, right] ← AIS.GetWindowParams[rgbW];
FOR scan IN [top..bottom]
DO
FOR pixel
IN [left..right]
DO
[r,g,b] ← unMap[AIS.ReadSample[rgbW, scan, pixel]];
AIS.WriteSample[redW, r, scan, pixel];
AIS.WriteSample[greenW, g, scan, pixel];
AIS.WriteSample[blueW, b, scan, pixel];
ENDLOOP;
ENDLOOP;
AIS.CloseWindow[redW];
AIS.CloseWindow[blueW];
AIS.CloseWindow[greenW];
AIS.CloseWindow[rgbW];
AIS.CloseFile[redFD];
AIS.CloseFile[blueFD];
AIS.CloseFile[greenFD];
AIS.CloseFile[rgbFD];
};