SDL  2.0
testgesture.c File Reference
#include "SDL.h"
#include <stdlib.h>
+ Include dependency graph for testgesture.c:

Go to the source code of this file.

Data Structures

struct  Point
 
struct  Knob
 

Macros

#define WIDTH   640
 
#define HEIGHT   480
 
#define BPP   4
 
#define EVENT_BUF_SIZE   256
 
#define VERBOSE   0
 

Functions

void setpix (SDL_Surface *screen, float _x, float _y, unsigned int col)
 
void drawLine (SDL_Surface *screen, float x0, float y0, float x1, float y1, unsigned int col)
 
void drawCircle (SDL_Surface *screen, float x, float y, float r, unsigned int c)
 
void drawKnob (SDL_Surface *screen, Knob k)
 
void DrawScreen (SDL_Surface *screen, SDL_Window *window)
 
SDL_WindowinitWindow (SDL_Window *window, int width, int height)
 
void loop ()
 
int main (int argc, char *argv[])
 

Variables

static SDL_Event events [EVENT_BUF_SIZE]
 
static int eventWrite
 
static int colors [7] = {0xFF,0xFF00,0xFF0000,0xFFFF00,0x00FFFF,0xFF00FF,0xFFFFFF}
 
SDL_Surfacescreen
 
SDL_Windowwindow
 
SDL_bool quitting = SDL_FALSE
 
static Knob knob
 

Macro Definition Documentation

#define BPP   4

Definition at line 27 of file testgesture.c.

Referenced by setpix().

#define EVENT_BUF_SIZE   256

Definition at line 30 of file testgesture.c.

Referenced by DrawScreen(), and loop().

#define HEIGHT   480

Definition at line 26 of file testgesture.c.

Referenced by main().

#define VERBOSE   0

Definition at line 33 of file testgesture.c.

#define WIDTH   640

Definition at line 25 of file testgesture.c.

Referenced by main().

Function Documentation

void drawCircle ( SDL_Surface screen,
float  x,
float  y,
float  r,
unsigned int  c 
)

Definition at line 92 of file testgesture.c.

References SDL_fabs, SDL_sqrt, and setpix().

Referenced by drawKnob(), and DrawScreen().

93 {
94  float tx,ty;
95  float xr;
96  for(ty = (float)-SDL_fabs(r);ty <= (float)SDL_fabs((int)r);ty++) {
97  xr = (float)SDL_sqrt(r*r - ty*ty);
98  if(r > 0) { /* r > 0 ==> filled circle */
99  for(tx=-xr+.5f;tx<=xr-.5;tx++) {
100  setpix(screen,x+tx,y+ty,c);
101  }
102  }
103  else {
104  setpix(screen,x-xr+.5f,y+ty,c);
105  setpix(screen,x+xr-.5f,y+ty,c);
106  }
107  }
108 }
GLdouble GLdouble GLdouble r
Definition: SDL_opengl.h:2079
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1574
#define SDL_fabs
GLfloat f
const GLubyte * c
GLint GLint GLint GLint GLint GLint y
Definition: SDL_opengl.h:1574
void setpix(SDL_Surface *screen, float _x, float _y, unsigned int col)
Definition: testgesture.c:56
#define SDL_sqrt
GLbyte ty
void drawKnob ( SDL_Surface screen,
Knob  k 
)

Definition at line 110 of file testgesture.c.

References Knob::ang, drawCircle(), SDL_Surface::h, Knob::p, Knob::r, SDL_cosf, SDL_sinf, SDL_Surface::w, Point::x, and Point::y.

Referenced by DrawScreen().

110  {
111  drawCircle(screen,k.p.x*screen->w,k.p.y*screen->h,k.r*screen->w,0xFFFFFF);
112  drawCircle(screen,(k.p.x+k.r/2*SDL_cosf(k.ang))*screen->w,
113  (k.p.y+k.r/2*SDL_sinf(k.ang))*screen->h,k.r/4*screen->w,0);
114 }
#define SDL_sinf
void drawCircle(SDL_Surface *screen, float x, float y, float r, unsigned int c)
Definition: testgesture.c:92
float r
Definition: testgesture.c:50
float x
Definition: testgesture.c:46
Point p
Definition: testgesture.c:51
#define SDL_cosf
float y
Definition: testgesture.c:46
float ang
Definition: testgesture.c:50
void drawLine ( SDL_Surface screen,
float  x0,
float  y0,
float  x1,
float  y1,
unsigned int  col 
)

Definition at line 86 of file testgesture.c.

