Skip to content

Commit

Permalink
Some work on using accelerated alpha blits with hardware surfaces.
Browse files Browse the repository at this point in the history
From Stephane Marchesin's fork, don't know who originally wrote it.
  • Loading branch information
icculus committed Apr 17, 2005
1 parent 2f5b5a7 commit 3ff6c7c
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 5 deletions.
11 changes: 11 additions & 0 deletions src/video/SDL_blit.c
Expand Up @@ -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 } */
Expand Down
21 changes: 16 additions & 5 deletions src/video/SDL_surface.c
Expand Up @@ -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 ) {
Expand Down
3 changes: 3 additions & 0 deletions src/video/SDL_sysvideo.h
Expand Up @@ -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);

Expand Down
2 changes: 2 additions & 0 deletions src/video/SDL_video.c
Expand Up @@ -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;
Expand Down

0 comments on commit 3ff6c7c

Please sign in to comment.