Mercurial > sdl-ios-xcode
changeset 4770:cf7976fd3258
Moved the SDL_Eyes test program for shaped windows into the Hg repository and got it building and linking as a test.
author | Eli Gottlieb <eligottlieb@gmail.com> |
---|---|
date | Mon, 31 May 2010 21:23:06 -0400 |
parents | 83f9b95da263 |
children | c500594c4246 |
files | Makefile.in test/Makefile.in test/README test/testeyes test/testeyes.c test/testeyes_bitmap.h test/testeyes_mask_bitmap.h |
diffstat | 7 files changed, 256 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/Makefile.in Thu May 27 16:44:35 2010 -0400 +++ b/Makefile.in Mon May 31 21:23:06 2010 -0400 @@ -44,7 +44,7 @@ DIST = acinclude autogen.sh Borland.html Borland.zip BUGS build-scripts configure configure.in COPYING CREDITS include INSTALL Makefile.minimal Makefile.in README* sdl-config.in sdl.m4 sdl.pc.in SDL.spec SDL.spec.in src test TODO VisualC.html VisualC VisualCE Watcom-Win32.zip WhatsNew Xcode Xcode-iPhoneOS -HDRS = SDL.h SDL_assert.h SDL_atomic.h SDL_audio.h SDL_compat.h SDL_cpuinfo.h SDL_endian.h SDL_error.h SDL_events.h SDL_haptic.h SDL_joystick.h SDL_keyboard.h SDL_keysym.h SDL_loadso.h SDL_main.h SDL_mouse.h SDL_mutex.h SDL_name.h SDL_opengl.h SDL_opengles.h SDL_pixels.h SDL_platform.h SDL_power.h SDL_quit.h SDL_rect.h SDL_revision.h SDL_rwops.h SDL_scancode.h SDL_stdinc.h SDL_surface.h SDL_syswm.h SDL_thread.h SDL_timer.h SDL_types.h SDL_version.h SDL_video.h begin_code.h close_code.h +HDRS = SDL.h SDL_assert.h SDL_atomic.h SDL_audio.h SDL_compat.h SDL_cpuinfo.h SDL_endian.h SDL_error.h SDL_events.h SDL_haptic.h SDL_joystick.h SDL_keyboard.h SDL_keysym.h SDL_loadso.h SDL_main.h SDL_mouse.h SDL_mutex.h SDL_name.h SDL_opengl.h SDL_opengles.h SDL_pixels.h SDL_platform.h SDL_power.h SDL_quit.h SDL_rect.h SDL_revision.h SDL_rwops.h SDL_scancode.h SDL_shape.h SDL_stdinc.h SDL_surface.h SDL_syswm.h SDL_thread.h SDL_timer.h SDL_types.h SDL_version.h SDL_video.h begin_code.h close_code.h LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@
--- a/test/Makefile.in Thu May 27 16:44:35 2010 -0400 +++ b/test/Makefile.in Mon May 31 21:23:06 2010 -0400 @@ -7,7 +7,7 @@ CFLAGS = @CFLAGS@ LIBS = @LIBS@ -TARGETS = checkkeys$(EXE) graywin$(EXE) loopwave$(EXE) testalpha$(EXE) testatomic$(EXE) testaudioinfo$(EXE) testbitmap$(EXE) testblitspeed$(EXE) testcursor$(EXE) testdraw2$(EXE) testdyngles$(EXE) testdyngl$(EXE) testerror$(EXE) testfile$(EXE) testfill$(EXE) testgamma$(EXE) testgl2$(EXE) testgles$(EXE) testgl$(EXE) testhaptic$(EXE) testhread$(EXE) testiconv$(EXE) testime$(EXE) testintersections$(EXE) testjoystick$(EXE) testkeys$(EXE) testloadso$(EXE) testlock$(EXE) testmmousetablet$(EXE) testmultiaudio$(EXE) testoverlay2$(EXE) testoverlay$(EXE) testpalette$(EXE) testplatform$(EXE) testpower$(EXE) testresample$(EXE) testsem$(EXE) testsprite2$(EXE) testsprite$(EXE) testspriteminimal$(EXE) testtimer$(EXE) testver$(EXE) testvidinfo$(EXE) testwin$(EXE) testwm2$(EXE) testwm$(EXE) threadwin$(EXE) torturethread$(EXE) +TARGETS = checkkeys$(EXE) graywin$(EXE) loopwave$(EXE) testalpha$(EXE) testatomic$(EXE) testaudioinfo$(EXE) testbitmap$(EXE) testblitspeed$(EXE) testcursor$(EXE) testdraw2$(EXE) testdyngles$(EXE) testdyngl$(EXE) testerror$(EXE) testeyes$(EXE) testfile$(EXE) testfill$(EXE) testgamma$(EXE) testgl2$(EXE) testgles$(EXE) testgl$(EXE) testhaptic$(EXE) testhread$(EXE) testiconv$(EXE) testime$(EXE) testintersections$(EXE) testjoystick$(EXE) testkeys$(EXE) testloadso$(EXE) testlock$(EXE) testmmousetablet$(EXE) testmultiaudio$(EXE) testoverlay2$(EXE) testoverlay$(EXE) testpalette$(EXE) testplatform$(EXE) testpower$(EXE) testresample$(EXE) testsem$(EXE) testsprite2$(EXE) testsprite$(EXE) testspriteminimal$(EXE) testtimer$(EXE) testver$(EXE) testvidinfo$(EXE) testwin$(EXE) testwm2$(EXE) testwm$(EXE) threadwin$(EXE) torturethread$(EXE) all: Makefile $(TARGETS) @@ -62,6 +62,9 @@ testerror$(EXE): $(srcdir)/testerror.c $(CC) -o $@ $? $(CFLAGS) $(LIBS) +testeyes$(EXE): $(srcdir)/testeyes.c + $(CC) -o $@ $? -std=c99 $(CFLAGS) $(LIBS) + testfile$(EXE): $(srcdir)/testfile.c $(CC) -o $@ $? $(CFLAGS) $(LIBS)
--- a/test/README Thu May 27 16:44:35 2010 -0400 +++ b/test/README Mon May 31 21:23:06 2010 -0400 @@ -12,6 +12,7 @@ testcursor Tests custom mouse cursor testdyngl Tests dynamically loading OpenGL library testerror Tests multi-threaded error handling + testeyes Tests shaped windows testfile Tests RWops layer testgamma Tests video device gamma ramp testgl A very simple example of using OpenGL with SDL
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/testeyes.c Mon May 31 21:23:06 2010 -0400 @@ -0,0 +1,208 @@ +#include <stdlib.h> +#include <math.h> +#include <SDL_events.h> +#include <SDL_rect.h> +#include <SDL_pixels.h> +#include <SDL_video.h> +#include <SDL_shape.h> +#include "testeyes_bitmap.h" +#include "testeyes_mask_bitmap.h" + +/* The following code for the calculation of pupil positions has been taken and rewritten from the original xeyes. The + copyright notice is included as follows, and the code is now under the same license as the rest of this file. */ +/* + +Copyright (c) 1991 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from the X Consortium. + +*/ +# define NUM_EYES 2 +# define EYE_X(n) ((n) * 2.0) +# define EYE_Y(n) (0.0) +# define EYE_THICK (0.175) /* thickness of eye rim */ +# define EYE_OFFSET (0.1) /* padding between eyes */ +# define EYE_WIDTH (2.0 - (EYE_THICK + EYE_OFFSET) * 2) +# define EYE_HEIGHT EYE_WIDTH +# define EYE_HWIDTH (EYE_WIDTH / 2.0) +# define EYE_HHEIGHT (EYE_HEIGHT / 2.0) +# define BALL_WIDTH (0.3) +# define BALL_HEIGHT BALL_WIDTH +# define BALL_PAD (0.05) +# define BALL_DIST ((EYE_WIDTH - BALL_WIDTH) / 2.0 - BALL_PAD) + +SDL_Point computePupil (int num,SDL_Point mouse) { + double dx = mouse.x - EYE_X(num); + double dy = mouse.y - EYE_Y(num); + double cx = 0.0,cy = 0.0; + if(dx == 0 && dy == 0) { + cx = EYE_X(num); + cy = EYE_Y(num); + } + else { + double angle = atan2((double)dy,(double)dx); + double cosa = cos(angle); + double sina = sin(angle); + double hypotenuse = hypot(EYE_HHEIGHT * cosa, EYE_HWIDTH * sina); + double dist = BALL_DIST * hypot((EYE_HWIDTH * EYE_HHEIGHT) * cosa / hypotenuse, + (EYE_HWIDTH * EYE_HHEIGHT) * sina / hypotenuse); + if(dist > hypot((double)dx,(double)dy)) { + cx = dx + EYE_X(num); + cy = dy + EYE_Y(num); + } + else { + cx = dist * cosa + EYE_X(num); + cy = dist * sina + EYE_Y(num); + } + } + SDL_Point ret = {cx,cy}; + return ret; +} + +/* Here begins the code exclusively and entirely written by Eli Gottlieb in May 2010. */ +typedef struct { + SDL_Rect left; + SDL_Rect right; +} Pupil_Pair; +typedef struct { + SDL_Point left; + SDL_Point right; +} Pupil_Points; + +Pupil_Pair compute_pupil_positions(SDL_Point target) { + Pupil_Pair result; + Pupil_Points points; + points.left = computePupil(0,target); + points.right = computePupil(1,target); + result.left.x = points.left.x - BALL_WIDTH / 2.0; + result.left.y = points.left.y - BALL_HEIGHT / 2.0; + result.right.x = points.right.x - BALL_WIDTH / 2.0; + result.right.y = points.right.y - BALL_HEIGHT / 2.0; + result.left.w = result.right.w = BALL_WIDTH; + result.left.h = result.left.w = BALL_HEIGHT; + return result; +} + +void render_eyes(SDL_Window *window,SDL_Texture *eyes_texture,Pupil_Pair pupils) { + SDL_SelectRenderer(window); + + //Clear render-target to blue. + SDL_SetRenderDrawColor(0x00,0x00,0xff,0xff); + SDL_RenderClear(); + + //Render the whites of the eyes. + SDL_Rect srcdestrect = {0,0,eyes_width,eyes_height}; + SDL_RenderCopy(eyes_texture,&srcdestrect,&srcdestrect); + + //Render the pupils. + SDL_SetRenderDrawColor(0x00,0x00,0x00,0xff); + const SDL_Rect eyes[2] = {pupils.left,pupils.right}; + SDL_RenderFillRects((const SDL_Rect**)&eyes,2); + + SDL_RenderPresent(); +} + +int main(int argc,char** argv) { + if(SDL_VideoInit(NULL,0) == -1) { + printf("Could not initialize SDL video.\n"); + exit(-1); + } + + SDL_Window *window = SDL_CreateShapedWindow("Big Brother is watching you.",eyes_x_hot,eyes_y_hot,eyes_width,eyes_height,SDL_WINDOW_RESIZABLE); + if(window == NULL) { + SDL_VideoQuit(); + printf("Could not create shaped window for eyes.\n"); + exit(-2); + } + if(SDL_CreateRenderer(window,-1,SDL_RENDERER_PRESENTFLIP2) == -1) { + SDL_DestroyWindow(window); + SDL_VideoQuit(); + printf("Could not create rendering context for SDL_Eyes window.\n"); + exit(-3); + } + + SDL_Color bnw_palette[2] = {{0,0,0,0},{255,255,255,255}}; + SDL_Texture *eyes_texture = SDL_CreateTexture(SDL_PIXELFORMAT_INDEX1LSB,SDL_TEXTUREACCESS_STREAMING,eyes_width,eyes_height); + if(eyes_texture == NULL) { + SDL_DestroyRenderer(window); + SDL_DestroyWindow(window); + SDL_VideoQuit(); + printf("Could not create eyes texture.\n"); + exit(-4); + } + SDL_SetTexturePalette(eyes_texture,bnw_palette,0,2); + + void *pixels = NULL; + int pitch = 0; + SDL_Rect rect = {0,0,eyes_width,eyes_height}; + SDL_LockTexture(eyes_texture,&rect,1,&pixels,&pitch); + for(int row = 0;row<eyes_height;row++) + memcpy(pixels+pitch*row,eyes_bits+(eyes_width/8)*row,eyes_width/8); + SDL_UnlockTexture(eyes_texture); + + SDL_Texture *mask_texture = SDL_CreateTexture(SDL_PIXELFORMAT_INDEX1LSB,SDL_TEXTUREACCESS_STREAMING,eyesmask_width,eyesmask_height); + if(mask_texture == NULL) { + SDL_DestroyTexture(eyes_texture); + SDL_DestroyRenderer(window); + SDL_DestroyWindow(window); + SDL_VideoQuit(); + printf("Could not create shape mask texture.\n"); + exit(-5); + } + SDL_SetTexturePalette(mask_texture,bnw_palette,0,2); + + rect.x = rect.y = 0; + rect.w = eyesmask_width; + rect.h = eyesmask_height; + SDL_LockTexture(mask_texture,&rect,1,&pixels,&pitch); + for(int row = 0;row<eyesmask_height;row++) + memcpy(pixels+pitch*row,eyesmask_bits+(eyesmask_width/8)*row,eyesmask_width/8); + SDL_UnlockTexture(mask_texture); + + SDL_SelectShapeRenderer(window); + SDL_RenderCopy(mask_texture,&rect,&rect); + SDL_RenderPresent(); + + SDL_Event event; + int event_pending = 0; + event_pending = SDL_PollEvent(&event); + SDL_Point mouse_position; + Pupil_Pair pupil_positions; + SDL_SelectMouse(0); + SDL_GetMouseState(&mouse_position.x,&mouse_position.y); + pupil_positions = compute_pupil_positions(mouse_position); + while(event.type != SDL_QUIT) { + if(event.type == SDL_MOUSEMOTION) { + mouse_position.x = event.motion.x; + mouse_position.y = event.motion.y; + pupil_positions = compute_pupil_positions(mouse_position); + } + render_eyes(window,eyes_texture,pupil_positions); + event_pending = SDL_PollEvent(&event); + } + + //Call SDL_VideoQuit() before quitting. + SDL_VideoQuit(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/testeyes_bitmap.h Mon May 31 21:23:06 2010 -0400 @@ -0,0 +1,21 @@ +#define eyes_width 48 +#define eyes_height 32 +#define eyes_x_hot 0 +#define eyes_y_hot 0 +static unsigned char eyes_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x1e, 0x00, 0x00, 0xfe, 0x01, 0x80, 0x7f, 0x00, + 0x00, 0x87, 0x03, 0xc0, 0xe1, 0x00, 0x80, 0x01, 0x06, 0x60, 0x80, 0x01, + 0xc0, 0x00, 0x0c, 0x30, 0x00, 0x03, 0x60, 0x00, 0x18, 0x18, 0x00, 0x06, + 0x30, 0x00, 0x30, 0x0c, 0x00, 0x0c, 0x30, 0x00, 0x30, 0x0c, 0x00, 0x0c, + 0x10, 0x00, 0x20, 0x04, 0x00, 0x08, 0x18, 0x00, 0x60, 0x06, 0x00, 0x18, + 0x18, 0x00, 0x60, 0x06, 0x00, 0x18, 0x18, 0x00, 0x60, 0x06, 0x00, 0x18, + 0x18, 0x00, 0x60, 0x06, 0x00, 0x18, 0x18, 0x00, 0x60, 0x06, 0x00, 0x18, + 0x18, 0x00, 0x60, 0x06, 0x00, 0x18, 0x18, 0x80, 0x63, 0x06, 0x00, 0x18, + 0x18, 0x80, 0x63, 0x06, 0xe0, 0x18, 0x18, 0x80, 0x63, 0x06, 0xe0, 0x18, + 0x18, 0x00, 0x60, 0x06, 0xe0, 0x18, 0x18, 0x00, 0x20, 0x06, 0x00, 0x08, + 0x10, 0x00, 0x30, 0x04, 0x00, 0x0c, 0x10, 0x00, 0x10, 0x04, 0x00, 0x04, + 0x30, 0x00, 0x18, 0x0c, 0x00, 0x06, 0x60, 0x00, 0x08, 0x18, 0x00, 0x02, + 0x40, 0x00, 0x0c, 0x10, 0x00, 0x03, 0xc0, 0x00, 0x06, 0x30, 0x80, 0x01, + 0x80, 0x83, 0x03, 0xe0, 0xe0, 0x00, 0x00, 0xff, 0x01, 0xc0, 0x7f, 0x00, + 0x00, 0xfe, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/testeyes_mask_bitmap.h Mon May 31 21:23:06 2010 -0400 @@ -0,0 +1,21 @@ +#define eyesmask_width 48 +#define eyesmask_height 32 +#define eyesmask_x_hot 0 +#define eyesmask_y_hot 0 +static unsigned char eyesmask_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x1e, 0x00, 0x00, 0xfe, 0x01, 0x80, 0x7f, 0x00, + 0x00, 0xff, 0x03, 0xc0, 0xff, 0x00, 0x80, 0xff, 0x07, 0xe0, 0xff, 0x01, + 0xc0, 0xff, 0x0f, 0xf0, 0xff, 0x03, 0xe0, 0xff, 0x1f, 0xf8, 0xff, 0x07, + 0xf0, 0xff, 0x3f, 0xfc, 0xff, 0x0f, 0xf0, 0xff, 0x3f, 0xfc, 0xff, 0x0f, + 0xf0, 0xff, 0x3f, 0xfc, 0xff, 0x0f, 0xf8, 0xff, 0x7f, 0xfe, 0xff, 0x1f, + 0xf8, 0xff, 0x7f, 0xfe, 0xff, 0x1f, 0xf8, 0xff, 0x7f, 0xfe, 0xff, 0x1f, + 0xf8, 0xff, 0x7f, 0xfe, 0xff, 0x1f, 0xf8, 0xff, 0x7f, 0xfe, 0xff, 0x1f, + 0xf8, 0xff, 0x7f, 0xfe, 0xff, 0x1f, 0xf8, 0xff, 0x7f, 0xfe, 0xff, 0x1f, + 0xf8, 0xff, 0x7f, 0xfe, 0xff, 0x1f, 0xf8, 0xff, 0x7f, 0xfe, 0xff, 0x1f, + 0xf8, 0xff, 0x7f, 0xfe, 0xff, 0x1f, 0xf8, 0xff, 0x3f, 0xfe, 0xff, 0x0f, + 0xf0, 0xff, 0x3f, 0xfc, 0xff, 0x0f, 0xf0, 0xff, 0x1f, 0xfc, 0xff, 0x07, + 0xf0, 0xff, 0x1f, 0xfc, 0xff, 0x07, 0xe0, 0xff, 0x0f, 0xf8, 0xff, 0x03, + 0xc0, 0xff, 0x0f, 0xf0, 0xff, 0x03, 0xc0, 0xff, 0x07, 0xf0, 0xff, 0x01, + 0x80, 0xff, 0x03, 0xe0, 0xff, 0x00, 0x00, 0xff, 0x01, 0xc0, 0x7f, 0x00, + 0x00, 0xfe, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};