References SDL_fabs, SDL_max, and setpix().

86  {
87  float t;
88  for(t=0;t<1;t+=(float)(1.f/SDL_max(SDL_fabs(x0-x1),SDL_fabs(y0-y1))))
89  setpix(screen,x1+t*(x0-x1),y1+t*(y0-y1),col);
90 }
GLuint GLfloat GLfloat GLfloat x1
#define SDL_fabs
GLfloat f
#define SDL_max(x, y)
Definition: SDL_stdinc.h:376
GLfixed y1
void setpix(SDL_Surface *screen, float _x, float _y, unsigned int col)
Definition: testgesture.c:56
GLuint GLfloat GLfloat y0
GLuint GLfloat x0
GLdouble GLdouble t
Definition: SDL_opengl.h:2071
void DrawScreen ( SDL_Surface screen,
SDL_Window window 
)

Definition at line 116 of file testgesture.c.

References colors, drawCircle(), drawKnob(), EVENT_BUF_SIZE, eventWrite, SDL_Surface::h, i, NULL, Knob::p, SDL_FillRect, SDL_FINGERDOWN, SDL_FINGERMOTION, SDL_FINGERUP, SDL_UpdateWindowSurface, setpix(), SDL_Surface::w, and Point::x.

Referenced by loop().

117 {
118  int i;
119 #if 1
120  SDL_FillRect(screen, NULL, 0);
121 #else
122  int x, y;
123  for(y = 0;y < screen->h;y++)
124  for(x = 0;x < screen->w;x++)
125  setpix(screen,(float)x,(float)y,((x%255)<<16) + ((y%255)<<8) + (x+y)%255);
126 #endif
127 
128  /* draw Touch History */
129  for(i = eventWrite; i < eventWrite+EVENT_BUF_SIZE; ++i) {
130  const SDL_Event *event = &events[i&(EVENT_BUF_SIZE-1)];
131  float age = (float)(i - eventWrite) / EVENT_BUF_SIZE;
132  float x, y;
133  unsigned int c, col;
134 
135  if(event->type == SDL_FINGERMOTION ||
136  event->type == SDL_FINGERDOWN ||
137  event->type == SDL_FINGERUP) {
138  x = event->tfinger.x;
139  y = event->tfinger.y;
140 
141  /* draw the touch: */
142  c = colors[event->tfinger.fingerId%7];
143  col = ((unsigned int)(c*(.1+.85))) | (unsigned int)(0xFF*age)<<24;
144 
145  if(event->type == SDL_FINGERMOTION)
146  drawCircle(screen,x*screen->w,y*screen->h,5,col);
147  else if(event->type == SDL_FINGERDOWN)
148  drawCircle(screen,x*screen->w,y*screen->h,-10,col);
149  }
150  }
151 
152  if(knob.p.x > 0)
153  drawKnob(screen,knob);
154 
155  SDL_UpdateWindowSurface(window);
156 }
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1574
static SDL_Event events[EVENT_BUF_SIZE]
Definition: testgesture.c:35
static Knob knob
Definition: testgesture.c:54
void drawCircle(SDL_Surface *screen, float x, float y, float r, unsigned int c)
Definition: testgesture.c:92
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
#define SDL_UpdateWindowSurface
static int eventWrite
Definition: testgesture.c:36
struct _cl_event * event
const GLubyte * c
#define EVENT_BUF_SIZE
Definition: testgesture.c:30
float x
Definition: testgesture.c:46
GLint GLint GLint GLint GLint GLint y
Definition: SDL_opengl.h:1574
Point p
Definition: testgesture.c:51
void drawKnob(SDL_Surface *screen, Knob k)
Definition: testgesture.c:110
void setpix(SDL_Surface *screen, float _x, float _y, unsigned int col)
Definition: testgesture.c:56
#define NULL
Definition: begin_code.h:164
#define SDL_FillRect
General event structure.
Definition: SDL_events.h:525
static int colors[7]
Definition: testgesture.c:39
SDL_Window* initWindow ( SDL_Window window,
int  width,
int  height 
)

Definition at line 159 of file testgesture.c.

References SDL_CreateWindow, SDL_WINDOW_RESIZABLE, SDL_WINDOWPOS_CENTERED, and window.

Referenced by loop(), and main().

