SDL  2.0
testgesture.c File Reference
#include "SDL.h"
#include <stdlib.h>
#include "SDL_test.h"
#include "SDL_test_common.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

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

Variables

static SDLTest_CommonStatestate
 
static SDL_Event events [EVENT_BUF_SIZE]
 
static int eventWrite
 
static int colors [7] = {0xFF,0xFF00,0xFF0000,0xFFFF00,0x00FFFF,0xFF00FF,0xFFFFFF}
 
static int quitting = 0
 
static Knob knob = { 0.0f, 0.1f, { 0.0f, 0.0f } }
 

Macro Definition Documentation

◆ BPP

#define BPP   4

Definition at line 31 of file testgesture.c.

Referenced by setpix().

◆ EVENT_BUF_SIZE

#define EVENT_BUF_SIZE   256

Definition at line 34 of file testgesture.c.

Referenced by DrawScreen(), and loop().

◆ HEIGHT

#define HEIGHT   480

Definition at line 30 of file testgesture.c.

Referenced by main().

◆ VERBOSE

#define VERBOSE   0

Definition at line 36 of file testgesture.c.

◆ WIDTH

#define WIDTH   640

Definition at line 29 of file testgesture.c.

Referenced by main().

Function Documentation

◆ drawCircle()

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

Definition at line 103 of file testgesture.c.

References SDL_fabs, SDL_sqrt, and setpix().

Referenced by drawKnob(), and DrawScreen().

104 {
105  float tx,ty, xr;
106  for (ty = (float) -SDL_fabs(r); ty <= (float) SDL_fabs((int) r); ty++) {
107  xr = (float) SDL_sqrt(r * r - ty * ty);
108  if (r > 0) { /* r > 0 ==> filled circle */
109  for(tx = -xr + 0.5f; tx <= xr - 0.5f; tx++) {
110  setpix(screen, x + tx, y + ty, c);
111  }
112  } else {
113  setpix(screen, x - xr + 0.5f, y + ty, c);
114  setpix(screen, x + xr - 0.5f, y + ty, c);
115  }
116  }
117 }
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
static void setpix(SDL_Surface *screen, float _x, float _y, unsigned int col)
Definition: testgesture.c:59
#define SDL_sqrt
GLbyte ty

◆ drawKnob()

static void drawKnob ( SDL_Surface screen,
const Knob k 
)
static

Definition at line 120 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().

121 {
122  drawCircle(screen, k->p.x * screen->w, k->p.y * screen->h, k->r * screen->w, 0xFFFFFF);
123  drawCircle(screen, (k->p.x + k->r / 2 * SDL_cosf(k->ang)) * screen->w,
124  (k->p.y + k->r / 2 * SDL_sinf(k->ang)) * screen->h, k->r / 4 * screen->w, 0);
125 }
#define SDL_sinf
static void drawCircle(SDL_Surface *screen, float x, float y, float r, unsigned int c)
Definition: testgesture.c:103
float r
Definition: testgesture.c:51
float x
Definition: testgesture.c:46
Point p
Definition: testgesture.c:52
#define SDL_cosf
float y
Definition: testgesture.c:46
float ang
Definition: testgesture.c:51

◆ drawLine()

static void drawLine ( SDL_Surface screen,
float  x0,
float  y0,
float  x1,
float  y1,
unsigned int  col 
)
static

Definition at line 94 of file testgesture.c.

References SDL_fabs, SDL_max, and setpix().

95 {
96  float t;
97  for (t = 0; t < 1; t += (float) (1.0f / SDL_max(SDL_fabs(x0 - x1), SDL_fabs(y0 - y1)))) {
98  setpix(screen, x1 + t * (x0 - x1), y1 + t * (y0 - y1), col);
99  }
100 }
GLuint GLfloat GLfloat GLfloat x1
#define SDL_fabs
GLfloat f
#define SDL_max(x, y)
Definition: SDL_stdinc.h:407
GLfixed y1
GLuint GLfloat GLfloat y0
static void setpix(SDL_Surface *screen, float _x, float _y, unsigned int col)
Definition: testgesture.c:59
GLuint GLfloat x0
GLdouble GLdouble t
Definition: SDL_opengl.h:2071

◆ DrawScreen()

static void DrawScreen ( SDL_Window window)
static

Definition at line 128 of file testgesture.c.

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

Referenced by loop().

