[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18970] branches/blender2.5/blender/source /blender/editors/screen: 2.5

Ton Roosendaal ton at blender.org
Sat Feb 14 17:43:05 CET 2009


Revision: 18970
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18970
Author:   ton
Date:     2009-02-14 17:43:02 +0100 (Sat, 14 Feb 2009)

Log Message:
-----------
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... :)

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/screen/screen_intern.h
    branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
    branches/blender2.5/blender/source/blender/editors/screen/screendump.c

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_intern.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_intern.h	2009-02-14 14:25:48 UTC (rev 18969)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_intern.h	2009-02-14 16:43:02 UTC (rev 18970)
@@ -57,6 +57,9 @@
 /* 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 */
 
 

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c	2009-02-14 14:25:48 UTC (rev 18969)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c	2009-02-14 16:43:02 UTC (rev 18970)
@@ -2064,6 +2064,7 @@
 		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 @@
 		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 @@
 	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 @@
 	
 	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 @@
 	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);

Modified: branches/blender2.5/blender/source/blender/editors/screen/screendump.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screendump.c	2009-02-14 14:25:48 UTC (rev 18969)
+++ branches/blender2.5/blender/source/blender/editors/screen/screendump.c	2009-02-14 16:43:02 UTC (rev 18970)
@@ -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
+





More information about the Bf-blender-cvs mailing list