<<>> <> <> <> <> DIRECTORY Basics, CtBasic, CtEncode, FS, ImagerSample, IO, Rope, SF; CtEncodeImpl: CEDAR PROGRAM IMPORTS Basics, CtBasic, FS, ImagerSample, IO EXPORTS CtEncode ~ BEGIN ROPE: TYPE ~ Rope.ROPE; STREAM: TYPE ~ IO.STREAM; Box: TYPE ~ CtBasic.Box; RGB: TYPE ~ CtBasic.RGB; SampleMap: TYPE ~ CtBasic.SampleMap; SampleMaps: TYPE ~ CtBasic.SampleMaps; SampleBuffer: TYPE ~ ImagerSample.SampleBuffer; <> Error: PUBLIC ERROR [reason: ROPE] = CODE; WriteEncoded: PUBLIC PROC [maps: SampleMaps, fileName: ROPE] ~ { <> <> <> <> <> <> <> <> <> <> <> <> <> <<}>> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <<};>> <> <> <> <> <> <> <> <> <> <> <> <> <> < WriteRGBRun[];>> <> <<}>> <> <> <> <> <<};>> <> <> <> <> <> <> <> <> <> <> <> < WriteBWRun[];>> <> <<};>> <> <> <<};>> }; <<>> ReadEncoded: PUBLIC PROC [fileName: ROPE, maps: SampleMaps ¬ NIL] RETURNS [SampleMaps] ~ { in: STREAM ¬ FS.StreamOpen[fileName ! FS.Error => Error[error.explanation]]; r, g, b, bw: ImagerSample.SampleBuffer; bpp: CARDINAL ¬ IF IO.GetByte[in] = 0 THEN 8 ELSE 24; xOrigin: CARDINAL ¬ Basics.Card16FromH[IO.GetHWord[in]]; yOrigin: CARDINAL ¬ Basics.Card16FromH[IO.GetHWord[in]]; w: CARDINAL ¬ Basics.Card16FromH[IO.GetHWord[in]]; h: CARDINAL ¬ Basics.Card16FromH[IO.GetHWord[in]]; CtBasic.ClipMaps[maps, maps.x, maps.y, maps.x+w, maps.y+h]; IF maps = NIL THEN maps ¬ CtBasic.CreateMaps[bpp, xOrigin, yOrigin, w, h] ELSE CtBasic.ClipMaps[maps, xOrigin, yOrigin, w, h]; IF bpp = 24 THEN { r ¬ ImagerSample.NewSamples[maps.w]; g ¬ ImagerSample.NewSamples[maps.w]; b ¬ ImagerSample.NewSamples[maps.w]; } ELSE bw ¬ ImagerSample.NewSamples[maps.w]; FOR y: NAT IN [maps.y..maps.y+maps.h) DO IF bpp = 8 THEN { x: NAT ¬ 0; WHILE x < w DO run: CARDINAL ¬ IO.GetByte[in]; val: CARDINAL ¬ IO.GetByte[in]; FOR n: NAT IN [x..x+run) DO bw[n] ¬ val; ENDLOOP; x ¬ x+run; REPEAT FINISHED => ImagerSample.PutSamples[maps[0].map, [y, maps.x], [0, 1], bw, 0, maps.w]; ENDLOOP; } ELSE { x: NAT ¬ 0; WHILE x < w DO run: CARDINAL ¬ IO.GetByte[in]; rgb: RGB ¬ [IO.GetByte[in], IO.GetByte[in], IO.GetByte[in]]; FOR n: NAT IN [x..x+run) DO r[n] ¬ rgb.r; g[n] ¬ rgb.g; b[n] ¬ rgb.b; ENDLOOP; x ¬ x+run; REPEAT FINISHED => { ImagerSample.PutSamples[maps[0].map, [y, maps.x], [0, 1], r, 0, maps.w]; ImagerSample.PutSamples[maps[1].map, [y, maps.x], [0, 1], g, 0, maps.w]; ImagerSample.PutSamples[maps[2].map, [y, maps.x], [0, 1], b, 0, maps.w]; }; ENDLOOP; }; ENDLOOP; RETURN[maps]; }; END.