129 {
131  int i;
132 
133  if (!screen) {
134  return;
135  }
136 
137  SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 75, 75, 75));
138 
139  /* draw Touch History */
140  for (i = eventWrite; i < eventWrite + EVENT_BUF_SIZE; ++i) {
141  const SDL_Event *event = &events[i & (EVENT_BUF_SIZE - 1)];
142  const float age = (float)(i - eventWrite) / EVENT_BUF_SIZE;
143  float x, y;
144  unsigned int c, col;
145 
146  if ( (event->type == SDL_FINGERMOTION) ||
147  (event->type == SDL_FINGERDOWN) ||
148  (event->type == SDL_FINGERUP) ) {
149  x = event->tfinger.x;
150  y = event->tfinger.y;
151 
152  /* draw the touch: */
153  c = colors[event->tfinger.fingerId % 7];
154  col = ((unsigned int) (c * (0.1f + 0.85f))) | (unsigned int) (0xFF * age) << 24;
155 
156  if (event->type == SDL_FINGERMOTION) {
157  drawCircle(screen, x * screen->w, y * screen->h, 5, col);
158  } else if (event->type == SDL_FINGERDOWN) {
159  drawCircle(screen, x * screen->w, y * screen->h, -10, col);
160  }
161  }
162  }
163 
164  if (knob.p.x > 0) {
165  drawKnob(screen, &knob);
166  }
167 
168  SDL_UpdateWindowSurface(window);
169 }
static void drawKnob(SDL_Surface *screen, const Knob *k)
Definition: testgesture.c:120
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1574
static SDL_Event events[EVENT_BUF_SIZE]
Definition: testgesture.c:39
A collection of pixels used in software blitting.
Definition: SDL_surface.h:70
static Knob knob
Definition: testgesture.c:55
GLfloat f
static void drawCircle(SDL_Surface *screen, float x, float y, float r, unsigned int c)
Definition: testgesture.c:103
#define SDL_UpdateWindowSurface
static int eventWrite
Definition: testgesture.c:40
struct _cl_event * event
const GLubyte * c
#define SDL_GetWindowSurface
#define EVENT_BUF_SIZE
Definition: testgesture.c:34
float x
Definition: testgesture.c:46
GLint GLint GLint GLint GLint GLint y
Definition: SDL_opengl.h:1574
Point p
Definition: testgesture.c:52
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:167
SDL_PixelFormat * format
Definition: SDL_surface.h:73
#define SDL_FillRect
#define SDL_MapRGB
General event structure.
Definition: SDL_events.h:557
static int colors[7]
Definition: testgesture.c:41
SDL_Renderer * screen

◆ loop()

static void loop ( void  )
static

Definition at line 172 of file testgesture.c.

References Knob::ang, SDL_MultiGestureEvent::dDist, SDL_Event::dgesture, DrawScreen(), SDL_MultiGestureEvent::dTheta, SDL_DollarGestureEvent::error, EVENT_BUF_SIZE, eventWrite, SDL_TouchFingerEvent::fingerId, SDL_DollarGestureEvent::gestureId, i, SDL_Event::key, SDL_KeyboardEvent::keysym, SDL_Event::mgesture, SDLTest_CommonState::num_windows, 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_KEYDOWN, SDL_LoadDollarTemplates, SDL_Log, SDL_MULTIGESTURE, SDL_PollEvent, SDL_PRIs64, SDL_RecordGesture, SDL_RWclose, SDL_RWFromFile, SDL_SaveAllDollarTemplates, SDLK_i, SDLK_l, SDLK_s, SDLK_SPACE, SDLTest_CommonEvent(), SDL_Keysym::sym, SDL_Event::tfinger, SDL_Event::type, SDLTest_CommonState::windows, Point::x, SDL_TouchFingerEvent::x, SDL_MultiGestureEvent::x, Point::y, SDL_TouchFingerEvent::y, and SDL_MultiGestureEvent::y.

Referenced by main().

