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

◆ BPP

#define BPP   4

Definition at line 27 of file testgesture.c.

Referenced by setpix().

◆ EVENT_BUF_SIZE

#define EVENT_BUF_SIZE   256

Definition at line 30 of file testgesture.c.

Referenced by DrawScreen(), and loop().

◆ HEIGHT

#define HEIGHT   480

Definition at line 26 of file testgesture.c.

Referenced by main().

◆ VERBOSE

#define VERBOSE   0

Definition at line 33 of file testgesture.c.

◆ WIDTH

#define WIDTH   640

Definition at line 25 of file testgesture.c.

Referenced by main().

Function Documentation

◆ drawCircle()

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

◆ drawKnob()

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

◆ drawLine()

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:407
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

◆ DrawScreen()

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
#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
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 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

◆ initWindow()

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:139
#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

◆ loop()

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
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
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_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

◆ main()

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

◆ setpix()

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:320
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

◆ colors

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().

◆ events

SDL_Event events[EVENT_BUF_SIZE]
static

Definition at line 35 of file testgesture.c.

Referenced by IsSDLWindowEventPending(), and UpdateEventsForDeviceRemoval().

◆ eventWrite

int eventWrite
static

Definition at line 36 of file testgesture.c.

Referenced by DrawScreen(), and loop().

◆ knob

Knob knob
static

Definition at line 54 of file testgesture.c.

◆ quitting

SDL_bool quitting = SDL_FALSE

Definition at line 43 of file testgesture.c.

Referenced by loop(), and main().

◆ screen

SDL_Surface* screen

Definition at line 41 of file testgesture.c.

◆ window

Definition at line 42 of file testgesture.c.

Referenced by initWindow().