Mercurial > sdl-ios-xcode
diff src/video/SDL_blit_N.c @ 2267:c785543d1843
Okay, still some bugs, but everything builds again...
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sat, 18 Aug 2007 05:39:09 +0000 |
parents | bee005ace1bf |
children | e1da92da346c |
line wrap: on
line diff
--- a/src/video/SDL_blit_N.c Sat Aug 18 01:44:21 2007 +0000 +++ b/src/video/SDL_blit_N.c Sat Aug 18 05:39:09 2007 +0000 @@ -160,9 +160,9 @@ { int height = info->dst_h; Uint8 *src = (Uint8 *) info->src; - int srcskip = info->s_skip; + int srcskip = info->src_skip; Uint8 *dst = (Uint8 *) info->dst; - int dstskip = info->dst_pitch; + int dstskip = info->dst_skip; SDL_PixelFormat *srcfmt = info->src; vector unsigned char valpha = vec_splat_u8(0); vector unsigned char vpermute = calc_swizzle32(srcfmt, NULL); @@ -264,9 +264,9 @@ { int height = info->dst_h; Uint8 *src = (Uint8 *) info->src; - int srcskip = info->s_skip; + int srcskip = info->src_skip; Uint8 *dst = (Uint8 *) info->dst; - int dstskip = info->dst_pitch; + int dstskip = info->dst_skip; SDL_PixelFormat *srcfmt = info->src; SDL_PixelFormat *dstfmt = info->dst; unsigned alpha; @@ -322,8 +322,8 @@ vf800 = (vector unsigned short) vec_splat_u8(-7); vf800 = vec_sl(vf800, vec_splat_u16(8)); - if (dstfmt->Amask && (info->cmod >> 24)) { - ((unsigned char *) &valpha)[0] = alpha = (info->cmod >> 24); + if (dstfmt->Amask && info->a) { + ((unsigned char *) &valpha)[0] = alpha = info->a; valpha = vec_splat(valpha, 0); } else { alpha = 0; @@ -412,9 +412,9 @@ { int height = info->dst_h; Uint8 *src = (Uint8 *) info->src; - int srcskip = info->s_skip; + int srcskip = info->src_skip; Uint8 *dst = (Uint8 *) info->dst; - int dstskip = info->dst_pitch; + int dstskip = info->dst_skip; SDL_PixelFormat *srcfmt = info->src; SDL_PixelFormat *dstfmt = info->dst; unsigned alpha; @@ -470,8 +470,8 @@ vf800 = (vector unsigned short) vec_splat_u8(-7); vf800 = vec_sl(vf800, vec_splat_u16(8)); - if (dstfmt->Amask && (info->cmod >> 24)) { - ((unsigned char *) &valpha)[0] = alpha = (info->cmod >> 24); + if (dstfmt->Amask && info->a) { + ((unsigned char *) &valpha)[0] = alpha = info->a; valpha = vec_splat(valpha, 0); } else { alpha = 0; @@ -561,17 +561,17 @@ { int height = info->dst_h; Uint32 *srcp = (Uint32 *) info->src; - int srcskip = info->s_skip; + int srcskip = info->src_skip; Uint32 *dstp = (Uint32 *) info->dst; - int dstskip = info->dst_pitch; + int dstskip = info->dst_skip; SDL_PixelFormat *srcfmt = info->src; int srcbpp = srcfmt->BytesPerPixel; SDL_PixelFormat *dstfmt = info->dst; int dstbpp = dstfmt->BytesPerPixel; int copy_alpha = (srcfmt->Amask && dstfmt->Amask); - unsigned alpha = dstfmt->Amask ? (info->cmod >> 24) : 0; + unsigned alpha = dstfmt->Amask ? info->a : 0; Uint32 rgbmask = srcfmt->Rmask | srcfmt->Gmask | srcfmt->Bmask; - Uint32 ckey = info->ckey; + Uint32 ckey = info->colorkey; vector unsigned int valpha; vector unsigned char vpermute; vector unsigned char vzero; @@ -679,17 +679,17 @@ { int height = info->dst_h; Uint32 *src = (Uint32 *) info->src; - int srcskip = info->s_skip; + int srcskip = info->src_skip; Uint32 *dst = (Uint32 *) info->dst; - int dstskip = info->dst_pitch; + int dstskip = info->dst_skip; SDL_PixelFormat *srcfmt = info->src; SDL_PixelFormat *dstfmt = info->dst; vector unsigned int vzero = vec_splat_u32(0); vector unsigned char vpermute = calc_swizzle32(srcfmt, dstfmt); if (dstfmt->Amask && !srcfmt->Amask) { - if ((info->cmod >> 24)) { + if (info->a) { vector unsigned char valpha; - ((unsigned char *) &valpha)[0] = (info->cmod >> 24); + ((unsigned char *) &valpha)[0] = info->a; vzero = (vector unsigned int) vec_splat(valpha, 0); } } @@ -758,17 +758,17 @@ int height = info->dst_h; Uint32 *src = (Uint32 *) info->src; - int srcskip = info->s_skip; + int srcskip = info->src_skip; Uint32 *dst = (Uint32 *) info->dst; - int dstskip = info->dst_pitch; + int dstskip = info->dst_skip; SDL_PixelFormat *srcfmt = info->src; SDL_PixelFormat *dstfmt = info->dst; vector unsigned int vzero = vec_splat_u32(0); vector unsigned char vpermute = calc_swizzle32(srcfmt, dstfmt); if (dstfmt->Amask && !srcfmt->Amask) { - if ((info->cmod >> 24)) { + if (info->a) { vector unsigned char valpha; - ((unsigned char *) &valpha)[0] = (info->cmod >> 24); + ((unsigned char *) &valpha)[0] = info->a; vzero = (vector unsigned int) vec_splat(valpha, 0); } } @@ -901,9 +901,9 @@ width = info->dst_w; height = info->dst_h; src = (Uint32 *) info->src; - srcskip = info->s_skip / 4; + srcskip = info->src_skip / 4; dst = info->dst; - dstskip = info->dst_pitch; + dstskip = info->dst_skip; map = info->table; if (map == NULL) { @@ -1018,9 +1018,9 @@ width = info->dst_w; height = info->dst_h; src = (Uint32 *) info->src; - srcskip = info->s_skip / 4; + srcskip = info->src_skip / 4; dst = (Uint16 *) info->dst; - dstskip = info->dst_pitch / 2; + dstskip = info->dst_skip / 2; #ifdef USE_DUFFS_LOOP while (height--) { @@ -1142,9 +1142,9 @@ width = info->dst_w; height = info->dst_h; src = (Uint32 *) info->src; - srcskip = info->s_skip / 4; + srcskip = info->src_skip / 4; dst = (Uint16 *) info->dst; - dstskip = info->dst_pitch / 2; + dstskip = info->dst_skip / 2; #ifdef USE_DUFFS_LOOP while (height--) { @@ -1255,9 +1255,9 @@ width = info->dst_w; height = info->dst_h; src = (Uint8 *) info->src; - srcskip = info->s_skip; + srcskip = info->src_skip; dst = (Uint32 *) info->dst; - dstskip = info->dst_pitch / 4; + dstskip = info->dst_skip / 4; #ifdef USE_DUFFS_LOOP while (height--) { @@ -1877,9 +1877,9 @@ width = info->dst_w; height = info->dst_h; src = (Uint32 *) info->src; - srcskip = info->s_skip / 4; + srcskip = info->src_skip / 4; dst = info->dst; - dstskip = info->dst_pitch; + dstskip = info->dst_skip; map = info->table; #ifdef USE_DUFFS_LOOP @@ -1950,11 +1950,11 @@ width = info->dst_w; height = info->dst_h; src = info->src; - srcskip = info->s_skip; + srcskip = info->src_skip; dst = info->dst; - dstskip = info->dst_pitch; + dstskip = info->dst_skip; map = info->table; - srcfmt = info->src; + srcfmt = info->src_fmt; srcbpp = srcfmt->BytesPerPixel; if (map == NULL) { @@ -2031,15 +2031,15 @@ int width = info->dst_w; int height = info->dst_h; Uint32 *src = (Uint32 *) info->src; - int srcskip = info->s_skip; + int srcskip = info->src_skip; Uint32 *dst = (Uint32 *) info->dst; - int dstskip = info->dst_pitch; - SDL_PixelFormat *srcfmt = info->src; - SDL_PixelFormat *dstfmt = info->dst; + int dstskip = info->dst_skip; + SDL_PixelFormat *srcfmt = info->src_fmt; + SDL_PixelFormat *dstfmt = info->dst_fmt; if (dstfmt->Amask) { /* RGB->RGBA, SET_ALPHA */ - Uint32 mask = ((info->cmod >> 24) >> dstfmt->Aloss) << dstfmt->Ashift; + Uint32 mask = (info->a >> dstfmt->Aloss) << dstfmt->Ashift; while (height--) { /* *INDENT-OFF* */ @@ -2080,14 +2080,14 @@ int width = info->dst_w; int height = info->dst_h; Uint8 *src = info->src; - int srcskip = info->s_skip; + int srcskip = info->src_skip; Uint8 *dst = info->dst; - int dstskip = info->dst_pitch; - SDL_PixelFormat *srcfmt = info->src; + int dstskip = info->dst_skip; + SDL_PixelFormat *srcfmt = info->src_fmt; int srcbpp = srcfmt->BytesPerPixel; - SDL_PixelFormat *dstfmt = info->dst; + SDL_PixelFormat *dstfmt = info->dst_fmt; int dstbpp = dstfmt->BytesPerPixel; - unsigned alpha = dstfmt->Amask ? (info->cmod >> 24) : 0; + unsigned alpha = dstfmt->Amask ? info->a : 0; while (height--) { /* *INDENT-OFF* */ @@ -2115,12 +2115,12 @@ int width = info->dst_w; int height = info->dst_h; Uint8 *src = info->src; - int srcskip = info->s_skip; + int srcskip = info->src_skip; Uint8 *dst = info->dst; - int dstskip = info->dst_pitch; - SDL_PixelFormat *srcfmt = info->src; + int dstskip = info->dst_skip; + SDL_PixelFormat *srcfmt = info->src_fmt; int srcbpp = srcfmt->BytesPerPixel; - SDL_PixelFormat *dstfmt = info->dst; + SDL_PixelFormat *dstfmt = info->dst_fmt; int dstbpp = dstfmt->BytesPerPixel; int c; @@ -2145,12 +2145,12 @@ int width = info->dst_w; int height = info->dst_h; Uint8 *src = info->src; - int srcskip = info->s_skip; + int srcskip = info->src_skip; Uint8 *dst = info->dst; - int dstskip = info->dst_pitch; - SDL_PixelFormat *srcfmt = info->src; + int dstskip = info->dst_skip; + SDL_PixelFormat *srcfmt = info->src_fmt; const Uint8 *palmap = info->table; - Uint32 ckey = info->ckey; + Uint32 ckey = info->colorkey; Uint32 rgbmask = ~srcfmt->Amask; int srcbpp; Uint32 Pixel; @@ -2211,11 +2211,11 @@ int width = info->dst_w; int height = info->dst_h; Uint16 *srcp = (Uint16 *) info->src; - int srcskip = info->s_skip; + int srcskip = info->src_skip; Uint16 *dstp = (Uint16 *) info->dst; - int dstskip = info->dst_pitch; - Uint32 ckey = info->ckey; - Uint32 rgbmask = ~info->src->Amask; + int dstskip = info->dst_skip; + Uint32 ckey = info->colorkey; + Uint32 rgbmask = ~info->src_fmt->Amask; /* Set up some basic variables */ srcskip /= 2; @@ -2245,15 +2245,15 @@ int width = info->dst_w; int height = info->dst_h; Uint8 *src = info->src; - int srcskip = info->s_skip; + int srcskip = info->src_skip; Uint8 *dst = info->dst; - int dstskip = info->dst_pitch; - Uint32 ckey = info->ckey; - SDL_PixelFormat *srcfmt = info->src; - SDL_PixelFormat *dstfmt = info->dst; + int dstskip = info->dst_skip; + Uint32 ckey = info->colorkey; + SDL_PixelFormat *srcfmt = info->src_fmt; + SDL_PixelFormat *dstfmt = info->dst_fmt; int srcbpp = srcfmt->BytesPerPixel; int dstbpp = dstfmt->BytesPerPixel; - unsigned alpha = dstfmt->Amask ? (info->cmod >> 24) : 0; + unsigned alpha = dstfmt->Amask ? info->a : 0; Uint32 rgbmask = ~srcfmt->Amask; /* Set up some basic variables */ @@ -2288,12 +2288,12 @@ int width = info->dst_w; int height = info->dst_h; Uint8 *src = info->src; - int srcskip = info->s_skip; + int srcskip = info->src_skip; Uint8 *dst = info->dst; - int dstskip = info->dst_pitch; - Uint32 ckey = info->ckey; - SDL_PixelFormat *srcfmt = info->src; - SDL_PixelFormat *dstfmt = info->dst; + int dstskip = info->dst_skip; + Uint32 ckey = info->colorkey; + SDL_PixelFormat *srcfmt = info->src_fmt; + SDL_PixelFormat *dstfmt = info->dst_fmt; Uint32 rgbmask = ~srcfmt->Amask; Uint8 srcbpp; @@ -2332,7 +2332,7 @@ int dstbpp; Uint32 dstR, dstG, dstB; Uint32 blit_features; - SDL_loblit blitfunc; + SDL_BlitFunc blitfunc; enum { NO_ALPHA = 1, SET_ALPHA = 2, COPY_ALPHA = 4 } alpha; }; @@ -2403,30 +2403,77 @@ /* Mask matches table, or table entry is zero */ #define MASKOK(x, y) (((x) == (y)) || ((y) == 0x00000000)) -SDL_loblit -SDL_CalculateBlitN(SDL_Surface * surface, int blit_index) +SDL_BlitFunc +SDL_CalculateBlitN(SDL_Surface * surface) { SDL_PixelFormat *srcfmt; SDL_PixelFormat *dstfmt; const struct blit_table *table; int which; - SDL_loblit blitfun; + SDL_BlitFunc blitfun; /* Set up data for choosing the blit */ srcfmt = surface->format; dstfmt = surface->map->dst->format; - if (blit_index & 2) { - /* alpha or alpha+colorkey */ - return SDL_CalculateAlphaBlit(surface, blit_index); - } - /* We don't support destinations less than 8-bits */ if (dstfmt->BitsPerPixel < 8) { return (NULL); } - if (blit_index == 1) { + switch (surface->map->info.flags) { + case 0: + blitfun = NULL; + if (dstfmt->BitsPerPixel == 8) { + /* We assume 8-bit destinations are palettized */ + if ((srcfmt->BytesPerPixel == 4) && + (srcfmt->Rmask == 0x00FF0000) && + (srcfmt->Gmask == 0x0000FF00) && + (srcfmt->Bmask == 0x000000FF)) { + if (surface->map->info.table) { + blitfun = Blit_RGB888_index8_map; + } else { + blitfun = Blit_RGB888_index8; + } + } else { + blitfun = BlitNto1; + } + } else { + /* Now the meat, choose the blitter we want */ + int a_need = NO_ALPHA; + if (dstfmt->Amask) + a_need = srcfmt->Amask ? COPY_ALPHA : SET_ALPHA; + table = normal_blit[srcfmt->BytesPerPixel - 1]; + for (which = 0; table[which].dstbpp; ++which) { + if (MASKOK(srcfmt->Rmask, table[which].srcR) && + MASKOK(srcfmt->Gmask, table[which].srcG) && + MASKOK(srcfmt->Bmask, table[which].srcB) && + MASKOK(dstfmt->Rmask, table[which].dstR) && + MASKOK(dstfmt->Gmask, table[which].dstG) && + MASKOK(dstfmt->Bmask, table[which].dstB) && + dstfmt->BytesPerPixel == table[which].dstbpp && + (a_need & table[which].alpha) == a_need && + ((table[which].blit_features & GetBlitFeatures()) == + table[which].blit_features)) + break; + } + blitfun = table[which].blitfunc; + + if (blitfun == BlitNtoN) { /* default C fallback catch-all. Slow! */ + /* Fastpath C fallback: 32bit RGB<->RGBA blit with matching RGB */ + if (srcfmt->BytesPerPixel == 4 && dstfmt->BytesPerPixel == 4 + && srcfmt->Rmask == dstfmt->Rmask + && srcfmt->Gmask == dstfmt->Gmask + && srcfmt->Bmask == dstfmt->Bmask) { + blitfun = Blit4to4MaskAlpha; + } else if (a_need == COPY_ALPHA) { + blitfun = BlitNtoNCopyAlpha; + } + } + } + return (blitfun); + + case SDL_COPY_COLORKEY: /* colorkey blit: Here we don't have too many options, mostly because RLE is the preferred fast way to deal with this. If a particular case turns out to be useful we'll add it. */ @@ -2442,70 +2489,15 @@ return Blit32to32KeyAltivec; } else #endif - - if (srcfmt->Amask && dstfmt->Amask) + if (srcfmt->Amask && dstfmt->Amask) { return BlitNtoNKeyCopyAlpha; - else - return BlitNtoNKey; - } - } - - blitfun = NULL; - if (dstfmt->BitsPerPixel == 8) { - /* We assume 8-bit destinations are palettized */ - if ((srcfmt->BytesPerPixel == 4) && - (srcfmt->Rmask == 0x00FF0000) && - (srcfmt->Gmask == 0x0000FF00) && (srcfmt->Bmask == 0x000000FF)) { - if (surface->map->table) { - blitfun = Blit_RGB888_index8_map; } else { - blitfun = Blit_RGB888_index8; - } - } else { - blitfun = BlitNto1; - } - } else { - /* Now the meat, choose the blitter we want */ - int a_need = NO_ALPHA; - if (dstfmt->Amask) - a_need = srcfmt->Amask ? COPY_ALPHA : SET_ALPHA; - table = normal_blit[srcfmt->BytesPerPixel - 1]; - for (which = 0; table[which].dstbpp; ++which) { - if (MASKOK(srcfmt->Rmask, table[which].srcR) && - MASKOK(srcfmt->Gmask, table[which].srcG) && - MASKOK(srcfmt->Bmask, table[which].srcB) && - MASKOK(dstfmt->Rmask, table[which].dstR) && - MASKOK(dstfmt->Gmask, table[which].dstG) && - MASKOK(dstfmt->Bmask, table[which].dstB) && - dstfmt->BytesPerPixel == table[which].dstbpp && - (a_need & table[which].alpha) == a_need && - ((table[which].blit_features & GetBlitFeatures()) == - table[which].blit_features)) - break; - } - blitfun = table[which].blitfunc; - - if (blitfun == BlitNtoN) { /* default C fallback catch-all. Slow! */ - /* Fastpath C fallback: 32bit RGB<->RGBA blit with matching RGB */ - if (srcfmt->BytesPerPixel == 4 && dstfmt->BytesPerPixel == 4 && - srcfmt->Rmask == dstfmt->Rmask && - srcfmt->Gmask == dstfmt->Gmask && - srcfmt->Bmask == dstfmt->Bmask) { - blitfun = Blit4to4MaskAlpha; - } else if (a_need == COPY_ALPHA) { - blitfun = BlitNtoNCopyAlpha; + return BlitNtoNKey; } } } -#ifdef DEBUG_ASM - if ((blitfun == BlitNtoN) || (blitfun == BlitNto1)) - fprintf(stderr, "Using C blit\n"); - else - fprintf(stderr, "Using optimized C blit\n"); -#endif /* DEBUG_ASM */ - - return (blitfun); + return NULL; } /* vi: set ts=4 sw=4 expandtab: */