//--- // util: General utilities (what a surprise huh?) //--- #pragma once #include #include #include /* Integer square root (recursive, logarithmic complexity). */ int64_t sqrtll(int64_t n); #include "fixed.h" // Heaps /* Queue objects are passed by value in this API. */ typedef struct { /* Number of slots allocated */ uint16_t alloc_size; /* Number of slots used */ uint16_t size; /* Size of elements */ uint16_t elsize; /* Array of elements, of size alloc_size * elsize */ void *array; /* Comparison function */ int (*compare)(void const *, void const *); } pqueue_t; /* Allocate a queue for [size] elements of individual size [elsize] with the specified comparison function. */ pqueue_t pqueue_alloc(size_t size, size_t elsize, int (*compare)(void const *, void const *)); /* Free the buffer of the queue. */ void pqueue_destroy(pqueue_t *q); /* Check whether the queue is empty. */ bool pqueue_empty(pqueue_t const *q); /* Add [*element] to the queue. */ void pqueue_add(pqueue_t *q, void const *element); /* Pop the smallest element of the queue into [*ret]. */ void pqueue_pop(pqueue_t *q, void *ret); /* Like qsort(), but actually it's a heap sort. */ void heap_sort(void *base, size_t n, size_t elsize, int (*compare)(void const *, void const *)); // Other utils /* Round F-key. */ void fkey_button(int position, char const *text, int color); /* Size of text with digit-only image font. */ void font_damage_size(int value, int *w, int *h); /* Render text with digit-only image font. */ void font_damage_print(int x, int y, int color, int align_x, int align_y, int value); #define RGB24(hex) \ (((hex & 0xf80000) >> 8) | \ ((hex & 0x00fc00) >> 5) | \ ((hex & 0x0000f8) >> 3)) /* Cubic transition from [start] to [end] in total time [tmax] */ int cubic(int start, int end, fixed_t t, fixed_t tmax);