String exportdir;
virtual void ExportViewAsImage(){
Size sz=GetSize();
ImageBuffer ib(sz);
glReadPixels(0,0,sz.cx,sz.cy,GL_BGRA_EXT,GL_UNSIGNED_BYTE,(GLvoid*)~ib);
if(!glGetError()){
// Flip
Buffer<RGBA> temp(sz.cx);
for(int i=0;i<sz.cy/2;i++){
memcpy(temp,ib[i],sz.cx*sizeof(RGBA));
memcpy(ib[i],ib[sz.cy-1-i],sz.cx*sizeof(RGBA));
memcpy(ib[sz.cy-1-i],temp,sz.cx*sizeof(RGBA));
}
// Flatten alpha channel
for(int i=0;i<sz.cy;i++){
for(int x=0;x<sz.cx;x++) ib[i][x].a=255;
}
// Save image
FileSel fs;
fs.Type("Portable Network Graphics (*.png)","*.png");
if(!exportdir.IsEmpty()) fs.PreSelect(exportdir);
else fs.ActiveDir(::GetDesktopFolder());
if(fs.ExecuteSaveAs("Save snapshot as...")){
exportdir=~fs;
PNGEncoder enc;
enc.SaveFile(~fs,ib);
}
}
}
void ContextMenu(Bar& bar) {
bar.Add("Export view as image...", [&](){ ExecuteGL(THISFN(ExportViewAsImage)); });
}