I woke up today with the crazy idea that maybe - just maybe - getByteArray() already allows what i need by actually returning the inner byte array from roBitmap (i.e. repeated calls return the same object), so that i get to peek and poke directly at that while it still belongs to the bitmap. My hopes withered when i glanced the doc to be reminded it takes (x,y,w,h) as arguments, so no - it every time cuts you a new object that is not connected to the underlying bitmap.
Yes, i concluded that DrawRect(x,y,1,1,c) is about the only way to draw pixels. I understand why they did not include SetPixel() as such - because of possible autoscaling up, SetPixel(4,0,c) + SetPixel(5,0,c) is not the same as DrawRect(4,0,2,1,c). roRegion done per pixel would have huge overhead (yet cannot be faster). Generating/writing to/loading from disk hundreds of PNGs per second is a non-starter too.
After sleeping on it, i feel something like createObject("roBitmap", {width: w, height: h, byteArray: ba}) is probably the cleanest way to do it, since the functionality is already there for createObject("roBitmap", String filename) - it reads the file, uncompresses it to a buffer and then creates the ro-wrapper with params around that buffer, so same thing sans reading and uncompressing file; re-use the code. But it does not matter which approach - even an imagined ifDraw2D.getInnerByteArray() to let massage directly the data will do.
Would like to hear from RokuCo on this, please. This will have great pay-off to dev.effort ratio, wouldn't it? Unleash power that is already in the box.