Rework previous refactoring to use new generic colorkey/alphamod routines
This commit is contained in:
@@ -533,18 +533,10 @@ blt_prim(SDL_Surface *src, SDL_Rect src_r, RenderPixelFn plot, int factor,
|
||||
mask = srcfmt->Amask;
|
||||
key = 0;
|
||||
}
|
||||
#if SDL_MAJOR_VERSION == 1
|
||||
else if (src->flags & SDL_SRCCOLORKEY)
|
||||
{ // colorkey transparency
|
||||
mask = ~srcfmt->Amask;
|
||||
key = srcfmt->colorkey & mask;
|
||||
}
|
||||
#else
|
||||
else if (SDL_GetColorKey (src, &key) == 0)
|
||||
else if (TFB_GetColorKey (src, &key) == 0)
|
||||
{
|
||||
mask = ~0;
|
||||
}
|
||||
#endif
|
||||
// TODO: calculate the source and destination pointers directly
|
||||
// instead of using the plot(x,y) version
|
||||
for (y = 0; y < src_r.h; ++y)
|
||||
|
||||
@@ -110,283 +110,6 @@ TFB_ReInitGraphics (int driver, int flags, int width, int height)
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Probably ought to clean this away at some point. */
|
||||
SDL_Surface *
|
||||
TFB_DisplayFormatAlpha (SDL_Surface *surface)
|
||||
{
|
||||
SDL_Surface* newsurf;
|
||||
SDL_PixelFormat* dstfmt;
|
||||
const SDL_PixelFormat* srcfmt = surface->format;
|
||||
|
||||
// figure out what format to use (alpha/no alpha)
|
||||
if (surface->format->Amask)
|
||||
dstfmt = format_conv_surf->format;
|
||||
else
|
||||
dstfmt = SDL_Screen->format;
|
||||
|
||||
if (srcfmt->BytesPerPixel == dstfmt->BytesPerPixel &&
|
||||
srcfmt->Rmask == dstfmt->Rmask &&
|
||||
srcfmt->Gmask == dstfmt->Gmask &&
|
||||
srcfmt->Bmask == dstfmt->Bmask &&
|
||||
srcfmt->Amask == dstfmt->Amask)
|
||||
return surface; // no conversion needed
|
||||
|
||||
newsurf = SDL_ConvertSurface (surface, dstfmt, surface->flags);
|
||||
// SDL_SRCCOLORKEY and SDL_SRCALPHA cannot work at the same time,
|
||||
// so we need to disable one of them
|
||||
if ((surface->flags & SDL_SRCCOLORKEY) && newsurf
|
||||
&& (newsurf->flags & SDL_SRCCOLORKEY)
|
||||
&& (newsurf->flags & SDL_SRCALPHA))
|
||||
SDL_SetAlpha (newsurf, 0, 255);
|
||||
|
||||
return newsurf;
|
||||
}
|
||||
|
||||
void
|
||||
TFB_BlitSurface (SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst,
|
||||
SDL_Rect *dstrect, int blend_numer, int blend_denom)
|
||||
{
|
||||
BOOLEAN has_colorkey;
|
||||
int x, y, x1, y1, x2, y2, dst_x2, dst_y2, nr, ng, nb;
|
||||
int srcx, srcy, w, h;
|
||||
Uint8 sr, sg, sb, dr, dg, db;
|
||||
Uint32 src_pixval, dst_pixval, colorkey;
|
||||
GetPixelFn src_getpix, dst_getpix;
|
||||
PutPixelFn putpix;
|
||||
SDL_Rect fulldst;
|
||||
|
||||
if (blend_numer == blend_denom)
|
||||
{
|
||||
// normal blit: dst = src
|
||||
|
||||
// log_add (log_Debug, "normal blit\n");
|
||||
SDL_BlitSurface (src, srcrect, dst, dstrect);
|
||||
return;
|
||||
}
|
||||
|
||||
// NOTE: following clipping code is copied from SDL-1.2.4 sources
|
||||
|
||||
// If the destination rectangle is NULL, use the entire dest surface
|
||||
if (dstrect == NULL)
|
||||
{
|
||||
fulldst.x = fulldst.y = 0;
|
||||
dstrect = &fulldst;
|
||||
}
|
||||
|
||||
// clip the source rectangle to the source surface
|
||||
if (srcrect)
|
||||
{
|
||||
int maxw, maxh;
|
||||
|
||||
srcx = srcrect->x;
|
||||
w = srcrect->w;
|
||||
if (srcx < 0)
|
||||
{
|
||||
w += srcx;
|
||||
dstrect->x -= srcx;
|
||||
srcx = 0;
|
||||
}
|
||||
maxw = src->w - srcx;
|
||||
if (maxw < w)
|
||||
w = maxw;
|
||||
|
||||
srcy = srcrect->y;
|
||||
h = srcrect->h;
|
||||
if (srcy < 0)
|
||||
{
|
||||
h += srcy;
|
||||
dstrect->y -= srcy;
|
||||
srcy = 0;
|
||||
}
|
||||
maxh = src->h - srcy;
|
||||
if (maxh < h)
|
||||
h = maxh;
|
||||
}
|
||||
else
|
||||
{
|
||||
srcx = 0;
|
||||
srcy = 0;
|
||||
w = src->w;
|
||||
h = src->h;
|
||||
}
|
||||
|
||||
// clip the destination rectangle against the clip rectangle
|
||||
{
|
||||
SDL_Rect *clip = &dst->clip_rect;
|
||||
int dx, dy;
|
||||
|
||||
dx = clip->x - dstrect->x;
|
||||
if (dx > 0)
|
||||
{
|
||||
w -= dx;
|
||||
dstrect->x += dx;
|
||||
srcx += dx;
|
||||
}
|
||||
dx = dstrect->x + w - clip->x - clip->w;
|
||||
if (dx > 0)
|
||||
w -= dx;
|
||||
|
||||
dy = clip->y - dstrect->y;
|
||||
if (dy > 0)
|
||||
{
|
||||
h -= dy;
|
||||
dstrect->y += dy;
|
||||
srcy += dy;
|
||||
}
|
||||
dy = dstrect->y + h - clip->y - clip->h;
|
||||
if (dy > 0)
|
||||
h -= dy;
|
||||
}
|
||||
|
||||
dstrect->w = w;
|
||||
dstrect->h = h;
|
||||
|
||||
if (w <= 0 || h <= 0)
|
||||
return;
|
||||
|
||||
x1 = srcx;
|
||||
y1 = srcy;
|
||||
x2 = srcx + w;
|
||||
y2 = srcy + h;
|
||||
|
||||
if (src->flags & SDL_SRCCOLORKEY)
|
||||
{
|
||||
has_colorkey = TRUE;
|
||||
colorkey = src->format->colorkey;
|
||||
}
|
||||
else
|
||||
{
|
||||
has_colorkey = FALSE;
|
||||
colorkey = 0; /* Satisfying compiler */
|
||||
}
|
||||
|
||||
src_getpix = getpixel_for (src);
|
||||
dst_getpix = getpixel_for (dst);
|
||||
putpix = putpixel_for (dst);
|
||||
|
||||
if (blend_denom < 0)
|
||||
{
|
||||
// additive blit: dst = src + dst
|
||||
#if 0
|
||||
log_add (log_Debug, "additive blit %d %d, src %d %d %d %d dst %d %d,"
|
||||
" srcbpp %d", blend_numer, blend_denom, x1, y1, x2, y2,
|
||||
dstrect->x, dstrect->y, src->format->BitsPerPixel);
|
||||
#endif
|
||||
for (y = y1; y < y2; ++y)
|
||||
{
|
||||
dst_y2 = dstrect->y + (y - y1);
|
||||
for (x = x1; x < x2; ++x)
|
||||
{
|
||||
dst_x2 = dstrect->x + (x - x1);
|
||||
src_pixval = src_getpix (src, x, y);
|
||||
|
||||
if (has_colorkey && src_pixval == colorkey)
|
||||
continue;
|
||||
|
||||
dst_pixval = dst_getpix (dst, dst_x2, dst_y2);
|
||||
|
||||
SDL_GetRGB (src_pixval, src->format, &sr, &sg, &sb);
|
||||
SDL_GetRGB (dst_pixval, dst->format, &dr, &dg, &db);
|
||||
|
||||
nr = sr + dr;
|
||||
ng = sg + dg;
|
||||
nb = sb + db;
|
||||
|
||||
if (nr > 255)
|
||||
nr = 255;
|
||||
if (ng > 255)
|
||||
ng = 255;
|
||||
if (nb > 255)
|
||||
nb = 255;
|
||||
|
||||
putpix (dst, dst_x2, dst_y2,
|
||||
SDL_MapRGB (dst->format, nr, ng, nb));
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (blend_numer < 0)
|
||||
{
|
||||
// subtractive blit: dst = src - dst
|
||||
#if 0
|
||||
log_add (log_Debug, "subtractive blit %d %d, src %d %d %d %d"
|
||||
" dst %d %d, srcbpp %d", blend_numer, blend_denom,
|
||||
x1, y1, x2, y2, dstrect->x, dstrect->y,
|
||||
src->format->BitsPerPixel);
|
||||
#endif
|
||||
for (y = y1; y < y2; ++y)
|
||||
{
|
||||
dst_y2 = dstrect->y + (y - y1);
|
||||
for (x = x1; x < x2; ++x)
|
||||
{
|
||||
dst_x2 = dstrect->x + (x - x1);
|
||||
src_pixval = src_getpix (src, x, y);
|
||||
|
||||
if (has_colorkey && src_pixval == colorkey)
|
||||
continue;
|
||||
|
||||
dst_pixval = dst_getpix (dst, dst_x2, dst_y2);
|
||||
|
||||
SDL_GetRGB (src_pixval, src->format, &sr, &sg, &sb);
|
||||
SDL_GetRGB (dst_pixval, dst->format, &dr, &dg, &db);
|
||||
|
||||
nr = sr - dr;
|
||||
ng = sg - dg;
|
||||
nb = sb - db;
|
||||
|
||||
if (nr < 0)
|
||||
nr = 0;
|
||||
if (ng < 0)
|
||||
ng = 0;
|
||||
if (nb < 0)
|
||||
nb = 0;
|
||||
|
||||
putpix (dst, dst_x2, dst_y2,
|
||||
SDL_MapRGB (dst->format, nr, ng, nb));
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// modulated blit: dst = src * (blend_numer / blend_denom)
|
||||
|
||||
float f = blend_numer / (float)blend_denom;
|
||||
#if 0
|
||||
log_add (log_Debug, "modulated blit %d %d, f %f, src %d %d %d %d"
|
||||
" dst %d %d, srcbpp %d\n", blend_numer, blend_denom, f,
|
||||
x1, y1, x2, y2, dstrect->x, dstrect->y,
|
||||
src->format->BitsPerPixel);
|
||||
#endif
|
||||
for (y = y1; y < y2; ++y)
|
||||
{
|
||||
dst_y2 = dstrect->y + (y - y1);
|
||||
for (x = x1; x < x2; ++x)
|
||||
{
|
||||
dst_x2 = dstrect->x + (x - x1);
|
||||
src_pixval = src_getpix (src, x, y);
|
||||
|
||||
if (has_colorkey && src_pixval == colorkey)
|
||||
continue;
|
||||
|
||||
SDL_GetRGB (src_pixval, src->format, &sr, &sg, &sb);
|
||||
|
||||
nr = (int)(sr * f);
|
||||
ng = (int)(sg * f);
|
||||
nb = (int)(sb * f);
|
||||
|
||||
if (nr > 255)
|
||||
nr = 255;
|
||||
if (ng > 255)
|
||||
ng = 255;
|
||||
if (nb > 255)
|
||||
nb = 255;
|
||||
|
||||
putpix (dst, dst_x2, dst_y2,
|
||||
SDL_MapRGB (dst->format, nr, ng, nb));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
TFB_SetGamma (float gamma)
|
||||
{
|
||||
|
||||
@@ -79,7 +79,7 @@ TFB_ReInitGraphics (int driver, int flags, int width, int height)
|
||||
|
||||
GfxFlags = flags;
|
||||
|
||||
result = TFB_Pure_ConfigureVideo (TFB_GFXDRIVER_SDL_PURE, flags,
|
||||
result = TFB_Pure_ConfigureVideo (TFB_GFXDRIVER_SDL_PURE, flags,
|
||||
width, height, togglefullscreen);
|
||||
|
||||
if (flags & TFB_GFXFLAGS_FULLSCREEN)
|
||||
@@ -90,276 +90,6 @@ TFB_ReInitGraphics (int driver, int flags, int width, int height)
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Probably ought to clean this away at some point. */
|
||||
SDL_Surface *
|
||||
TFB_DisplayFormatAlpha (SDL_Surface *surface)
|
||||
{
|
||||
SDL_Surface* newsurf;
|
||||
SDL_PixelFormat* dstfmt;
|
||||
const SDL_PixelFormat* srcfmt = surface->format;
|
||||
|
||||
// figure out what format to use (alpha/no alpha)
|
||||
if (surface->format->Amask)
|
||||
dstfmt = format_conv_surf->format;
|
||||
else
|
||||
dstfmt = SDL_Screen->format;
|
||||
|
||||
if (srcfmt->BytesPerPixel == dstfmt->BytesPerPixel &&
|
||||
srcfmt->Rmask == dstfmt->Rmask &&
|
||||
srcfmt->Gmask == dstfmt->Gmask &&
|
||||
srcfmt->Bmask == dstfmt->Bmask &&
|
||||
srcfmt->Amask == dstfmt->Amask)
|
||||
return surface; // no conversion needed
|
||||
|
||||
newsurf = SDL_ConvertSurface (surface, dstfmt, 0);
|
||||
|
||||
return newsurf;
|
||||
}
|
||||
|
||||
void
|
||||
TFB_BlitSurface (SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst,
|
||||
SDL_Rect *dstrect, int blend_numer, int blend_denom)
|
||||
{
|
||||
BOOLEAN has_colorkey;
|
||||
int x, y, x1, y1, x2, y2, dst_x2, dst_y2, nr, ng, nb;
|
||||
int srcx, srcy, w, h;
|
||||
Uint8 sr, sg, sb, dr, dg, db;
|
||||
Uint32 src_pixval, dst_pixval, colorkey;
|
||||
GetPixelFn src_getpix, dst_getpix;
|
||||
PutPixelFn putpix;
|
||||
SDL_Rect fulldst;
|
||||
|
||||
if (blend_numer == blend_denom)
|
||||
{
|
||||
// normal blit: dst = src
|
||||
|
||||
// log_add (log_Debug, "normal blit\n");
|
||||
SDL_BlitSurface (src, srcrect, dst, dstrect);
|
||||
return;
|
||||
}
|
||||
|
||||
// NOTE: following clipping code is copied from SDL-1.2.4 sources
|
||||
|
||||
// If the destination rectangle is NULL, use the entire dest surface
|
||||
if (dstrect == NULL)
|
||||
{
|
||||
fulldst.x = fulldst.y = 0;
|
||||
dstrect = &fulldst;
|
||||
}
|
||||
|
||||
// clip the source rectangle to the source surface
|
||||
if (srcrect)
|
||||
{
|
||||
int maxw, maxh;
|
||||
|
||||
srcx = srcrect->x;
|
||||
w = srcrect->w;
|
||||
if (srcx < 0)
|
||||
{
|
||||
w += srcx;
|
||||
dstrect->x -= srcx;
|
||||
srcx = 0;
|
||||
}
|
||||
maxw = src->w - srcx;
|
||||
if (maxw < w)
|
||||
w = maxw;
|
||||
|
||||
srcy = srcrect->y;
|
||||
h = srcrect->h;
|
||||
if (srcy < 0)
|
||||
{
|
||||
h += srcy;
|
||||
dstrect->y -= srcy;
|
||||
srcy = 0;
|
||||
}
|
||||
maxh = src->h - srcy;
|
||||
if (maxh < h)
|
||||
h = maxh;
|
||||
}
|
||||
else
|
||||
{
|
||||
srcx = 0;
|
||||
srcy = 0;
|
||||
w = src->w;
|
||||
h = src->h;
|
||||
}
|
||||
|
||||
// clip the destination rectangle against the clip rectangle
|
||||
{
|
||||
SDL_Rect *clip = &dst->clip_rect;
|
||||
int dx, dy;
|
||||
|
||||
dx = clip->x - dstrect->x;
|
||||
if (dx > 0)
|
||||
{
|
||||
w -= dx;
|
||||
dstrect->x += dx;
|
||||
srcx += dx;
|
||||
}
|
||||
dx = dstrect->x + w - clip->x - clip->w;
|
||||
if (dx > 0)
|
||||
w -= dx;
|
||||
|
||||
dy = clip->y - dstrect->y;
|
||||
if (dy > 0)
|
||||
{
|
||||
h -= dy;
|
||||
dstrect->y += dy;
|
||||
srcy += dy;
|
||||
}
|
||||
dy = dstrect->y + h - clip->y - clip->h;
|
||||
if (dy > 0)
|
||||
h -= dy;
|
||||
}
|
||||
|
||||
dstrect->w = w;
|
||||
dstrect->h = h;
|
||||
|
||||
if (w <= 0 || h <= 0)
|
||||
return;
|
||||
|
||||
x1 = srcx;
|
||||
y1 = srcy;
|
||||
x2 = srcx + w;
|
||||
y2 = srcy + h;
|
||||
|
||||
if (SDL_GetColorKey (src, &colorkey) < 0)
|
||||
{
|
||||
has_colorkey = FALSE;
|
||||
colorkey = 0; /* Satisfying compiler */
|
||||
}
|
||||
else
|
||||
{
|
||||
has_colorkey = TRUE;
|
||||
}
|
||||
|
||||
src_getpix = getpixel_for (src);
|
||||
dst_getpix = getpixel_for (dst);
|
||||
putpix = putpixel_for (dst);
|
||||
|
||||
if (blend_denom < 0)
|
||||
{
|
||||
// additive blit: dst = src + dst
|
||||
#if 0
|
||||
log_add (log_Debug, "additive blit %d %d, src %d %d %d %d dst %d %d,"
|
||||
" srcbpp %d", blend_numer, blend_denom, x1, y1, x2, y2,
|
||||
dstrect->x, dstrect->y, src->format->BitsPerPixel);
|
||||
#endif
|
||||
for (y = y1; y < y2; ++y)
|
||||
{
|
||||
dst_y2 = dstrect->y + (y - y1);
|
||||
for (x = x1; x < x2; ++x)
|
||||
{
|
||||
dst_x2 = dstrect->x + (x - x1);
|
||||
src_pixval = src_getpix (src, x, y);
|
||||
|
||||
if (has_colorkey && src_pixval == colorkey)
|
||||
continue;
|
||||
|
||||
dst_pixval = dst_getpix (dst, dst_x2, dst_y2);
|
||||
|
||||
SDL_GetRGB (src_pixval, src->format, &sr, &sg, &sb);
|
||||
SDL_GetRGB (dst_pixval, dst->format, &dr, &dg, &db);
|
||||
|
||||
nr = sr + dr;
|
||||
ng = sg + dg;
|
||||
nb = sb + db;
|
||||
|
||||
if (nr > 255)
|
||||
nr = 255;
|
||||
if (ng > 255)
|
||||
ng = 255;
|
||||
if (nb > 255)
|
||||
nb = 255;
|
||||
|
||||
putpix (dst, dst_x2, dst_y2,
|
||||
SDL_MapRGB (dst->format, nr, ng, nb));
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (blend_numer < 0)
|
||||
{
|
||||
// subtractive blit: dst = src - dst
|
||||
#if 0
|
||||
log_add (log_Debug, "subtractive blit %d %d, src %d %d %d %d"
|
||||
" dst %d %d, srcbpp %d", blend_numer, blend_denom,
|
||||
x1, y1, x2, y2, dstrect->x, dstrect->y,
|
||||
src->format->BitsPerPixel);
|
||||
#endif
|
||||
for (y = y1; y < y2; ++y)
|
||||
{
|
||||
dst_y2 = dstrect->y + (y - y1);
|
||||
for (x = x1; x < x2; ++x)
|
||||
{
|
||||
dst_x2 = dstrect->x + (x - x1);
|
||||
src_pixval = src_getpix (src, x, y);
|
||||
|
||||
if (has_colorkey && src_pixval == colorkey)
|
||||
continue;
|
||||
|
||||
dst_pixval = dst_getpix (dst, dst_x2, dst_y2);
|
||||
|
||||
SDL_GetRGB (src_pixval, src->format, &sr, &sg, &sb);
|
||||
SDL_GetRGB (dst_pixval, dst->format, &dr, &dg, &db);
|
||||
|
||||
nr = sr - dr;
|
||||
ng = sg - dg;
|
||||
nb = sb - db;
|
||||
|
||||
if (nr < 0)
|
||||
nr = 0;
|
||||
if (ng < 0)
|
||||
ng = 0;
|
||||
if (nb < 0)
|
||||
nb = 0;
|
||||
|
||||
putpix (dst, dst_x2, dst_y2,
|
||||
SDL_MapRGB (dst->format, nr, ng, nb));
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// modulated blit: dst = src * (blend_numer / blend_denom)
|
||||
|
||||
float f = blend_numer / (float)blend_denom;
|
||||
#if 0
|
||||
log_add (log_Debug, "modulated blit %d %d, f %f, src %d %d %d %d"
|
||||
" dst %d %d, srcbpp %d\n", blend_numer, blend_denom, f,
|
||||
x1, y1, x2, y2, dstrect->x, dstrect->y,
|
||||
src->format->BitsPerPixel);
|
||||
#endif
|
||||
for (y = y1; y < y2; ++y)
|
||||
{
|
||||
dst_y2 = dstrect->y + (y - y1);
|
||||
for (x = x1; x < x2; ++x)
|
||||
{
|
||||
dst_x2 = dstrect->x + (x - x1);
|
||||
src_pixval = src_getpix (src, x, y);
|
||||
|
||||
if (has_colorkey && src_pixval == colorkey)
|
||||
continue;
|
||||
|
||||
SDL_GetRGB (src_pixval, src->format, &sr, &sg, &sb);
|
||||
|
||||
nr = (int)(sr * f);
|
||||
ng = (int)(sg * f);
|
||||
nb = (int)(sb * f);
|
||||
|
||||
if (nr > 255)
|
||||
nr = 255;
|
||||
if (ng > 255)
|
||||
ng = 255;
|
||||
if (nb > 255)
|
||||
nb = 255;
|
||||
|
||||
putpix (dst, dst_x2, dst_y2,
|
||||
SDL_MapRGB (dst->format, nr, ng, nb));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
TFB_SetGamma (float gamma)
|
||||
{
|
||||
|
||||
@@ -80,8 +80,8 @@ TFB_InitGraphics (int driver, int flags, int width, int height)
|
||||
result = TFB_Pure_InitGraphics (driver, flags, width, height);
|
||||
}
|
||||
|
||||
sprintf (caption, "The Ur-Quan Masters v%d.%d.%d%s",
|
||||
UQM_MAJOR_VERSION, UQM_MINOR_VERSION,
|
||||
sprintf (caption, "The Ur-Quan Masters v%d.%d.%d%s",
|
||||
UQM_MAJOR_VERSION, UQM_MINOR_VERSION,
|
||||
UQM_PATCH_VERSION, UQM_EXTRA_VERSION);
|
||||
SDL_WM_SetCaption (caption, NULL);
|
||||
|
||||
@@ -121,7 +121,7 @@ TFB_ProcessEvents ()
|
||||
/* Up to three different state changes can occur in one event. */
|
||||
/* Here, disregard least significant change (mouse focus). */
|
||||
// This controls the automatic sleep/pause when minimized.
|
||||
// On small displays (e.g. mobile devices), APPINPUTFOCUS would
|
||||
// On small displays (e.g. mobile devices), APPINPUTFOCUS would
|
||||
// be an appropriate substitution for APPACTIVE:
|
||||
// if (Event.active.state & SDL_APPINPUTFOCUS)
|
||||
if (Event.active.state & SDL_APPACTIVE)
|
||||
@@ -192,7 +192,7 @@ TFB_SwapBuffers (int force_full_redraw)
|
||||
force_full_redraw = TFB_REDRAW_FADING;
|
||||
|
||||
last_fade_amount = fade_amount;
|
||||
last_transition_amount = transition_amount;
|
||||
last_transition_amount = transition_amount;
|
||||
|
||||
graphics_backend->preprocess (force_full_redraw, transition_amount,
|
||||
fade_amount);
|
||||
@@ -217,7 +217,7 @@ TFB_SwapBuffers (int force_full_redraw)
|
||||
}
|
||||
else
|
||||
{
|
||||
graphics_backend->color (255, 255, 255,
|
||||
graphics_backend->color (255, 255, 255,
|
||||
fade_amount - 255, NULL);
|
||||
}
|
||||
}
|
||||
@@ -230,6 +230,40 @@ TFB_SwapBuffers (int force_full_redraw)
|
||||
graphics_backend->postprocess ();
|
||||
}
|
||||
|
||||
/* Probably ought to clean this away at some point. */
|
||||
SDL_Surface *
|
||||
TFB_DisplayFormatAlpha (SDL_Surface *surface)
|
||||
{
|
||||
SDL_Surface* newsurf;
|
||||
SDL_PixelFormat* dstfmt;
|
||||
const SDL_PixelFormat* srcfmt = surface->format;
|
||||
|
||||
// figure out what format to use (alpha/no alpha)
|
||||
if (surface->format->Amask)
|
||||
dstfmt = format_conv_surf->format;
|
||||
else
|
||||
dstfmt = SDL_Screen->format;
|
||||
|
||||
if (srcfmt->BytesPerPixel == dstfmt->BytesPerPixel &&
|
||||
srcfmt->Rmask == dstfmt->Rmask &&
|
||||
srcfmt->Gmask == dstfmt->Gmask &&
|
||||
srcfmt->Bmask == dstfmt->Bmask &&
|
||||
srcfmt->Amask == dstfmt->Amask)
|
||||
return surface; // no conversion needed
|
||||
|
||||
newsurf = SDL_ConvertSurface (surface, dstfmt, surface->flags);
|
||||
// Colorkeys and surface-level alphas cannot work at the same time,
|
||||
// so we need to disable one of them
|
||||
if (TFB_HasColorKey (surface) && newsurf &&
|
||||
TFB_HasColorKey (newsurf) &&
|
||||
TFB_HasSurfaceAlphaMod (newsurf))
|
||||
{
|
||||
TFB_DisableSurfaceAlphaMod (newsurf);
|
||||
}
|
||||
|
||||
return newsurf;
|
||||
}
|
||||
|
||||
// This function should only be called from the graphics thread,
|
||||
// like from a TFB_DrawCommand_Callback command.
|
||||
TFB_Canvas
|
||||
@@ -238,6 +272,250 @@ TFB_GetScreenCanvas (SCREEN screen)
|
||||
return SDL_Screens[screen];
|
||||
}
|
||||
|
||||
void
|
||||
TFB_BlitSurface (SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst,
|
||||
SDL_Rect *dstrect, int blend_numer, int blend_denom)
|
||||
{
|
||||
BOOLEAN has_colorkey;
|
||||
int x, y, x1, y1, x2, y2, dst_x2, dst_y2, nr, ng, nb;
|
||||
int srcx, srcy, w, h;
|
||||
Uint8 sr, sg, sb, dr, dg, db;
|
||||
Uint32 src_pixval, dst_pixval, colorkey;
|
||||
GetPixelFn src_getpix, dst_getpix;
|
||||
PutPixelFn putpix;
|
||||
SDL_Rect fulldst;
|
||||
|
||||
if (blend_numer == blend_denom)
|
||||
{
|
||||
// normal blit: dst = src
|
||||
|
||||
// log_add (log_Debug, "normal blit\n");
|
||||
SDL_BlitSurface (src, srcrect, dst, dstrect);
|
||||
return;
|
||||
}
|
||||
|
||||
// NOTE: following clipping code is copied from SDL-1.2.4 sources
|
||||
|
||||
// If the destination rectangle is NULL, use the entire dest surface
|
||||
if (dstrect == NULL)
|
||||
{
|
||||
fulldst.x = fulldst.y = 0;
|
||||
dstrect = &fulldst;
|
||||
}
|
||||
|
||||
// clip the source rectangle to the source surface
|
||||
if (srcrect)
|
||||
{
|
||||
int maxw, maxh;
|
||||
|
||||
srcx = srcrect->x;
|
||||
w = srcrect->w;
|
||||
if (srcx < 0)
|
||||
{
|
||||
w += srcx;
|
||||
dstrect->x -= srcx;
|
||||
srcx = 0;
|
||||
}
|
||||
maxw = src->w - srcx;
|
||||
if (maxw < w)
|
||||
w = maxw;
|
||||
|
||||
srcy = srcrect->y;
|
||||
h = srcrect->h;
|
||||
if (srcy < 0)
|
||||
{
|
||||
h += srcy;
|
||||
dstrect->y -= srcy;
|
||||
srcy = 0;
|
||||
}
|
||||
maxh = src->h - srcy;
|
||||
if (maxh < h)
|
||||
h = maxh;
|
||||
}
|
||||
else
|
||||
{
|
||||
srcx = 0;
|
||||
srcy = 0;
|
||||
w = src->w;
|
||||
h = src->h;
|
||||
}
|
||||
|
||||
// clip the destination rectangle against the clip rectangle
|
||||
{
|
||||
SDL_Rect *clip = &dst->clip_rect;
|
||||
int dx, dy;
|
||||
|
||||
dx = clip->x - dstrect->x;
|
||||
if (dx > 0)
|
||||
{
|
||||
w -= dx;
|
||||
dstrect->x += dx;
|
||||
srcx += dx;
|
||||
}
|
||||
dx = dstrect->x + w - clip->x - clip->w;
|
||||
if (dx > 0)
|
||||
w -= dx;
|
||||
|
||||
dy = clip->y - dstrect->y;
|
||||
if (dy > 0)
|
||||
{
|
||||
h -= dy;
|
||||
dstrect->y += dy;
|
||||
srcy += dy;
|
||||
}
|
||||
dy = dstrect->y + h - clip->y - clip->h;
|
||||
if (dy > 0)
|
||||
h -= dy;
|
||||
}
|
||||
|
||||
dstrect->w = w;
|
||||
dstrect->h = h;
|
||||
|
||||
if (w <= 0 || h <= 0)
|
||||
return;
|
||||
|
||||
x1 = srcx;
|
||||
y1 = srcy;
|
||||
x2 = srcx + w;
|
||||
y2 = srcy + h;
|
||||
|
||||
if (TFB_GetColorKey (src, &colorkey) < 0)
|
||||
{
|
||||
has_colorkey = FALSE;
|
||||
colorkey = 0; /* Satisfying compiler */
|
||||
}
|
||||
else
|
||||
{
|
||||
has_colorkey = TRUE;
|
||||
}
|
||||
|
||||
src_getpix = getpixel_for (src);
|
||||
dst_getpix = getpixel_for (dst);
|
||||
putpix = putpixel_for (dst);
|
||||
|
||||
if (blend_denom < 0)
|
||||
{
|
||||
// additive blit: dst = src + dst
|
||||
#if 0
|
||||
log_add (log_Debug, "additive blit %d %d, src %d %d %d %d dst %d %d,"
|
||||
" srcbpp %d", blend_numer, blend_denom, x1, y1, x2, y2,
|
||||
dstrect->x, dstrect->y, src->format->BitsPerPixel);
|
||||
#endif
|
||||
for (y = y1; y < y2; ++y)
|
||||
{
|
||||
dst_y2 = dstrect->y + (y - y1);
|
||||
for (x = x1; x < x2; ++x)
|
||||
{
|
||||
dst_x2 = dstrect->x + (x - x1);
|
||||
src_pixval = src_getpix (src, x, y);
|
||||
|
||||
if (has_colorkey && src_pixval == colorkey)
|
||||
continue;
|
||||
|
||||
dst_pixval = dst_getpix (dst, dst_x2, dst_y2);
|
||||
|
||||
SDL_GetRGB (src_pixval, src->format, &sr, &sg, &sb);
|
||||
SDL_GetRGB (dst_pixval, dst->format, &dr, &dg, &db);
|
||||
|
||||
nr = sr + dr;
|
||||
ng = sg + dg;
|
||||
nb = sb + db;
|
||||
|
||||
if (nr > 255)
|
||||
nr = 255;
|
||||
if (ng > 255)
|
||||
ng = 255;
|
||||
if (nb > 255)
|
||||
nb = 255;
|
||||
|
||||
putpix (dst, dst_x2, dst_y2,
|
||||
SDL_MapRGB (dst->format, nr, ng, nb));
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (blend_numer < 0)
|
||||
{
|
||||
// subtractive blit: dst = src - dst
|
||||
#if 0
|
||||
log_add (log_Debug, "subtractive blit %d %d, src %d %d %d %d"
|
||||
" dst %d %d, srcbpp %d", blend_numer, blend_denom,
|
||||
x1, y1, x2, y2, dstrect->x, dstrect->y,
|
||||
src->format->BitsPerPixel);
|
||||
#endif
|
||||
for (y = y1; y < y2; ++y)
|
||||
{
|
||||
dst_y2 = dstrect->y + (y - y1);
|
||||
for (x = x1; x < x2; ++x)
|
||||
{
|
||||
dst_x2 = dstrect->x + (x - x1);
|
||||
src_pixval = src_getpix (src, x, y);
|
||||
|
||||
if (has_colorkey && src_pixval == colorkey)
|
||||
continue;
|
||||
|
||||
dst_pixval = dst_getpix (dst, dst_x2, dst_y2);
|
||||
|
||||
SDL_GetRGB (src_pixval, src->format, &sr, &sg, &sb);
|
||||
SDL_GetRGB (dst_pixval, dst->format, &dr, &dg, &db);
|
||||
|
||||
nr = sr - dr;
|
||||
ng = sg - dg;
|
||||
nb = sb - db;
|
||||
|
||||
if (nr < 0)
|
||||
nr = 0;
|
||||
if (ng < 0)
|
||||
ng = 0;
|
||||
if (nb < 0)
|
||||
nb = 0;
|
||||
|
||||
putpix (dst, dst_x2, dst_y2,
|
||||
SDL_MapRGB (dst->format, nr, ng, nb));
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// modulated blit: dst = src * (blend_numer / blend_denom)
|
||||
|
||||
float f = blend_numer / (float)blend_denom;
|
||||
#if 0
|
||||
log_add (log_Debug, "modulated blit %d %d, f %f, src %d %d %d %d"
|
||||
" dst %d %d, srcbpp %d\n", blend_numer, blend_denom, f,
|
||||
x1, y1, x2, y2, dstrect->x, dstrect->y,
|
||||
src->format->BitsPerPixel);
|
||||
#endif
|
||||
for (y = y1; y < y2; ++y)
|
||||
{
|
||||
dst_y2 = dstrect->y + (y - y1);
|
||||
for (x = x1; x < x2; ++x)
|
||||
{
|
||||
dst_x2 = dstrect->x + (x - x1);
|
||||
src_pixval = src_getpix (src, x, y);
|
||||
|
||||
if (has_colorkey && src_pixval == colorkey)
|
||||
continue;
|
||||
|
||||
SDL_GetRGB (src_pixval, src->format, &sr, &sg, &sb);
|
||||
|
||||
nr = (int)(sr * f);
|
||||
ng = (int)(sg * f);
|
||||
nb = (int)(sb * f);
|
||||
|
||||
if (nr > 255)
|
||||
nr = 255;
|
||||
if (ng > 255)
|
||||
ng = 255;
|
||||
if (nb > 255)
|
||||
nb = 255;
|
||||
|
||||
putpix (dst, dst_x2, dst_y2,
|
||||
SDL_MapRGB (dst->format, nr, ng, nb));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
TFB_UploadTransitionScreen (void)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user