From 0b4b82b969f4483afe9dde65f747e6a65071ba04 Mon Sep 17 00:00:00 2001 From: pelya Date: Sun, 23 Feb 2014 14:47:55 +0200 Subject: [PATCH] Working hiver jitter filter --- project/java/Video.java | 14 +++++----- project/jni/application/xserver/gfx.c | 22 ++++++++-------- .../src/video/android/SDL_androidinput.c | 26 ++++++++++++++----- .../src/video/android/SDL_androidvideo-1.2.c | 26 +++++++++++++++++-- .../src/video/android/SDL_androidvideo.c | 2 ++ .../src/video/android/SDL_androidvideo.h | 6 ++++- 6 files changed, 70 insertions(+), 26 deletions(-) diff --git a/project/java/Video.java b/project/java/Video.java index 4d0857090..60dd47050 100644 --- a/project/java/Video.java +++ b/project/java/Video.java @@ -121,8 +121,6 @@ abstract class DifferentTouchInput Log.i("SDL", "Device board: " + android.os.Build.BOARD); if( android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH ) { - if ( Globals.GenerateSubframeTouchEvents ) - return IcsTouchInputWithHistory.Holder.sInstance; if( DetectCrappyDragonRiseDatexGamepad() ) return CrappyDragonRiseDatexGamepadInputWhichNeedsItsOwnHandlerBecauseImTooCheapAndStupidToBuyProperGamepad.Holder.sInstance; //return IcsTouchInput.Holder.sInstance; @@ -331,8 +329,9 @@ abstract class DifferentTouchInput } public void process(final MotionEvent event) { - int hwMouseEvent = (event.getSource() & InputDevice.SOURCE_MOUSE) == InputDevice.SOURCE_MOUSE ? Mouse.MOUSE_HW_INPUT_MOUSE : - (event.getSource() & InputDevice.SOURCE_STYLUS) == InputDevice.SOURCE_STYLUS ? Mouse.MOUSE_HW_INPUT_STYLUS : Mouse.MOUSE_HW_INPUT_FINGER; + int hwMouseEvent = ((event.getSource() & InputDevice.SOURCE_STYLUS) == InputDevice.SOURCE_STYLUS) ? Mouse.MOUSE_HW_INPUT_STYLUS : + ((event.getSource() & InputDevice.SOURCE_MOUSE) == InputDevice.SOURCE_MOUSE) ? Mouse.MOUSE_HW_INPUT_MOUSE : + Mouse.MOUSE_HW_INPUT_FINGER; if( ExternalMouseDetected != hwMouseEvent ) { ExternalMouseDetected = hwMouseEvent; @@ -561,7 +560,10 @@ abstract class DifferentTouchInput } Settings.applyMouseEmulationOptions(); } - touchInput = IcsTouchInput.Holder.sInstance; + if ( Globals.GenerateSubframeTouchEvents ) + touchInput = IcsTouchInputWithHistory.Holder.sInstance; + else + touchInput = IcsTouchInput.Holder.sInstance; } } super.process(event); @@ -577,7 +579,7 @@ abstract class DifferentTouchInput hoverX = event.getX(); hoverY = event.getY(); hoverTime = System.currentTimeMillis(); - if( ExternalMouseDetected != 0 && (event.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_HOVER_MOVE ) + if( ExternalMouseDetected == 0 && (event.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_HOVER_MOVE ) fingerHover = true; if( tap && System.currentTimeMillis() < tapTime + 1000 ) { diff --git a/project/jni/application/xserver/gfx.c b/project/jni/application/xserver/gfx.c index f188b5dc8..3cc65cf09 100644 --- a/project/jni/application/xserver/gfx.c +++ b/project/jni/application/xserver/gfx.c @@ -158,7 +158,7 @@ void XSDL_showConfigMenu(int * resolutionW, int * displayW, int * resolutionH, i int x, y, i, ii; SDL_Event event; int res = -1, dpi = -1; - char native[32] = "0x0", native78[32], native68[32], native58[32], native48[32]; + char native[32] = "0x0", native56[32], native46[32], native36[32], native26[32]; int vertical = SDL_ListModes(NULL, 0)[0]->w < SDL_ListModes(NULL, 0)[0]->h; char cfgpath[PATH_MAX]; FILE * cfgfile; @@ -174,16 +174,16 @@ void XSDL_showConfigMenu(int * resolutionW, int * displayW, int * resolutionH, i } const char * resStr[] = { - native, native78, native68, native58, - native48, "1280x1024", "1280x960", "1280x720", + native, native56, native46, native36, + native26, "1280x1024", "1280x960", "1280x720", "1024x768", "800x600", "800x480", "640x480" }; const int resVal[][2] = { {*resolutionW, *resolutionH}, - {*resolutionW * 7 / 8, *resolutionH * 7 / 8}, - {*resolutionW * 6 / 8, *resolutionH * 6 / 8}, - {*resolutionW * 5 / 8, *resolutionH * 5 / 8}, - {*resolutionW * 4 / 8, *resolutionH * 4 / 8}, + {*resolutionW * 5 / 6, *resolutionH * 5 / 6}, + {*resolutionW * 4 / 6, *resolutionH * 4 / 6}, + {*resolutionW * 3 / 6, *resolutionH * 3 / 6}, + {*resolutionW * 2 / 6, *resolutionH * 2 / 6}, {1280,1024}, {1280,960}, {1280,720}, {1024,768}, {800,600}, {800,480}, {640,480} }; @@ -202,10 +202,10 @@ void XSDL_showConfigMenu(int * resolutionW, int * displayW, int * resolutionH, i }; sprintf(native, "%dx%d", resVal[0][0], resVal[0][1]); - sprintf(native78, "%dx%d", resVal[1][0], resVal[1][1]); - sprintf(native68, "%dx%d", resVal[2][0], resVal[2][1]); - sprintf(native58, "%dx%d", resVal[3][0], resVal[3][1]); - sprintf(native48, "%dx%d", resVal[4][0], resVal[4][1]); + sprintf(native56, "%dx%d", resVal[1][0], resVal[1][1]); + sprintf(native46, "%dx%d", resVal[2][0], resVal[2][1]); + sprintf(native36, "%dx%d", resVal[3][0], resVal[3][1]); + sprintf(native26, "%dx%d", resVal[4][0], resVal[4][1]); int savedRes = 0; int savedDpi = 8; diff --git a/project/jni/sdl-1.2/src/video/android/SDL_androidinput.c b/project/jni/sdl-1.2/src/video/android/SDL_androidinput.c index 02f6622a7..8d740d73c 100644 --- a/project/jni/sdl-1.2/src/video/android/SDL_androidinput.c +++ b/project/jni/sdl-1.2/src/video/android/SDL_androidinput.c @@ -127,7 +127,7 @@ int SDL_ANDROID_currentMouseButtons = 0; static int hardwareMouseDetected = 0; enum { MOUSE_HW_BUTTON_LEFT = 1, MOUSE_HW_BUTTON_RIGHT = 2, MOUSE_HW_BUTTON_MIDDLE = 4, MOUSE_HW_BUTTON_BACK = 8, MOUSE_HW_BUTTON_FORWARD = 16, MOUSE_HW_BUTTON_MAX = MOUSE_HW_BUTTON_FORWARD }; enum { MOUSE_HW_INPUT_FINGER = 0, MOUSE_HW_INPUT_STYLUS = 1, MOUSE_HW_INPUT_MOUSE = 2 }; -enum { DEADZONE_HOVER_FINGER = 16, DEADZONE_HOVER_STYLUS = 32, HOVER_FREEZE_TIME = 300 }; +enum { DEADZONE_HOVER_FINGER = 32, DEADZONE_HOVER_STYLUS = 64, HOVER_FREEZE_TIME = 300 }; static int hoverJitterFilter = 1; static int hoverX, hoverY, hoverTime = 0, hoverMouseFreeze = 0, hoverDeadzone = 0; @@ -676,6 +676,16 @@ static void ProcessMouseHover( jint *xx, jint *yy, int action ) *xx = hoverX; *yy = hoverY; } + +#ifdef VIDEO_DEBUG + SDL_ANDROID_VideoDebugRect.x = hoverX - hoverDeadzone; + SDL_ANDROID_VideoDebugRect.y = hoverY - hoverDeadzone; + SDL_ANDROID_VideoDebugRect.w = hoverDeadzone * 2; + SDL_ANDROID_VideoDebugRect.h = hoverDeadzone * 2; + memset(&SDL_ANDROID_VideoDebugRectColor, 0, sizeof(SDL_ANDROID_VideoDebugRectColor)); + SDL_ANDROID_VideoDebugRectColor.g = hoverMouseFreeze * 255; + SDL_ANDROID_VideoDebugRectColor.r = SDL_ANDROID_VideoDebugRectColor.b = (SDL_GetTicks() - hoverTime) * 255 / HOVER_FREEZE_TIME; +#endif } JNIEXPORT void JNICALL @@ -971,12 +981,16 @@ JAVA_EXPORT_NAME(DemoGLSurfaceView_nativeHardwareMouseDetected) (JNIEnv* env, jo relativeMovement = cfg.relativeMovement; SDL_ANDROID_ShowMouseCursor = cfg.ShowMouseCursor; } - - int hoverDeadzone = (hardwareMouseDetected == MOUSE_HW_INPUT_STYLUS) ? - SDL_ANDROID_sFakeWindowHeight / DEADZONE_HOVER_STYLUS : - (hardwareMouseDetected == MOUSE_HW_INPUT_FINGER) ? - SDL_ANDROID_sFakeWindowHeight / DEADZONE_HOVER_FINGER : 0; } + SDL_ANDROID_SetHoverDeadzone(); +} + +void SDL_ANDROID_SetHoverDeadzone() +{ + hoverDeadzone = (hardwareMouseDetected == MOUSE_HW_INPUT_STYLUS) ? + SDL_ANDROID_sFakeWindowHeight / DEADZONE_HOVER_STYLUS : + (hardwareMouseDetected == MOUSE_HW_INPUT_FINGER) ? + SDL_ANDROID_sFakeWindowHeight / DEADZONE_HOVER_FINGER : 0; } JNIEXPORT void JNICALL diff --git a/project/jni/sdl-1.2/src/video/android/SDL_androidvideo-1.2.c b/project/jni/sdl-1.2/src/video/android/SDL_androidvideo-1.2.c index 93ea52349..f5c76b914 100644 --- a/project/jni/sdl-1.2/src/video/android/SDL_androidvideo-1.2.c +++ b/project/jni/sdl-1.2/src/video/android/SDL_androidvideo-1.2.c @@ -48,8 +48,11 @@ #define _THIS SDL_VideoDevice *this +#ifdef VIDEO_DEBUG +#define DEBUGOUT(...) __android_log_print(ANDROID_LOG_INFO, "libSDL", __VA_ARGS__) +#else #define DEBUGOUT(...) -//#define DEBUGOUT(...) __android_log_print(ANDROID_LOG_INFO, "libSDL", __VA_ARGS__) +#endif static int ANDROID_VideoInit(_THIS, SDL_PixelFormat *vformat); static SDL_Rect **ANDROID_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags); @@ -501,6 +504,7 @@ SDL_Surface *ANDROID_SetVideoMode(_THIS, SDL_Surface *current, UpdateScreenUnderFingerRect(0,0); SDL_ANDROID_ShowScreenUnderFingerRect.w = SDL_ANDROID_ShowScreenUnderFingerRect.h = 0; + SDL_ANDROID_SetHoverDeadzone(); /* We're done */ return(current); @@ -1018,7 +1022,25 @@ static void ANDROID_FlipHWSurfaceInternal(int numrects, SDL_Rect *rects) glPopMatrix(); //glFlush(); } - +#ifdef VIDEO_DEBUG + if( SDL_ANDROID_VideoDebugRect.w > 0 ) + { + SDL_Rect frame = SDL_ANDROID_VideoDebugRect; + glPushMatrix(); + glLoadIdentity(); + glOrthof( 0.0f, SDL_ANDROID_sFakeWindowWidth, SDL_ANDROID_sFakeWindowHeight, 0.0f, 0.0f, 1.0f ); + glEnableClientState(GL_VERTEX_ARRAY); + glColor4f(SDL_ANDROID_VideoDebugRectColor.r / 255.0f, SDL_ANDROID_VideoDebugRectColor.g / 255.0f, SDL_ANDROID_VideoDebugRectColor.b / 255.0f, 1.0f); + GLshort vertices[] = { frame.x, frame.y, + frame.x + frame.w, frame.y, + frame.x + frame.w, frame.y + frame.h, + frame.x, frame.y + frame.h }; + glVertexPointer(2, GL_SHORT, 0, vertices); + glDrawArrays(GL_LINE_LOOP, 0, 4); + glDisableClientState(GL_VERTEX_ARRAY); + glPopMatrix(); + } +#endif if(SDL_ANDROID_ShowMouseCursor) { if( SDL_ANDROID_ShowScreenUnderFinger == ZOOM_NONE || SDL_ANDROID_ShowScreenUnderFinger == ZOOM_MAGNIFIER ) diff --git a/project/jni/sdl-1.2/src/video/android/SDL_androidvideo.c b/project/jni/sdl-1.2/src/video/android/SDL_androidvideo.c index 3c4726e0b..4f79c3310 100644 --- a/project/jni/sdl-1.2/src/video/android/SDL_androidvideo.c +++ b/project/jni/sdl-1.2/src/video/android/SDL_androidvideo.c @@ -88,6 +88,8 @@ int SDL_ANDROID_BYTESPERPIXEL = 2; int SDL_ANDROID_BITSPERPIXEL = 16; int SDL_ANDROID_UseGles2 = 0; int SDL_ANDROID_ShowMouseCursor = 0; +SDL_Rect SDL_ANDROID_VideoDebugRect; +SDL_Color SDL_ANDROID_VideoDebugRectColor; static void appPutToBackgroundCallbackDefault(void) { diff --git a/project/jni/sdl-1.2/src/video/android/SDL_androidvideo.h b/project/jni/sdl-1.2/src/video/android/SDL_androidvideo.h index 3aaafaaa5..e5092c0a2 100644 --- a/project/jni/sdl-1.2/src/video/android/SDL_androidvideo.h +++ b/project/jni/sdl-1.2/src/video/android/SDL_androidvideo.h @@ -28,6 +28,8 @@ #include "SDL_joystick.h" #include "SDL_events.h" +//#define VIDEO_DEBUG 1 + enum ScreenZoom { ZOOM_NONE = 0, ZOOM_MAGNIFIER = 1 }; extern int SDL_ANDROID_sWindowWidth; @@ -76,6 +78,8 @@ extern void SDL_ANDROID_DrawMouseCursor(int x, int y, int size, float alpha); extern void SDL_ANDROID_DrawMouseCursorIfNeeded(); extern void SDL_ANDROID_CallJavaTogglePlainAndroidSoftKeyboardInput(); extern void SDL_ANDROID_CallJavaStartAccelerometerGyroscope(int start); +extern SDL_Rect SDL_ANDROID_VideoDebugRect; +extern SDL_Color SDL_ANDROID_VideoDebugRectColor; #if SDL_VERSION_ATLEAST(1,3,0) extern SDL_Window * ANDROID_CurrentWindow; @@ -88,6 +92,6 @@ extern int SDL_ANDROID_isJoystickUsed; extern int SDL_ANDROID_isSecondJoystickUsed; // Events have to be sent only from main thread from PumpEvents(), so we'll buffer them here extern void SDL_ANDROID_PumpEvents(); - +extern void SDL_ANDROID_SetHoverDeadzone(); #endif /* _SDL_androidvideo_h */