[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [48511] branches/soc-2011-tomato/source/ blender/windowmanager/intern/wm_playanim.c: basic events quit and resize window now work

Campbell Barton ideasman42 at gmail.com
Tue Jul 3 01:01:13 CEST 2012


Revision: 48511
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48511
Author:   campbellbarton
Date:     2012-07-02 23:01:04 +0000 (Mon, 02 Jul 2012)
Log Message:
-----------
basic events quit and resize window now work
text draws again.

Modified Paths:
--------------
    branches/soc-2011-tomato/source/blender/windowmanager/intern/wm_playanim.c

Modified: branches/soc-2011-tomato/source/blender/windowmanager/intern/wm_playanim.c
===================================================================
--- branches/soc-2011-tomato/source/blender/windowmanager/intern/wm_playanim.c	2012-07-02 21:49:19 UTC (rev 48510)
+++ branches/soc-2011-tomato/source/blender/windowmanager/intern/wm_playanim.c	2012-07-02 23:01:04 UTC (rev 48511)
@@ -74,19 +74,40 @@
 
 #include "DNA_scene_types.h"
 #include "BLI_utildefines.h"
+#include "ED_datafiles.h" /* for fonts */
 #include "wm_event_types.h"
 #include "GHOST_C-api.h"
+#include "BLF_api.h"
 
 #define WINCLOSE -1
 #define REDRAW -3
 #define RESHAPE -2
 #define WINQUIT -4
 
-static int qtest(void)
-{
-	return 0;
-}
+/* use */
+typedef struct PlayState {
+	short direction;
+	short next;
+	short once;
+	short turbo;
+	short pingpong;
+	short noskip;
+	short sstep;
+	short pause;
+	short wait2;
+	short stopped;
+	short go;
 
+	struct PlayAnimPict *picture;
+
+	/* set once at the start */
+	int ibufx, ibufy;
+	int fontid;
+
+	/* saves passing args */
+	struct ImBuf *curframe_ibuf;
+} PlayState;
+
 /* ***************** gl_util.c ****************** */
 
 static GHOST_SystemHandle g_system = NULL;
@@ -118,6 +139,7 @@
 }
 
 /* implementation */
+#if 0
 static int qreadN(short *val)
 {
 #if 0 // XXX25
@@ -168,6 +190,7 @@
 
 	return(event);
 }
+#endif
 
 typedef struct PlayAnimPict {
 	struct PlayAnimPict *next, *prev;
@@ -199,7 +222,7 @@
 	return (ptottime < 0);
 }
 
