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
This commit is contained in:
Doug Zongker
2012-12-18 16:31:27 -08:00
parent bb01d0c12b
commit c560a67b12
3 changed files with 32 additions and 5 deletions

View File

@@ -20,4 +20,10 @@ ifeq ($(subst ",,$(TARGET_RECOVERY_PIXEL_FORMAT)),BGRA_8888)
LOCAL_CFLAGS += -DRECOVERY_BGRA LOCAL_CFLAGS += -DRECOVERY_BGRA
endif 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) include $(BUILD_STATIC_LIBRARY)

View File

@@ -60,6 +60,9 @@ static GGLSurface gr_framebuffer[NUM_BUFFERS];
static GGLSurface gr_mem_surface; static GGLSurface gr_mem_surface;
static unsigned gr_active_fb = 0; static unsigned gr_active_fb = 0;
static unsigned double_buffering = 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_fb_fd = -1;
static int gr_vt_fd = -1; static int gr_vt_fd = -1;
@@ -132,6 +135,9 @@ static int get_framebuffer(GGLSurface *fb)
return -1; return -1;
} }
overscan_offset_x = vi.xres * overscan_percent / 100;
overscan_offset_y = vi.yres * overscan_percent / 100;
fb->version = sizeof(*fb); fb->version = sizeof(*fb);
fb->width = vi.xres; fb->width = vi.xres;
fb->height = vi.yres; fb->height = vi.yres;
@@ -224,6 +230,9 @@ int gr_text(int x, int y, const char *s)
GRFont *font = gr_font; GRFont *font = gr_font;
unsigned off; unsigned off;
x += overscan_offset_x;
y += overscan_offset_y;
y -= font->ascent; y -= font->ascent;
gl->bindTexture(gl, &font->texture); gl->bindTexture(gl, &font->texture);
@@ -250,6 +259,9 @@ void gr_texticon(int x, int y, gr_surface icon) {
} }
GGLContext* gl = gr_context; GGLContext* gl = gr_context;
x += overscan_offset_x;
y += overscan_offset_y;
gl->bindTexture(gl, (GGLSurface*) icon); gl->bindTexture(gl, (GGLSurface*) icon);
gl->texEnvi(gl, GGL_TEXTURE_ENV, GGL_TEXTURE_ENV_MODE, GGL_REPLACE); 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); 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)); 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; GGLContext *gl = gr_context;
gl->disable(gl, GGL_TEXTURE_2D); 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) { 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; GGLContext *gl = gr_context;
dx += overscan_offset_x;
dy += overscan_offset_y;
gl->bindTexture(gl, (GGLSurface*) source); gl->bindTexture(gl, (GGLSurface*) source);
gl->texEnvi(gl, GGL_TEXTURE_ENV, GGL_TEXTURE_ENV_MODE, GGL_REPLACE); 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); 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) int gr_fb_width(void)
{ {
return gr_framebuffer[0].width; return gr_framebuffer[0].width - 2*overscan_offset_x;
} }
int gr_fb_height(void) 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) gr_pixel *gr_fb_data(void)

View File

@@ -36,7 +36,7 @@ void gr_flip(void);
void gr_fb_blank(bool blank); void gr_fb_blank(bool blank);
void gr_color(unsigned char r, unsigned char g, unsigned char b, unsigned char a); 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); int gr_text(int x, int y, const char *s);
void gr_texticon(int x, int y, gr_surface icon); void gr_texticon(int x, int y, gr_surface icon);
int gr_measure(const char *s); int gr_measure(const char *s);