Well… there is a getcolumn() also. But it will be quite slow if for every scanline you read and update all the lines on the screen… using putpixel() might work though.
You could keep an array (400 items or so) of the maximum values, and update that for every scanline. Then once in a while draw that to the screen.
Nope, frame buffer is in the LCD’s own memory.
I don’t think C will simplify any of the difficulties here… it might improve the eventual performance a little, but the fundamental problems are the same.