Commit 8907a054 authored by Ryan C. Gordon's avatar Ryan C. Gordon

Some work on using accelerated alpha blits with hardware surfaces.

From Stephane Marchesin's fork, don't know who originally wrote it.

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%401053
parent ec77fa95
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment