rubidium@8123: /* $Id$ */ rubidium@8123: rubidium@9111: /** @file zoom_func.h Functions related to zooming. */ rubidium@8123: rubidium@8123: #ifndef ZOOM_FUNC_H rubidium@8123: #define ZOOM_FUNC_H rubidium@8123: rubidium@8123: #include "zoom_type.h" rubidium@8123: rubidium@8123: extern ZoomLevel _saved_scrollpos_zoom; rubidium@8123: rubidium@8123: /** rubidium@8123: * Scale by zoom level, usually shift left (when zoom > ZOOM_LVL_NORMAL) rubidium@8123: * When shifting right, value is rounded up rubidium@8123: * @param value value to shift rubidium@8123: * @param zoom zoom level to shift to rubidium@8123: * @return shifted value rubidium@8123: */ rubidium@8123: static inline int ScaleByZoom(int value, ZoomLevel zoom) rubidium@8123: { rubidium@8123: if (zoom == ZOOM_LVL_NORMAL) return value; rubidium@8123: int izoom = zoom - ZOOM_LVL_NORMAL; rubidium@8123: return (zoom > ZOOM_LVL_NORMAL) ? value << izoom : (value + (1 << -izoom) - 1) >> -izoom; rubidium@8123: } rubidium@8123: rubidium@8123: /** rubidium@8123: * Scale by zoom level, usually shift right (when zoom > ZOOM_LVL_NORMAL) rubidium@8123: * When shifting right, value is rounded up rubidium@8123: * @param value value to shift rubidium@8123: * @param zoom zoom level to shift to rubidium@8123: * @return shifted value rubidium@8123: */ rubidium@8123: static inline int UnScaleByZoom(int value, ZoomLevel zoom) rubidium@8123: { rubidium@8123: if (zoom == ZOOM_LVL_NORMAL) return value; rubidium@8123: int izoom = zoom - ZOOM_LVL_NORMAL; rubidium@8123: return (zoom > ZOOM_LVL_NORMAL) ? (value + (1 << izoom) - 1) >> izoom : value << -izoom; rubidium@8123: } rubidium@8123: rubidium@8123: /** rubidium@8123: * Scale by zoom level, usually shift left (when zoom > ZOOM_LVL_NORMAL) rubidium@8123: * @param value value to shift rubidium@8123: * @param zoom zoom level to shift to rubidium@8123: * @return shifted value rubidium@8123: */ rubidium@8123: static inline int ScaleByZoomLower(int value, ZoomLevel zoom) rubidium@8123: { rubidium@8123: if (zoom == ZOOM_LVL_NORMAL) return value; rubidium@8123: int izoom = zoom - ZOOM_LVL_NORMAL; rubidium@8123: return (zoom > ZOOM_LVL_NORMAL) ? value << izoom : value >> -izoom; rubidium@8123: } rubidium@8123: rubidium@8123: /** rubidium@8123: * Scale by zoom level, usually shift right (when zoom > ZOOM_LVL_NORMAL) rubidium@8123: * @param value value to shift rubidium@8123: * @param zoom zoom level to shift to rubidium@8123: * @return shifted value rubidium@8123: */ rubidium@8123: static inline int UnScaleByZoomLower(int value, ZoomLevel zoom) rubidium@8123: { rubidium@8123: if (zoom == ZOOM_LVL_NORMAL) return value; rubidium@8123: int izoom = zoom - ZOOM_LVL_NORMAL; rubidium@8123: return (zoom > ZOOM_LVL_NORMAL) ? value >> izoom : value << -izoom; rubidium@8123: } rubidium@8123: rubidium@8123: #endif /* ZOOM_FUNC_H */