For what aghast means in the 3rd approach I believe the below extract from my own code is a relatively good example:
Code:
typedef enum _IMAGE_CHANNELS
{
IMAGE_CHANNEL_R = 0,
IMAGE_CHANNEL_G,
IMAGE_CHANNEL_B,
IMAGE_CHANNEL_A,
IMAGE_CHANNEL_COUNT
} IMAGE_CHANNELS;
#define ImageRows(IMAGE) ((IMAGE)->Rows)
#define ImageCols(IMAGE) ((IMAGE)->Cols)
#define ImagePfxRows 1
#define ImagePfxCols 1
#define ImageColX(IMAGE,COL) ((COL) + ImagePfxCols)
#define ImageRowX(IMAGE,ROW) ((ROW) + ImagePfxRows)
#define ImageColOffset( IMAGE, COL ) \
(ImageColX(IMAGE,COL) * IMAGE_CHANNEL_COUNT)
#define ImageRowOffset( IMAGE, ROW ) \
(ImageRowX(IMAGE,ROW) * ImageColOffset(IMAGE,ImageCols(IMAGE)))
#define ImagePixelX( IMAGE, ROW, COL ) \
(ImageRowOffset(IMAGE,ROW) + ImageColOffset(IMAGE,COL))
/* Adds any offset/s for local pixel indices, index 0 is used for nil, do NOT
* fill that index */
#define ImagePixelA(IMAGE, ROW, COL ) \
(ImagePixelX(IMAGE,ROW,COL) - IMAGE_CHANNEL_COUNT)
#define ImagePixelB(IMAGE, ROW, COL ) \
(ImagePixelX(IMAGE,ROW,COL) - ImageColOffset(IMAGE,ImageCols(IMAGE)))
#define ImagePixelC(IMAGE, ROW, COL ) \
(ImagePixelB(IMAGE,ROW,COL) - IMAGE_CHANNEL_COUNT)