diff options
author | Michael Drake <tlsa@netsurf-browser.org> | 2021-09-26 20:16:32 +0100 |
---|---|---|
committer | Michael Drake <tlsa@netsurf-browser.org> | 2021-09-26 20:16:32 +0100 |
commit | fada1a850cb1e88b9c19e45029092311ab7f869c (patch) | |
tree | aaa84b7bf8b091e9d20eb36ae81e8d80f44035d5 | |
parent | 9be2acf63d9f293d0ca1321dfd985889bce4e37d (diff) | |
download | libnsgif-fada1a850cb1e88b9c19e45029092311ab7f869c.tar.gz libnsgif-fada1a850cb1e88b9c19e45029092311ab7f869c.tar.bz2 |
lzw: Optimisation: Pre-multiply relative offsets by struct size.tlsa/lzw-optimise
-rw-r--r-- | src/lzw.c | 25 |
1 files changed, 19 insertions, 6 deletions
@@ -364,7 +364,7 @@ static inline void lzw__table_add_entry( entry->value = code; entry->first = ctx->prev_code_first; entry->count = ctx->prev_code_count + 1; - entry->extends = ctx->table_size - ctx->prev_code; + entry->extends = (ctx->table_size - ctx->prev_code) * sizeof(*entry); ctx->table_size++; } @@ -444,6 +444,19 @@ static inline lzw_result lzw__decode( } /** + * Get the LZW table entry that the given entry extends. + * + * \param[in] entry The starting entry/ + * \return new table entry. + */ +static inline const struct lzw_table_entry *lzw__entry_get_extends( + const struct lzw_table_entry *entry) +{ + return (const struct lzw_table_entry *) + (((const uint8_t *)(entry)) - entry->extends); +} + +/** * Write values for this code to the output stack. * * If there isn't enough space in the output stack, this function will write @@ -483,13 +496,13 @@ static inline uint32_t lzw__write_fn(struct lzw_ctx *ctx, /* Skip over any values we don't have space for. */ for (unsigned i = left; i != 0; i--) { - entry -= entry->extends; + entry = lzw__entry_get_extends(entry); } output_pos += count; for (unsigned i = count; i != 0; i--) { *--output_pos = entry->value; - entry -= entry->extends; + entry = lzw__entry_get_extends(entry); } return count; @@ -561,7 +574,7 @@ static inline uint32_t lzw__map_write_fn(struct lzw_ctx *ctx, ctx->output_left = left; for (unsigned i = left; i != 0; i--) { - entry -= entry->extends; + entry = lzw__entry_get_extends(entry); } output_pos += count; @@ -571,12 +584,12 @@ static inline uint32_t lzw__map_write_fn(struct lzw_ctx *ctx, if (entry->value != ctx->transparency_idx) { *output_pos = ctx->colour_map[entry->value]; } - entry -= entry->extends; + entry = lzw__entry_get_extends(entry); } } else { for (unsigned i = count; i != 0; i--) { *--output_pos = ctx->colour_map[entry->value]; - entry -= entry->extends; + entry = lzw__entry_get_extends(entry); } } |