173 {
175  SDL_RWops *stream;
176  int i;
177 
178  while (SDL_PollEvent(&event)) {
180 
181  /* Record _all_ events */
182  events[eventWrite & (EVENT_BUF_SIZE-1)] = event;
183  eventWrite++;
184 
185  switch (event.type) {
186  case SDL_KEYDOWN:
187  switch (event.key.keysym.sym) {
188  case SDLK_i: {
189  for (i = 0; i < SDL_GetNumTouchDevices(); ++i) {
190  const SDL_TouchID id = SDL_GetTouchDevice(i);
191  SDL_Log("Fingers Down on device %"SDL_PRIs64": %d", id, SDL_GetNumTouchFingers(id));
192  }
193  break;
194  }
195 
196  case SDLK_SPACE:
197  SDL_RecordGesture(-1);
198  break;
199 
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 
206  case SDLK_l:
207  stream = SDL_RWFromFile("gestureSave", "r");
208  SDL_Log("Loaded: %i", SDL_LoadDollarTemplates(-1, stream));
209  SDL_RWclose(stream);
210  break;
211  }
212  break;
213 
214 #if VERBOSE
215  case SDL_FINGERMOTION:
216  SDL_Log("Finger: %"SDL_PRIs64",x: %f, y: %f",event.tfinger.fingerId,
217  event.tfinger.x,event.tfinger.y);
218  break;
219 
220  case SDL_FINGERDOWN:
221  SDL_Log("Finger: %"SDL_PRIs64" down - x: %f, y: %f",
222  event.tfinger.fingerId,event.tfinger.x,event.tfinger.y);
223  break;
224 
225  case SDL_FINGERUP:
226  SDL_Log("Finger: %"SDL_PRIs64" up - x: %f, y: %f",
227  event.tfinger.fingerId,event.tfinger.x,event.tfinger.y);
228  break;
229 #endif
230 
231  case SDL_MULTIGESTURE:
232 #if VERBOSE
233  SDL_Log("Multi Gesture: x = %f, y = %f, dAng = %f, dR = %f",
234  event.mgesture.x, event.mgesture.y,
235  event.mgesture.dTheta, event.mgesture.dDist);
236  SDL_Log("MG: numDownTouch = %i",event.mgesture.numFingers);
237 #endif
238 
239  knob.p.x = event.mgesture.x;
240  knob.p.y = event.mgesture.y;
241  knob.ang += event.mgesture.dTheta;
242  knob.r += event.mgesture.dDist;
243  break;
244 
245  case SDL_DOLLARGESTURE:
246  SDL_Log("Gesture %"SDL_PRIs64" performed, error: %f",
247  event.dgesture.gestureId, event.dgesture.error);
248  break;
249 
250  case SDL_DOLLARRECORD:
251  SDL_Log("Recorded gesture: %"SDL_PRIs64"",event.dgesture.gestureId);
252  break;
253  }
254  }
255 
256  for (i = 0; i < state->num_windows; ++i) {
257  if (state->windows[i]) {
258  DrawScreen(state->windows[i]);
259  }
260  }
261 
262 #ifdef __EMSCRIPTEN__
263  if (quitting) {
264  emscripten_cancel_main_loop();
265  }
266 #endif
267 }
#define SDL_PollEvent
SDL_DollarGestureEvent dgesture
Definition: SDL_events.h:584
#define SDL_RecordGesture
static SDL_Event events[EVENT_BUF_SIZE]
Definition: testgesture.c:39
static Knob knob
Definition: testgesture.c:55
static int quitting
Definition: testgesture.c:42
#define SDL_GetNumTouchDevices
SDL_GestureID gestureId
Definition: SDL_events.h:473
float r
Definition: testgesture.c:51
SDL_Window ** windows
static void DrawScreen(SDL_Window *window)
Definition: testgesture.c:128
#define SDL_GetTouchDevice
#define SDL_Log
#define SDL_RWFromFile
#define SDL_PRIs64
Definition: SDL_stdinc.h:227
static int eventWrite
Definition: testgesture.c:40
void SDLTest_CommonEvent(SDLTest_CommonState *state, SDL_Event *event, int *done)
Common event handler for test windows.
GLuint GLuint stream
SDL_MultiGestureEvent mgesture
Definition: SDL_events.h:583
struct _cl_event * event
#define SDL_SaveAllDollarTemplates
#define EVENT_BUF_SIZE
Definition: testgesture.c:34
Sint64 SDL_TouchID
Definition: SDL_touch.h:41
float x
Definition: testgesture.c:46
#define SDL_GetNumTouchFingers
Point p
Definition: testgesture.c:52
SDL_Keysym keysym
Definition: SDL_events.h:220
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_LoadDollarTemplates
SDL_KeyboardEvent key
Definition: SDL_events.h:563
float y
Definition: testgesture.c:46
SDL_FingerID fingerId
Definition: SDL_events.h:439
SDL_Keycode sym
Definition: SDL_keyboard.h:50
#define SDL_RWclose
General event structure.
Definition: SDL_events.h:557
float ang
Definition: testgesture.c:51
static SDLTest_CommonState * state
Definition: testgesture.c:38
Uint32 type
Definition: SDL_events.h:559
SDL_TouchFingerEvent tfinger
Definition: SDL_events.h:582

◆ main()

int main ( int  argc,
char *  argv[] 
)

Definition at line 269 of file testgesture.c.

References HEIGHT, loop(), quitting, SDL_INIT_VIDEO, SDL_TRUE, SDLTest_CommonCreateState(), SDLTest_CommonDefaultArgs(), SDLTest_CommonInit(), SDLTest_CommonQuit(), SDLTest_CommonState::skip_renderer, WIDTH, SDLTest_CommonState::window_h, SDLTest_CommonState::window_title, and SDLTest_CommonState::window_w.

270 {
272  if (!state) {
273  return 1;
274  }
275 
276  state->window_title = "Gesture Test";
277  state->window_w = WIDTH;
278  state->window_h = HEIGHT;
280 
281  if (!SDLTest_CommonDefaultArgs(state, argc, argv) || !SDLTest_CommonInit(state)) {
283  return 1;
284  }
285 
286 #ifdef __EMSCRIPTEN__
287  emscripten_set_main_loop(loop, 0, 1);
288 #else
289  while (!quitting) {
290  loop();
291  }
292 #endif
293 
295  return 0;
296 }
SDL_bool SDLTest_CommonDefaultArgs(SDLTest_CommonState *state, const int argc, char **argv)
Easy argument handling when test app doesn&#39;t need any custom args.
SDLTest_CommonState * SDLTest_CommonCreateState(char **argv, Uint32 flags)
Parse command line parameters and create common state.
static int quitting
Definition: testgesture.c:42
SDL_bool SDLTest_CommonInit(SDLTest_CommonState *state)
Open test window.
#define WIDTH
Definition: testgesture.c:29
static void loop(void)
Definition: testgesture.c:172
#define HEIGHT
Definition: testgesture.c:30
void SDLTest_CommonQuit(SDLTest_CommonState *state)
Close test window.
#define SDL_INIT_VIDEO
Definition: SDL.h:79
static SDLTest_CommonState * state
Definition: testgesture.c:38
const char * window_title

◆ setpix()

static void setpix ( SDL_Surface screen,
float  _x,
float  _y,
unsigned int  col 
)
static

Definition at line 59 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(), and drawLine().

60 {
61  Uint32 *pixmem32;
62  Uint32 colour;
63  Uint8 r, g, b;
64  const int x = (int)_x;
65  const int y = (int)_y;
66  float a;
67 
68  if ( (x < 0) || (x >= screen->w) || (y < 0) || (y >= screen->h) ) {
69  return;
70  }
71 
72  pixmem32 = (Uint32 *) screen->pixels + y * screen->pitch / BPP + x;
73 
74  SDL_memcpy(&colour, pixmem32, screen->format->BytesPerPixel);
75 
76  SDL_GetRGB(colour,screen->format,&r,&g,&b);
77 
78  /* r = 0;g = 0; b = 0; */
79  a = (float) ((col >> 24) & 0xFF);
80  if (a == 0) {
81  a = 0xFF; /* Hack, to make things easier. */
82  }
83 
84  a = (a == 0.0f) ? 1 : (a / 255.0f);
85  r = (Uint8) (r * (1 - a) + ((col >> 16) & 0xFF) * a);
86  g = (Uint8) (g * (1 - a) + ((col >> 8) & 0xFF) * a);
87  b = (Uint8) (b * (1 - a) + ((col >> 0) & 0xFF) * a);
88  colour = SDL_MapRGB(screen->format, r, g, b);
89 
90  *pixmem32 = colour;
91 }
#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
GLfloat f
#define BPP
Definition: testgesture.c:31
#define SDL_memcpy
void * pixels
Definition: SDL_surface.h:76
uint8_t Uint8
Definition: SDL_stdinc.h:179
GLint GLint GLint GLint GLint GLint y
Definition: SDL_opengl.h:1574
SDL_PixelFormat * format
Definition: SDL_surface.h:73
uint32_t Uint32
Definition: SDL_stdinc.h:203
#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 41 of file testgesture.c.

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

◆ events

◆ eventWrite

int eventWrite
static

Definition at line 40 of file testgesture.c.

Referenced by DrawScreen(), and loop().

◆ knob

Knob knob = { 0.0f, 0.1f, { 0.0f, 0.0f } }
static

Definition at line 55 of file testgesture.c.

◆ quitting

int quitting = 0
static

Definition at line 42 of file testgesture.c.

Referenced by loop(), and main().

◆ state

SDLTest_CommonState* state
static

Definition at line 38 of file testgesture.c.