taisei/src/resource/font.h
Andrei Alexeyev 9b3779ebb4
Some renderer refactoring (mostly API and GLES preparations) (#144)
* Refacor uniforms API:

    - More complete and consistent
    - Type-safety
    - Usage correctess assertions missing for now, planned

* Redesign texturing API: texunits gone, assign textures to sampler uniforms directly

r_texture_create now allocates memory and returns an opaque Texture
pointer; similar changes to the other renderer APIs will follow.

* Framebuffers: make _create return an opaque pointer, add debug label APIs (unused for now)

* opaque pointers and debug label APIs for vertex arrays and buffers

* fix null renderer

* Refactor glsl preprocessing into an independent module

* Separate shader resource management from renderer backend

This makes it possible to add more shading languages and/or include a
transpiler, which will be useful for the GLES backend.

* refactor r_clear into a stateless API

* add r_texture_clear API; fix gl33_framebuffer_clear

* Replace deprecated glsl_objects with objects in all *.prog files

* fix missing texture_clear implementation in null renderer

* remove some dead code in null renderer

* fix GLES segfault

* GLES 3.0 actually has glVertexAttribDivisor

* Query GL for supported GLSL versions (preparing to add shader transcompilation)
2018-09-14 10:37:20 +03:00

122 lines
2.7 KiB
C

/*
* This software is licensed under the terms of the MIT-License
* See COPYING for further information.
* ---
* Copyright (c) 2011-2018, Lukas Weber <laochailan@web.de>.
* Copyright (c) 2012-2018, Andrei Alexeyev <akari@alienslab.net>.
*/
#pragma once
#include "taisei.h"
#include "sprite.h"
#include "hashtable.h"
#include "resource.h"
#include "renderer/api.h"
typedef enum {
ALIGN_LEFT = 0, // must be 0
ALIGN_CENTER,
ALIGN_RIGHT,
} Alignment;
typedef ulong charcode_t;
typedef struct Font Font;
typedef struct FontMetrics {
int ascent;
int descent;
int max_glyph_height;
int lineskip;
double scale;
} FontMetrics;
typedef struct GlyphMetrics {
int bearing_x;
int bearing_y;
int width;
int height;
int advance;
} GlyphMetrics;
// TODO: maybe move this into util/geometry.h
typedef struct BBox {
struct {
int min;
int max;
} x;
struct {
int min;
int max;
} y;
} BBox;
typedef void (*GlyphDrawCallback)(Font *font, charcode_t charcode, SpriteParams *spr_params, void *userdata);
typedef struct TextParams {
const char *font;
Font *font_ptr;
const char *shader;
ShaderProgram *shader_ptr;
struct {
GlyphDrawCallback func;
void *userdata;
} glyph_callback;
struct { double x, y; } pos;
const Color *color;
const ShaderCustomParams *shader_params;
Texture *aux_textures[R_NUM_SPRITE_AUX_TEXTURES];
BlendMode blend;
Alignment align;
} TextParams;
Font* get_font(const char *font)
attr_nonnull(1);
ShaderProgram* text_get_default_shader(void)
attr_returns_nonnull;
const FontMetrics* font_get_metrics(Font *font)
attr_nonnull(1) attr_returns_nonnull;
double font_get_lineskip(Font *font)
attr_nonnull(1);
const GlyphMetrics* font_get_char_metrics(Font *font, charcode_t c)
attr_nonnull(1);
double text_draw(const char *text, const TextParams *params)
attr_nonnull(1, 2);
double text_draw_wrapped(const char *text, double max_width, const TextParams *params)
attr_nonnull(1, 3);
void text_render(const char *text, Font *font, Sprite *out_sprite, BBox *out_bbox)
attr_nonnull(1, 2, 3, 4);
void text_shorten(Font *font, char *text, double width)
attr_nonnull(1, 2);
void text_wrap(Font *font, const char *src, double width, char *buf, size_t bufsize)
attr_nonnull(1, 2, 4);
void text_bbox(Font *font, const char *text, uint maxlines, BBox *bbox)
attr_nonnull(1, 2, 4);
int text_width_raw(Font *font, const char *text, uint maxlines)
attr_nonnull(1, 2);
double text_width(Font *font, const char *text, uint maxlines)
attr_nonnull(1, 2);
int text_height_raw(Font *font, const char *text, uint maxlines)
attr_nonnull(1, 2);
double text_height(Font *font, const char *text, uint maxlines)
attr_nonnull(1, 2);
extern ResourceHandler font_res_handler;
#define FONT_PATH_PREFIX "res/fonts/"
#define FONT_EXTENSION ".font"