src/video/SDL_blit_N.c
changeset 1232 0aa0000081d5
parent 1224 f033d9589ca1
child 1312 c9b51268668f
equal deleted inserted replaced
1231:cf59e7b91ed4 1232:0aa0000081d5
  1989 			src += srcskip;
  1989 			src += srcskip;
  1990 			dst += dstskip;
  1990 			dst += dstskip;
  1991 		}
  1991 		}
  1992 	}
  1992 	}
  1993 }
  1993 }
       
  1994 
       
  1995 /* blits 32 bit RGB<->RGBA with both surfaces having the same R,G,B fields */
       
  1996 static void Blit4to4MaskAlpha(SDL_BlitInfo *info)
       
  1997 {
       
  1998 	int width = info->d_width;
       
  1999 	int height = info->d_height;
       
  2000 	Uint32 *src = (Uint32 *)info->s_pixels;
       
  2001 	int srcskip = info->s_skip;
       
  2002 	Uint32 *dst = (Uint32 *)info->d_pixels;
       
  2003 	int dstskip = info->d_skip;
       
  2004 	SDL_PixelFormat *srcfmt = info->src;
       
  2005 	SDL_PixelFormat *dstfmt = info->dst;
       
  2006 
       
  2007 	if (dstfmt->Amask) {
       
  2008 		/* RGB->RGBA, SET_ALPHA */
       
  2009 		Uint32 mask = (srcfmt->alpha >> dstfmt->Aloss) << dstfmt->Ashift;
       
  2010 
       
  2011 		while ( height-- ) {
       
  2012 			DUFFS_LOOP(
       
  2013 			{
       
  2014 				*dst = *src | mask;
       
  2015 				++dst;
       
  2016 				++src;
       
  2017 			},
       
  2018 			width);
       
  2019 			src = (Uint32*)((Uint8*)src + srcskip);
       
  2020 			dst = (Uint32*)((Uint8*)dst + dstskip);
       
  2021 		}
       
  2022 	} else {
       
  2023 		/* RGBA->RGB, NO_ALPHA */
       
  2024 		Uint32 mask = srcfmt->Rmask | srcfmt->Gmask | srcfmt->Bmask;
       
  2025 
       
  2026 		while ( height-- ) {
       
  2027 			DUFFS_LOOP(
       
  2028 			{
       
  2029 				*dst = *src & mask;
       
  2030 				++dst;
       
  2031 				++src;
       
  2032 			},
       
  2033 			width);
       
  2034 			src = (Uint32*)((Uint8*)src + srcskip);
       
  2035 			dst = (Uint32*)((Uint8*)dst + dstskip);
       
  2036 		}
       
  2037 	}
       
  2038 }
       
  2039 
  1994 static void BlitNtoN(SDL_BlitInfo *info)
  2040 static void BlitNtoN(SDL_BlitInfo *info)
  1995 {
  2041 {
  1996 	int width = info->d_width;
  2042 	int width = info->d_width;
  1997 	int height = info->d_height;
  2043 	int height = info->d_height;
  1998 	Uint8 *src = info->s_pixels;
  2044 	Uint8 *src = info->s_pixels;
  2412 			    ((table[which].blit_features & GetBlitFeatures()) == table[which].blit_features) )
  2458 			    ((table[which].blit_features & GetBlitFeatures()) == table[which].blit_features) )
  2413 				break;
  2459 				break;
  2414 		}
  2460 		}
  2415 		sdata->aux_data = table[which].aux_data;
  2461 		sdata->aux_data = table[which].aux_data;
  2416 		blitfun = table[which].blitfunc;
  2462 		blitfun = table[which].blitfunc;
  2417 		if(a_need == COPY_ALPHA && blitfun == BlitNtoN)
  2463 
  2418 		    blitfun = BlitNtoNCopyAlpha;
  2464 		if(blitfun == BlitNtoN) {  /* default C fallback catch-all. Slow! */
       
  2465 			/* Fastpath C fallback: 32bit RGB<->RGBA blit with matching RGB */
       
  2466 			if ( srcfmt->BytesPerPixel == 4 && dstfmt->BytesPerPixel == 4 &&
       
  2467 			     srcfmt->Rmask == dstfmt->Rmask &&
       
  2468 			     srcfmt->Gmask == dstfmt->Gmask &&
       
  2469 			     srcfmt->Bmask == dstfmt->Bmask ) {
       
  2470 				blitfun = Blit4to4MaskAlpha;
       
  2471 			} else if ( a_need == COPY_ALPHA ) {
       
  2472 			    blitfun = BlitNtoNCopyAlpha;
       
  2473 			}
       
  2474 		}
  2419 	}
  2475 	}
  2420 
  2476 
  2421 #ifdef DEBUG_ASM
  2477 #ifdef DEBUG_ASM
  2422 #ifdef USE_ASMBLIT
  2478 #ifdef USE_ASMBLIT
  2423 	if ( blitfun == ConvertMMX )
  2479 	if ( blitfun == ConvertMMX )