Perhaps `copyFromFramebuffer` should take an optional `framebuffer`?