-static void toscreen(PlayAnimPict *picture, struct ImBuf *ibuf)
+static void toscreen(PlayAnimPict *picture, struct ImBuf *ibuf, int fontid)
 {
 
 	if (ibuf == NULL) {
@@ -213,26 +236,33 @@
 	if (ibuf->rect == NULL)
 		return;
 
+	GHOST_ActivateWindowDrawingContext(g_window);
+
 	glRasterPos2f(0.0f, 0.0f);
 
 	glDrawPixels(ibuf->x, ibuf->y, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
 
 	pupdate_time();
 
-	if (picture && (qualN & (SHIFT | LMOUSE))) {
+	//if (picture && (qualN & (SHIFT | LMOUSE))) {
+	if (picture && fontid != -1) {
 		char str[32 + FILE_MAX];
 		cpack(-1);
-		glRasterPos2f(0.02f, 0.03f);
-		BLI_snprintf(str, sizeof(str), "%s | %.2f frames/s\n", picture->name, fstep / swaptime);
-#if 0 // XXX25
-		BMF_DrawString(G.fonts, str);
-#endif
+//		glRasterPos2f(0.02f, 0.03f);
+		BLI_snprintf(str, sizeof(str), "%s | %.2f frames/s", picture->name, fstep / swaptime);
+//		BMF_DrawString(font, str);
+
+		BLF_enable(fontid, BLF_ASPECT);
+		BLF_aspect(fontid, 1.0f / ibuf->x, 1.0f / ibuf->y, 1.0f);
+		BLF_position(fontid, 0.02f, 0.03f, 0.0f);
+		BLF_draw(fontid, str, 256); // XXX
+		printf("Drawing text '%s'\n", str);
 	}
 
 	GHOST_SwapWindowBuffers(g_window);
 }
 
-static void build_pict_list(char *first, int totframes, int fstep)
+static void build_pict_list(char *first, int totframes, int fstep, int fontid)
 {
 	char *mem, filepath[FILE_MAX];
 //	short val;
@@ -247,7 +277,7 @@
 			int pic;
 			ibuf = IMB_anim_absolute(anim, 0, IMB_TC_NONE, IMB_PROXY_NONE);
 			if (ibuf) {
-				toscreen(NULL, ibuf);
+				toscreen(NULL, ibuf, fontid);
 				IMB_freeImBuf(ibuf);
 			}
 
@@ -345,7 +375,7 @@
 					ibuf = IMB_loadiffname(picture->name, picture->IB_flags);
 				}
 				if (ibuf) {
-					toscreen(picture, ibuf);
+					toscreen(picture, ibuf, fontid);
 					IMB_freeImBuf(ibuf);
 				}
 				pupdate_time();
@@ -369,11 +399,284 @@
 	return;
 }
 
-static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_ptr)
+static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr ps_void)
 {
-	(void)evt;
-	(void)C_void_ptr;
+	PlayState *ps = (PlayState *)ps_void;
+	{
+		GHOST_TEventType type = GHOST_GetEventType(evt);
+		int val;
+		int event;
 
+		/* convert ghost event into value keyboard or mouse */
+		val = ELEM(type, GHOST_kEventKeyDown, GHOST_kEventButtonDown);
+
+		if (ps->wait2 && ps->stopped) {
+			ps->stopped = FALSE;
+		}
+
+		switch (type) {
+			case GHOST_kEventWindowSize:
+			case GHOST_kEventWindowMove:
+			{
+				int sizex, sizey;
+
+				playanim_window_get_size(&sizex, &sizey);
+				GHOST_ActivateWindowDrawingContext(g_window);
+
+				glViewport(0, 0, sizex, sizey);
+				glScissor(0, 0, sizex, sizey);
+
+				zoomx = (float) sizex / ps->ibufx;
+				zoomy = (float) sizey / ps->ibufy;
+				zoomx = floor(zoomx + 0.5);
+				zoomy = floor(zoomy + 0.5);
+				if (zoomx < 1.0) zoomx = 1.0;
+				if (zoomy < 1.0) zoomy = 1.0;
+
+				sizex = zoomx * ps->ibufx;
+				sizey = zoomy * ps->ibufy;
+
+				glPixelZoom(zoomx, zoomy);
+				glEnable(GL_DITHER);
+				ptottime = 0.0;
+				toscreen(ps->picture, ps->curframe_ibuf, ps->fontid);
+//XXX25				while (qtest()) qreadN(&val);
+
+				break;
+			}
+			case GHOST_kEventQuit:
+			case GHOST_kEventWindowClose:
+			{
+				ps->go = FALSE;
+				break;
+			}
+			default:
+				/* quiet warnings */
+				break;
+		}
+
+		return 1; // XXX25
+
+		event = -1;
+
+
+//XXX25		int event = qreadN(&val);
+		/* printf("%d %d\n", event, val); */
+
+		if (ps->wait2) {
+			pupdate_time();
+			ptottime = 0;
+		}
+		switch (event) {
+			case AKEY:
+				if (val)
+					ps->noskip = !ps->noskip;
+				break;
+			case PKEY:
+				if (val)
+					ps->pingpong = !ps->pingpong;
+				break;
+			case SLASHKEY:
+				if (val) {
+					if (qualN & SHIFT) {
+						if (ps->curframe_ibuf)
+							printf(" Name: %s | Speed: %.2f frames/s\n", ps->curframe_ibuf->name, fstep / swaptime);
+					}
+					else {
+						swaptime = fstep / 5.0;
+					}
+				}
+				break;
+			case LEFTARROWKEY:
+				if (val) {
+					ps->sstep = TRUE;
+					ps->wait2 = FALSE;
+					if (qualN & SHIFT) {
+						ps->picture = picsbase->first;
+						ps->next = 0;
+					}
+					else {
+						ps->next = -1;
+					}
+				}
+				break;
+			case DOWNARROWKEY:
+				if (val) {
+					ps->wait2 = FALSE;
+					if (qualN & SHIFT) {
+						ps->next = ps->direction = -1;
+					}
+					else {
+						ps->next = -10;
+						ps->sstep = TRUE;
+					}
+				}
+				break;
+			case RIGHTARROWKEY:
+				if (val) {
+					ps->sstep = TRUE;
+					ps->wait2 = FALSE;
+					if (qualN & SHIFT) {
+						ps->picture = picsbase->last;
+						ps->next = 0;
+					}
+					else {
+						ps->next = 1;
+					}
+				}
+				break;
+			case UPARROWKEY:
+				if (val) {
+					ps->wait2 = FALSE;
+					if (qualN & SHIFT) {
+						ps->next = ps->direction = 1;
+					}
+					else {
+						ps->next = 10;
+						ps->sstep = TRUE;
+					}
+				}
+				break;
+			case LEFTMOUSE:
+			case MOUSEX:
+				if (qualN & LMOUSE) {
+					int sizex, sizey;
+					int i;
+					playanim_window_get_size(&sizex, &sizey);
+					ps->picture = picsbase->first;
+					i = 0;
+					while (ps->picture) {
+						i++;
+						ps->picture = ps->picture->next;
+					}
+					i = (i * val) / sizex;
+					ps->picture = picsbase->first;
+					for (; i > 0; i--) {
+						if (ps->picture->next == NULL) break;
+						ps->picture = ps->picture->next;
+					}
+					ps->sstep = TRUE;
+					ps->wait2 = FALSE;
+					ps->next = 0;
+				}
+				break;
+			case EQUALKEY:
+				if (val) {
+					if (qualN & SHIFT) {
+						ps->pause++;
+						printf("pause:%d\n", ps->pause);
+					}
+					else {
+						swaptime /= 1.1;
+					}
+				}
+				break;
+			case MINUSKEY:
+				if (val) {
+					if (qualN & SHIFT) {
+						ps->pause--;
+						printf("pause:%d\n", ps->pause);
+					}
+					else {
+						swaptime *= 1.1;
+					}
+				}
+				break;
+			case PAD0:
+				if (val) {
+					if (ps->once) {
+						ps->once = ps->wait2 = FALSE;
+					}
+					else {
+						ps->picture = NULL;
+						ps->once = TRUE;
+						ps->wait2 = FALSE;
+					}
+				}
+				break;
+			case RETKEY:
+			case PADENTER:
+				if (val) {
+					ps->wait2 = ps->sstep = FALSE;
+				}
+				break;
+			case PADPERIOD:
+				if (val) {
+					if (ps->sstep) ps->wait2 = FALSE;
+					else {
+						ps->sstep = TRUE;
+						ps->wait2 = !ps->wait2;
+					}
+				}
+				break;
+			case PAD1:
+				swaptime = fstep / 60.0;
+				break;
+			case PAD2:
+				swaptime = fstep / 50.0;
+				break;
+			case PAD3:
+				swaptime = fstep / 30.0;
+				break;
+			case PAD4:
+				if (qualN & SHIFT)
+					swaptime = fstep / 24.0;
+				else
+					swaptime = fstep / 25.0;
+				break;
+			case PAD5:
+				swaptime = fstep / 20.0;
+				break;
+			case PAD6:
+				swaptime = fstep / 15.0;
+				break;
+			case PAD7:
+				swaptime = fstep / 12.0;
+				break;
+			case PAD8:
+				swaptime = fstep / 10.0;
+				break;
+			case PAD9:
+				swaptime = fstep / 6.0;
+				break;
+			case PADPLUSKEY:
+				if (val == 0) break;
+				zoomx += 2.0;
+				zoomy += 2.0;
+			case PADMINUS:
+			{
+				int sizex, sizey;
+				/* int ofsx, ofsy; */ /* UNUSED */
+
+				if (val == 0) break;
+				if (zoomx > 1.0) zoomx -= 1.0;
+				if (zoomy > 1.0) zoomy -= 1.0;
+				// playanim_window_get_position(&ofsx, &ofsy);
+				playanim_window_get_size(&sizex, &sizey);
+				/* ofsx += sizex / 2; */ /* UNUSED */
+				/* ofsy += sizey / 2; */ /* UNUSED */
+				sizex = zoomx * ps->ibufx;
+				sizey = zoomy * ps->ibufy;
+				/* ofsx -= sizex / 2; */ /* UNUSED */
+				/* ofsy -= sizey / 2; */ /* UNUSED */
+				// window_set_position(g_window,sizex,sizey);
+				GHOST_SetClientSize(g_window, sizex, sizey);
+				break;
+			}
+			case RESHAPE:
+			case REDRAW:
+			{
+//XXX25 DONE!
+			}
+			case ESCKEY:
+			case WINCLOSE:
+			case WINQUIT:
+//XXX25 DONE!
+			break;
+		}
+//XXX25		if (go == FALSE) break;
+	}
+
 	return 1;
 }
 
