diff options
| -rw-r--r-- | firmware/export/system.h | 2 | ||||
| -rw-r--r-- | firmware/font.c | 29 |
2 files changed, 15 insertions, 16 deletions
diff --git a/firmware/export/system.h b/firmware/export/system.h index cec47f1..aa07994 100644 --- a/firmware/export/system.h +++ b/firmware/export/system.h @@ -124,6 +124,8 @@ int get_cpu_boost_counter(void); ptr = (typeof(ptr))tmp_ptr1; \ } +#define PTR_ADD(ptr, x) ((typeof(ptr))((char*)(ptr) + (x))) +#define PTR_SUB(ptr, x) ((typeof(ptr))((char*)(ptr) - (x))) /* newer? SDL includes endian.h, So we ignore it */ #if (CONFIG_PLATFORM & PLATFORM_HOSTED) || defined(__PCTOOL__) diff --git a/firmware/font.c b/firmware/font.c index 0546061..8cd9be1 100644 --- a/firmware/font.c +++ b/firmware/font.c @@ -88,26 +88,23 @@ static int buflibmove_callback(int handle, void* current, void* new) { (void)handle; struct buflib_alloc_data *alloc = (struct buflib_alloc_data*)current; - size_t diff = new - current; + ptrdiff_t diff = new - current; if (alloc->handle_locked) return BUFLIB_CB_CANNOT_MOVE; - if (alloc->font.bits) - alloc->font.bits += diff; - if (alloc->font.offset) - alloc->font.offset += diff; - if (alloc->font.width) - alloc->font.width += diff; - - alloc->font.buffer_start += diff; - alloc->font.buffer_end += diff; - alloc->font.buffer_position += diff; - - if (alloc->font.cache._index) - alloc->font.cache._index += diff; - if (alloc->font.cache._lru._base) - alloc->font.cache._lru._base += diff; +#define UPDATE(x) if (x) { x = PTR_ADD(x, diff); } + + UPDATE(alloc->font.bits); + UPDATE(alloc->font.offset); + UPDATE(alloc->font.width); + + UPDATE(alloc->font.buffer_start); + UPDATE(alloc->font.buffer_end); + UPDATE(alloc->font.buffer_position); + + UPDATE(alloc->font.cache._index); + UPDATE(alloc->font.cache._lru._base); return BUFLIB_CB_OK; } |