# Module `sdlraster` - SDL raster interface

SDL raster interface.

This module provides an SDL-based portable bitmap ("raster") display.

sdlraster uses the ring pattern. `RASTER` arrays cycle around a ring of processes. One of the processes is `raster.display` (or `raster.display.simple`), which generates fresh rasters on startup, and draws rasters it receives to the display before passing them around the ring again. The other processes in the ring can do whatever they like to the rasters before passing them on.

To shut down the ring, a raster of height zero is sent around the ring, replacing one of the existing rasters. Each process passes it on and then exits, aside from the process that sent it which just waits to receive it again before exiting. (You can use `raster.shutdown` to do this.)

To avoid races with multiple shutdown messages, only one process is permitted to initiate shutdown; that is, if you're using `raster.display.simple`, then you mustn't try to shut down the ring from any other process.

Programs that don't care about input events can use `raster.display.simple`, which simply shuts down the ring when the user closes the window. If you want to handle keyboard or mouse input, `raster.display` provides an extra channel which delivers SDL events as `RASTER.EVENT` structures; in that case, you must shut down the ring using `raster.shutdown` when you want to exit.

(This module also provides the old `SDLRaster` and `miniraster` interfaces for backwards compatibility, but you should not use them in new code.)

## Index

- Constant `EVENT.CHECK.TIME` - The time between event checks, in nanoseconds
- Constant `MAX.RASTERS` - The maximum number of initial rasters allowed in the ring
- Process `raster.clear` - Clear a raster to a solid colour
- Process `raster.convert.event` - Convert an into a
- Process `raster.display` - Raster display process
- Process `raster.display.simple` - Simple interface for programs that don't need to handle events
- Process `raster.shutdown` - Shut down a raster ring

## Declarations

### `sdlraster.occ`:65Constant `MAX.RASTERS`

`VAL INT MAX.RASTERS`

The maximum number of initial rasters allowed in the ring.

### `sdlraster.occ`:68Constant `EVENT.CHECK.TIME`

`VAL INT EVENT.CHECK.TIME`

The time between event checks, in nanoseconds.

### `sdlraster.occ`:74Process `raster.clear`

`PROC raster.clear (RASTER r, VAL INT colour)`

Clear a raster to a solid colour.

### `sdlraster.occ`:107Process `raster.convert.event`

`PROC raster.convert.event (SDL.Event event, RESULT RASTER.EVENT ev)`

Convert an `SDL.Event` into a `RASTER.EVENT`.

### `sdlraster.occ`:283Process `raster.display`

`PROC raster.display (VAL []BYTE title, VAL INT width, height, num.rasters, CHAN RASTER in?, out!, CHAN RASTER.EVENT events!)`

Raster display process. Generate a number of rasters on startup, and draw incoming rasters to the display. In addition, report any events received on the display.

This process provides `num.rasters + 1` places of buffering in the ring.

#### Parameters:

`VAL []BYTE` | `title` | Window title
`VAL INT` | `width` | Width of window
`VAL INT` | `height` | Height of window
`VAL INT` | `num.rasters` | Initial number of rasters to inject into the ring. This must be at least 1, and no more than `MAX.RASTERS`.
`CHAN RASTER` | `in` | Raster input
`CHAN RASTER` | `out` | Raster output
`CHAN RASTER.EVENT` | `events` | Input events. When it shuts down, the raster will send a `RASTER.ET.SHUTDOWN` event as its last message, so you know when to stop reading from this channel.

### `sdlraster.occ`:354Process `raster.shutdown`

`PROC raster.shutdown (CHAN RASTER in?, out!)`

Shut down a raster ring. You must have read a raster from the ring yourself before calling this. This outputs an empty raster, and then discards incoming rasters until the empty one's received again.

### `sdlraster.occ`:415Process `raster.display.simple`

`PROC raster.display.simple (VAL []BYTE title, VAL INT width, height, num.buffers, CHAN RASTER in?, out!)`

Simple interface for programs that don't need to handle events. This automatically shuts down the ring when the window is closed; otherwise it behaves like `raster.display`.