FgImgRgbaUb
fgOglGetRender()
{
    glReadBuffer(GL_FRONT);
    FgImgRgbaUb     ret;
    GLint           x[4];
    glGetIntegerv(GL_VIEWPORT,x);
    FgVect2UI       dims(x[2],x[3]);
    if (dims.volume() > 0) {
        ret.resize(dims);
        FgRgbaUB *          ptr = ret.dataPtr();
        for (uint yy=0; yy<dims[1]; ++yy) {     // Invert line ordering from OGL:
            glReadPixels(0,dims[1]-1-yy,dims[0],1,GL_RGBA,GL_UNSIGNED_BYTE,ptr);
            ptr += dims[0];
        }
    }
    glReadBuffer(GL_BACK);          // Restore to default
    return ret;
}
void
fgSaveImgAnyFormat(
    const FgString &    fname,
    const FgImgRgbaUb & img)
{
    FGASSERT(fname.length() > 0);

    fgEnsureMagick();
    FgScopePtr<ImageInfo>       image_info(CloneImageInfo(0),DestroyImageInfo);
    FgScopePtr<ExceptionInfo>   exception(AcquireExceptionInfo(),DestroyExceptionInfo);
    FgScopePtr<Image>           image(ConstituteImage(img.width(),img.height(),"RGBA",
                                                   CharPixel,
                                                   img.dataPtr(),
                                                   exception.get()),
                                   DestroyImage);
    (void) strcpy(image_info->filename,fname.as_utf8_string().c_str());
    FGASSERT(
        MagickTrue == 
            WriteImages(image_info.get(),image.get(),fname.as_utf8_string().c_str(),exception.get()));
}