Mercurial > hg > svcore
diff data/model/PowerOfTwoZoomConstraint.cpp @ 1324:d4a28d1479a8 zoom
Some hackery toward having a zoomlevel type
author | Chris Cannam |
---|---|
date | Mon, 12 Dec 2016 15:18:52 +0000 |
parents | 59e7fe1b1003 |
children | 710e6250a401 |
line wrap: on
line diff
--- a/data/model/PowerOfTwoZoomConstraint.cpp Fri Dec 09 19:04:33 2016 +0000 +++ b/data/model/PowerOfTwoZoomConstraint.cpp Mon Dec 12 15:18:52 2016 +0000 @@ -15,6 +15,34 @@ #include "PowerOfTwoZoomConstraint.h" +ZoomLevel +PowerOfTwoZoomConstraint::getNearestZoomLevel(ZoomLevel requested, + RoundingDirection dir) const +{ + int blockSize; + + if (requested.zone == ZoomLevel::FramesPerPixel) { + blockSize = getNearestBlockSize(requested.level, dir); + if (blockSize > getMaxZoomLevel().level) { + blockSize = getMaxZoomLevel().level; + } + return { requested.zone, blockSize }; + } else { + RoundingDirection opposite = dir; + if (dir == RoundUp) opposite = RoundDown; + else if (dir == RoundDown) opposite = RoundUp; + blockSize = getNearestBlockSize(requested.level, opposite); + if (blockSize > getMinZoomLevel().level) { + blockSize = getMinZoomLevel().level; + } + if (blockSize == 1) { + return { ZoomLevel::FramesPerPixel, 1 }; + } else { + return { requested.zone, blockSize }; + } + } +} + int PowerOfTwoZoomConstraint::getNearestBlockSize(int req, RoundingDirection dir) const @@ -41,7 +69,7 @@ } } - if (result > getMaxZoomLevel()) result = getMaxZoomLevel(); + if (result > getMaxZoomLevel().level) result = getMaxZoomLevel().level; return result; }