From 3ff6c7cc586d0c642c9df514c2ce79c750335899 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sun, 17 Apr 2005 10:40:41 +0000 Subject: [PATCH] Some work on using accelerated alpha blits with hardware surfaces. From Stephane Marchesin's fork, don't know who originally wrote it. --- src/video/SDL_blit.c | 11 +++++++++++ src/video/SDL_surface.c | 21 ++++++++++++++++----- src/video/SDL_sysvideo.h | 3 +++ src/video/SDL_video.c | 2 ++ 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/video/SDL_blit.c b/src/video/SDL_blit.c index 192633413..9d7b11b68 100644 --- a/src/video/SDL_blit.c +++ b/src/video/SDL_blit.c @@ -280,6 +280,17 @@ int SDL_CalculateBlit(SDL_Surface *surface) video->CheckHWBlit(this, surface, surface->map->dst); } } + + /* if an alpha pixel format is specified, we can accelerate alpha blits */ + if (((surface->flags & SDL_HWSURFACE) == SDL_HWSURFACE )&&(current_video->displayformatalphapixel)) + { + if ( (surface->flags & SDL_SRCALPHA) ) + if ( current_video->info.blit_hw_A ) { + SDL_VideoDevice *video = current_video; + SDL_VideoDevice *this = current_video; + video->CheckHWBlit(this, surface, surface->map->dst); + } + } /* Get the blit function index, based on surface mode */ /* { 0 = nothing, 1 = colorkey, 2 = alpha, 3 = colorkey+alpha } */ diff --git a/src/video/SDL_surface.c b/src/video/SDL_surface.c index bb431daae..cd818637f 100644 --- a/src/video/SDL_surface.c +++ b/src/video/SDL_surface.c @@ -91,11 +91,22 @@ SDL_Surface * SDL_CreateRGBSurface (Uint32 flags, } surface->flags = SDL_SWSURFACE; if ( (flags & SDL_HWSURFACE) == SDL_HWSURFACE ) { - depth = screen->format->BitsPerPixel; - Rmask = screen->format->Rmask; - Gmask = screen->format->Gmask; - Bmask = screen->format->Bmask; - Amask = screen->format->Amask; + if ((Amask) && (video->displayformatalphapixel)) + { + depth = video->displayformatalphapixel->BitsPerPixel; + Rmask = video->displayformatalphapixel->Rmask; + Gmask = video->displayformatalphapixel->Gmask; + Bmask = video->displayformatalphapixel->Bmask; + Amask = video->displayformatalphapixel->Amask; + } + else + { + depth = screen->format->BitsPerPixel; + Rmask = screen->format->Rmask; + Gmask = screen->format->Gmask; + Bmask = screen->format->Bmask; + Amask = screen->format->Amask; + } } surface->format = SDL_AllocFormat(depth, Rmask, Gmask, Bmask, Amask); if ( surface->format == NULL ) { diff --git a/src/video/SDL_sysvideo.h b/src/video/SDL_sysvideo.h index 9582ce226..8f5d545c9 100644 --- a/src/video/SDL_sysvideo.h +++ b/src/video/SDL_sysvideo.h @@ -134,6 +134,9 @@ struct SDL_VideoDevice { /* Information about the video hardware */ SDL_VideoInfo info; + /* The pixel format used when SDL_CreateRGBSurface creates SDL_HWSURFACEs with alpha */ + SDL_PixelFormat* displayformatalphapixel; + /* Allocates a surface in video memory */ int (*AllocHWSurface)(_THIS, SDL_Surface *surface); diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index fd8d56231..3cd9c9436 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -212,6 +212,8 @@ int SDL_VideoInit (const char *driver_name, Uint32 flags) video->offset_x = 0; video->offset_y = 0; memset(&video->info, 0, (sizeof video->info)); + + video->displayformatalphapixel = NULL; /* Set some very sane GL defaults */ video->gl_config.driver_loaded = 0;