160 {
161  if (!window) {
162  window = SDL_CreateWindow("Gesture Test",
165  }
166  return window;
167 }
#define SDL_WINDOWPOS_CENTERED
Definition: SDL_video.h:137
#define SDL_CreateWindow
GLint GLint GLsizei width
Definition: SDL_opengl.h:1572
SDL_Window * window
Definition: testgesture.c:42
GLint GLint GLsizei GLsizei height
Definition: SDL_opengl.h:1572
void loop ( )

Definition at line 169 of file testgesture.c.

References Knob::ang, SDL_WindowEvent::data1, SDL_WindowEvent::data2, SDL_MultiGestureEvent::dDist, SDL_Event::dgesture, DrawScreen(), SDL_MultiGestureEvent::dTheta, SDL_DollarGestureEvent::error, SDL_WindowEvent::event, EVENT_BUF_SIZE, eventWrite, SDL_TouchFingerEvent::fingerId, SDL_DollarGestureEvent::gestureId, i, initWindow(), SDL_Event::key, SDL_KeyboardEvent::keysym, SDL_Event::mgesture, SDL_MultiGestureEvent::numFingers, Knob::p, quitting, Knob::r, SDL_DOLLARGESTURE, SDL_DOLLARRECORD, SDL_FINGERDOWN, SDL_FINGERMOTION, SDL_FINGERUP, SDL_GetNumTouchDevices, SDL_GetNumTouchFingers, SDL_GetTouchDevice, SDL_GetWindowSurface, SDL_KEYDOWN, SDL_LoadDollarTemplates, SDL_Log, SDL_MULTIGESTURE, SDL_PollEvent, SDL_PRIs64, SDL_Quit, SDL_QUIT, SDL_RecordGesture, SDL_RWclose, SDL_RWFromFile, SDL_SaveAllDollarTemplates, SDL_TRUE, SDL_WINDOWEVENT, SDL_WINDOWEVENT_RESIZED, SDLK_ESCAPE, SDLK_i, SDLK_l, SDLK_s, SDLK_SPACE, SDL_Keysym::sym, SDL_Event::tfinger, SDL_Event::type, SDL_Event::window, Point::x, SDL_TouchFingerEvent::x, SDL_MultiGestureEvent::x, Point::y, SDL_TouchFingerEvent::y, and SDL_MultiGestureEvent::y.

Referenced by main().

170 {
172  SDL_RWops *stream;
173 
174  while(SDL_PollEvent(&event))
175  {
176  /* Record _all_ events */
177  events[eventWrite & (EVENT_BUF_SIZE-1)] = event;
178  eventWrite++;
179 
180  switch (event.type)
181  {
182  case SDL_QUIT:
183  quitting = SDL_TRUE;
184  break;
185  case SDL_KEYDOWN:
186  switch (event.key.keysym.sym)
187  {
188  case SDLK_i:
189  {
190  int i;
191  for (i = 0; i < SDL_GetNumTouchDevices(); ++i) {
193  SDL_Log("Fingers Down on device %"SDL_PRIs64": %d", id, SDL_GetNumTouchFingers(id));
194  }
195  break;
196  }
197  case SDLK_SPACE:
198  SDL_RecordGesture(-1);
199  break;
200  case SDLK_s:
201  stream = SDL_RWFromFile("gestureSave", "w");
202  SDL_Log("Wrote %i templates", SDL_SaveAllDollarTemplates(stream));
203  SDL_RWclose(stream);
204  break;
205  case SDLK_l:
206  stream = SDL_RWFromFile("gestureSave", "r");
207  SDL_Log("Loaded: %i", SDL_LoadDollarTemplates(-1, stream));
208  SDL_RWclose(stream);
209  break;
210  case SDLK_ESCAPE:
211  quitting = SDL_TRUE;
212  break;
213  }
214  break;
215  case SDL_WINDOWEVENT:
216  if (event.window.event == SDL_WINDOWEVENT_RESIZED) {
217  if (!(window = initWindow(window, event.window.data1, event.window.data2)) ||
219  {
220  SDL_Quit();
221  exit(1);
222  }
223  }
224  break;
225  case SDL_FINGERMOTION:
226 #if VERBOSE
227  SDL_Log("Finger: %"SDL_PRIs64",x: %f, y: %f",event.tfinger.fingerId,
228  event.tfinger.x,event.tfinger.y);
229 #endif
230  break;
231  case SDL_FINGERDOWN:
232 #if VERBOSE
233  SDL_Log("Finger: %"SDL_PRIs64" down - x: %f, y: %f",
234  event.tfinger.fingerId,event.tfinger.x,event.tfinger.y);
235 #endif
236  break;
237  case SDL_FINGERUP:
238 #if VERBOSE
239  SDL_Log("Finger: %"SDL_PRIs64" up - x: %f, y: %f",
240  event.tfinger.fingerId,event.tfinger.x,event.tfinger.y);
241 #endif
242  break;
243  case SDL_MULTIGESTURE:
244 #if VERBOSE
245  SDL_Log("Multi Gesture: x = %f, y = %f, dAng = %f, dR = %f",
246  event.mgesture.x,
247  event.mgesture.y,
248  event.mgesture.dTheta,
249  event.mgesture.dDist);
250  SDL_Log("MG: numDownTouch = %i",event.mgesture.numFingers);
251 #endif
252  knob.p.x = event.mgesture.x;
253  knob.p.y = event.mgesture.y;
254  knob.ang += event.mgesture.dTheta;
255  knob.r += event.mgesture.dDist;
256  break;
257  case SDL_DOLLARGESTURE:
258  SDL_Log("Gesture %"SDL_PRIs64" performed, error: %f",
259  event.dgesture.gestureId,
260  event.dgesture.error);
261  break;
262  case SDL_DOLLARRECORD:
263  SDL_Log("Recorded gesture: %"SDL_PRIs64"",event.dgesture.gestureId);
264  break;
265  }
266  }
268 
269 #ifdef __EMSCRIPTEN__
270  if (quitting) {
271  emscripten_cancel_main_loop();
272  }
273 #endif
274 }
SDL_Window * initWindow(SDL_Window *window, int width, int height)
Definition: testgesture.c:159
#define SDL_PollEvent
SDL_DollarGestureEvent dgesture
Definition: SDL_events.h:550
#define SDL_RecordGesture
SDL_Surface * screen
Definition: testgesture.c:41
static SDL_Event events[EVENT_BUF_SIZE]
Definition: testgesture.c:35
SDL_bool quitting
Definition: testgesture.c:43
static Knob knob
Definition: testgesture.c:54
#define SDL_GetNumTouchDevices
SDL_GestureID gestureId
Definition: SDL_events.h:452
float r
Definition: testgesture.c:50
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
SDL_WindowEvent window
Definition: SDL_events.h:529
#define SDL_GetTouchDevice
#define SDL_Log
#define SDL_RWFromFile
#define SDL_PRIs64
Definition: SDL_stdinc.h:205
static int eventWrite
Definition: testgesture.c:36
GLuint GLuint stream
SDL_MultiGestureEvent mgesture
Definition: SDL_events.h:549
struct _cl_event * event
#define SDL_Quit
#define SDL_SaveAllDollarTemplates
#define SDL_GetWindowSurface
#define EVENT_BUF_SIZE
Definition: testgesture.c:30
Sint64 SDL_TouchID
Definition: SDL_touch.h:41
float x
Definition: testgesture.c:46
#define SDL_GetNumTouchFingers
Point p
Definition: testgesture.c:51
SDL_Keysym keysym
Definition: SDL_events.h:199
#define SDL_RWclose(ctx)
Definition: SDL_rwops.h:189
#define SDL_LoadDollarTemplates
EGLSurface EGLNativeWindowType * window
Definition: eglext.h:1025
SDL_KeyboardEvent key
Definition: SDL_events.h:530
float y
Definition: testgesture.c:46
SDL_FingerID fingerId
Definition: SDL_events.h:418
SDL_Keycode sym
Definition: SDL_keyboard.h:50
General event structure.
Definition: SDL_events.h:525
float ang
Definition: testgesture.c:50
void DrawScreen(SDL_Surface *screen, SDL_Window *window)
Definition: testgesture.c:116
Uint32 type
Definition: SDL_events.h:527
SDL_TouchFingerEvent tfinger
Definition: SDL_events.h:548
int main ( int  argc,
char *  argv[] 
)

Definition at line 276 of file testgesture.c.

References Knob::ang, HEIGHT, initWindow(), loop(), NULL, quitting, Knob::r, SDL_FALSE, SDL_GetWindowSurface, SDL_Init, SDL_INIT_VIDEO, SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, SDL_LogSetPriority, SDL_Quit, and WIDTH.

277 {
278  window = NULL;
279  screen = NULL;
281 
282  /* Enable standard application logging */
284 
285  /* gesture variables */
286  knob.r = .1f;
287  knob.ang = 0;
288 
289  if (SDL_Init(SDL_INIT_VIDEO) < 0 ) return 1;
290 
291  if (!(window = initWindow(window, WIDTH, HEIGHT)) ||
293  {
294  SDL_Quit();
295  return 1;
296  }
297 
298 #ifdef __EMSCRIPTEN__
299  emscripten_set_main_loop(loop, 0, 1);
300 #else
301  while(!quitting) {
302  loop();
303  }
304 #endif
305 
306  SDL_Quit();
307  return 0;
308 }
SDL_Window * initWindow(SDL_Window *window, int width, int height)
Definition: testgesture.c:159
SDL_Surface * screen
Definition: testgesture.c:41
SDL_bool quitting
Definition: testgesture.c:43
static Knob knob
Definition: testgesture.c:54
float r
Definition: testgesture.c:50
void loop()
Definition: testgesture.c:169
#define SDL_Quit
#define SDL_GetWindowSurface
#define WIDTH
Definition: testgesture.c:25
#define SDL_LogSetPriority
#define NULL
Definition: begin_code.h:164
#define HEIGHT
Definition: testgesture.c:26
EGLSurface EGLNativeWindowType * window
Definition: eglext.h:1025
#define SDL_Init
float ang
Definition: testgesture.c:50
#define SDL_INIT_VIDEO
Definition: SDL.h:78
void setpix ( SDL_Surface screen,
float  _x,
float  _y,
unsigned int  col 
)

Definition at line 56 of file testgesture.c.

References BPP, SDL_PixelFormat::BytesPerPixel, SDL_Surface::format, SDL_Surface::h, SDL_Surface::pitch, SDL_Surface::pixels, SDL_GetRGB, SDL_MapRGB, SDL_memcpy, and SDL_Surface::w.

Referenced by drawCircle(), drawLine(), and DrawScreen().

57 {
58  Uint32 *pixmem32;
59  Uint32 colour;
60  Uint8 r,g,b;
61  int x = (int)_x;
62  int y = (int)_y;
63  float a;
64 
65  if(x < 0 || x >= screen->w) return;
66  if(y < 0 || y >= screen->h) return;
67 
68  pixmem32 = (Uint32*) screen->pixels + y*screen->pitch/BPP + x;
69 
70  SDL_memcpy(&colour,pixmem32,screen->format->BytesPerPixel);
71 
72  SDL_GetRGB(colour,screen->format,&r,&g,&b);
73  /* r = 0;g = 0; b = 0; */
74  a = (float)((col>>24)&0xFF);
75  if(a == 0) a = 0xFF; /* Hack, to make things easier. */
76  a /= 0xFF;
77  r = (Uint8)(r*(1-a) + ((col>>16)&0xFF)*(a));
78  g = (Uint8)(g*(1-a) + ((col>> 8)&0xFF)*(a));
79  b = (Uint8)(b*(1-a) + ((col>> 0)&0xFF)*(a));
80  colour = SDL_MapRGB( screen->format,r, g, b);
81 
82 
83  *pixmem32 = colour;
84 }
#define SDL_GetRGB
GLdouble GLdouble GLdouble r
Definition: SDL_opengl.h:2079
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1574
Uint8 BytesPerPixel
Definition: SDL_pixels.h:318
uint32_t Uint32
Definition: SDL_stdinc.h:181
#define BPP
Definition: testgesture.c:27
#define SDL_memcpy
void * pixels
Definition: SDL_surface.h:75
uint8_t Uint8
Definition: SDL_stdinc.h:157
GLint GLint GLint GLint GLint GLint y
Definition: SDL_opengl.h:1574
SDL_PixelFormat * format
Definition: SDL_surface.h:72
#define SDL_MapRGB
GLboolean GLboolean GLboolean GLboolean a
GLboolean GLboolean g
GLboolean GLboolean GLboolean b

Variable Documentation

int colors[7] = {0xFF,0xFF00,0xFF0000,0xFFFF00,0x00FFFF,0xFF00FF,0xFFFFFF}
static

Definition at line 39 of file testgesture.c.

Referenced by DrawScreen(), MapNto1(), SDL_LoadBMP_RW(), and SDL_SaveBMP_RW().

SDL_Event events[EVENT_BUF_SIZE]
static

Definition at line 35 of file testgesture.c.

Referenced by IsSDLWindowEventPending(), and UpdateEventsForDeviceRemoval().

int eventWrite
static

Definition at line 36 of file testgesture.c.

Referenced by DrawScreen(), and loop().

Knob knob
static

Definition at line 54 of file testgesture.c.

SDL_bool quitting = SDL_FALSE

Definition at line 43 of file testgesture.c.

Referenced by loop(), and main().

SDL_Surface* screen

Definition at line 41 of file testgesture.c.

Definition at line 42 of file testgesture.c.

Referenced by initWindow().