From 852eeaf7a42b0a4a449a5093163e1f5da4c5f084 Mon Sep 17 00:00:00 2001 From: avolkov Date: Tue, 30 Jun 2009 05:32:24 +0000 Subject: [PATCH] Rounding-error correction in log(x|y)ToUniverse; bug #1046; from Nic git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@3162 8092fc87-c524-0410-9efc-e669fe64eaf9 --- sc2/ChangeLog | 1 + sc2/src/sc2code/units.h | 27 ++++++++++++++++----------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/sc2/ChangeLog b/sc2/ChangeLog index c2a6c6c5d..dc561e874 100644 --- a/sc2/ChangeLog +++ b/sc2/ChangeLog @@ -1,4 +1,5 @@ Changes towards version 0.7: +- Rounding-error correction in log(x|y)ToUniverse (bug #1046), from Nic - Change hardcoded Starbase and Sa-Matra values to pretty enum values (bug #1047), from Nic - Load override.cfg from user's dir to add or override menu controls - Alex diff --git a/sc2/src/sc2code/units.h b/sc2/src/sc2code/units.h index fbc76280b..e7f256f5c 100644 --- a/sc2/src/sc2code/units.h +++ b/sc2/src/sc2code/units.h @@ -92,11 +92,18 @@ extern int ScreenHeight; #define UNIT_SCREEN_WIDTH 63 #define UNIT_SCREEN_HEIGHT 50 +#define LOG_UNITS_X ((SDWORD)(LOG_SPACE_WIDTH >> 4) * SECTOR_WIDTH) +#define LOG_UNITS_Y ((SDWORD)(LOG_SPACE_HEIGHT >> 4) * SECTOR_HEIGHT) +#define UNIVERSE_UNITS_X (((MAX_X_UNIVERSE + 1) >> 4) * 10) +#define UNIVERSE_UNITS_Y (((MAX_Y_UNIVERSE + 1) >> 4)) + +#define ROUNDING_ERROR(div) ((div) >> 1) + static inline COORD logxToUniverse (SDWORD lx) { - return (COORD) ((lx * ((MAX_X_UNIVERSE + 1) >> 4)) * 10 - / ((SDWORD) ((LOG_SPACE_WIDTH) >> 4) * SECTOR_WIDTH)); + return (COORD) ((lx * UNIVERSE_UNITS_X + ROUNDING_ERROR(LOG_UNITS_X)) + / LOG_UNITS_X); } #define LOGX_TO_UNIVERSE(lx) \ logxToUniverse (lx) @@ -104,27 +111,25 @@ static inline COORD logyToUniverse (SDWORD ly) { return (COORD) (MAX_Y_UNIVERSE - - (COORD)(((SDWORD) (ly) * ((MAX_Y_UNIVERSE + 1) >> 4)) - / ((SDWORD) ((LOG_SPACE_HEIGHT) >> 4) * SECTOR_HEIGHT))); + ((ly * UNIVERSE_UNITS_Y + ROUNDING_ERROR(LOG_UNITS_Y)) + / LOG_UNITS_Y)); } #define LOGY_TO_UNIVERSE(ly) \ logyToUniverse (ly) static inline SDWORD universeToLogx (COORD ux) { - return ((SDWORD) ux * ((SDWORD) ((LOG_SPACE_WIDTH) >> 4) * SECTOR_WIDTH) - + ((((MAX_X_UNIVERSE + 1) >> 4) * 10) >> 1)) - / (((MAX_X_UNIVERSE + 1) >> 4) * 10); + return (ux * LOG_UNITS_X + ROUNDING_ERROR(UNIVERSE_UNITS_X)) + / UNIVERSE_UNITS_X; } #define UNIVERSE_TO_LOGX(ux) \ universeToLogx (ux) static inline SDWORD universeToLogy (COORD uy) { - return ((SDWORD) (MAX_Y_UNIVERSE - uy) - * ((SDWORD) ((LOG_SPACE_HEIGHT) >> 4) * SECTOR_HEIGHT) - + (((MAX_Y_UNIVERSE + 1) >> 4) >> 1)) - / ((MAX_Y_UNIVERSE + 1) >> 4); + return ((MAX_Y_UNIVERSE - uy) * LOG_UNITS_Y + + ROUNDING_ERROR(UNIVERSE_UNITS_Y)) + / UNIVERSE_UNITS_Y; } #define UNIVERSE_TO_LOGY(uy) \ universeToLogy (uy)