[QP] Add RGB565 surface. Docs clarification, cleanup, tabsification, and reordering. (#18396)
This commit is contained in:
parent
e9bdc4eeb1
commit
1849897444
10 changed files with 782 additions and 294 deletions
|
@ -36,10 +36,10 @@ typedef struct qff_font_handle_t {
|
|||
static qff_font_handle_t font_descriptors[QUANTUM_PAINTER_NUM_FONTS] = {0};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Quantum Painter External API: qp_load_font_mem
|
||||
// Helper: load font from stream
|
||||
|
||||
painter_font_handle_t qp_load_font_mem(const void *buffer) {
|
||||
qp_dprintf("qp_load_font_mem: entry\n");
|
||||
static painter_font_handle_t qp_load_font_internal(bool (*stream_factory)(qff_font_handle_t *font, void *arg), void *arg) {
|
||||
qp_dprintf("qp_load_font: entry\n");
|
||||
qff_font_handle_t *font = NULL;
|
||||
|
||||
// Find a free slot
|
||||
|
@ -52,20 +52,18 @@ painter_font_handle_t qp_load_font_mem(const void *buffer) {
|
|||
|
||||
// Drop out if not found
|
||||
if (!font) {
|
||||
qp_dprintf("qp_load_font_mem: fail (no free slot)\n");
|
||||
qp_dprintf("qp_load_font: fail (no free slot)\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Assume we can read the graphics descriptor
|
||||
font->mem_stream = qp_make_memory_stream((void *)buffer, sizeof(qff_font_descriptor_v1_t));
|
||||
|
||||
// Update the length of the stream to match, and rewind to the start
|
||||
font->mem_stream.length = qff_get_total_size(&font->stream);
|
||||
font->mem_stream.position = 0;
|
||||
if (!stream_factory(font, arg)) {
|
||||
qp_dprintf("qp_load_font: fail (could not create stream)\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Now that we know the length, validate the input data
|
||||
if (!qff_validate_stream(&font->stream)) {
|
||||
qp_dprintf("qp_load_font_mem: fail (failed validation)\n");
|
||||
qp_dprintf("qp_load_font: fail (failed validation)\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -76,12 +74,12 @@ painter_font_handle_t qp_load_font_mem(const void *buffer) {
|
|||
|
||||
void *ram_buffer = malloc(font->mem_stream.length);
|
||||
if (ram_buffer == NULL) {
|
||||
qp_dprintf("qp_load_font_mem: could not allocate enough RAM for font, falling back to original\n");
|
||||
qp_dprintf("qp_load_font: could not allocate enough RAM for font, falling back to original\n");
|
||||
} else {
|
||||
do {
|
||||
// Copy the data into RAM
|
||||
if (qp_stream_read(ram_buffer, 1, font->mem_stream.length, &font->mem_stream) != font->mem_stream.length) {
|
||||
qp_dprintf("qp_load_font_mem: could not copy from flash to RAM, falling back to original\n");
|
||||
qp_dprintf("qp_load_font: could not copy from flash to RAM, falling back to original\n");
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -102,17 +100,37 @@ painter_font_handle_t qp_load_font_mem(const void *buffer) {
|
|||
qff_read_font_descriptor(&font->stream, &font->base.line_height, &font->has_ascii_table, &font->num_unicode_glyphs, &font->bpp, &font->has_palette, &font->compression_scheme, NULL);
|
||||
|
||||
if (!qp_internal_bpp_capable(font->bpp)) {
|
||||
qp_dprintf("qp_load_font_mem: fail (image bpp too high (%d), check QUANTUM_PAINTER_SUPPORTS_256_PALETTE)\n", (int)font->bpp);
|
||||
qp_dprintf("qp_load_font: fail (image bpp too high (%d), check QUANTUM_PAINTER_SUPPORTS_256_PALETTE)\n", (int)font->bpp);
|
||||
qp_close_font((painter_font_handle_t)font);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Validation success, we can return the handle
|
||||
font->validate_ok = true;
|
||||
qp_dprintf("qp_load_font_mem: ok\n");
|
||||
qp_dprintf("qp_load_font: ok\n");
|
||||
return (painter_font_handle_t)font;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Quantum Painter External API: qp_load_font_mem
|
||||
|
||||
static inline bool font_mem_stream_factory(qff_font_handle_t *font, void *arg) {
|
||||
void *buffer = arg;
|
||||
|
||||
// Assume we can read the graphics descriptor
|
||||
font->mem_stream = qp_make_memory_stream(buffer, sizeof(qff_font_descriptor_v1_t));
|
||||
|
||||
// Update the length of the stream to match, and rewind to the start
|
||||
font->mem_stream.length = qff_get_total_size(&font->stream);
|
||||
font->mem_stream.position = 0;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
painter_font_handle_t qp_load_font_mem(const void *buffer) {
|
||||
return qp_load_font_internal(font_mem_stream_factory, (void *)buffer);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Quantum Painter External API: qp_close_font
|
||||
|
||||
|
@ -133,6 +151,7 @@ bool qp_close_font(painter_font_handle_t font) {
|
|||
#endif // QUANTUM_PAINTER_LOAD_FONTS_TO_RAM
|
||||
|
||||
// Free up this font for use elsewhere.
|
||||
qp_stream_close(&qff_font->stream);
|
||||
qff_font->validate_ok = false;
|
||||
return true;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue