src/zoom.hpp
branchNewGRF_ports
changeset 6872 1c4a4a609f85
parent 6871 5a9dc001e1ad
child 6873 86bf4ccb580d
equal deleted inserted replaced
6871:5a9dc001e1ad 6872:1c4a4a609f85
     1 /* $Id$ */
       
     2 
       
     3 /** @file zoom.hpp */
       
     4 
       
     5 #ifndef ZOOM_HPP
       
     6 #define ZOOM_HPP
       
     7 
       
     8 enum ZoomLevel {
       
     9 	/* Our possible zoom-levels */
       
    10 	ZOOM_LVL_NORMAL = 0,
       
    11 	ZOOM_LVL_OUT_2X,
       
    12 	ZOOM_LVL_OUT_4X,
       
    13 	ZOOM_LVL_OUT_8X,
       
    14 	ZOOM_LVL_END,
       
    15 
       
    16 	/* Here we define in which zoom viewports are */
       
    17 	ZOOM_LVL_VIEWPORT = ZOOM_LVL_NORMAL,
       
    18 	ZOOM_LVL_NEWS     = ZOOM_LVL_NORMAL,
       
    19 	ZOOM_LVL_INDUSTRY = ZOOM_LVL_OUT_2X,
       
    20 	ZOOM_LVL_TOWN     = ZOOM_LVL_OUT_2X,
       
    21 	ZOOM_LVL_AIRCRAFT = ZOOM_LVL_NORMAL,
       
    22 	ZOOM_LVL_SHIP     = ZOOM_LVL_NORMAL,
       
    23 	ZOOM_LVL_TRAIN    = ZOOM_LVL_NORMAL,
       
    24 	ZOOM_LVL_ROADVEH  = ZOOM_LVL_NORMAL,
       
    25 	ZOOM_LVL_WORLD_SCREENSHOT = ZOOM_LVL_NORMAL,
       
    26 
       
    27 	ZOOM_LVL_DETAIL   = ZOOM_LVL_OUT_2X, ///< All zoomlevels below or equal to this, will result in details on the screen, like road-work, ...
       
    28 
       
    29 	ZOOM_LVL_MIN      = ZOOM_LVL_NORMAL,
       
    30 	ZOOM_LVL_MAX      = ZOOM_LVL_OUT_8X,
       
    31 };
       
    32 
       
    33 extern ZoomLevel _saved_scrollpos_zoom;
       
    34 
       
    35 /**
       
    36  * Scale by zoom level, usually shift left (when zoom > ZOOM_LVL_NORMAL)
       
    37  * When shifting right, value is rounded up
       
    38  * @param value value to shift
       
    39  * @param zoom  zoom level to shift to
       
    40  * @return shifted value
       
    41  */
       
    42 static inline int ScaleByZoom(int value, ZoomLevel zoom)
       
    43 {
       
    44 	if (zoom == ZOOM_LVL_NORMAL) return value;
       
    45 	int izoom = (int)zoom - (int)ZOOM_LVL_NORMAL;
       
    46 	return (zoom > ZOOM_LVL_NORMAL) ? value << izoom : (value + (1 << -izoom) - 1) >> -izoom;
       
    47 }
       
    48 
       
    49 /**
       
    50  * Scale by zoom level, usually shift right (when zoom > ZOOM_LVL_NORMAL)
       
    51  * When shifting right, value is rounded up
       
    52  * @param value value to shift
       
    53  * @param zoom  zoom level to shift to
       
    54  * @return shifted value
       
    55  */
       
    56 static inline int UnScaleByZoom(int value, ZoomLevel zoom)
       
    57 {
       
    58 	if (zoom == ZOOM_LVL_NORMAL) return value;
       
    59 	int izoom = (int)zoom - (int)ZOOM_LVL_NORMAL;
       
    60 	return (zoom > ZOOM_LVL_NORMAL) ? (value + (1 << izoom) - 1) >> izoom : value << -izoom;
       
    61 }
       
    62 
       
    63 /**
       
    64  * Scale by zoom level, usually shift left (when zoom > ZOOM_LVL_NORMAL)
       
    65  * @param value value to shift
       
    66  * @param zoom  zoom level to shift to
       
    67  * @return shifted value
       
    68  */
       
    69 static inline int ScaleByZoomLower(int value, ZoomLevel zoom)
       
    70 {
       
    71 	if (zoom == ZOOM_LVL_NORMAL) return value;
       
    72 	int izoom = (int)zoom - (int)ZOOM_LVL_NORMAL;
       
    73 	return (zoom > ZOOM_LVL_NORMAL) ? value << izoom : value >> -izoom;
       
    74 }
       
    75 
       
    76 /**
       
    77  * Scale by zoom level, usually shift right (when zoom > ZOOM_LVL_NORMAL)
       
    78  * @param value value to shift
       
    79  * @param zoom  zoom level to shift to
       
    80  * @return shifted value
       
    81  */
       
    82 static inline int UnScaleByZoomLower(int value, ZoomLevel zoom)
       
    83 {
       
    84 	if (zoom == ZOOM_LVL_NORMAL) return value;
       
    85 	int izoom = (int)zoom - (int)ZOOM_LVL_NORMAL;
       
    86 	return (zoom > ZOOM_LVL_NORMAL) ? value >> izoom : value << -izoom;
       
    87 }
       
    88 
       
    89 #endif /* ZOOM_HPP */