diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2010-10-10 02:30:01 +0400 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2010-10-10 02:30:01 +0400 |
commit | d7cd6e349d01f6be60649a013c22330f0ba34c54 (patch) | |
tree | caa99d6a9c1acc076cdf5c570ef8a67c24bd0880 /source/gameengine/BlenderRoutines/KX_BlenderGL.cpp | |
parent | 854ef1770075c6e1579ccbbd30eda57484527760 (diff) | |
parent | d420d09da982e1a874ffe2b0612b8fdd0afc980e (diff) |
Merged changes in the trunk up to revision 32390.
Diffstat (limited to 'source/gameengine/BlenderRoutines/KX_BlenderGL.cpp')
-rw-r--r-- | source/gameengine/BlenderRoutines/KX_BlenderGL.cpp | 59 |
1 files changed, 50 insertions, 9 deletions
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp b/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp index 55a687c0baa..662222bf990 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp +++ b/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp @@ -49,6 +49,8 @@ extern "C" { #include "GL/glew.h" +#include "MEM_guardedalloc.h" + #include "BL_Material.h" // MAXTEX /* Data types encoding the game world: */ @@ -68,7 +70,11 @@ extern "C" { #include "BKE_bmfont.h" #include "BKE_image.h" +#include "BLI_path_util.h" + extern "C" { +#include "IMB_imbuf_types.h" +#include "IMB_imbuf.h" #include "WM_api.h" #include "WM_types.h" #include "wm_event_system.h" @@ -206,18 +212,53 @@ void BL_NormalMouse(wmWindow *win) } #define MAX_FILE_LENGTH 512 +/* get shot from frontbuffer sort of a copy from screendump.c */ +static unsigned int *screenshot(ScrArea *curarea, int *dumpsx, int *dumpsy) +{ + int x=0, y=0; + unsigned int *dumprect= NULL; + + x= curarea->totrct.xmin; + y= curarea->totrct.ymin; + *dumpsx= curarea->totrct.xmax-x; + *dumpsy= curarea->totrct.ymax-y; + + if (*dumpsx && *dumpsy) { + + dumprect= (unsigned int *)MEM_mallocN(sizeof(int) * (*dumpsx) * (*dumpsy), "dumprect"); + glReadBuffer(GL_FRONT); + glReadPixels(x, y, *dumpsx, *dumpsy, GL_RGBA, GL_UNSIGNED_BYTE, dumprect); + glFinish(); + glReadBuffer(GL_BACK); + } -void BL_MakeScreenShot(struct ARegion *ar, const char* filename) + return dumprect; +} + +/* based on screendump.c::screenshot_exec */ +void BL_MakeScreenShot(ScrArea *curarea, const char* filename) { - char copyfilename[MAX_FILE_LENGTH]; - strcpy(copyfilename,filename); + char path[MAX_FILE_LENGTH]; + strcpy(path,filename); - // filename read - only + unsigned int *dumprect; + int dumpsx, dumpsy; - /* XXX will need to change at some point */ - //XXX BIF_screendump(0); - - // write+read filename - //XXX write_screendump((char*) copyfilename); + dumprect= screenshot(curarea, &dumpsx, &dumpsy); + if(dumprect) { + ImBuf *ibuf; + BLI_path_abs(path, G.sce); + /* BKE_add_image_extension() checks for if extension was already set */ + BKE_add_image_extension(path, R_PNG); /* scene->r.imtype */ + ibuf= IMB_allocImBuf(dumpsx, dumpsy, 24, 0, 0); + ibuf->rect= dumprect; + ibuf->ftype= PNG; + + IMB_saveiff(ibuf, path, IB_rect); + + ibuf->rect= NULL; + IMB_freeImBuf(ibuf); + MEM_freeN(dumprect); + } } |