diff --git a/sc2/ChangeLog b/sc2/ChangeLog index c3659f6c5..30b71e277 100644 --- a/sc2/ChangeLog +++ b/sc2/ChangeLog @@ -1,4 +1,6 @@ Changes towards version 0.3: +- Moved image scaling to DCQ thread; fixes scale-out-of-sync problem + in melee -Mika - Fix lockup in cyborg melee (fixes 204 and 218) from chmmravatar - Added -g option to control gamma correction, from chmmravatar - Restored the CondBank to actually use condition variables properly diff --git a/sc2/src/sc2code/libs/graphics/gfx_common.h b/sc2/src/sc2code/libs/graphics/gfx_common.h index a1d85a899..262089537 100644 --- a/sc2/src/sc2code/libs/graphics/gfx_common.h +++ b/sc2/src/sc2code/libs/graphics/gfx_common.h @@ -53,6 +53,7 @@ void DrawFromExtraScreen (PRECT r); void SetGraphicGrabOther (int grab_other); void SetGraphicScale (int scale); int GetGraphicScale (void); +int GetGraphicScaleIdentity (void); void SetGraphicUseOtherExtra (int other); void ScreenTransition (int transition, PRECT pRect); diff --git a/sc2/src/sc2code/libs/graphics/sdl/3do_blt.c b/sc2/src/sc2code/libs/graphics/sdl/3do_blt.c index d4834f721..8b163ba98 100644 --- a/sc2/src/sc2code/libs/graphics/sdl/3do_blt.c +++ b/sc2/src/sc2code/libs/graphics/sdl/3do_blt.c @@ -22,12 +22,17 @@ #include "rotozoom.h" #include "graphics/tfb_draw.h" -static int gscale; +#define GSCALE_SHIFT 2 // controls the number of scale steps +#define GSCALE_IDENTITY (256 >> GSCALE_SHIFT) // 'identity scale' + +static int gscale = GSCALE_IDENTITY; void SetGraphicScale (int scale) { - gscale = scale; + gscale = scale >> GSCALE_SHIFT; + if (gscale == 0) + gscale = GSCALE_IDENTITY; } int @@ -36,6 +41,12 @@ GetGraphicScale () return gscale; } +int +GetGraphicScaleIdentity (void) +{ + return GSCALE_IDENTITY; +} + static void read_screen (PRECT lpRect, FRAMEPTR DstFramePtr) { diff --git a/sc2/src/sc2code/libs/graphics/sdl/canvas.c b/sc2/src/sc2code/libs/graphics/sdl/canvas.c index 132f4e153..2747055b0 100644 --- a/sc2/src/sc2code/libs/graphics/sdl/canvas.c +++ b/sc2/src/sc2code/libs/graphics/sdl/canvas.c @@ -49,9 +49,9 @@ TFB_DrawCanvas_Image (TFB_Image *img, int x, int y, int scale, TFB_Palette *pale targetRect.x = x; targetRect.y = y; - if (scale != 0 && scale != 256) + if (scale != 0 && scale != GetGraphicScaleIdentity ()) { - // TFB_DrawImage_FixScaling (img, scale); + TFB_DrawImage_FixScaling (img, scale); surf = img->ScaledImg; } else @@ -92,9 +92,9 @@ TFB_DrawCanvas_FilledImage (TFB_Image *img, int x, int y, int scale, int r, int targetRect.x = x; targetRect.y = y; - if (scale != 0 && scale != 256) + if (scale != 0 && scale != GetGraphicScaleIdentity ()) { - // TFB_DrawImage_FixScaling (img, scale); + TFB_DrawImage_FixScaling (img, scale); surf = img->ScaledImg; } else @@ -206,9 +206,9 @@ TFB_DrawCanvas_New_Scaled (TFB_Canvas src, int scale) { SDL_Surface *new_surf; - new_surf = zoomSurface ((SDL_Surface *)src, scale / 256.0f, - scale / 256.0f, SMOOTHING_OFF); - + new_surf = zoomSurface ((SDL_Surface *)src, scale / (float)GetGraphicScaleIdentity (), + scale / (float)GetGraphicScaleIdentity (), SMOOTHING_OFF); + if (new_surf) { if (!TFB_DrawCanvas_IsPaletted (new_surf)) diff --git a/sc2/src/sc2code/libs/graphics/sdl/sdl_common.c b/sc2/src/sc2code/libs/graphics/sdl/sdl_common.c index e92694a4f..322c75d28 100644 --- a/sc2/src/sc2code/libs/graphics/sdl/sdl_common.c +++ b/sc2/src/sc2code/libs/graphics/sdl/sdl_common.c @@ -510,11 +510,6 @@ TFB_FlushGraphics () // Only call from main thread!! int y = DC.data.image.y; LockMutex (DC_image->mutex); - if (DC.data.image.scale) - TFB_BBox_RegisterCanvas (DC_image->ScaledImg, x, y); - else - TFB_BBox_RegisterCanvas (DC_image->NormalImg, x, y); - if (DC.data.image.UsePalette) { pal = palette; @@ -529,6 +524,13 @@ TFB_FlushGraphics () // Only call from main thread!! DC.data.image.scale, pal, SDL_Screens[DC.data.image.destBuffer]); + LockMutex (DC_image->mutex); + if (DC.data.image.scale) + TFB_BBox_RegisterCanvas (DC_image->ScaledImg, x, y); + else + TFB_BBox_RegisterCanvas (DC_image->NormalImg, x, y); + UnlockMutex (DC_image->mutex); + break; } case TFB_DRAWCOMMANDTYPE_FILLEDIMAGE: @@ -537,14 +539,17 @@ TFB_FlushGraphics () // Only call from main thread!! int x = DC.data.filledimage.x; int y = DC.data.filledimage.y; + TFB_DrawCanvas_FilledImage (DC.data.filledimage.image, DC.data.filledimage.x, DC.data.filledimage.y, + DC.data.filledimage.scale, DC.data.filledimage.r, DC.data.filledimage.g, + DC.data.filledimage.b, SDL_Screens[DC.data.filledimage.destBuffer]); + + LockMutex (DC_image->mutex); if (DC.data.filledimage.scale) TFB_BBox_RegisterCanvas (DC_image->ScaledImg, x, y); else TFB_BBox_RegisterCanvas (DC_image->NormalImg, x, y); + UnlockMutex (DC_image->mutex); - TFB_DrawCanvas_FilledImage (DC.data.filledimage.image, DC.data.filledimage.x, DC.data.filledimage.y, - DC.data.filledimage.scale, DC.data.filledimage.r, DC.data.filledimage.g, - DC.data.filledimage.b, SDL_Screens[DC.data.filledimage.destBuffer]); break; } case TFB_DRAWCOMMANDTYPE_LINE: @@ -616,8 +621,7 @@ TFB_FlushGraphics () // Only call from main thread!! TFB_BBox_RegisterPoint (src.x, src.y); TFB_BBox_RegisterPoint (src.x + src.w, src.y + src.h); - - + SDL_BlitSurface(SDL_Screens[DC.data.copy.srcBuffer], &src, SDL_Screens[DC.data.copy.destBuffer], &dest); break; } diff --git a/sc2/src/sc2code/libs/graphics/tfb_draw.c b/sc2/src/sc2code/libs/graphics/tfb_draw.c index 5e886436a..4174817d5 100644 --- a/sc2/src/sc2code/libs/graphics/tfb_draw.c +++ b/sc2/src/sc2code/libs/graphics/tfb_draw.c @@ -84,7 +84,7 @@ TFB_DrawScreen_Image (TFB_Image *img, int x, int y, int scale, TFB_Palette *pale DC.data.image.image = img; DC.data.image.x = x; DC.data.image.y = y; - DC.data.image.scale = (scale == 256) ? 0 : scale; + DC.data.image.scale = (scale == GetGraphicScaleIdentity ()) ? 0 : scale; if (palette != NULL) { @@ -129,7 +129,7 @@ TFB_DrawScreen_FilledImage (TFB_Image *img, int x, int y, int scale, int r, int DC.data.filledimage.image = img; DC.data.filledimage.x = x; DC.data.filledimage.y = y; - DC.data.filledimage.scale = (scale == 256) ? 0 : scale; + DC.data.filledimage.scale = (scale == GetGraphicScaleIdentity ()) ? 0 : scale; DC.data.filledimage.r = r; DC.data.filledimage.g = g; DC.data.filledimage.b = b; diff --git a/sc2/src/sc2code/libs/graphics/tfb_prim.c b/sc2/src/sc2code/libs/graphics/tfb_prim.c index 384c81c45..8722046cc 100644 --- a/sc2/src/sc2code/libs/graphics/tfb_prim.c +++ b/sc2/src/sc2code/libs/graphics/tfb_prim.c @@ -46,10 +46,9 @@ void TFB_Prim_Rect (PRECT r, TFB_Palette *color) { RECT arm; - int gscale; + int gscale, gscale_identity; gscale = GetGraphicScale (); - if (!gscale) - gscale = 256; + gscale_identity = GetGraphicScaleIdentity (); arm = *r; arm.extent.width = r->extent.width; arm.extent.height = 1; @@ -57,10 +56,10 @@ TFB_Prim_Rect (PRECT r, TFB_Palette *color) arm.extent.height = r->extent.height; arm.extent.width = 1; TFB_Prim_FillRect (&arm, color); - arm.corner.x += ((r->extent.width * gscale) >> 8) - 1; + arm.corner.x += ((r->extent.width * gscale) / gscale_identity) - 1; TFB_Prim_FillRect (&arm, color); arm.corner.x = r->corner.x; - arm.corner.y += ((r->extent.height * gscale) >> 8) - 1; + arm.corner.y += ((r->extent.height * gscale) / gscale_identity) - 1; arm.extent.width = r->extent.width; arm.extent.height = 1; TFB_Prim_FillRect (&arm, color); @@ -70,7 +69,7 @@ void TFB_Prim_FillRect (PRECT r, TFB_Palette *color) { RECT rect; - int gscale; + int gscale, gscale_identity; rect.corner.x = r->corner.x - _CurFramePtr->HotSpot.x; rect.corner.y = r->corner.y - _CurFramePtr->HotSpot.y; @@ -78,10 +77,11 @@ TFB_Prim_FillRect (PRECT r, TFB_Palette *color) rect.extent.height = r->extent.height; gscale = GetGraphicScale (); - if (gscale) + gscale_identity = GetGraphicScaleIdentity (); + if (gscale != gscale_identity) { - rect.extent.width = (rect.extent.width * gscale) >> 8; - rect.extent.height = (rect.extent.height * gscale) >> 8; + rect.extent.width = (rect.extent.width * gscale) / gscale_identity; + rect.extent.height = (rect.extent.height * gscale) / gscale_identity; rect.corner.x += (r->extent.width - rect.extent.width) >> 1; rect.corner.y += (r->extent.height - @@ -118,7 +118,7 @@ TFB_Prim_Stamp (PSTAMP stmp) TFB_Image *img; BOOLEAN paletted; TFB_Palette palette[256]; - int gscale; + int gscale, gscale_identity; SrcFramePtr = (PFRAME_DESC)stmp->frame; if (!SrcFramePtr) @@ -128,6 +128,7 @@ TFB_Prim_Stamp (PSTAMP stmp) } img = SrcFramePtr->image; gscale = GetGraphicScale (); + gscale_identity = GetGraphicScaleIdentity (); if (!img) { @@ -141,13 +142,12 @@ TFB_Prim_Stamp (PSTAMP stmp) y = stmp->origin.y - _CurFramePtr->HotSpot.y - SrcFramePtr->HotSpot.y; paletted = FALSE; - if (gscale != 0 && gscale != 256) + if (gscale != GetGraphicScaleIdentity ()) { - TFB_DrawImage_FixScaling (img, gscale); x += (SrcFramePtr->HotSpot.x * - ((1 << 8) - gscale)) >> 8; + (gscale_identity - gscale)) / gscale_identity; y += (SrcFramePtr->HotSpot.y * - ((1 << 8) - gscale)) >> 8; + (gscale_identity - gscale)) / gscale_identity; } if (TFB_DrawCanvas_IsPaletted(img->NormalImg) && img->colormap_index != -1) @@ -177,7 +177,7 @@ TFB_Prim_StampFill (PSTAMP stmp, TFB_Palette *color) PFRAME_DESC SrcFramePtr; TFB_Image *img; int r, g, b; - int gscale; + int gscale, gscale_identity; SrcFramePtr = (PFRAME_DESC)stmp->frame; if (!SrcFramePtr) @@ -187,6 +187,7 @@ TFB_Prim_StampFill (PSTAMP stmp, TFB_Palette *color) } img = SrcFramePtr->image; gscale = GetGraphicScale (); + gscale_identity = GetGraphicScaleIdentity (); if (!img) { @@ -202,13 +203,12 @@ TFB_Prim_StampFill (PSTAMP stmp, TFB_Palette *color) g = color->g; b = color->b; - if (gscale != 0 && gscale != 256) + if (gscale != gscale_identity) { - TFB_DrawImage_FixScaling (img, gscale); x += (SrcFramePtr->HotSpot.x * - ((1 << 8) - gscale)) >> 8; + (gscale_identity - gscale)) / gscale_identity; y += (SrcFramePtr->HotSpot.y * - ((1 << 8) - gscale)) >> 8; + (gscale_identity - gscale)) / gscale_identity; } UnlockMutex (img->mutex);