diff --git a/sc2/src/libs/graphics/sdl/primitives.c b/sc2/src/libs/graphics/sdl/primitives.c index c83521334..6dd539a1b 100644 --- a/sc2/src/libs/graphics/sdl/primitives.c +++ b/sc2/src/libs/graphics/sdl/primitives.c @@ -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) diff --git a/sc2/src/libs/graphics/sdl/sdl1_common.c b/sc2/src/libs/graphics/sdl/sdl1_common.c index 651931342..f1ace3351 100644 --- a/sc2/src/libs/graphics/sdl/sdl1_common.c +++ b/sc2/src/libs/graphics/sdl/sdl1_common.c @@ -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) { diff --git a/sc2/src/libs/graphics/sdl/sdl2_common.c b/sc2/src/libs/graphics/sdl/sdl2_common.c index 272cdc2e9..f1998ccc3 100644 --- a/sc2/src/libs/graphics/sdl/sdl2_common.c +++ b/sc2/src/libs/graphics/sdl/sdl2_common.c @@ -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) { diff --git a/sc2/src/libs/graphics/sdl/sdl_common.c b/sc2/src/libs/graphics/sdl/sdl_common.c index 5b6976e29..b2fe9d4fd 100644 --- a/sc2/src/libs/graphics/sdl/sdl_common.c +++ b/sc2/src/libs/graphics/sdl/sdl_common.c @@ -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) {