From af50243590e1bbf6800a0d4fb13e0a6188421289 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 17 Aug 2007 00:54:53 +0000 Subject: [PATCH] Moved the colorkey and per-surface alpha into the blit info, in preparation for support for general color channel modulation. Removed and consolidated some data in the blit info. --- include/SDL_pixels.h | 5 --- src/video/SDL_RLEaccel.c | 22 ++++++------- src/video/SDL_blit.c | 37 ++++++++++------------ src/video/SDL_blit.h | 15 +++------ src/video/SDL_blit_0.c | 14 ++++----- src/video/SDL_blit_1.c | 14 ++++----- src/video/SDL_blit_A.c | 34 ++++++++++---------- src/video/SDL_blit_N.c | 68 +++++++++++++++++++--------------------- src/video/SDL_pixels.c | 34 +++++++++----------- src/video/SDL_surface.c | 19 +++++------ src/video/SDL_video.c | 6 ++-- 11 files changed, 122 insertions(+), 146 deletions(-) diff --git a/include/SDL_pixels.h b/include/SDL_pixels.h index a6c77e26a..dfd6d54b5 100644 --- a/include/SDL_pixels.h +++ b/include/SDL_pixels.h @@ -237,11 +237,6 @@ typedef struct SDL_PixelFormat Uint32 Gmask; Uint32 Bmask; Uint32 Amask; - - /* RGB color key information */ - Uint32 colorkey; - /* Alpha value information (per-surface alpha) */ - Uint8 alpha; } SDL_PixelFormat; /** diff --git a/src/video/SDL_RLEaccel.c b/src/video/SDL_RLEaccel.c index 7a76d679d..08bc092b3 100644 --- a/src/video/SDL_RLEaccel.c +++ b/src/video/SDL_RLEaccel.c @@ -859,7 +859,7 @@ SDL_RLEBlit(SDL_Surface * src, SDL_Rect * srcrect, y = dstrect->y; dstbuf = (Uint8 *) dst->pixels + y * dst->pitch + x * src->format->BytesPerPixel; - srcbuf = (Uint8 *) src->map->sw_data->aux_data; + srcbuf = (Uint8 *) src->map->data; { /* skip lines at the top if neccessary */ @@ -906,7 +906,7 @@ SDL_RLEBlit(SDL_Surface * src, SDL_Rect * srcrect, } alpha = (src->flags & SDL_SRCALPHA) == SDL_SRCALPHA - ? src->format->alpha : 255; + ? (src->map->cmod >> 24) : 255; /* if left or right edge clipping needed, call clip blit */ if (srcrect->x || srcrect->w != src->w) { RLEClipBlit(w, srcbuf, dst, dstbuf, srcrect, alpha); @@ -1133,7 +1133,7 @@ SDL_RLEAlphaBlit(SDL_Surface * src, SDL_Rect * srcrect, x = dstrect->x; y = dstrect->y; dstbuf = (Uint8 *) dst->pixels + y * dst->pitch + x * df->BytesPerPixel; - srcbuf = (Uint8 *) src->map->sw_data->aux_data + sizeof(RLEDestFormat); + srcbuf = (Uint8 *) src->map->data + sizeof(RLEDestFormat); { /* skip lines at the top if necessary */ @@ -1628,7 +1628,7 @@ RLEAlphaSurface(SDL_Surface * surface) Uint8 *p = SDL_realloc(rlebuf, dst - rlebuf); if (!p) p = rlebuf; - surface->map->sw_data->aux_data = p; + surface->map->data = p; } return 0; @@ -1715,7 +1715,7 @@ RLEColorkeySurface(SDL_Surface * surface) skip = run = 0; dst = rlebuf; rgbmask = ~surface->format->Amask; - ckey = surface->format->colorkey & rgbmask; + ckey = surface->map->ckey & rgbmask; lastline = dst; getpix = getpixes[bpp - 1]; w = surface->w; @@ -1794,7 +1794,7 @@ RLEColorkeySurface(SDL_Surface * surface) Uint8 *p = SDL_realloc(rlebuf, dst - rlebuf); if (!p) p = rlebuf; - surface->map->sw_data->aux_data = p; + surface->map->data = p; } return (0); @@ -1859,7 +1859,7 @@ UnRLEAlpha(SDL_Surface * surface) Uint8 *srcbuf; Uint32 *dst; SDL_PixelFormat *sf = surface->format; - RLEDestFormat *df = surface->map->sw_data->aux_data; + RLEDestFormat *df = surface->map->data; int (*uncopy_opaque) (Uint32 *, void *, int, RLEDestFormat *, SDL_PixelFormat *); int (*uncopy_transl) (Uint32 *, void *, int, @@ -1948,7 +1948,7 @@ SDL_UnRLESurface(SDL_Surface * surface, int recode) } /* fill it with the background colour */ - SDL_FillRect(surface, NULL, surface->format->colorkey); + SDL_FillRect(surface, NULL, surface->map->ckey); /* now render the encoded surface */ full.x = full.y = 0; @@ -1967,9 +1967,9 @@ SDL_UnRLESurface(SDL_Surface * surface, int recode) } } - if (surface->map && surface->map->sw_data->aux_data) { - SDL_free(surface->map->sw_data->aux_data); - surface->map->sw_data->aux_data = NULL; + if (surface->map && surface->map->data) { + SDL_free(surface->map->data); + surface->map->data = NULL; } } } diff --git a/src/video/SDL_blit.c b/src/video/SDL_blit.c index 0aece2820..e854d0355 100644 --- a/src/video/SDL_blit.c +++ b/src/video/SDL_blit.c @@ -77,11 +77,12 @@ SDL_SoftBlit(SDL_Surface * src, SDL_Rect * srcrect, info.d_width = dstrect->w; info.d_height = dstrect->h; info.d_skip = dst->pitch - info.d_width * dst->format->BytesPerPixel; - info.aux_data = src->map->sw_data->aux_data; info.src = src->format; info.table = src->map->table; info.dst = dst->format; - RunBlit = src->map->sw_data->blit; + info.ckey = src->map->ckey; + info.cmod = src->map->cmod; + RunBlit = (SDL_loblit)src->map->data; /* Run the actual software blit */ RunBlit(&info); @@ -166,20 +167,21 @@ SDL_ChooseBlitFunc(SDL_BlitEntry * entries, int count) int SDL_CalculateBlit(SDL_Surface * surface) { + SDL_loblit blit = NULL; int blit_index; /* Clean everything out to start */ if ((surface->flags & SDL_RLEACCEL) == SDL_RLEACCEL) { SDL_UnRLESurface(surface, 1); } - surface->map->sw_blit = NULL; + surface->map->blit = NULL; /* Get the blit function index, based on surface mode */ /* { 0 = nothing, 1 = colorkey, 2 = alpha, 3 = colorkey+alpha } */ blit_index = 0; blit_index |= (!!(surface->flags & SDL_SRCCOLORKEY)) << 0; if (surface->flags & SDL_SRCALPHA - && (surface->format->alpha != SDL_ALPHA_OPAQUE + && ((surface->map->cmod >> 24) != SDL_ALPHA_OPAQUE || surface->format->Amask)) { blit_index |= 2; } @@ -188,34 +190,28 @@ SDL_CalculateBlit(SDL_Surface * surface) if (surface->map->identity && blit_index == 0) { /* Handle overlapping blits on the same surface */ if (surface == surface->map->dst) { - surface->map->sw_data->blit = SDL_BlitCopyOverlap; + blit = SDL_BlitCopyOverlap; } else { - surface->map->sw_data->blit = SDL_BlitCopy; + blit = SDL_BlitCopy; } } else { if (surface->format->BitsPerPixel < 8) { - surface->map->sw_data->blit = - SDL_CalculateBlit0(surface, blit_index); + blit = SDL_CalculateBlit0(surface, blit_index); } else { switch (surface->format->BytesPerPixel) { case 1: - surface->map->sw_data->blit = - SDL_CalculateBlit1(surface, blit_index); + blit = SDL_CalculateBlit1(surface, blit_index); break; case 2: case 3: case 4: - surface->map->sw_data->blit = - SDL_CalculateBlitN(surface, blit_index); - break; - default: - surface->map->sw_data->blit = NULL; + blit = SDL_CalculateBlitN(surface, blit_index); break; } } } /* Make sure we have a blit function */ - if (surface->map->sw_data->blit == NULL) { + if (blit == NULL) { SDL_InvalidateMap(surface->map); SDL_SetError("Blit combination not supported"); return (-1); @@ -227,15 +223,16 @@ SDL_CalculateBlit(SDL_Surface * surface) && (blit_index == 1 || (blit_index == 3 && !surface->format->Amask))) { if (SDL_RLESurface(surface) == 0) - surface->map->sw_blit = SDL_RLEBlit; + surface->map->blit = SDL_RLEBlit; } else if (blit_index == 2 && surface->format->Amask) { if (SDL_RLESurface(surface) == 0) - surface->map->sw_blit = SDL_RLEAlphaBlit; + surface->map->blit = SDL_RLEAlphaBlit; } } - if (surface->map->sw_blit == NULL) { - surface->map->sw_blit = SDL_SoftBlit; + if (surface->map->blit == NULL) { + surface->map->blit = SDL_SoftBlit; + surface->map->data = blit; } return (0); } diff --git a/src/video/SDL_blit.h b/src/video/SDL_blit.h index 95282180e..b68ec0f82 100644 --- a/src/video/SDL_blit.h +++ b/src/video/SDL_blit.h @@ -45,30 +45,25 @@ typedef struct int d_width; int d_height; int d_skip; - void *aux_data; SDL_PixelFormat *src; Uint8 *table; SDL_PixelFormat *dst; + Uint32 ckey, cmod; } SDL_BlitInfo; /* The type definition for the low level blit functions */ typedef void (*SDL_loblit) (SDL_BlitInfo * info); -/* This is the private info structure for software accelerated blits */ -struct private_swaccel -{ - SDL_loblit blit; - void *aux_data; -}; - /* Blit mapping definition */ typedef struct SDL_BlitMap { SDL_Surface *dst; int identity; Uint8 *table; - SDL_blit sw_blit; - struct private_swaccel *sw_data; + SDL_blit blit; + void *data; + Uint32 ckey; /* colorkey */ + Uint32 cmod; /* ARGB modulation */ /* the version count matches the destination; mismatch indicates an invalid mapping */ diff --git a/src/video/SDL_blit_0.c b/src/video/SDL_blit_0.c index ba4b4d654..9d55290d0 100644 --- a/src/video/SDL_blit_0.c +++ b/src/video/SDL_blit_0.c @@ -200,7 +200,7 @@ BlitBto1Key(SDL_BlitInfo * info) Uint8 *dst = info->d_pixels; int srcskip = info->s_skip; int dstskip = info->d_skip; - Uint32 ckey = info->src->colorkey; + Uint32 ckey = info->ckey; Uint8 *palmap = info->table; int c; @@ -253,7 +253,7 @@ BlitBto2Key(SDL_BlitInfo * info) Uint16 *dstp = (Uint16 *) info->d_pixels; int srcskip = info->s_skip; int dstskip = info->d_skip; - Uint32 ckey = info->src->colorkey; + Uint32 ckey = info->ckey; Uint8 *palmap = info->table; int c; @@ -288,7 +288,7 @@ BlitBto3Key(SDL_BlitInfo * info) Uint8 *dst = info->d_pixels; int srcskip = info->s_skip; int dstskip = info->d_skip; - Uint32 ckey = info->src->colorkey; + Uint32 ckey = info->ckey; Uint8 *palmap = info->table; int c; @@ -322,7 +322,7 @@ BlitBto4Key(SDL_BlitInfo * info) Uint32 *dstp = (Uint32 *) info->d_pixels; int srcskip = info->s_skip; int dstskip = info->d_skip; - Uint32 ckey = info->src->colorkey; + Uint32 ckey = info->ckey; Uint8 *palmap = info->table; int c; @@ -361,7 +361,7 @@ BlitBtoNAlpha(SDL_BlitInfo * info) SDL_PixelFormat *dstfmt = info->dst; int dstbpp; int c; - const int A = info->src->alpha; + const int A = (info->cmod >> 24); /* Set up some basic variables */ dstbpp = dstfmt->BytesPerPixel; @@ -407,8 +407,8 @@ BlitBtoNAlphaKey(SDL_BlitInfo * info) const SDL_Color *srcpal = srcfmt->palette->colors; int dstbpp; int c; - const int A = srcfmt->alpha; - Uint32 ckey = srcfmt->colorkey; + const int A = (info->cmod >> 24); + Uint32 ckey = info->ckey; /* Set up some basic variables */ dstbpp = dstfmt->BytesPerPixel; diff --git a/src/video/SDL_blit_1.c b/src/video/SDL_blit_1.c index 51e7dbed9..5295c6ac6 100644 --- a/src/video/SDL_blit_1.c +++ b/src/video/SDL_blit_1.c @@ -290,7 +290,7 @@ Blit1to1Key(SDL_BlitInfo * info) Uint8 *dst = info->d_pixels; int dstskip = info->d_skip; Uint8 *palmap = info->table; - Uint32 ckey = info->src->colorkey; + Uint32 ckey = info->ckey; if (palmap) { while (height--) { @@ -337,7 +337,7 @@ Blit1to2Key(SDL_BlitInfo * info) Uint16 *dstp = (Uint16 *) info->d_pixels; int dstskip = info->d_skip; Uint16 *palmap = (Uint16 *) info->table; - Uint32 ckey = info->src->colorkey; + Uint32 ckey = info->ckey; /* Set up some basic variables */ dstskip /= 2; @@ -369,7 +369,7 @@ Blit1to3Key(SDL_BlitInfo * info) Uint8 *dst = info->d_pixels; int dstskip = info->d_skip; Uint8 *palmap = info->table; - Uint32 ckey = info->src->colorkey; + Uint32 ckey = info->ckey; int o; while (height--) { @@ -402,7 +402,7 @@ Blit1to4Key(SDL_BlitInfo * info) Uint32 *dstp = (Uint32 *) info->d_pixels; int dstskip = info->d_skip; Uint32 *palmap = (Uint32 *) info->table; - Uint32 ckey = info->src->colorkey; + Uint32 ckey = info->ckey; /* Set up some basic variables */ dstskip /= 4; @@ -436,7 +436,7 @@ Blit1toNAlpha(SDL_BlitInfo * info) SDL_PixelFormat *dstfmt = info->dst; const SDL_Color *srcpal = info->src->palette->colors; int dstbpp; - const int A = info->src->alpha; + const int A = (info->cmod >> 24); /* Set up some basic variables */ dstbpp = dstfmt->BytesPerPixel; @@ -477,9 +477,9 @@ Blit1toNAlphaKey(SDL_BlitInfo * info) SDL_PixelFormat *srcfmt = info->src; SDL_PixelFormat *dstfmt = info->dst; const SDL_Color *srcpal = info->src->palette->colors; - Uint32 ckey = srcfmt->colorkey; + Uint32 ckey = info->ckey; int dstbpp; - const int A = srcfmt->alpha; + const int A = (info->cmod >> 24); /* Set up some basic variables */ dstbpp = dstfmt->BytesPerPixel; diff --git a/src/video/SDL_blit_A.c b/src/video/SDL_blit_A.c index d1edb50e5..25be2c114 100644 --- a/src/video/SDL_blit_A.c +++ b/src/video/SDL_blit_A.c @@ -41,7 +41,7 @@ BlitNto1SurfaceAlpha(SDL_BlitInfo * info) SDL_PixelFormat *dstfmt = info->dst; int srcbpp = srcfmt->BytesPerPixel; - const unsigned A = srcfmt->alpha; + const unsigned A = (info->cmod >> 24); while (height--) { /* *INDENT-OFF* */ @@ -152,9 +152,9 @@ BlitNto1SurfaceAlphaKey(SDL_BlitInfo * info) SDL_PixelFormat *srcfmt = info->src; SDL_PixelFormat *dstfmt = info->dst; int srcbpp = srcfmt->BytesPerPixel; - Uint32 ckey = srcfmt->colorkey; + Uint32 ckey = info->ckey; - const int A = srcfmt->alpha; + const int A = (info->cmod >> 24); while (height--) { /* *INDENT-OFF* */ @@ -261,7 +261,7 @@ BlitRGBtoRGBSurfaceAlphaMMX(SDL_BlitInfo * info) { SDL_PixelFormat *df = info->dst; Uint32 chanmask = df->Rmask | df->Gmask | df->Bmask; - unsigned alpha = info->src->alpha; + unsigned alpha = (info->cmod >> 24); if (alpha == 128 && (df->Rmask | df->Gmask | df->Bmask) == 0x00FFFFFF) { /* only call a128 version when R,G,B occupy lower bits */ @@ -718,7 +718,6 @@ Blit32to565PixelAlphaAltivec(SDL_BlitInfo * info) static void Blit32to32SurfaceAlphaKeyAltivec(SDL_BlitInfo * info) { - unsigned alpha = info->src->alpha; int height = info->d_height; Uint32 *srcp = (Uint32 *) info->s_pixels; int srcskip = info->s_skip >> 2; @@ -726,10 +725,10 @@ Blit32to32SurfaceAlphaKeyAltivec(SDL_BlitInfo * info) int dstskip = info->d_skip >> 2; SDL_PixelFormat *srcfmt = info->src; SDL_PixelFormat *dstfmt = info->dst; - unsigned sA = srcfmt->alpha; + unsigned sA = (info->cmod >> 24); unsigned dA = dstfmt->Amask ? SDL_ALPHA_OPAQUE : 0; Uint32 rgbmask = srcfmt->Rmask | srcfmt->Gmask | srcfmt->Bmask; - Uint32 ckey = info->src->colorkey; + Uint32 ckey = info->ckey; vector unsigned char mergePermute; vector unsigned char vsrcPermute; vector unsigned char vdstPermute; @@ -1041,7 +1040,6 @@ static void Blit32to32SurfaceAlphaAltivec(SDL_BlitInfo * info) { /* XXX : 6 */ - unsigned alpha = info->src->alpha; int height = info->d_height; Uint32 *srcp = (Uint32 *) info->s_pixels; int srcskip = info->s_skip >> 2; @@ -1049,7 +1047,7 @@ Blit32to32SurfaceAlphaAltivec(SDL_BlitInfo * info) int dstskip = info->d_skip >> 2; SDL_PixelFormat *srcfmt = info->src; SDL_PixelFormat *dstfmt = info->dst; - unsigned sA = srcfmt->alpha; + unsigned sA = (info->cmod >> 24); unsigned dA = dstfmt->Amask ? SDL_ALPHA_OPAQUE : 0; vector unsigned char mergePermute; vector unsigned char vsrcPermute; @@ -1138,7 +1136,7 @@ Blit32to32SurfaceAlphaAltivec(SDL_BlitInfo * info) static void BlitRGBtoRGBSurfaceAlphaAltivec(SDL_BlitInfo * info) { - unsigned alpha = info->src->alpha; + unsigned alpha = (info->cmod >> 24); int height = info->d_height; Uint32 *srcp = (Uint32 *) info->s_pixels; int srcskip = info->s_skip >> 2; @@ -1251,7 +1249,7 @@ BlitRGBtoRGBSurfaceAlpha128(SDL_BlitInfo * info) static void BlitRGBtoRGBSurfaceAlpha(SDL_BlitInfo * info) { - unsigned alpha = info->src->alpha; + unsigned alpha = (info->cmod >> 24); if (alpha == 128) { BlitRGBtoRGBSurfaceAlpha128(info); } else { @@ -1560,7 +1558,7 @@ Blit16to16SurfaceAlpha128(SDL_BlitInfo * info, Uint16 mask) static void Blit565to565SurfaceAlphaMMX(SDL_BlitInfo * info) { - unsigned alpha = info->src->alpha; + unsigned alpha = (info->cmod >> 24); if (alpha == 128) { Blit16to16SurfaceAlpha128(info, 0xf7de); } else { @@ -1697,7 +1695,7 @@ Blit565to565SurfaceAlphaMMX(SDL_BlitInfo * info) static void Blit555to555SurfaceAlphaMMX(SDL_BlitInfo * info) { - unsigned alpha = info->src->alpha; + unsigned alpha = (info->cmod >> 24); if (alpha == 128) { Blit16to16SurfaceAlpha128(info, 0xfbde); } else { @@ -1837,7 +1835,7 @@ Blit555to555SurfaceAlphaMMX(SDL_BlitInfo * info) static void Blit565to565SurfaceAlpha(SDL_BlitInfo * info) { - unsigned alpha = info->src->alpha; + unsigned alpha = (info->cmod >> 24); if (alpha == 128) { Blit16to16SurfaceAlpha128(info, 0xf7de); } else { @@ -1876,7 +1874,7 @@ Blit565to565SurfaceAlpha(SDL_BlitInfo * info) static void Blit555to555SurfaceAlpha(SDL_BlitInfo * info) { - unsigned alpha = info->src->alpha; /* downscale alpha to 5 bits */ + unsigned alpha = (info->cmod >> 24); /* downscale alpha to 5 bits */ if (alpha == 128) { Blit16to16SurfaceAlpha128(info, 0xfbde); } else { @@ -2018,7 +2016,7 @@ BlitNtoNSurfaceAlpha(SDL_BlitInfo * info) SDL_PixelFormat *dstfmt = info->dst; int srcbpp = srcfmt->BytesPerPixel; int dstbpp = dstfmt->BytesPerPixel; - unsigned sA = srcfmt->alpha; + unsigned sA = (info->cmod >> 24); unsigned dA = dstfmt->Amask ? SDL_ALPHA_OPAQUE : 0; if (sA) { @@ -2060,10 +2058,10 @@ BlitNtoNSurfaceAlphaKey(SDL_BlitInfo * info) int dstskip = info->d_skip; SDL_PixelFormat *srcfmt = info->src; SDL_PixelFormat *dstfmt = info->dst; - Uint32 ckey = srcfmt->colorkey; + Uint32 ckey = info->ckey; int srcbpp = srcfmt->BytesPerPixel; int dstbpp = dstfmt->BytesPerPixel; - unsigned sA = srcfmt->alpha; + unsigned sA = (info->cmod >> 24); unsigned dA = dstfmt->Amask ? SDL_ALPHA_OPAQUE : 0; while (height--) { diff --git a/src/video/SDL_blit_N.c b/src/video/SDL_blit_N.c index c7ebd89c1..b8f751b1e 100644 --- a/src/video/SDL_blit_N.c +++ b/src/video/SDL_blit_N.c @@ -322,8 +322,8 @@ Blit_RGB565_32Altivec(SDL_BlitInfo * info) vf800 = (vector unsigned short) vec_splat_u8(-7); vf800 = vec_sl(vf800, vec_splat_u16(8)); - if (dstfmt->Amask && srcfmt->alpha) { - ((unsigned char *) &valpha)[0] = alpha = srcfmt->alpha; + if (dstfmt->Amask && (info->cmod >> 24)) { + ((unsigned char *) &valpha)[0] = alpha = (info->cmod >> 24); valpha = vec_splat(valpha, 0); } else { alpha = 0; @@ -470,8 +470,8 @@ Blit_RGB555_32Altivec(SDL_BlitInfo * info) vf800 = (vector unsigned short) vec_splat_u8(-7); vf800 = vec_sl(vf800, vec_splat_u16(8)); - if (dstfmt->Amask && srcfmt->alpha) { - ((unsigned char *) &valpha)[0] = alpha = srcfmt->alpha; + if (dstfmt->Amask && (info->cmod >> 24)) { + ((unsigned char *) &valpha)[0] = alpha = (info->cmod >> 24); valpha = vec_splat(valpha, 0); } else { alpha = 0; @@ -569,9 +569,9 @@ Blit32to32KeyAltivec(SDL_BlitInfo * info) SDL_PixelFormat *dstfmt = info->dst; int dstbpp = dstfmt->BytesPerPixel; int copy_alpha = (srcfmt->Amask && dstfmt->Amask); - unsigned alpha = dstfmt->Amask ? srcfmt->alpha : 0; + unsigned alpha = dstfmt->Amask ? (info->cmod >> 24) : 0; Uint32 rgbmask = srcfmt->Rmask | srcfmt->Gmask | srcfmt->Bmask; - Uint32 ckey = info->src->colorkey; + Uint32 ckey = info->ckey; vector unsigned int valpha; vector unsigned char vpermute; vector unsigned char vzero; @@ -687,9 +687,9 @@ ConvertAltivec32to32_noprefetch(SDL_BlitInfo * info) vector unsigned int vzero = vec_splat_u32(0); vector unsigned char vpermute = calc_swizzle32(srcfmt, dstfmt); if (dstfmt->Amask && !srcfmt->Amask) { - if (srcfmt->alpha) { + if ((info->cmod >> 24)) { vector unsigned char valpha; - ((unsigned char *) &valpha)[0] = srcfmt->alpha; + ((unsigned char *) &valpha)[0] = (info->cmod >> 24); vzero = (vector unsigned int) vec_splat(valpha, 0); } } @@ -766,9 +766,9 @@ ConvertAltivec32to32_prefetch(SDL_BlitInfo * info) vector unsigned int vzero = vec_splat_u32(0); vector unsigned char vpermute = calc_swizzle32(srcfmt, dstfmt); if (dstfmt->Amask && !srcfmt->Amask) { - if (srcfmt->alpha) { + if ((info->cmod >> 24)) { vector unsigned char valpha; - ((unsigned char *) &valpha)[0] = srcfmt->alpha; + ((unsigned char *) &valpha)[0] = (info->cmod >> 24); vzero = (vector unsigned int) vec_splat(valpha, 0); } } @@ -2039,7 +2039,7 @@ Blit4to4MaskAlpha(SDL_BlitInfo * info) if (dstfmt->Amask) { /* RGB->RGBA, SET_ALPHA */ - Uint32 mask = (srcfmt->alpha >> dstfmt->Aloss) << dstfmt->Ashift; + Uint32 mask = ((info->cmod >> 24) >> dstfmt->Aloss) << dstfmt->Ashift; while (height--) { /* *INDENT-OFF* */ @@ -2087,7 +2087,7 @@ BlitNtoN(SDL_BlitInfo * info) int srcbpp = srcfmt->BytesPerPixel; SDL_PixelFormat *dstfmt = info->dst; int dstbpp = dstfmt->BytesPerPixel; - unsigned alpha = dstfmt->Amask ? srcfmt->alpha : 0; + unsigned alpha = dstfmt->Amask ? (info->cmod >> 24) : 0; while (height--) { /* *INDENT-OFF* */ @@ -2150,7 +2150,7 @@ BlitNto1Key(SDL_BlitInfo * info) int dstskip = info->d_skip; SDL_PixelFormat *srcfmt = info->src; const Uint8 *palmap = info->table; - Uint32 ckey = srcfmt->colorkey; + Uint32 ckey = info->ckey; Uint32 rgbmask = ~srcfmt->Amask; int srcbpp; Uint32 Pixel; @@ -2214,7 +2214,7 @@ Blit2to2Key(SDL_BlitInfo * info) int srcskip = info->s_skip; Uint16 *dstp = (Uint16 *) info->d_pixels; int dstskip = info->d_skip; - Uint32 ckey = info->src->colorkey; + Uint32 ckey = info->ckey; Uint32 rgbmask = ~info->src->Amask; /* Set up some basic variables */ @@ -2248,12 +2248,12 @@ BlitNtoNKey(SDL_BlitInfo * info) int srcskip = info->s_skip; Uint8 *dst = info->d_pixels; int dstskip = info->d_skip; - Uint32 ckey = info->src->colorkey; + Uint32 ckey = info->ckey; SDL_PixelFormat *srcfmt = info->src; SDL_PixelFormat *dstfmt = info->dst; int srcbpp = srcfmt->BytesPerPixel; int dstbpp = dstfmt->BytesPerPixel; - unsigned alpha = dstfmt->Amask ? srcfmt->alpha : 0; + unsigned alpha = dstfmt->Amask ? (info->cmod >> 24) : 0; Uint32 rgbmask = ~srcfmt->Amask; /* Set up some basic variables */ @@ -2291,7 +2291,7 @@ BlitNtoNKeyCopyAlpha(SDL_BlitInfo * info) int srcskip = info->s_skip; Uint8 *dst = info->d_pixels; int dstskip = info->d_skip; - Uint32 ckey = info->src->colorkey; + Uint32 ckey = info->ckey; SDL_PixelFormat *srcfmt = info->src; SDL_PixelFormat *dstfmt = info->dst; Uint32 rgbmask = ~srcfmt->Amask; @@ -2332,70 +2332,69 @@ struct blit_table int dstbpp; Uint32 dstR, dstG, dstB; Uint32 blit_features; - void *aux_data; SDL_loblit blitfunc; enum { NO_ALPHA = 1, SET_ALPHA = 2, COPY_ALPHA = 4 } alpha; }; static const struct blit_table normal_blit_1[] = { /* Default for 8-bit RGB source, an invalid combination */ - {0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL}, + {0, 0, 0, 0, 0, 0, 0, 0, NULL}, }; static const struct blit_table normal_blit_2[] = { #if SDL_ALTIVEC_BLITTERS /* has-altivec */ {0x0000F800, 0x000007E0, 0x0000001F, 4, 0x00000000, 0x00000000, 0x00000000, - 2, NULL, Blit_RGB565_32Altivec, NO_ALPHA | COPY_ALPHA | SET_ALPHA}, + 2, Blit_RGB565_32Altivec, NO_ALPHA | COPY_ALPHA | SET_ALPHA}, {0x00007C00, 0x000003E0, 0x0000001F, 4, 0x00000000, 0x00000000, 0x00000000, - 2, NULL, Blit_RGB555_32Altivec, NO_ALPHA | COPY_ALPHA | SET_ALPHA}, + 2, Blit_RGB555_32Altivec, NO_ALPHA | COPY_ALPHA | SET_ALPHA}, #endif {0x0000F800, 0x000007E0, 0x0000001F, 4, 0x00FF0000, 0x0000FF00, 0x000000FF, - 0, NULL, Blit_RGB565_ARGB8888, SET_ALPHA}, + 0, Blit_RGB565_ARGB8888, SET_ALPHA}, {0x0000F800, 0x000007E0, 0x0000001F, 4, 0x000000FF, 0x0000FF00, 0x00FF0000, - 0, NULL, Blit_RGB565_ABGR8888, SET_ALPHA}, + 0, Blit_RGB565_ABGR8888, SET_ALPHA}, {0x0000F800, 0x000007E0, 0x0000001F, 4, 0xFF000000, 0x00FF0000, 0x0000FF00, - 0, NULL, Blit_RGB565_RGBA8888, SET_ALPHA}, + 0, Blit_RGB565_RGBA8888, SET_ALPHA}, {0x0000F800, 0x000007E0, 0x0000001F, 4, 0x0000FF00, 0x00FF0000, 0xFF000000, - 0, NULL, Blit_RGB565_BGRA8888, SET_ALPHA}, + 0, Blit_RGB565_BGRA8888, SET_ALPHA}, /* Default for 16-bit RGB source, used if no other blitter matches */ - {0, 0, 0, 0, 0, 0, 0, 0, NULL, BlitNtoN, 0} + {0, 0, 0, 0, 0, 0, 0, 0, BlitNtoN, 0} }; static const struct blit_table normal_blit_3[] = { /* Default for 24-bit RGB source, never optimized */ - {0, 0, 0, 0, 0, 0, 0, 0, NULL, BlitNtoN, 0} + {0, 0, 0, 0, 0, 0, 0, 0, BlitNtoN, 0} }; static const struct blit_table normal_blit_4[] = { #if SDL_ALTIVEC_BLITTERS /* has-altivec | dont-use-prefetch */ {0x00000000, 0x00000000, 0x00000000, 4, 0x00000000, 0x00000000, 0x00000000, - 6, NULL, ConvertAltivec32to32_noprefetch, + 6, ConvertAltivec32to32_noprefetch, NO_ALPHA | COPY_ALPHA | SET_ALPHA}, /* has-altivec */ {0x00000000, 0x00000000, 0x00000000, 4, 0x00000000, 0x00000000, 0x00000000, - 2, NULL, ConvertAltivec32to32_prefetch, + 2, ConvertAltivec32to32_prefetch, NO_ALPHA | COPY_ALPHA | SET_ALPHA}, /* has-altivec */ {0x00000000, 0x00000000, 0x00000000, 2, 0x0000F800, 0x000007E0, 0x0000001F, - 2, NULL, Blit_RGB888_RGB565Altivec, NO_ALPHA}, + 2, Blit_RGB888_RGB565Altivec, NO_ALPHA}, #endif {0x00FF0000, 0x0000FF00, 0x000000FF, 2, 0x0000F800, 0x000007E0, 0x0000001F, - 0, NULL, Blit_RGB888_RGB565, NO_ALPHA}, + 0, Blit_RGB888_RGB565, NO_ALPHA}, {0x00FF0000, 0x0000FF00, 0x000000FF, 2, 0x00007C00, 0x000003E0, 0x0000001F, - 0, NULL, Blit_RGB888_RGB555, NO_ALPHA}, + 0, Blit_RGB888_RGB555, NO_ALPHA}, /* Default for 32-bit RGB source, used if no other blitter matches */ - {0, 0, 0, 0, 0, 0, 0, 0, NULL, BlitNtoN, 0} + {0, 0, 0, 0, 0, 0, 0, 0, BlitNtoN, 0} }; static const struct blit_table *normal_blit[] = { normal_blit_1, normal_blit_2, normal_blit_3, normal_blit_4 @@ -2407,7 +2406,6 @@ static const struct blit_table *normal_blit[] = { SDL_loblit SDL_CalculateBlitN(SDL_Surface * surface, int blit_index) { - struct private_swaccel *sdata; SDL_PixelFormat *srcfmt; SDL_PixelFormat *dstfmt; const struct blit_table *table; @@ -2415,7 +2413,6 @@ SDL_CalculateBlitN(SDL_Surface * surface, int blit_index) SDL_loblit blitfun; /* Set up data for choosing the blit */ - sdata = surface->map->sw_data; srcfmt = surface->format; dstfmt = surface->map->dst->format; @@ -2486,7 +2483,6 @@ SDL_CalculateBlitN(SDL_Surface * surface, int blit_index) table[which].blit_features)) break; } - sdata->aux_data = table[which].aux_data; blitfun = table[which].blitfunc; if (blitfun == BlitNtoN) { /* default C fallback catch-all. Slow! */ diff --git a/src/video/SDL_pixels.c b/src/video/SDL_pixels.c index 0cd4a337d..d54b6312e 100644 --- a/src/video/SDL_pixels.c +++ b/src/video/SDL_pixels.c @@ -351,7 +351,6 @@ SDL_AllocFormat(int bpp, SDL_OutOfMemory(); return (NULL); } - format->alpha = SDL_ALPHA_OPAQUE; /* Set up the format */ format->BitsPerPixel = bpp; @@ -669,12 +668,12 @@ Map1to1(SDL_Palette * src, SDL_Palette * dst, int *identical) /* Map from Palette to BitField */ static Uint8 * -Map1toN(SDL_PixelFormat * src, SDL_PixelFormat * dst) +Map1toN(SDL_PixelFormat * src, Uint32 cmod, SDL_PixelFormat * dst) { Uint8 *map; int i; int bpp; - unsigned alpha; + unsigned Amod, Rmod, Gmod, Bmod; SDL_Palette *pal = src->palette; bpp = ((dst->BytesPerPixel == 3) ? 4 : dst->BytesPerPixel); @@ -684,12 +683,18 @@ Map1toN(SDL_PixelFormat * src, SDL_PixelFormat * dst) return (NULL); } - alpha = dst->Amask ? src->alpha : 0; + Amod = (cmod >> 24) & 0xFF; + Rmod = (cmod >> 16) & 0xFF; + Gmod = (cmod >> 8) & 0xFF; + Bmod = (cmod >> 0) & 0xFF; + /* We memory copy to the pixel map so the endianness is preserved */ for (i = 0; i < pal->ncolors; ++i) { - ASSEMBLE_RGBA(&map[i * bpp], dst->BytesPerPixel, dst, - pal->colors[i].r, pal->colors[i].g, - pal->colors[i].b, alpha); + Uint8 A = Amod; + Uint8 R = (pal->colors[i].r * Rmod) / 255; + Uint8 G = (pal->colors[i].g * Gmod) / 255; + Uint8 B = (pal->colors[i].b * Bmod) / 255; + ASSEMBLE_RGBA(&map[i * bpp], dst->BytesPerPixel, dst, R, G, B, A); } return (map); } @@ -720,15 +725,7 @@ SDL_AllocBlitMap(void) SDL_OutOfMemory(); return (NULL); } - - /* Allocate the software blit data */ - map->sw_data = - (struct private_swaccel *) SDL_calloc(1, sizeof(*map->sw_data)); - if (map->sw_data == NULL) { - SDL_FreeBlitMap(map); - SDL_OutOfMemory(); - return (NULL); - } + map->cmod = 0xFFFFFFFF; /* It's ready to go */ return (map); @@ -783,7 +780,7 @@ SDL_MapSurface(SDL_Surface * src, SDL_Surface * dst) default: /* Palette --> BitField */ - map->table = Map1toN(srcfmt, dstfmt); + map->table = Map1toN(srcfmt, src->map->cmod, dstfmt); if (map->table == NULL) { return (-1); } @@ -823,9 +820,6 @@ SDL_FreeBlitMap(SDL_BlitMap * map) { if (map) { SDL_InvalidateMap(map); - if (map->sw_data != NULL) { - SDL_free(map->sw_data); - } SDL_free(map); } } diff --git a/src/video/SDL_surface.c b/src/video/SDL_surface.c index e3614cd70..48a13d0b9 100644 --- a/src/video/SDL_surface.c +++ b/src/video/SDL_surface.c @@ -231,7 +231,7 @@ SDL_SetColorKey(SDL_Surface * surface, Uint32 flag, Uint32 key) /* Optimize away operations that don't change anything */ if ((flag == (surface->flags & (SDL_SRCCOLORKEY | SDL_RLEACCELOK))) && - (key == surface->format->colorkey)) { + (key == surface->map->ckey)) { return (0); } @@ -242,7 +242,7 @@ SDL_SetColorKey(SDL_Surface * surface, Uint32 flag, Uint32 key) if (flag) { surface->flags |= SDL_SRCCOLORKEY; - surface->format->colorkey = key; + surface->map->ckey = key; if (flag & SDL_RLEACCELOK) { surface->flags |= SDL_RLEACCELOK; } else { @@ -250,7 +250,7 @@ SDL_SetColorKey(SDL_Surface * surface, Uint32 flag, Uint32 key) } } else { surface->flags &= ~(SDL_SRCCOLORKEY | SDL_RLEACCELOK); - surface->format->colorkey = 0; + surface->map->ckey = 0; } SDL_InvalidateMap(surface->map); return (0); @@ -261,7 +261,7 @@ int SDL_SetAlpha(SDL_Surface * surface, Uint32 flag, Uint8 value) { Uint32 oldflags = surface->flags; - Uint32 oldalpha = surface->format->alpha; + Uint32 oldalpha = (surface->map->cmod >> 24); /* Sanity check the flag as it gets passed in */ if (flag & SDL_SRCALPHA) { @@ -285,7 +285,8 @@ SDL_SetAlpha(SDL_Surface * surface, Uint32 flag, Uint8 value) if (flag) { surface->flags |= SDL_SRCALPHA; - surface->format->alpha = value; + surface->map->cmod &= 0x00FFFFFF; + surface->map->cmod |= ((Uint32)value << 24); if (flag & SDL_RLEACCELOK) { surface->flags |= SDL_RLEACCELOK; } else { @@ -293,7 +294,7 @@ SDL_SetAlpha(SDL_Surface * surface, Uint32 flag, Uint8 value) } } else { surface->flags &= ~SDL_SRCALPHA; - surface->format->alpha = SDL_ALPHA_OPAQUE; + surface->map->cmod |= 0xFF000000; } /* * The representation for software surfaces is independent of @@ -412,7 +413,7 @@ SDL_LowerBlit(SDL_Surface * src, SDL_Rect * srcrect, return (-1); } } - return (src->map->sw_blit(src, srcrect, dst, dstrect)); + return (src->map->blit(src, srcrect, dst, dstrect)); } @@ -601,7 +602,7 @@ SDL_ConvertSurface(SDL_Surface * surface, if ((flags & SDL_SRCCOLORKEY) != SDL_SRCCOLORKEY && format->Amask) { surface_flags &= ~SDL_SRCCOLORKEY; } else { - colorkey = surface->format->colorkey; + colorkey = surface->map->ckey; SDL_SetColorKey(surface, 0, 0); } } @@ -610,7 +611,7 @@ SDL_ConvertSurface(SDL_Surface * surface, if (format->Amask) { surface->flags &= ~SDL_SRCALPHA; } else { - alpha = surface->format->alpha; + alpha = (Uint8)(surface->map->cmod >> 24); SDL_SetAlpha(surface, 0, 0); } } diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index e535539ec..966bbecd2 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -1595,7 +1595,7 @@ SDL_CreateTextureFromSurface(Uint32 format, SDL_Surface * surface) surface->pitch); } } else { - Uint8 alpha; + Uint32 cmod; SDL_Rect bounds; SDL_Surface dst; @@ -1648,6 +1648,7 @@ SDL_CreateTextureFromSurface(Uint32 format, SDL_Surface * surface) } /* Copy over the alpha channel */ + cmod = surface->map->cmod; if (surface_flags & SDL_SRCALPHA) { if (fmt->Amask) { surface->flags &= ~SDL_SRCALPHA; @@ -1655,7 +1656,6 @@ SDL_CreateTextureFromSurface(Uint32 format, SDL_Surface * surface) /* FIXME: Need to make sure the texture has an alpha channel * and copy 'alpha' into the texture alpha channel. */ - alpha = surface->format->alpha; SDL_SetAlpha(surface, 0, 0); } } @@ -1673,7 +1673,7 @@ SDL_CreateTextureFromSurface(Uint32 format, SDL_Surface * surface) if (fmt->Amask) { surface->flags |= SDL_SRCALPHA; } else { - SDL_SetAlpha(surface, aflags, alpha); + SDL_SetAlpha(surface, aflags, (cmod >> 24)); } }