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] ~ { }; 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. z CtEncodeImpl.mesa Copyright Σ 1988, 1992 by Xerox Corporation. All rights reserved. Bloomenthal, July 3, 1992 1:30 pm PDT Glassner, November 14, 1990 4:52 pm PST Run Length Encoding Operations IF maps = NIL OR (maps.bpp # 8 AND maps.bpp # 24) THEN Error["Bad map"] ELSE { color: BOOL _ maps.bpp = 24; r, g, b, bw: ImagerSample.SampleBuffer; out: STREAM _ FS.StreamOpen[fileName, $create]; redGrn: SampleMap; IF color THEN { redGrn _ CtBasic.GetRedGrn[maps[0].map]; r _ ImagerSample.NewSamples[maps.w]; g _ ImagerSample.NewSamples[maps.w]; b _ ImagerSample.NewSamples[maps.w]; } ELSE bw _ ImagerSample.NewSamples[maps.w]; IO.PutByte[out, IF color THEN 1 ELSE 0]; IO.PutHWord[out, Basics.HFromCard16[maps.x]]; IO.PutHWord[out, Basics.HFromCard16[maps.y]]; IO.PutHWord[out, Basics.HFromCard16[maps.w]]; IO.PutHWord[out, Basics.HFromCard16[maps.h]]; FOR y: NAT IN [maps.y..maps.y+maps.h) DO IF color THEN { WriteRGBRun: PROC ~ INLINE { IO.PutByte[out, run]; IO.PutByte[out, rgb.r]; IO.PutByte[out, rgb.g]; IO.PutByte[out, rgb.b]; }; run: NAT _ 1; rgb: RGB; ImagerSample.GetSamples[redGrn, [y, 2*maps.x], [0, 2], r, 0, maps.w]; ImagerSample.GetSamples[redGrn, [y, 2*maps.x+1], [0, 2], g, 0, maps.w]; ImagerSample.GetSamples[maps[1].map, [y, maps.x], [0, 1], b, 0, maps.w]; rgb _ [r[0], g[0], b[0]]; FOR x: NAT IN (0..maps.w) DO temp: RGB _ [r[x], g[x], b[x]]; IF temp = rgb AND run # 255 THEN {run _ run+1; LOOP}; WriteRGBRun[]; rgb _ temp; run _ 1; REPEAT FINISHED => WriteRGBRun[]; ENDLOOP; } ELSE { WriteBWRun: PROC ~ INLINE { IO.PutByte[out, run]; IO.PutByte[out, val]; }; run: NAT _ 1; val: CARDINAL; ImagerSample.GetSamples[maps[0].map, [y, maps.x], [0, 1], bw, 0, maps.w]; val _ bw[0]; FOR x: NAT IN (0..maps.w) DO temp: CARDINAL _ bw[x]; IF temp = val AND run # 255 THEN {run _ run+1; LOOP}; WriteBWRun[]; val _ temp; run _ 1; REPEAT FINISHED => WriteBWRun[]; ENDLOOP; }; ENDLOOP; IO.Close[out]; }; ΚΊ–"cedarcode" style•NewlineDelimiter ™™Jšœ Οeœ6™BJ™%J™'—J˜JšΟk œ;˜DJ˜šΠbl œžœž˜Jšžœ&˜-Jšžœ ˜—J˜šœž˜J˜Jšžœžœžœ˜Jšžœžœžœžœ˜Jšœžœ˜Jšžœžœ žœ˜Jšœ žœ˜%Jšœ žœ˜'Jšœ žœ˜/—headšΟl™š Οnœžœžœ žœžœ˜*J˜—š‘ œžœžœžœ˜@šžœžœžœžœ™1Jšžœ™šžœ™Jšœžœ™J™'Jšœžœžœ™/J™šžœ™šžœ™J™)J™$J™$J™$J™—Jšžœ&™*—Jšžœžœžœžœ™(Jšžœ+™-Jšžœ+™-Jšžœ+™-Jšžœ+™-šžœžœžœž™(šžœ™šžœ™š‘ œžœžœ™Jšžœ™Jšžœ™Jšžœ™Jšžœ™J™—Jšœžœ™ Jšœžœ™ J™EJ™GJ™HJ™šžœžœžœ ž™Jšœžœ™Jšžœ žœ žœžœ™5J™J™ J™šž™Jšžœ™—Jšžœ™—J™—šžœ™š‘ œžœžœ™Jšžœ™Jšžœ™J™—Jšœžœ™ Jšœžœ™J™IJ™ šžœžœžœ ž™Jšœžœ ™Jšžœ žœ žœžœ™5J™ J™ J™šž™Jšžœ™—Jšžœ™—J™——Jšžœ™—Jšžœ ™J™——J˜J™—š ‘ œžœžœ žœžœ˜AJšžœ ˜Jšœ˜Jšœžœžœžœ$˜LJ˜'Jš œžœžœžœžœžœ˜5Jšœ žœžœ˜8Jšœ žœžœ˜8Jšœžœžœ˜2Jšœžœžœ˜2J˜;šžœž˜ Jšžœ7˜;Jšžœ0˜4—šžœ ˜ šžœ˜J˜$J˜$J˜$J˜—Jšžœ%˜*—šžœžœžœž˜(šžœ˜ šžœ˜Jšœžœ˜ šžœž˜Jšœžœžœ ˜Jšœžœžœ ˜Jš žœžœžœ žœ žœ˜1J˜ šžœ˜J˜I—Jšžœ˜—J˜—šžœ˜Jšœžœ˜ šžœž˜Jšœžœžœ ˜Jš œžœžœžœžœ˜<šžœžœžœ ž˜J˜ J˜ J˜ Jšžœ˜—J˜ šžœ˜J˜HJ˜HJ˜HJ˜—Jšžœ˜—J˜——Jšžœ˜—Jšžœ˜ J˜——J˜šžœ˜J˜—J˜—…—ˆΌ