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