From: <mar...@us...> - 2009-08-25 20:40:46
|
Revision: 2526 http://navit.svn.sourceforge.net/navit/?rev=2526&view=rev Author: martin-s Date: 2009-08-25 20:40:35 +0000 (Tue, 25 Aug 2009) Log Message: ----------- Fix:graphics_sdl:Fixes from jehan Modified Paths: -------------- trunk/navit/navit/attr_def.h trunk/navit/navit/graphics/sdl/graphics_sdl.c Modified: trunk/navit/navit/attr_def.h =================================================================== --- trunk/navit/navit/attr_def.h 2009-08-25 20:36:47 UTC (rev 2525) +++ trunk/navit/navit/attr_def.h 2009-08-25 20:40:35 UTC (rev 2526) @@ -120,7 +120,7 @@ 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(night_mode) ATTR(autozoom_active) ATTR(position_valid) +ATTR(frame) ATTR2(0x0002ffff,type_int_end) ATTR2(0x00030000,type_string_begin) ATTR(type) Modified: trunk/navit/navit/graphics/sdl/graphics_sdl.c =================================================================== --- trunk/navit/navit/graphics/sdl/graphics_sdl.c 2009-08-25 20:36:47 UTC (rev 2525) +++ trunk/navit/navit/graphics/sdl/graphics_sdl.c 2009-08-25 20:40:35 UTC (rev 2526) @@ -99,6 +99,9 @@ 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 @@ 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 @@ 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 @@ #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 @@ 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 @@ 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 @@ 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 @@ } } - 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 @@ { 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 @@ 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 @@ 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 @@ 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_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; + struct graphics_priv *ov; + Uint32 rmask, gmask, bmask, amask; + int 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; - } - dbg(0, "x %d y %d\n", p->x, p->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; + } - 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 (%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 + ); - dbg(1, "overlay_new %d %d %d %u %u\n", i, - x, - y, - w, - h); + ov = g_new0(struct graphics_priv, 1); - 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, -#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); + 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 = x; - ov->overlay_y = y; - ov->overlay_parent = gr; - ov->overlay_idx = i; - - gr->overlay_array[i] = ov; - + 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 @@ 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 @@ 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, 16, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_RESIZABLE); + 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; + if(this->screen == NULL) { g_free(this); @@ -2126,7 +2176,7 @@ *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; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |