From c560a67b12350102ba237fa70cedc7c972ad4e4b Mon Sep 17 00:00:00 2001 From: Doug Zongker Date: Tue, 18 Dec 2012 16:31:27 -0800 Subject: add optional overscan compensation to recovery graphics If your screen is a TV, it may not actually be displaying the edges of the framebuffer. Allow specifying an overscan percentage, and move each edge of the framebuffer in by that percent of the width/height. (The gr_* layer just lies to the caller about the size of the framebuffer, telling the caller it's smaller than it really is, and offsets all drawing commands to match.) Change-Id: I11bb2feb39ae522bd3e957a14ebdecf3609e0fdc --- minui/Android.mk | 6 ++++++ minui/graphics.c | 29 +++++++++++++++++++++++++---- minui/minui.h | 2 +- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/minui/Android.mk b/minui/Android.mk index 285ac62bf..43e0ad33b 100644 --- a/minui/Android.mk +++ b/minui/Android.mk @@ -20,4 +20,10 @@ ifeq ($(subst ",,$(TARGET_RECOVERY_PIXEL_FORMAT)),BGRA_8888) LOCAL_CFLAGS += -DRECOVERY_BGRA endif +ifneq ($(TARGET_RECOVERY_OVERSCAN_PERCENT),) + LOCAL_CFLAGS += -DOVERSCAN_PERCENT=$(TARGET_RECOVERY_OVERSCAN_PERCENT) +else + LOCAL_CFLAGS += -DOVERSCAN_PERCENT=0 +endif + include $(BUILD_STATIC_LIBRARY) diff --git a/minui/graphics.c b/minui/graphics.c index 287878e92..747b2dbc6 100644 --- a/minui/graphics.c +++ b/minui/graphics.c @@ -60,6 +60,9 @@ static GGLSurface gr_framebuffer[NUM_BUFFERS]; static GGLSurface gr_mem_surface; static unsigned gr_active_fb = 0; static unsigned double_buffering = 0; +static int overscan_percent = OVERSCAN_PERCENT; +static int overscan_offset_x = 0; +static int overscan_offset_y = 0; static int gr_fb_fd = -1; static int gr_vt_fd = -1; @@ -132,6 +135,9 @@ static int get_framebuffer(GGLSurface *fb) return -1; } + overscan_offset_x = vi.xres * overscan_percent / 100; + overscan_offset_y = vi.yres * overscan_percent / 100; + fb->version = sizeof(*fb); fb->width = vi.xres; fb->height = vi.yres; @@ -224,6 +230,9 @@ int gr_text(int x, int y, const char *s) GRFont *font = gr_font; unsigned off; + x += overscan_offset_x; + y += overscan_offset_y; + y -= font->ascent; gl->bindTexture(gl, &font->texture); @@ -250,6 +259,9 @@ void gr_texticon(int x, int y, gr_surface icon) { } GGLContext* gl = gr_context; + x += overscan_offset_x; + y += overscan_offset_y; + gl->bindTexture(gl, (GGLSurface*) icon); gl->texEnvi(gl, GGL_TEXTURE_ENV, GGL_TEXTURE_ENV_MODE, GGL_REPLACE); gl->texGeni(gl, GGL_S, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE); @@ -263,11 +275,17 @@ void gr_texticon(int x, int y, gr_surface icon) { gl->recti(gl, x, y, x+gr_get_width(icon), y+gr_get_height(icon)); } -void gr_fill(int x, int y, int w, int h) +void gr_fill(int x1, int y1, int x2, int y2) { + x1 += overscan_offset_x; + y1 += overscan_offset_y; + + x2 += overscan_offset_x; + y2 += overscan_offset_y; + GGLContext *gl = gr_context; gl->disable(gl, GGL_TEXTURE_2D); - gl->recti(gl, x, y, w, h); + gl->recti(gl, x1, y1, x2, y2); } void gr_blit(gr_surface source, int sx, int sy, int w, int h, int dx, int dy) { @@ -276,6 +294,9 @@ void gr_blit(gr_surface source, int sx, int sy, int w, int h, int dx, int dy) { } GGLContext *gl = gr_context; + dx += overscan_offset_x; + dy += overscan_offset_y; + gl->bindTexture(gl, (GGLSurface*) source); gl->texEnvi(gl, GGL_TEXTURE_ENV, GGL_TEXTURE_ENV_MODE, GGL_REPLACE); gl->texGeni(gl, GGL_S, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE); @@ -385,12 +406,12 @@ void gr_exit(void) int gr_fb_width(void) { - return gr_framebuffer[0].width; + return gr_framebuffer[0].width - 2*overscan_offset_x; } int gr_fb_height(void) { - return gr_framebuffer[0].height; + return gr_framebuffer[0].height - 2*overscan_offset_y; } gr_pixel *gr_fb_data(void) diff --git a/minui/minui.h b/minui/minui.h index 767ffcb50..bc43bb596 100644 --- a/minui/minui.h +++ b/minui/minui.h @@ -36,7 +36,7 @@ void gr_flip(void); void gr_fb_blank(bool blank); void gr_color(unsigned char r, unsigned char g, unsigned char b, unsigned char a); -void gr_fill(int x, int y, int w, int h); +void gr_fill(int x1, int y1, int x2, int y2); int gr_text(int x, int y, const char *s); void gr_texticon(int x, int y, gr_surface icon); int gr_measure(const char *s); -- cgit v1.2.3