From f37c96c43b85a3f943a613c6919dd6a6059afd05 Mon Sep 17 00:00:00 2001 From: gevaerts Date: Mon, 9 Nov 2009 17:43:46 +0000 Subject: [PATCH] Allow %?Sp<...> to be used as a conditional When there are two choices (i.e. boolean), choose the first one if the pitch is different from the normal value, and choose the second one if the pitch is the same as the normal value. When there are more than two choices (i.e. enum), the left half of the choices are used to show 0..normal range, and the right half of the choices are used to show values over that range. The last entry is used when it is set to the normal setting, following the rockbox convention to use the last entry for special values. 2 items: %?Sp<0..99 or 101..infinity|100> 3 items: %?Sp<0..99|101..infinity|100> 4 items: %?Sp<0..49|50..99|101..infinity|100> 5 items: %?Sp<0..49|50..99|101..149|150..infinity|100> 6 items: %?Sp<0..33|34..66|67..99|101..133|134..infinity|100> 7 items: %?Sp<0..33|34..66|67..99|101..133|134..167|167..infinity|100> This will allow two expected use cases: (1) %?Sp<%Sp> to show the pitch only when playing at a modified pitch. (2) %?Sp<%xdAa|%xdAb|> to show an icon of Darth Vader (subpicture 1 of image A) when playing at a lower pitch than the original, and to show an icon of a chipmunk (subpicture 2 of image A) when playing at a higher pitch than the original. When playing at a normal pitch, nothing is shown. Flyspray: FS#10680 Author: Junio C Hamano git-svn-id: svn://svn.rockbox.org/rockbox/trunk@23589 a1c6a512-1295-4272-9138-f99709370657 --- apps/gui/skin_engine/skin_tokens.c | 40 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/apps/gui/skin_engine/skin_tokens.c b/apps/gui/skin_engine/skin_tokens.c index c599adf83..6eb1759b9 100644 --- a/apps/gui/skin_engine/skin_tokens.c +++ b/apps/gui/skin_engine/skin_tokens.c @@ -107,6 +107,42 @@ static char* get_dir(char* buf, int buf_size, const char* path, int level) return buf; } +/* A helper to determine the enum value for pitch/speed. + + When there are two choices (i.e. boolean), return 1 if the value is + different from normal value and 2 if the value is the same as the + normal value. E.g. "%?Sp<%Sp>" would show the pitch only when + playing at a modified pitch. + + When there are more than two choices (i.e. enum), the left half of + the choices are to show 0..normal range, and the right half of the + choices are to show values over that. The last entry is used when + it is set to the normal setting, following the rockbox convention + to use the last entry for special values. + + E.g. + + 2 items: %?Sp<0..99 or 101..infinity|100> + 3 items: %?Sp<0..99|101..infinity|100> + 4 items: %?Sp<0..49|50..99|101..infinity|100> + 5 items: %?Sp<0..49|50..99|101..149|150..infinity|100> + 6 items: %?Sp<0..33|34..66|67..99|101..133|134..infinity|100> + 7 items: %?Sp<0..33|34..66|67..99|101..133|134..167|167..infinity|100> +*/ +static int pitch_speed_enum(int range, int32_t val, int32_t normval) +{ + int center; + int n; + + if (range < 3) + return (val == normval) + 1; + if (val == normval) + return range; + center = range / 2; + n = (center * val) / normval + 1; + return (range <= n) ? (range - 1) : n; +} + /* Return the tag found at index i and write its value in buf. The return value is buf if the tag had a value, or NULL if not. @@ -786,6 +822,10 @@ const char *get_token_value(struct gui_wps *gwps, snprintf(buf, buf_size, "%ld.%ld", pitch / PITCH_SPEED_PRECISION, (pitch % PITCH_SPEED_PRECISION) / (PITCH_SPEED_PRECISION / 10)); + + if (intval) + *intval = pitch_speed_enum(limit, pitch, + PITCH_SPEED_PRECISION * 100); return buf; } #endif -- 2.11.4.GIT