changeset 1052:68f607298ca9

Some work on using accelerated alpha blits with hardware surfaces. From Stephane Marchesin's fork, don't know who originally wrote it.
author Ryan C. Gordon <icculus@icculus.org>
date Sun, 17 Apr 2005 10:40:41 +0000
parents 091350827e08
children f596fa4f17a6
files src/video/SDL_blit.c src/video/SDL_surface.c src/video/SDL_sysvideo.h src/video/SDL_video.c
diffstat 4 files changed, 32 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/video/SDL_blit.c	Sun Apr 17 10:36:03 2005 +0000
+++ b/src/video/SDL_blit.c	Sun Apr 17 10:40:41 2005 +0000
@@ -280,6 +280,17 @@
 			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 } */
--- a/src/video/SDL_surface.c	Sun Apr 17 10:36:03 2005 +0000
+++ b/src/video/SDL_surface.c	Sun Apr 17 10:40:41 2005 +0000
@@ -91,11 +91,22 @@
 	}
 	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 ) {
--- a/src/video/SDL_sysvideo.h	Sun Apr 17 10:36:03 2005 +0000
+++ b/src/video/SDL_sysvideo.h	Sun Apr 17 10:40:41 2005 +0000
@@ -134,6 +134,9 @@
 	/* 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);
 
--- a/src/video/SDL_video.c	Sun Apr 17 10:36:03 2005 +0000
+++ b/src/video/SDL_video.c	Sun Apr 17 10:40:41 2005 +0000
@@ -212,6 +212,8 @@
 	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;