Skip to content
Permalink
Browse files
Some work on using accelerated alpha blits with hardware surfaces.
From Stephane Marchesin's fork, don't know who originally wrote it.
  • Loading branch information
icculus committed Apr 17, 2005
1 parent 2f5b5a7 commit 3ff6c7cc586d0c642c9df514c2ce79c750335899
Showing with 32 additions and 5 deletions.
  1. +11 −0 src/video/SDL_blit.c
  2. +16 −5 src/video/SDL_surface.c
  3. +3 −0 src/video/SDL_sysvideo.h
  4. +2 −0 src/video/SDL_video.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 } */
@@ -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 ) {
@@ -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);

@@ -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;

0 comments on commit 3ff6c7c

Please sign in to comment.