From 4fb87d803a4c3d440fcd95256c51dd4cb4e44487 Mon Sep 17 00:00:00 2001 From: pelya Date: Mon, 7 Jun 2010 18:36:39 +0300 Subject: [PATCH] Some fies to resizing renderer, it still fails for horizontal screen --- .../jni/sdl/src/video/SDL_renderer_resize.c | 80 ++++++++++++++----- .../sdl/src/video/android/SDL_androidinput.c | 2 +- 2 files changed, 63 insertions(+), 19 deletions(-) diff --git a/alienblaster/project/jni/sdl/src/video/SDL_renderer_resize.c b/alienblaster/project/jni/sdl/src/video/SDL_renderer_resize.c index 95fac36db..6165e92b7 100644 --- a/alienblaster/project/jni/sdl/src/video/SDL_renderer_resize.c +++ b/alienblaster/project/jni/sdl/src/video/SDL_renderer_resize.c @@ -32,6 +32,10 @@ #include "SDL_renderer_gles.h" #include "SDL_renderer_sw.h" +#ifdef ANDROID +#include +#endif + static int RESIZE_RenderDrawPoints(SDL_Renderer * renderer, const SDL_Point * points, int count); static int RESIZE_RenderDrawLines(SDL_Renderer * renderer, @@ -88,11 +92,28 @@ RESIZE_CreateRenderer(SDL_Window * window) realH /= 2; fakeH /= 2; } + + while( (realW / 5) * 5 == realW && (fakeW / 5) * 5 == fakeW ) { + realW /= 5; + fakeW /= 5; + } + + while( (realH / 5) * 5 == realH && (fakeH / 5) * 5 == fakeH ) { + realH /= 5; + fakeH /= 5; + } if( realW > 255 || realH > 255 || fakeW > 255 || fakeH > 255 || realW == 0 || realH == 0 || fakeW == 0 || fakeH == 0 ) return -1; + #ifdef ANDROID + __android_log_print(ANDROID_LOG_INFO, "libSDL", "Using resize renderer: from %dx%d to %dx%d", + window->w, window->h, window->display->current_mode.w, window->display->current_mode.h); + __android_log_print(ANDROID_LOG_INFO, "libSDL", "Resize renderer ratio: from %dx%d to %dx%d", + fakeW, fakeH, realW, realH ); + #endif + #if SDL_VIDEO_RENDER_OGL_ES if( !strcmp(window->renderer->info.name, "opengl_es") ) driverDataSize = GLES_RenderDataSize; @@ -104,6 +125,8 @@ RESIZE_CreateRenderer(SDL_Window * window) if( !strcmp(window->renderer->info.name, "software") ) driverDataSize = SW_RenderDataSize; +/* TODO: add other renderers */ + if( !driverDataSize ) return -1; @@ -163,15 +186,18 @@ RESIZE_RenderDrawPoints(SDL_Renderer * renderer, const SDL_Point * points, RESIZE_RenderData *data = (RESIZE_RenderData *) (renderer->driverdata - sizeof(RESIZE_RenderData)); int ret; - if( !data->renderer.RenderDrawPoints ) - return -1; - SDL_Point * resized = SDL_stack_alloc( SDL_Point, count ); if( ! resized ) { SDL_OutOfMemory(); return -1; } + data->renderer.r = renderer->r; + data->renderer.g = renderer->g; + data->renderer.b = renderer->b; + data->renderer.a = renderer->a; + data->renderer.blendMode = renderer->blendMode; + RESIZE_resizePoints( data->realW, data->fakeW, data->realH, data->fakeH, points, resized, count ); ret = data->renderer.RenderDrawPoints(&data->renderer, resized, count); @@ -188,14 +214,17 @@ RESIZE_RenderDrawLines(SDL_Renderer * renderer, const SDL_Point * points, RESIZE_RenderData *data = (RESIZE_RenderData *) (renderer->driverdata - sizeof(RESIZE_RenderData)); int ret; - if( !data->renderer.RenderDrawLines ) - return -1; - SDL_Point * resized = SDL_stack_alloc( SDL_Point, count * 2 ); if( ! resized ) { SDL_OutOfMemory(); return -1; } + + data->renderer.r = renderer->r; + data->renderer.g = renderer->g; + data->renderer.b = renderer->b; + data->renderer.a = renderer->a; + data->renderer.blendMode = renderer->blendMode; RESIZE_resizePoints( data->realW, data->fakeW, data->realH, data->fakeH, points, resized, count * 2 ); @@ -226,9 +255,6 @@ RESIZE_RenderDrawRects(SDL_Renderer * renderer, const SDL_Rect ** rects, RESIZE_RenderData *data = (RESIZE_RenderData *) (renderer->driverdata - sizeof(RESIZE_RenderData)); int i, ret; - if( !data->renderer.RenderDrawRects ) - return -1; - SDL_Rect * resized = SDL_stack_alloc( SDL_Rect, count ); if( ! resized ) { SDL_OutOfMemory(); @@ -244,9 +270,15 @@ RESIZE_RenderDrawRects(SDL_Renderer * renderer, const SDL_Rect ** rects, for( i = 0; i < count; i++ ) { resizedPtrs[i] = &(resized[i]); } - + RESIZE_resizeRects( data->realW, data->fakeW, data->realH, data->fakeH, rects, resized, count ); + data->renderer.r = renderer->r; + data->renderer.g = renderer->g; + data->renderer.b = renderer->b; + data->renderer.a = renderer->a; + data->renderer.blendMode = renderer->blendMode; + ret = data->renderer.RenderDrawRects(&data->renderer, resizedPtrs, count); SDL_stack_free(resizedPtrs); @@ -262,9 +294,6 @@ RESIZE_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect ** rects, RESIZE_RenderData *data = (RESIZE_RenderData *) (renderer->driverdata - sizeof(RESIZE_RenderData)); int i, ret; - if( !data->renderer.RenderFillRects ) - return -1; - SDL_Rect * resized = SDL_stack_alloc( SDL_Rect, count ); if( ! resized ) { SDL_OutOfMemory(); @@ -283,6 +312,12 @@ RESIZE_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect ** rects, RESIZE_resizeRects( data->realW, data->fakeW, data->realH, data->fakeH, rects, resized, count * 4 ); + data->renderer.r = renderer->r; + data->renderer.g = renderer->g; + data->renderer.b = renderer->b; + data->renderer.a = renderer->a; + data->renderer.blendMode = renderer->blendMode; + ret = data->renderer.RenderFillRects(&data->renderer, resizedPtrs, count); SDL_stack_free(resizedPtrs); @@ -296,13 +331,22 @@ RESIZE_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * srcrect, const SDL_Rect * dstrect) { RESIZE_RenderData *data = (RESIZE_RenderData *) (renderer->driverdata - sizeof(RESIZE_RenderData)); - SDL_Rect dest; uint8_t realW = data->realW, fakeW = data->fakeW, realH = data->realH, fakeH = data->fakeH; + SDL_Rect dest; - dest.x = dstrect->x * realW / fakeW; - dest.w = dstrect->w * realW / fakeW; - dest.y = dstrect->y * realH / fakeH; - dest.h = dstrect->h * realH / fakeH; + dest.x = (dstrect->x * realW) / fakeW; + dest.w = (dstrect->w * realW) / fakeW; + dest.y = (dstrect->y * realH) / fakeH; + dest.h = (dstrect->h * realH) / fakeH; + + /* + __android_log_print(ANDROID_LOG_INFO, "libSDL", "RESIZE_RenderCopy: from x%dy%dw%dh%d to x%dy%dw%dh%d rW%d/fW%d rH%d/fH%d", + dstrect->x, dstrect->y, dstrect->w, dstrect->h, + dest.x, dest.y, dest.w, dest.h, + realW, fakeW, realH, fakeH); + */ + /* HACK */ + /* dest.y += 160; */ return data->renderer.RenderCopy(&data->renderer, texture, srcrect, &dest); } diff --git a/alienblaster/project/jni/sdl/src/video/android/SDL_androidinput.c b/alienblaster/project/jni/sdl/src/video/android/SDL_androidinput.c index 520cf6d72..b4c053e62 100644 --- a/alienblaster/project/jni/sdl/src/video/android/SDL_androidinput.c +++ b/alienblaster/project/jni/sdl/src/video/android/SDL_androidinput.c @@ -190,7 +190,7 @@ void ANDROID_InitOSKeymap() int i; SDLKey defaultKeymap[SDL_NUM_SCANCODES]; - SDL_GetDefaultKeymap(&defaultKeymap); + SDL_GetDefaultKeymap(defaultKeymap); SDL_SetKeymap(0, defaultKeymap, SDL_NUM_SCANCODES); // TODO: keys are mapped rather randomly