@@ -414,15 +717,10 @@
 void playanim(int argc, const char **argv)
 {
 	struct ImBuf *ibuf = NULL;
-	PlayAnimPict *picture = NULL;
 	char filepath[FILE_MAX];
-	short val = 0, go = TRUE, ibufx = 0, ibufy = 0;
-	int event, stopped = FALSE;
 	GHOST_TUns32 maxwinx, maxwiny;
 	/* short c233 = FALSE, yuvx = FALSE; */ /* UNUSED */
-	short once = FALSE, sstep = FALSE, wait2 = FALSE, /*  resetmap = FALSE, */ pause = 0;
-	short pingpong = FALSE, direction = 1, next = 1, turbo = FALSE, /*  doubleb = TRUE, */ noskip = FALSE;
-	int sizex, sizey, i;
+	int i;
 	/* This was done to disambiguate the name for use under c++. */
 	struct anim *anim = NULL;
 	int start_x = 0, start_y = 0;
@@ -430,6 +728,25 @@
 	int efra = -1;
 	int totblock;
 
+	PlayState ps = {0};
+
+	/* ps.doubleb   = TRUE;*/ /* UNUSED */
+	ps.go        = TRUE;
+	ps.direction = TRUE;
+	ps.next      = TRUE;
+	ps.once      = FALSE;
+	ps.turbo     = FALSE;
+	ps.pingpong  = FALSE;
+	ps.noskip    = FALSE;
+	ps.sstep     = FALSE;
+	ps.pause     = FALSE;
+	ps.wait2     = FALSE;
+	ps.stopped   = FALSE;
+	ps.picture   = NULL;
+	/* resetmap = FALSE */
+
+	ps.fontid = -1;
+
 	while (argc > 1) {
 		if (argv[1][0] == '-') {
 			switch (argv[1][1]) {
@@ -551,8 +868,7 @@
 	{
 //		extern void add_to_mainqueue(wmWindow *win, void *user_data, short evt, short val, char ascii);
 
-		void *some_handle = NULL; // XXX25, fixme

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list