From b1be21531829e1603eea405f1315f241d9351f33 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt Date: Wed, 6 Mar 2024 23:16:22 +0100 Subject: [PATCH] avcodec/xpmdec: Use LUT for hex char->number conversion Speeds up decoding and also reduces binary size. Signed-off-by: Andreas Rheinhardt Signed-off-by: Paul B Mahol --- libavcodec/xpmdec.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/libavcodec/xpmdec.c b/libavcodec/xpmdec.c index e7f8a90fdc..b915abe0bf 100644 --- a/libavcodec/xpmdec.c +++ b/libavcodec/xpmdec.c @@ -193,15 +193,22 @@ static const ColorEntry color_table[] = { static unsigned hex_char_to_number(uint8_t x) { - if (x >= 'a' && x <= 'f') - x -= 'a' - 10; - else if (x >= 'A' && x <= 'F') - x -= 'A' - 10; - else if (x >= '0' && x <= '9') - x -= '0'; - else - x = 0; - return x; +#define TIMES256(idx) \ +TIMES64(4 * (idx)) TIMES64(4 * (idx) + 1) TIMES64(4 * (idx) + 2) TIMES64(4 * (idx) + 3) +#define TIMES64(idx) \ +TIMES16(4 * (idx)) TIMES16(4 * (idx) + 1) TIMES16(4 * (idx) + 2) TIMES16(4 * (idx) + 3) +#define TIMES16(idx) \ +TIMES4(4 * (idx)) TIMES4(4 * (idx) + 1) TIMES4(4 * (idx) + 2) TIMES4(4 * (idx) + 3) +#define TIMES4(idx) \ +ENTRY(4 * (idx)) ENTRY(4 * (idx) + 1) ENTRY(4 * (idx) + 2) ENTRY(4 * (idx) + 3) +#define ENTRY(x) [x] = ((x) >= 'a' && (x) <= 'f') ? (x) - ('a' - 10) : \ + ((x) >= 'A' && (x) <= 'F') ? (x) - ('A' - 10) : \ + ((x) >= '0' && (x) <= '9') ? (x) - '0' : 0, + + static const uint8_t lut[] = { + TIMES256(0) + }; + return lut[x]; } /*