tock-mirror/testcases/blur.occ

87 lines
1.8 KiB
Plaintext

VAL INT width IS 512:
VAL INT height IS 512:
PROTOCOL maybe.image
CASE
nothing
just ; [height][width]BYTE
:
INT FUNCTION add.pixel(VAL INT kw, x, y, p.x, p.y, pixel)
VAL INT d.x IS x - p.x:
VAL INT d.y IS y - p.y:
VAL INT d IS (d.x*d.x) + (d.y*d.y):
INT r:
VALOF
IF
d = 0
r := pixel * kw
TRUE
r := (pixel * kw) / d
RESULT r
:
PROC blur.image(VAL INT kw, [height][width]BYTE img)
VAL INT kw.half IS kw / 2:
SEQ y = 0 FOR height
SEQ x = 0 FOR width
INITIAL INT sum IS 0:
INITIAL INT c IS 0:
SEQ
SEQ j = 0 FOR kw
VAL INT p.y IS (y + j) - kw.half:
IF
(p.y < 0) OR (p.y >= height)
SKIP
TRUE
SEQ i = 0 FOR kw
VAL INT p.x IS (x + i) - kw.half:
IF
(p.x < 0) OR (p.x >= width)
SKIP
TRUE
SEQ
sum := sum + add.pixel(kw, x, y, p.x, p.y, INT img[p.y][p.x])
c := c + 1
INITIAL INT n IS sum / c:
SEQ
IF
n > 255
n := 255
TRUE
SKIP
img[y][x] := BYTE n
:
PROC element(CHAN maybe.image in?)
[height][width]BYTE img:
INITIAL BOOL cont IS TRUE:
WHILE cont
SEQ
in ? CASE
nothing
cont := FALSE
just ; img
blur.image(9, img)
:
PROC server(VAL INT frames, CHAN maybe.image out!)
SEQ
SEQ i = 0 FOR frames
[height][width]BYTE img:
SEQ
SEQ y = 0 FOR height
SEQ x = 0 FOR width
img[y][x] := 128
out ! just ; img
out ! nothing
:
PROC main()
VAL INT frames IS 8:
CHAN maybe.image c:
PAR
element(c?)
server(frames, c!)
: