X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=lib%2Fvideo%2Fsurface.cpp;h=bcb8dc8660e100bb9ec4cd04427076467646ed09;hb=5cbc442143d66a117c0a50e3bfb7969b622be2a8;hp=6b8b773c728bb8006f0d53bc7019f448da146d0a;hpb=d53e6f8d043be47409f892172514b059881858ef;p=supertux.git diff --git a/lib/video/surface.cpp b/lib/video/surface.cpp index 6b8b773c7..bcb8dc866 100644 --- a/lib/video/surface.cpp +++ b/lib/video/surface.cpp @@ -194,12 +194,21 @@ Surface::reload() { w = impl->w; h = impl->h; + for(std::vector::iterator i = + data.applied_filters.begin(); i != data.applied_filters.end(); + i++) + impl->apply_filter(i->type, i->color); } } -void Surface::apply_mask(Color color) +void Surface::apply_filter(int filter, Color color) { -impl->apply_mask(color); +impl->apply_filter(filter, color); + +SurfaceData::Filter apply_filter; +apply_filter.type = filter; +apply_filter.color = color; +data.applied_filters.push_back(apply_filter); } Surface::~Surface() @@ -255,7 +264,25 @@ Surface::resize(int w_, int h_) void apply_filter_to_surface(SDL_Surface* surface, int filter, Color color) { -if(filter == MASK_FILTER) +if(filter == HORIZONTAL_FLIP_FILTER) + { + SDL_Surface* sur_copy = sdl_surface_from_sdl_surface(surface, true); + SDL_BlitSurface(surface, NULL, sur_copy, NULL); + SDL_SetAlpha(sur_copy,0,0); + + SDL_Rect src, dst; + src.y = dst.y = 0; + src.w = dst.w = 1; + src.h = dst.h = sur_copy->h; + for(int x = 0; x < sur_copy->w; x++) + { + src.x = x; dst.x = sur_copy->w - x; + SDL_BlitSurface(sur_copy, &src, surface, &dst); + } + + SDL_FreeSurface(sur_copy); + } +else if(filter == MASK_FILTER) { SDL_Surface* sur_copy = sdl_surface_from_sdl_surface(surface, true); @@ -841,9 +868,9 @@ SurfaceOpenGL::draw_stretched(float x, float y, int sw, int sh, Uint8 alpha, Uin } void -SurfaceOpenGL::apply_mask(Color color) +SurfaceOpenGL::apply_filter(int filter, Color color) { - ::apply_filter_to_surface(sdl_surface, MASK_FILTER, color); + ::apply_filter_to_surface(sdl_surface, filter, color); create_gl(sdl_surface,&gl_texture); w = sdl_surface->w; @@ -995,10 +1022,10 @@ SurfaceSDL::draw_part(float sx, float sy, float x, float y, float w, float h, Ui /* Create a Surface, make it using colorkey, blit surface into temp, apply alpha to temp sur, blit the temp into the screen */ /* Note: this has to be done, since SDL doesn't allow to set alpha to surfaces that - already have an alpha mask yet... */ + already have an alpha mask, yet... */ SDL_Surface* sdl_surface_copy = SDL_CreateRGBSurface (sdl_surface->flags, - sdl_surface->w, sdl_surface->h, sdl_surface->format->BitsPerPixel, + (int)w, (int)h, sdl_surface->format->BitsPerPixel, sdl_surface->format->Rmask, sdl_surface->format->Gmask, sdl_surface->format->Bmask, 0); @@ -1007,7 +1034,7 @@ SurfaceSDL::draw_part(float sx, float sy, float x, float y, float w, float h, Ui SDL_SetColorKey(sdl_surface_copy, SDL_SRCCOLORKEY, colorkey); - SDL_BlitSurface(sdl_surface, NULL, sdl_surface_copy, NULL); + SDL_BlitSurface(sdl_surface, &src, sdl_surface_copy, NULL); SDL_SetAlpha(sdl_surface_copy ,SDL_SRCALPHA,alpha); int ret = SDL_BlitSurface(sdl_surface_copy, NULL, screen, &dest); @@ -1053,9 +1080,9 @@ SurfaceSDL::draw_stretched(float x, float y, int sw, int sh, Uint8 alpha, Uint32 } void -SurfaceSDL::apply_mask(Color color) +SurfaceSDL::apply_filter(int filter, Color color) { - ::apply_filter_to_surface(sdl_surface, MASK_FILTER, color); + ::apply_filter_to_surface(sdl_surface, filter, color); w = sdl_surface->w; h = sdl_surface->h;