2.5
Making screenshots back. CTRL+F3 does full window now. Filewindow doesn't show image type, nor does single-area work now. Need this commit for test in render crashes... :)
This commit is contained in:
@@ -57,6 +57,9 @@ void ed_screen_fullarea(bContext *C, ScrArea *sa);
|
||||
/* screen_context.c */
|
||||
void ed_screen_context(const bContext *C, bContextDataMember member, bContextDataResult *result);
|
||||
|
||||
/* screendump.c */
|
||||
void SCREEN_OT_screenshot(struct wmOperatorType *ot);
|
||||
|
||||
#endif /* ED_SCREEN_INTERN_H */
|
||||
|
||||
|
||||
|
||||
@@ -2064,6 +2064,7 @@ static void image_rect_update(void *rjv, RenderResult *rr, volatile rcti *renrec
|
||||
xmax= ibuf->x - rxmin;
|
||||
if(rymin + ymax > ibuf->y)
|
||||
ymax= ibuf->y - rymin;
|
||||
|
||||
if(xmax < 1 || ymax < 1) return;
|
||||
|
||||
/* find current float rect for display, first case is after composit... still weak */
|
||||
@@ -2086,11 +2087,14 @@ static void image_rect_update(void *rjv, RenderResult *rr, volatile rcti *renrec
|
||||
float *rf= rectf;
|
||||
char *rc= rectc;
|
||||
|
||||
for(x1= 0; x1<xmax; x1++, rf += 4, rc+=4) {
|
||||
rc[0]= FTOCHAR(rf[0]);
|
||||
rc[1]= FTOCHAR(rf[1]);
|
||||
rc[2]= FTOCHAR(rf[2]);
|
||||
rc[3]= FTOCHAR(rf[3]);
|
||||
/* crop offset */
|
||||
if( rectc >= (char *)(ibuf->rect)) {
|
||||
for(x1= 0; x1<xmax; x1++, rf += 4, rc+=4) {
|
||||
rc[0]= FTOCHAR(rf[0]);
|
||||
rc[1]= FTOCHAR(rf[1]);
|
||||
rc[2]= FTOCHAR(rf[2]);
|
||||
rc[3]= FTOCHAR(rf[3]);
|
||||
}
|
||||
}
|
||||
rectf += 4*rr->rectx;
|
||||
rectc += 4*ibuf->x;
|
||||
@@ -2262,6 +2266,7 @@ void ED_operatortypes_screen(void)
|
||||
WM_operatortype_append(SCREEN_OT_region_flip);
|
||||
WM_operatortype_append(SCREEN_OT_screen_set);
|
||||
WM_operatortype_append(SCREEN_OT_screen_full_area);
|
||||
WM_operatortype_append(SCREEN_OT_screenshot);
|
||||
|
||||
/*frame changes*/
|
||||
WM_operatortype_append(SCREEN_OT_frame_offset);
|
||||
@@ -2287,6 +2292,7 @@ void ED_keymap_screen(wmWindowManager *wm)
|
||||
|
||||
WM_keymap_verify_item(keymap, "SCREEN_OT_actionzone", LEFTMOUSE, KM_PRESS, 0, 0);
|
||||
|
||||
/* screen tools */
|
||||
WM_keymap_verify_item(keymap, "SCREEN_OT_area_move", LEFTMOUSE, KM_PRESS, 0, 0);
|
||||
WM_keymap_verify_item(keymap, "SCREEN_OT_area_split", EVT_ACTIONZONE, 0, 0, 0);
|
||||
WM_keymap_verify_item(keymap, "SCREEN_OT_area_join", EVT_ACTIONZONE, 0, 0, 0);
|
||||
@@ -2296,6 +2302,7 @@ void ED_keymap_screen(wmWindowManager *wm)
|
||||
WM_keymap_add_item(keymap, "SCREEN_OT_screen_full_area", UPARROWKEY, KM_PRESS, KM_CTRL, 0);
|
||||
WM_keymap_add_item(keymap, "SCREEN_OT_screen_full_area", DOWNARROWKEY, KM_PRESS, KM_CTRL, 0);
|
||||
WM_keymap_add_item(keymap, "SCREEN_OT_screen_full_area", SPACEKEY, KM_PRESS, KM_CTRL, 0);
|
||||
WM_keymap_add_item(keymap, "SCREEN_OT_screenshot", F3KEY, KM_PRESS, KM_CTRL, 0);
|
||||
|
||||
/* tests */
|
||||
WM_keymap_add_item(keymap, "SCREEN_OT_region_split", SKEY, KM_PRESS, KM_CTRL|KM_ALT, 0);
|
||||
|
||||
@@ -46,86 +46,206 @@
|
||||
|
||||
#include "BIF_gl.h"
|
||||
|
||||
#include "RNA_access.h"
|
||||
#include "RNA_define.h"
|
||||
|
||||
#include "WM_types.h"
|
||||
#include "WM_api.h"
|
||||
|
||||
static unsigned int *dumprect= NULL;
|
||||
static int dumpsx, dumpsy;
|
||||
#include "ED_fileselect.h"
|
||||
#include "ED_screen.h"
|
||||
|
||||
/* XXX */
|
||||
static int saveover() {return 0;}
|
||||
typedef struct ScreenshotData {
|
||||
unsigned int *dumprect;
|
||||
int dumpsx, dumpsy;
|
||||
} ScreenshotData;
|
||||
|
||||
/* Callback */
|
||||
void write_screendump(bContext *C, char *name)
|
||||
static int screenshot_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
Scene *scene= CTX_data_scene(C);
|
||||
ImBuf *ibuf;
|
||||
ScreenshotData *scd= op->customdata;
|
||||
|
||||
if(dumprect) {
|
||||
|
||||
strcpy(G.ima, name);
|
||||
BLI_convertstringcode(name, G.sce);
|
||||
BLI_convertstringframe(name, scene->r.cfra); /* TODO - is this ever used? */
|
||||
if(scd && scd->dumprect) {
|
||||
Scene *scene= CTX_data_scene(C);
|
||||
ImBuf *ibuf;
|
||||
char filename[FILE_MAX];
|
||||
|
||||
RNA_string_get(op->ptr, "filename", filename);
|
||||
|
||||
strcpy(G.ima, filename);
|
||||
BLI_convertstringcode(filename, G.sce);
|
||||
|
||||
/* BKE_add_image_extension() checks for if extension was already set */
|
||||
if(scene->r.scemode & R_EXTENSION)
|
||||
if(strlen(name)<FILE_MAXDIR+FILE_MAXFILE-5)
|
||||
BKE_add_image_extension(scene, name, scene->r.imtype);
|
||||
if(strlen(filename)<FILE_MAXDIR+FILE_MAXFILE-5)
|
||||
BKE_add_image_extension(scene, filename, scene->r.imtype);
|
||||
|
||||
if(saveover(name)) {
|
||||
// waitcursor(1);
|
||||
|
||||
ibuf= IMB_allocImBuf(dumpsx, dumpsy, 24, 0, 0);
|
||||
ibuf->rect= dumprect;
|
||||
|
||||
if(scene->r.planes == 8) IMB_cspace(ibuf, rgb_to_bw);
|
||||
|
||||
BKE_write_ibuf(scene, ibuf, name, scene->r.imtype, scene->r.subimtype, scene->r.quality);
|
||||
ibuf= IMB_allocImBuf(scd->dumpsx, scd->dumpsy, 24, 0, 0);
|
||||
ibuf->rect= scd->dumprect;
|
||||
|
||||
if(scene->r.planes == 8) IMB_cspace(ibuf, rgb_to_bw);
|
||||
|
||||
BKE_write_ibuf(scene, ibuf, filename, scene->r.imtype, scene->r.subimtype, scene->r.quality);
|
||||
|
||||
IMB_freeImBuf(ibuf);
|
||||
|
||||
// waitcursor(0);
|
||||
}
|
||||
MEM_freeN(dumprect);
|
||||
dumprect= NULL;
|
||||
IMB_freeImBuf(ibuf);
|
||||
|
||||
MEM_freeN(scd->dumprect);
|
||||
MEM_freeN(scd);
|
||||
op->customdata= NULL;
|
||||
}
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
/* get dump from frontbuffer */
|
||||
void ED_screendump(bContext *C, int fscreen)
|
||||
/* get shot from frontbuffer */
|
||||
static unsigned int *screenshot(bContext *C, int *dumpsx, int *dumpsy, int fscreen)
|
||||
{
|
||||
wmWindow *win= CTX_wm_window(C);
|
||||
ScrArea *curarea= CTX_wm_area(C);
|
||||
int x=0, y=0;
|
||||
// char imstr[64];
|
||||
|
||||
if(dumprect) MEM_freeN(dumprect);
|
||||
dumprect= NULL;
|
||||
unsigned int *dumprect= NULL;
|
||||
|
||||
if(fscreen) { /* full screen */
|
||||
x= 0;
|
||||
y= 0;
|
||||
dumpsx= win->sizex;
|
||||
dumpsy= win->sizey;
|
||||
|
||||
*dumpsx= win->sizex;
|
||||
*dumpsy= win->sizey;
|
||||
}
|
||||
else {
|
||||
x= curarea->totrct.xmin;
|
||||
y= curarea->totrct.ymin;
|
||||
dumpsx= curarea->totrct.xmax-x;
|
||||
dumpsy= curarea->totrct.ymax-y;
|
||||
*dumpsx= curarea->totrct.xmax-x;
|
||||
*dumpsy= curarea->totrct.ymax-y;
|
||||
}
|
||||
|
||||
if (dumpsx && dumpsy) {
|
||||
|
||||
if (*dumpsx && *dumpsy) {
|
||||
|
||||
dumprect= MEM_mallocN(sizeof(int)*dumpsx*dumpsy, "dumprect");
|
||||
dumprect= MEM_mallocN(sizeof(int) * dumpsx[0] * dumpsy[0], "dumprect");
|
||||
glReadBuffer(GL_FRONT);
|
||||
glReadPixels(x, y, dumpsx, dumpsy, GL_RGBA, GL_UNSIGNED_BYTE, dumprect);
|
||||
glReadPixels(x, y, *dumpsx, *dumpsy, GL_RGBA, GL_UNSIGNED_BYTE, dumprect);
|
||||
glFinish();
|
||||
glReadBuffer(GL_BACK);
|
||||
|
||||
// save_image_filesel_str(imstr);
|
||||
// activate_fileselect(FILE_SPECIAL, imstr, G.ima, write_screendump);
|
||||
}
|
||||
|
||||
return dumprect;
|
||||
}
|
||||
|
||||
|
||||
static int screenshot_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
||||
{
|
||||
unsigned int *dumprect;
|
||||
int dumpsx, dumpsy;
|
||||
|
||||
dumprect= screenshot(C, &dumpsx, &dumpsy, RNA_boolean_get(op->ptr, "full"));
|
||||
if(dumprect) {
|
||||
SpaceFile *sfile;
|
||||
ScreenshotData *scd= MEM_callocN(sizeof(ScreenshotData), "screenshot");
|
||||
|
||||
scd->dumpsx= dumpsx;
|
||||
scd->dumpsy= dumpsy;
|
||||
scd->dumprect= dumprect;
|
||||
op->customdata= scd;
|
||||
|
||||
if(RNA_property_is_set(op->ptr, "filename"))
|
||||
return screenshot_exec(C, op);
|
||||
|
||||
ED_screen_full_newspace(C, CTX_wm_area(C), SPACE_FILE);
|
||||
|
||||
/* settings for filebrowser */
|
||||
sfile= (SpaceFile*)CTX_wm_space_data(C);
|
||||
sfile->op = op;
|
||||
|
||||
ED_fileselect_set_params(sfile, FILE_BLENDER, "Save Screenshot As", G.ima, 0, 0, 0);
|
||||
|
||||
return OPERATOR_RUNNING_MODAL;
|
||||
}
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
|
||||
void SCREEN_OT_screenshot(wmOperatorType *ot)
|
||||
{
|
||||
ot->name= "Make Screenshot";
|
||||
ot->idname= "SCREEN_OT_screenshot";
|
||||
|
||||
ot->invoke= screenshot_invoke;
|
||||
ot->exec= screenshot_exec;
|
||||
ot->poll= WM_operator_winactive;
|
||||
|
||||
ot->flag= 0;
|
||||
|
||||
RNA_def_property(ot->srna, "filename", PROP_STRING, PROP_FILEPATH);
|
||||
RNA_def_boolean(ot->srna, "full", 1, "Full Screen", "");
|
||||
}
|
||||
|
||||
/* *************** screenshot movie job ************************* */
|
||||
#if 0
|
||||
typedef struct ScreenshotJob {
|
||||
unsigned int *dumprect;
|
||||
int dumpsx, dumpsy;
|
||||
short *stop;
|
||||
short *do_update;
|
||||
} ScreenshotJob;
|
||||
|
||||
|
||||
static void screenshot_freejob(void *sjv)
|
||||
{
|
||||
ScreenshotJob *sj= sjv;
|
||||
|
||||
MEM_freeN(sj);
|
||||
}
|
||||
|
||||
|
||||
/* called before redraw notifiers, copies a new dumprect */
|
||||
static void screenshot_updatejob(void *sjv)
|
||||
{
|
||||
ScreenshotJob *sj= sjv;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* only this runs inside thread */
|
||||
static void screenshot_startjob(void *sjv, short *stop, short *do_update)
|
||||
{
|
||||
ScreenshotJob *sj= sjv;
|
||||
|
||||
sj->stop= stop;
|
||||
sj->do_update= do_update;
|
||||
|
||||
|
||||
}
|
||||
|
||||
static int screenshot_job_invoke(const bContext *C, wmOperator *op, wmEvent *event)
|
||||
{
|
||||
bScreen *screen= CTX_wm_screen(C);
|
||||
wmJob *steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), screen);
|
||||
ScreenshotJob *sj= MEM_callocN(sizeof(ScreenshotJob), "screenshot job");
|
||||
|
||||
/* customdata for preview thread */
|
||||
sj->scene= CTX_data_scene(C);
|
||||
|
||||
/* setup job */
|
||||
WM_jobs_customdata(steve, sj, screenshot_freejob);
|
||||
WM_jobs_timer(steve, 0.1, 0, 0);
|
||||
WM_jobs_callbacks(steve, screenshot_startjob, NULL, screenshot_updatejob);
|
||||
|
||||
WM_jobs_start(steve);
|
||||
|
||||
}
|
||||
|
||||
void SCREEN_OT_screenshot_movie(wmOperatorType *ot)
|
||||
{
|
||||
ot->name= "Make Screenshot";
|
||||
ot->idname= "SCREEN_OT_screenshot_movie";
|
||||
|
||||
ot->invoke= screenshot_invoke;
|
||||
ot->exec= screenshot_exec;
|
||||
ot->poll= WM_operator_winactive;
|
||||
|
||||
ot->flag= 0;
|
||||
|
||||
RNA_def_property(ot->srna, "filename", PROP_STRING, PROP_FILEPATH);
|
||||
RNA_def_boolean(ot->srna, "full", 1, "Full Screen", "");
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user