Decoupling rendering from image output.
authorClaude Heiland-Allen <claude@mathr.co.uk>
Sat, 21 Dec 2013 04:01:55 +0000 (04:01 +0000)
committerClaude Heiland-Allen <claude@mathr.co.uk>
Sat, 21 Dec 2013 04:01:55 +0000 (04:01 +0000)
commit706785ce2684df3c7bae5caaa92885fcfef14300
treeb8092ae8673684c866eb7ad9f0e3db581ecef10f
parent24e8b81a7b49818148e6a0c719e70ad53a8fca9c
Decoupling rendering from image output.

So far we have been rendering pixels and outputting them as we go.  For
future flexibility, we'll collect all the pixel data in memory in the
same format they were calculated.  This will simplify our render function.

We'll define a new type for our pixels, a struct containing an int.
A struct is a collection of fields, accessed with the member selection
operator ``.'', or via a pointer to a struct with the ``->'' operator.
An image is a collection of pixels with a width and a height, so we
define another struct for that.  We use a pointer to pixels, because we
might want to create images of different sizes.  Because the size isn't
fixed, we need to use dynamic memory allocation.  We allocate memory with
calloc(), which takes the number of items and the size of each item.  The
sizeof() operator can take a type, but it's more convenient to get the
size from the pointer for which we are allocating memory.  Memory allocated
should be deallocated when it is no longer needed, and the matching pair
to calloc() is free().

We need to write a function to output the image.  We print the header
and loop over the pixels, packing them into bytes (we inline our minimal
colour() function because this is the only use site).  Next we modify our
render() function to copy the calculated data into our image.  Finally
we modify the main() in render.c to create a new image, render into it,
write it out, and free it before exiting.
mandelbrot.h
mandelbrot_imp.c
render.c