RasterIO supports negative line/pixel spaces - but this comes at a cost, since you won't benefit from the CPU L1 cache
Pass a pointer to the end of your buffer and set pixelSpace = -sizeof(type), lineSpace = -sizeof(type) * lineLen
In your case this would be
int nXSize = poBand->GetXSize();
pafScanline = (float *) CPLMalloc(sizeof(...