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
This commit is contained in:
avolkov
2009-06-30 05:32:24 +00:00
parent 81a1ada2c2
commit 852eeaf7a4
2 changed files with 17 additions and 11 deletions
+1
View File
@@ -1,4 +1,5 @@
Changes towards version 0.7: 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 - Change hardcoded Starbase and Sa-Matra values to pretty enum values
(bug #1047), from Nic (bug #1047), from Nic
- Load override.cfg from user's dir to add or override menu controls - Alex - Load override.cfg from user's dir to add or override menu controls - Alex
+16 -11
View File
@@ -92,11 +92,18 @@ extern int ScreenHeight;
#define UNIT_SCREEN_WIDTH 63 #define UNIT_SCREEN_WIDTH 63
#define UNIT_SCREEN_HEIGHT 50 #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 static inline COORD
logxToUniverse (SDWORD lx) logxToUniverse (SDWORD lx)
{ {
return (COORD) ((lx * ((MAX_X_UNIVERSE + 1) >> 4)) * 10 return (COORD) ((lx * UNIVERSE_UNITS_X + ROUNDING_ERROR(LOG_UNITS_X))
/ ((SDWORD) ((LOG_SPACE_WIDTH) >> 4) * SECTOR_WIDTH)); / LOG_UNITS_X);
} }
#define LOGX_TO_UNIVERSE(lx) \ #define LOGX_TO_UNIVERSE(lx) \
logxToUniverse (lx) logxToUniverse (lx)
@@ -104,27 +111,25 @@ static inline COORD
logyToUniverse (SDWORD ly) logyToUniverse (SDWORD ly)
{ {
return (COORD) (MAX_Y_UNIVERSE - return (COORD) (MAX_Y_UNIVERSE -
(COORD)(((SDWORD) (ly) * ((MAX_Y_UNIVERSE + 1) >> 4)) ((ly * UNIVERSE_UNITS_Y + ROUNDING_ERROR(LOG_UNITS_Y))
/ ((SDWORD) ((LOG_SPACE_HEIGHT) >> 4) * SECTOR_HEIGHT))); / LOG_UNITS_Y));
} }
#define LOGY_TO_UNIVERSE(ly) \ #define LOGY_TO_UNIVERSE(ly) \
logyToUniverse (ly) logyToUniverse (ly)
static inline SDWORD static inline SDWORD
universeToLogx (COORD ux) universeToLogx (COORD ux)
{ {
return ((SDWORD) ux * ((SDWORD) ((LOG_SPACE_WIDTH) >> 4) * SECTOR_WIDTH) return (ux * LOG_UNITS_X + ROUNDING_ERROR(UNIVERSE_UNITS_X))
+ ((((MAX_X_UNIVERSE + 1) >> 4) * 10) >> 1)) / UNIVERSE_UNITS_X;
/ (((MAX_X_UNIVERSE + 1) >> 4) * 10);
} }
#define UNIVERSE_TO_LOGX(ux) \ #define UNIVERSE_TO_LOGX(ux) \
universeToLogx (ux) universeToLogx (ux)
static inline SDWORD static inline SDWORD
universeToLogy (COORD uy) universeToLogy (COORD uy)
{ {
return ((SDWORD) (MAX_Y_UNIVERSE - uy) return ((MAX_Y_UNIVERSE - uy) * LOG_UNITS_Y
* ((SDWORD) ((LOG_SPACE_HEIGHT) >> 4) * SECTOR_HEIGHT) + ROUNDING_ERROR(UNIVERSE_UNITS_Y))
+ (((MAX_Y_UNIVERSE + 1) >> 4) >> 1)) / UNIVERSE_UNITS_Y;
/ ((MAX_Y_UNIVERSE + 1) >> 4);
} }
#define UNIVERSE_TO_LOGY(uy) \ #define UNIVERSE_TO_LOGY(uy) \
universeToLogy (uy) universeToLogy (uy)