# HG changeset patch # User Chris Cannam # Date 1537436748 -3600 # Node ID 53073777e591124787b6be6c449abc896d09b834 # Parent 5360f7aba1893a488039cd972c2f3230c1a298e2 More ZoomLevel updates diff -r 5360f7aba189 -r 53073777e591 base/ZoomLevel.h --- a/base/ZoomLevel.h Wed Sep 19 15:41:44 2018 +0100 +++ b/base/ZoomLevel.h Thu Sep 20 10:45:48 2018 +0100 @@ -16,6 +16,7 @@ #define SV_ZOOM_LEVEL_H #include +#include /** Display zoom level. Can be an integer number of samples per pixel, * or an integer number of pixels per sample. @@ -26,6 +27,7 @@ FramesPerPixel, // zoomed out (as in classic SV) PixelsPerFrame // zoomed in beyond 1-1 (interpolating the waveform) }; + Zone zone; int level; @@ -74,7 +76,10 @@ } } - /// Inexact + /** Inexact conversion. The result is a whole number if we are + * zoomed in enough (in PixelsPerFrame zone), a fraction + * otherwise. + */ double framesToPixels(double frames) const { if (zone == PixelsPerFrame) { return frames * level; @@ -83,7 +88,10 @@ } } - /// Inexact + /** Inexact conversion. The result is a whole number if we are + * zoomed out enough (in FramesPerPixel zone), a fraction + * otherwise. + */ double pixelsToFrames(double pixels) const { if (zone == PixelsPerFrame) { return pixels / level; @@ -91,6 +99,22 @@ return pixels * level; } } + + /** Return a ZoomLevel that approximates the given ratio of pixels + * to frames. + */ + static ZoomLevel fromRatio(int pixels, int frames) { + if (pixels < frames) { + return { FramesPerPixel, int(round(double(pixels)/frames)) }; + } else { + int r = int(round(double(frames)/pixels)); + if (r > 1) { + return { PixelsPerFrame, r }; + } else { + return { FramesPerPixel, 1 }; + } + } + } }; std::ostream &operator<<(std::ostream &s, const ZoomLevel &z);