view nuklear_ui/font.c @ 1546:1a09422b87a5

Get Windows build working again. MegaWiFi code probably needs more work before it will actually work on Windows, but at least it doesn't break the build now
author Michael Pavone <pavone@retrodev.com>
date Mon, 26 Mar 2018 21:25:40 -0700
parents 4f6e8acd7b6a
children 24508cb54f87
line wrap: on
line source

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include "../util.h"
#include "sfnt.h"

char *default_font_path(void)
{
	FILE *fc_pipe = popen("fc-match -f '%{file}'", "r");
	if (!fc_pipe) {
		return NULL;
	}
	size_t buf_size = 128;
	char *buffer = NULL;
	size_t total = 0, read = 0;
	do {
		total += read;
		buf_size *= 2;
		buffer = realloc(buffer, buf_size);
		if (!buffer) {
			return NULL;
		}
		read = fread(buffer, 1, buf_size - total, fc_pipe);
	} while (read == (buf_size - total));
	total += read;
	buffer[total] = 0;
	
	return buffer;
}

uint8_t *default_font(uint32_t *size_out)
{
	char *path = default_font_path();
	if (!path) {
		goto error;
	}
	FILE *f = fopen(path, "rb");
	if (!f) {
		goto error;
	}
	long size = file_size(f);
	uint8_t *buffer = malloc(size);
	if (size != fread(buffer, 1, size, f)) {
		fclose(f);
		goto error;
	}
	fclose(f);
	sfnt_container *sfnt = load_sfnt(buffer, size);
	if (!sfnt) {
		free(buffer);
		goto error;
	}
	return sfnt_flatten(sfnt->tables, size_out);
error:
	//TODO: try to find a suitable font in /usr/share/fonts as a fallback
	return NULL;
}