diff options
author | Iru Cai <mytbk920423@gmail.com> | 2018-09-03 15:52:36 +0800 |
---|---|---|
committer | Iru Cai <mytbk920423@gmail.com> | 2018-09-03 15:52:36 +0800 |
commit | 40437b955bb7fccb3ec6480982cad5b79670b6bd (patch) | |
tree | ad8d4e69b396c266c5a3a0d5a2f9fb356e067064 /csrc/bit_functions.c | |
parent | 69d17d3c5b4024d04b70bfe2e2f635fff0a5a3e5 (diff) | |
download | rich4-40437b955bb7fccb3ec6480982cad5b79670b6bd.tar.xz |
move fcn_004552b7 to bit_functions.c and complete it
Diffstat (limited to 'csrc/bit_functions.c')
-rw-r--r-- | csrc/bit_functions.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/csrc/bit_functions.c b/csrc/bit_functions.c new file mode 100644 index 0000000..b0be170 --- /dev/null +++ b/csrc/bit_functions.c @@ -0,0 +1,71 @@ +#include <stdint.h> +#include <stddef.h> + +typedef void (*bit_f)(uint16_t*, uint16_t*, uint8_t*, size_t); +extern uint32_t pixel_fmt; + +void fcn_455337(uint16_t *edi, uint16_t *esi, uint8_t *ebx, size_t ecx) +{ + do { + uint16_t ax = *esi; + esi++; + + uint8_t dl = ebx[ax & 0x1f]; + uint8_t dh = ebx[(ax >> 5) & 0x1f]; + uint8_t al = ebx[(ax >> 10) & 0x1f]; + ax = ((uint16_t)(al & 0x3f) << 10) | ((uint16_t)(dh & 0x1f) << 5) | (dl & 0x1f); + + *edi = ax; + edi++; + } while (--ecx); +} + +void fcn_45536c(uint16_t *edi, uint16_t *esi, uint8_t *ebx, size_t ecx) +{ + do { + uint32_t ax = *esi; + esi++; + + uint8_t dl = ebx[ax & 0x1f]; + uint8_t dh = ebx[(ax >> 6) & 0x1f]; + uint16_t dx = ((uint16_t)dh << 8) | dl; + uint8_t al = ebx[(ax >> 11) & 0x1f]; + ax = ((uint16_t)(al & 0x1f) << 11) | (((dx >> 7) & 0x3f) << 5) | (dx & 0x1f); + + *edi = ax; + edi++; + } while (--ecx); +} + +void fcn_4553a1(uint16_t *edi, uint16_t *esi, uint8_t *ebx, size_t ecx) +{ + ebx = (uint8_t*)(((long)ebx) >> 1); + do { + uint16_t ax = *esi; + esi++; + + uint8_t dl = ebx[ax & 0xf]; + uint8_t dh = ebx[(ax >> 4) & 0xf]; + uint8_t al = ebx[(ax >> 8) & 0xf]; + ax = ((uint16_t)(dh & 0xf) << 12) | ((uint16_t)al << 4) | (dl & 0xf); + + *edi = ax; + edi++; + } while (--ecx); +} + +const bit_f ftable_485958[] = { + fcn_455337, fcn_45536c, fcn_45536c, fcn_4553a1 +}; +const uint32_t ftable_485968[] = { + 0x00455442U, 0x00455480U, 0x00455480U, 0x004554beU +}; +const uint32_t ftable_485978[] = { + 0x004555ebU, 0x00455628U, 0x0045566eU, 0x004556abU +}; + +void fcn_004552b7(void * dst, void * src, size_t a3, int a4) +{ + ftable_485958[pixel_fmt](dst, src, (uint8_t*)(0x485d68 + (a4 << 5)), a3 >> 1); +} + |