summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>2009-08-25 20:40:35 +0000
committermartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>2009-08-25 20:40:35 +0000
commitf03c5d08d7715ef043ce8ba1b83a70951db2c7af (patch)
tree9e8ef4deb188b2439bdef3c52a14ac06c48aa0da
parent81d046f777c21be68b119f3525701c2ce4ef540b (diff)
downloadnavit-svn-f03c5d08d7715ef043ce8ba1b83a70951db2c7af.tar.gz
Fix:graphics_sdl:Fixes from jehan
git-svn-id: http://svn.code.sf.net/p/navit/code/trunk/navit@2526 ffa7fe5e-494d-0410-b361-a75ebd5db220
-rw-r--r--navit/attr_def.h3
-rw-r--r--navit/graphics/sdl/graphics_sdl.c270
2 files changed, 162 insertions, 111 deletions
diff --git a/navit/attr_def.h b/navit/attr_def.h
index 3074c31c..1bf34aca 100644
--- a/navit/attr_def.h
+++ b/navit/attr_def.h
@@ -120,7 +120,7 @@ ATTR(house_number_left_interpolation)
ATTR(house_number_right_interpolation)
ATTR(delay)
ATTR(lag)
-
+ATTR(bpp)
ATTR2(0x00027500,type_rel_abs_begin)
/* These attributes are int that can either hold relative *
* or absolute values. A relative value is indicated by *
@@ -167,6 +167,7 @@ ATTR(use_overlay)
ATTR(night_mode)
ATTR(autozoom_active)
ATTR(position_valid)
+ATTR(frame)
ATTR2(0x0002ffff,type_int_end)
ATTR2(0x00030000,type_string_begin)
ATTR(type)
diff --git a/navit/graphics/sdl/graphics_sdl.c b/navit/graphics/sdl/graphics_sdl.c
index c30bc121..4b8e83d6 100644
--- a/navit/graphics/sdl/graphics_sdl.c
+++ b/navit/graphics/sdl/graphics_sdl.c
@@ -99,6 +99,9 @@ struct graphics_priv;
struct graphics_priv {
SDL_Surface *screen;
int aa;
+ /* video modes */
+ uint32_t video_flags;
+ int video_bpp;
/* <overlay> */
int overlay_mode;
@@ -408,7 +411,9 @@ image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, char *n
if(gi->img)
{
/* TBD: improves blit performance? */
+#if !SDL_VERSION_ATLEAST(1,3,0)
SDL_SetColorKey(gi->img, SDL_RLEACCEL, gi->img->format->colorkey);
+#endif
*w=gi->img->w;
*h=gi->img->h;
hot->x=*w/2;
@@ -536,18 +541,20 @@ draw_polygon(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point
if(gr->aa)
{
raster_aapolygon(gr->screen, count, vx, vy,
- SDL_MapRGB(gr->screen->format,
+ SDL_MapRGBA(gr->screen->format,
gc->fore_r,
gc->fore_g,
- gc->fore_b));
+ gc->fore_b,
+ gc->fore_a));
}
else
{
raster_polygon(gr->screen, count, vx, vy,
- SDL_MapRGB(gr->screen->format,
+ SDL_MapRGBA(gr->screen->format,
gc->fore_r,
gc->fore_g,
- gc->fore_b));
+ gc->fore_b,
+ gc->fore_a));
}
#else
#ifdef SDL_SGE
@@ -600,10 +607,11 @@ draw_rectangle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct poi
#ifdef RASTER
raster_rect(gr->screen, p->x, p->y, w, h,
- SDL_MapRGB(gr->screen->format,
+ SDL_MapRGBA(gr->screen->format,
gc->fore_r,
gc->fore_g,
- gc->fore_b));
+ gc->fore_b,
+ gc->fore_a));
#else
#ifdef SDL_SGE
#ifdef ALPHA
@@ -652,14 +660,20 @@ draw_circle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point
if(gr->aa)
{
raster_aacircle(gr->screen, p->x, p->y, r,
- SDL_MapRGB(gr->screen->format,
- gc->fore_r, gc->fore_g, gc->fore_b));
+ SDL_MapRGBA(gr->screen->format,
+ gc->fore_r,
+ gc->fore_g,
+ gc->fore_b,
+ gc->fore_a));
}
else
{
raster_circle(gr->screen, p->x, p->y, r,
- SDL_MapRGB(gr->screen->format,
- gc->fore_r, gc->fore_g, gc->fore_b));
+ SDL_MapRGBA(gr->screen->format,
+ gc->fore_r,
+ gc->fore_g,
+ gc->fore_b,
+ gc->fore_a));
}
#else
#ifdef SDL_SGE
@@ -776,14 +790,20 @@ draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *
if(gr->aa)
{
raster_aaline(gr->screen, p[i].x, p[i].y, p[i+1].x, p[i+1].y,
- SDL_MapRGB(gr->screen->format,
- gc->fore_r, gc->fore_g, gc->fore_b));
+ SDL_MapRGBA(gr->screen->format,
+ gc->fore_r,
+ gc->fore_g,
+ gc->fore_b,
+ gc->fore_a));
}
else
{
raster_line(gr->screen, p[i].x, p[i].y, p[i+1].x, p[i+1].y,
- SDL_MapRGB(gr->screen->format,
- gc->fore_r, gc->fore_g, gc->fore_b));
+ SDL_MapRGBA(gr->screen->format,
+ gc->fore_r,
+ gc->fore_g,
+ gc->fore_b,
+ gc->fore_a));
}
#else
#ifdef SDL_SGE
@@ -1161,7 +1181,7 @@ display_text_draw(struct text_render *text, struct graphics_priv *gr, struct gra
int i, x, y, poff, soff, col_lev;
struct text_glyph *gly, **gp;
Uint32 pix;
- Uint8 r, g, b;
+ Uint8 r, g, b, a;
#if 0
dbg(0,"%u %u %u %u, %u %u %u %u\n",
@@ -1245,11 +1265,12 @@ display_text_draw(struct text_render *text, struct graphics_priv *gr, struct gra
}
}
- SDL_GetRGB(pix,
+ SDL_GetRGBA(pix,
gr->screen->format,
&r,
&g,
- &b);
+ &b,
+ &a);
#ifdef DEBUG
printf("%u %u -> %u off\n",
@@ -1273,15 +1294,17 @@ display_text_draw(struct text_render *text, struct graphics_priv *gr, struct gra
{
if(col_lev >= 3*0x80)
{
- r |= bg->fore_r;
- g |= bg->fore_g;
- b |= bg->fore_b;
+ r = bg->fore_r;
+ g = bg->fore_g;
+ b = bg->fore_b;
+ a = bg->fore_a;
}
else
{
r &= ~bg->fore_r;
g &= ~bg->fore_g;
b &= ~bg->fore_b;
+ a &= ~bg->fore_a;
}
}
}
@@ -1310,10 +1333,11 @@ display_text_draw(struct text_render *text, struct graphics_priv *gr, struct gra
r, g, b);
#endif
- pix = SDL_MapRGB(gr->screen->format,
+ pix = SDL_MapRGBA(gr->screen->format,
r,
g,
- b);
+ b,
+ a);
switch(gr->screen->format->BytesPerPixel)
{
@@ -1463,7 +1487,9 @@ draw_mode(struct graphics_priv *gr, enum draw_mode_num mode)
if(ov)
{
rect.x = ov->overlay_x;
+ if(rect.x<0) rect.x += gr->screen->w;
rect.y = ov->overlay_y;
+ if(rect.y<0) rect.y += gr->screen->h;
rect.w = ov->screen->w;
rect.h = ov->screen->h;
SDL_BlitSurface(ov->screen, NULL,
@@ -1500,35 +1526,47 @@ overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct poin
static int window_fullscreen(struct window *win, int on)
{
- /* TODO */
- return 0;
-}
+ struct graphics_priv *gr=(struct graphics_priv *)win->priv;
-static struct window sdl_win =
-{
- NULL,
- window_fullscreen
+ /* Update video flags */
+ if(on) {
+ gr->video_flags |= SDL_FULLSCREEN;
+ } else {
+ gr->video_flags &= ~SDL_FULLSCREEN;
+ }
-};
+ /* Update video mode */
+ gr->screen = SDL_SetVideoMode(gr->screen->w, gr->screen->h, gr->video_bpp, gr->video_flags);
+ if(gr->screen == NULL) {
+ navit_destroy(gr->nav);
+ }
+ else {
+ callback_list_call_attr_2(gr->cbl, attr_resize, (void *)gr->screen->w, (void *)gr->screen->h);
+ }
+ return 1;
+}
static void *
get_data(struct graphics_priv *this, char *type)
{
- printf("get_data: %s\n", type);
-
- if(strcmp(type, "window") == 0)
- {
- return &sdl_win;
- }
- else
- {
- return &dummy;
- }
+ if(strcmp(type, "window") == 0) {
+ struct window *win;
+ win=g_new(struct window, 1);
+ win->priv=this;
+ win->fullscreen=window_fullscreen;
+ win->disable_suspend=NULL;
+ return win;
+ } else {
+ return &dummy;
+ }
}
static void draw_drag(struct graphics_priv *gr, struct point *p)
{
- // FIXME
+ if(p) {
+ gr->overlay_x = p->x;
+ gr->overlay_y = p->y;
+ }
}
static struct graphics_methods graphics_methods = {
@@ -1561,75 +1599,77 @@ static struct graphics_methods graphics_methods = {
static struct graphics_priv *
overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h,int alpha, int wraparound)
{
- struct graphics_priv *ov;
- int i, x, y;
-
- for(i = 0; i < OVERLAY_MAX; i++)
- {
- if(gr->overlay_array[i] == NULL)
- {
- break;
- }
- }
- if(i == OVERLAY_MAX)
- {
- dbg(0, "too many overlays! increase OVERLAY_MAX\n");
- return NULL;
- }
- dbg(0, "x %d y %d\n", p->x, p->y);
-
- if(p->x < 0)
- {
- x = gr->screen->w + p->x;
- }
- else
- {
- x = p->x;
- }
- if(p->y < 0)
- {
- y = gr->screen->h + p->y;
- }
- else
- {
- y = p->y;
- }
-
- dbg(1, "overlay_new %d %d %d %u %u\n", i,
- x,
- y,
- w,
- h);
-
- ov = g_new0(struct graphics_priv, 1);
-
- ov->screen = SDL_CreateRGBSurface(SDL_SWSURFACE | SDL_SRCALPHA,
- w, h,
-#if 1
- gr->screen->format->BitsPerPixel,
- gr->screen->format->Rmask,
- gr->screen->format->Gmask,
- gr->screen->format->Bmask,
- 0x00000000);
-#else
- 0x00ff0000,
- 0x0000ff00,
- 0x000000ff,
- 0xff000000);
-#endif
- SDL_SetAlpha(ov->screen, SDL_SRCALPHA, 128);
+ struct graphics_priv *ov;
+ Uint32 rmask, gmask, bmask, amask;
+ int i;
- ov->overlay_mode = 1;
- ov->overlay_x = x;
- ov->overlay_y = y;
- ov->overlay_parent = gr;
- ov->overlay_idx = i;
+ for(i = 0; i < OVERLAY_MAX; i++)
+ {
+ if(gr->overlay_array[i] == NULL)
+ {
+ break;
+ }
+ }
+ if(i == OVERLAY_MAX)
+ {
+ dbg(0, "too many overlays! increase OVERLAY_MAX\n");
+ return NULL;
+ }
- gr->overlay_array[i] = ov;
+ dbg(1, "overlay_new %d %d %d %u %u (%x, %x, %x ,%x, %d)\n", i,
+ p->x,
+ p->y,
+ w,
+ h,
+ gr->screen->format->Rmask,
+ gr->screen->format->Gmask,
+ gr->screen->format->Bmask,
+ gr->screen->format->Amask,
+ gr->screen->format->BitsPerPixel
+ );
+
+ ov = g_new0(struct graphics_priv, 1);
+
+ switch(gr->screen->format->BitsPerPixel) {
+ case 8:
+ rmask = 0xc0;
+ gmask = 0x30;
+ bmask = 0x0c;
+ amask = 0x03;
+ break;
+ case 16:
+ rmask = 0xf000;
+ gmask = 0x0f00;
+ bmask = 0x00f0;
+ amask = 0x000f;
+ break;
+ case 32:
+ rmask = 0xff000000;
+ gmask = 0x00ff0000;
+ bmask = 0x0000ff00;
+ amask = 0x000000ff;
+ break;
+ default:
+ rmask = gr->screen->format->Rmask;
+ gmask = gr->screen->format->Gmask;
+ bmask = gr->screen->format->Bmask;
+ amask = gr->screen->format->Amask;
+ }
+ ov->screen = SDL_CreateRGBSurface(SDL_SWSURFACE | SDL_SRCALPHA,
+ w, h,
+ gr->screen->format->BitsPerPixel,
+ rmask, gmask, bmask, amask);
+
+ ov->overlay_mode = 1;
+ ov->overlay_x = p->x;
+ ov->overlay_y = p->y;
+ ov->overlay_parent = gr;
+ ov->overlay_idx = i;
+ gr->overlay_array[i] = ov;
*meth=graphics_methods;
- return ov;
+ return ov;
}
@@ -2028,7 +2068,7 @@ static gboolean graphics_sdl_idle(void *data)
case SDL_VIDEORESIZE:
{
- gr->screen = SDL_SetVideoMode(ev.resize.w, ev.resize.h, 16, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_RESIZABLE);
+ gr->screen = SDL_SetVideoMode(ev.resize.w, ev.resize.h, gr->video_bpp, gr->video_flags);
if(gr->screen == NULL)
{
navit_destroy(gr->nav);
@@ -2088,15 +2128,25 @@ graphics_sdl_new(struct navit *nav, struct graphics_methods *meth, struct attr *
if (! event_request_system("glib","graphics_sdl_new"))
return NULL;
+ this->video_bpp = 16;
+ this->video_flags = SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_RESIZABLE;
- /* TODO: xml params for BPP */
if ((attr=attr_search(attrs, NULL, attr_w)))
w=attr->u.num;
if ((attr=attr_search(attrs, NULL, attr_h)))
h=attr->u.num;
+ if (attr=attr_search(attrs, NULL, attr_bpp))
+ this->video_bpp=attr->u.num;
+ if (attr=attr_search(attrs, NULL, attr_frame))
+ if(!attr->u.num)
+ this->video_flags |= SDL_NOFRAME;
+
+ this->screen = SDL_SetVideoMode(w, h, this->video_bpp, this->video_flags);
+
+ /* Use screen size instead of requested */
+ w = this->screen->w;
+ h = this->screen->h;
-
- this->screen = SDL_SetVideoMode(w, h, 16, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_RESIZABLE);
if(this->screen == NULL)
{
g_free(this);
@@ -2126,7 +2176,7 @@ graphics_sdl_new(struct navit *nav, struct graphics_methods *meth, struct attr *
*meth=graphics_methods;
- g_timeout_add(10, graphics_sdl_idle, this);
+ g_timeout_add(G_PRIORITY_DEFAULT+10, graphics_sdl_idle, this);
this->overlay_enable = 1;