|
|
@ -14,7 +14,7 @@ ColoredRect colored_rect(float width, float height, float r, float g, float b, f
|
|
|
|
return rect;
|
|
|
|
return rect;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
VkResult load_font(const char* atlas_file, const char* metadata_file, FontData* font) {
|
|
|
|
VkResult load_font(const char* atlas_file, const char* metadata_file, FontData* font, SymbolInfo** symbols, uint32_t** image) {
|
|
|
|
FILE* atlas = fopen(atlas_file, "rb");
|
|
|
|
FILE* atlas = fopen(atlas_file, "rb");
|
|
|
|
if(atlas == NULL) {
|
|
|
|
if(atlas == NULL) {
|
|
|
|
return VK_ERROR_UNKNOWN;
|
|
|
|
return VK_ERROR_UNKNOWN;
|
|
|
@ -44,9 +44,9 @@ VkResult load_font(const char* atlas_file, const char* metadata_file, FontData*
|
|
|
|
return VK_ERROR_UNKNOWN;
|
|
|
|
return VK_ERROR_UNKNOWN;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
font->data = malloc(out_size);
|
|
|
|
*image = malloc(out_size);
|
|
|
|
|
|
|
|
|
|
|
|
result = spng_decode_image(ctx, font->data, out_size, SPNG_FMT_RGBA8, 0);
|
|
|
|
result = spng_decode_image(ctx, *image, out_size, SPNG_FMT_RGBA8, 0);
|
|
|
|
if(result != SPNG_OK) {
|
|
|
|
if(result != SPNG_OK) {
|
|
|
|
return VK_ERROR_UNKNOWN;
|
|
|
|
return VK_ERROR_UNKNOWN;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -66,6 +66,32 @@ VkResult load_font(const char* atlas_file, const char* metadata_file, FontData*
|
|
|
|
if(atlas == NULL) {
|
|
|
|
if(atlas == NULL) {
|
|
|
|
return VK_ERROR_UNKNOWN;
|
|
|
|
return VK_ERROR_UNKNOWN;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
uint16_t symbol_count;
|
|
|
|
|
|
|
|
uint8_t ascent, descent;
|
|
|
|
|
|
|
|
fread(&symbol_count, 2, 1, metadata);
|
|
|
|
|
|
|
|
fread(&ascent, 1, 1, metadata);
|
|
|
|
|
|
|
|
fread(&descent, 1, 1, metadata);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
font->info.num_symbols = ntohs(symbol_count);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*symbols = malloc(sizeof(SymbolInfo)*symbol_count);
|
|
|
|
|
|
|
|
font->codes = malloc(sizeof(uint16_t)*symbol_count);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uint8_t width;
|
|
|
|
|
|
|
|
uint8_t top;
|
|
|
|
|
|
|
|
uint16_t code;
|
|
|
|
|
|
|
|
uint32_t x;
|
|
|
|
|
|
|
|
for(uint16_t i = 0; i < symbol_count; i++) {
|
|
|
|
|
|
|
|
fread(&code, 2, 1, metadata);
|
|
|
|
|
|
|
|
font->codes[i] = ntohs(code);
|
|
|
|
|
|
|
|
fread(&x, 4, 1, metadata);
|
|
|
|
|
|
|
|
(*symbols)[i].x = ntohl(x);
|
|
|
|
|
|
|
|
fread(&width, 1, 1, metadata);
|
|
|
|
|
|
|
|
(*symbols)[i].width = width;
|
|
|
|
|
|
|
|
fread(&top, 1, 1, metadata);
|
|
|
|
|
|
|
|
(*symbols)[i].top = top;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fclose(metadata);
|
|
|
|
fclose(metadata);
|
|
|
|
|
|
|
|
|
|
|
|
return VK_SUCCESS;
|
|
|
|
return VK_SUCCESS;
|
|
|
@ -85,13 +111,15 @@ VkResult render_thread(GLFWwindow* window, RenderContext* render_context) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FontData test_font = {};
|
|
|
|
FontData test_font = {};
|
|
|
|
result = load_font("tools/test.png", "tools/test.meta", &test_font);
|
|
|
|
uint32_t* test_atlas;
|
|
|
|
|
|
|
|
SymbolInfo* test_symbols;
|
|
|
|
|
|
|
|
result = load_font("tools/test.png", "tools/test.meta", &test_font, &test_symbols, &test_atlas);
|
|
|
|
if(result != VK_SUCCESS) {
|
|
|
|
if(result != VK_SUCCESS) {
|
|
|
|
return result;
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FontDescriptor test_font_descriptor;
|
|
|
|
FontDescriptor test_font_descriptor;
|
|
|
|
result = create_text_descriptor(render_context->device, render_context->allocator, ui_context.font_layout, ui_context.font_pool, &test_font, render_context->transfer_pool, render_context->transfer_queue, &test_font_descriptor);
|
|
|
|
result = create_text_descriptor(render_context->device, render_context->allocator, ui_context.font_layout, ui_context.font_pool, &test_font, test_symbols, test_atlas, render_context->transfer_pool, render_context->transfer_queue, &test_font_descriptor);
|
|
|
|
if(result != VK_SUCCESS) {
|
|
|
|
if(result != VK_SUCCESS) {
|
|
|
|
return result;
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
}
|
|
|
|