nuclear@7: /* nuclear@7: libdrawtext - a simple library for fast text rendering in OpenGL nuclear@7: Copyright (C) 2011-2014 John Tsiombikas nuclear@7: nuclear@7: This program is free software: you can redistribute it and/or modify nuclear@7: it under the terms of the GNU Lesser General Public License as published by nuclear@7: the Free Software Foundation, either version 3 of the License, or nuclear@7: (at your option) any later version. nuclear@7: nuclear@7: This program is distributed in the hope that it will be useful, nuclear@7: but WITHOUT ANY WARRANTY; without even the implied warranty of nuclear@7: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nuclear@7: GNU Lesser General Public License for more details. nuclear@7: nuclear@7: You should have received a copy of the GNU Lesser General Public License nuclear@7: along with this program. If not, see . nuclear@7: */ nuclear@7: #ifndef LIBDRAWTEXT_H_ nuclear@7: #define LIBDRAWTEXT_H_ nuclear@7: nuclear@7: #include nuclear@7: #include nuclear@7: #include "assman.h" nuclear@7: nuclear@7: struct dtx_font; nuclear@7: struct dtx_glyphmap; nuclear@7: nuclear@7: /* draw buffering modes */ nuclear@7: enum { nuclear@7: DTX_NBF, /* unbuffered */ nuclear@7: DTX_LBF, /* line buffered */ nuclear@7: DTX_FBF /* fully buffered */ nuclear@7: }; nuclear@7: nuclear@7: struct dtx_box { nuclear@7: float x, y; nuclear@7: float width, height; nuclear@7: }; nuclear@7: nuclear@7: #ifdef __cplusplus nuclear@7: extern "C" { nuclear@7: #endif nuclear@7: nuclear@7: /* Open a truetype/opentype/whatever font. nuclear@7: * nuclear@7: * If sz is non-zero, the default ASCII glyphmap at the requested point size is nuclear@7: * automatically created as well, and ready to use. nuclear@7: * nuclear@7: * To use other unicode ranges and different font sizes you must first call nuclear@7: * dtx_prepare or dtx_prepare_range before issuing any drawing calls, otherwise nuclear@7: * nothing will be rendered. nuclear@7: */ nuclear@7: struct dtx_font *dtx_open_font(const char *fname, int sz); nuclear@7: /* open a font by loading a precompiled glyphmap (see: dtx_save_glyphmap) nuclear@7: * this works even when compiled without freetype support nuclear@7: */ nuclear@7: struct dtx_font *dtx_open_font_glyphmap(const char *fname); nuclear@7: /* close a font opened by either of the above */ nuclear@7: void dtx_close_font(struct dtx_font *fnt); nuclear@7: nuclear@7: /* prepare an ASCII glyphmap for the specified font size */ nuclear@7: void dtx_prepare(struct dtx_font *fnt, int sz); nuclear@7: /* prepare an arbitrary unicode range glyphmap for the specified font size */ nuclear@7: void dtx_prepare_range(struct dtx_font *fnt, int sz, int cstart, int cend); nuclear@7: nuclear@7: int dtx_get_font_glyphmap_count(struct dtx_font *fnt); nuclear@7: struct dtx_glyphmap *dtx_get_font_glyphmap_idx(struct dtx_font *fnt, int idx); nuclear@7: nuclear@7: /* Finds the glyphmap that contains the specified character code and matches the requested size nuclear@7: * Returns null if it hasn't been created (you should call dtx_prepare/dtx_prepare_range). nuclear@7: */ nuclear@7: struct dtx_glyphmap *dtx_get_font_glyphmap(struct dtx_font *fnt, int sz, int code); nuclear@7: nuclear@7: /* Finds the glyphmap that contains the specified unicode range and matches the requested font size nuclear@7: * Will automatically generate one if it can't find it. nuclear@7: */ nuclear@7: struct dtx_glyphmap *dtx_get_font_glyphmap_range(struct dtx_font *fnt, int sz, int cstart, int cend); nuclear@7: nuclear@7: /* Creates and returns a glyphmap for a particular unicode range and font size. nuclear@7: * The generated glyphmap is added to the font's list of glyphmaps. nuclear@7: */ nuclear@7: struct dtx_glyphmap *dtx_create_glyphmap_range(struct dtx_font *fnt, int sz, int cstart, int cend); nuclear@7: /* free a glyphmap */ nuclear@7: void dtx_free_glyphmap(struct dtx_glyphmap *gmap); nuclear@7: nuclear@7: /* returns a pointer to the raster image of a glyphmap (1 byte per pixel grayscale) */ nuclear@7: unsigned char *dtx_get_glyphmap_image(struct dtx_glyphmap *gmap); nuclear@7: /* returns the point size of the glyphmap */ nuclear@7: int dtx_get_glyphmap_ptsize(struct dtx_glyphmap *gmap); nuclear@7: /* returns the width of the glyphmap image in pixels */ nuclear@7: int dtx_get_glyphmap_width(struct dtx_glyphmap *gmap); nuclear@7: /* returns the height of the glyphmap image in pixels */ nuclear@7: int dtx_get_glyphmap_height(struct dtx_glyphmap *gmap); nuclear@7: nuclear@7: /* The following functions can be used even when the library is compiled without nuclear@7: * freetype support. nuclear@7: */ nuclear@7: struct dtx_glyphmap *dtx_load_glyphmap(const char *fname); nuclear@7: struct dtx_glyphmap *dtx_load_glyphmap_stream(FILE *fp); nuclear@7: struct dtx_glyphmap *dtx_load_glyphmap_asset(ass_file *fp); nuclear@7: int dtx_save_glyphmap(const char *fname, const struct dtx_glyphmap *gmap); nuclear@7: int dtx_save_glyphmap_stream(FILE *fp, const struct dtx_glyphmap *gmap); nuclear@7: nuclear@7: /* adds a glyphmap to a font */ nuclear@7: void dtx_add_glyphmap(struct dtx_font *fnt, struct dtx_glyphmap *gmap); nuclear@7: nuclear@7: /* ---- rendering ---- */ nuclear@7: nuclear@7: /* before drawing anything this function must set the font to use */ nuclear@7: void dtx_use_font(struct dtx_font *fnt, int sz); nuclear@7: nuclear@7: /* sets the buffering mode nuclear@7: * - DTX_NBUF: every call to dtx_string gets rendered immediately. nuclear@7: * - DTX_LBUF: renders when the buffer is full or the string contains a newline. nuclear@7: * - DTX_FBUF: renders only when the buffer is full (you must call dtx_flush explicitly). nuclear@7: */ nuclear@7: void dtx_draw_buffering(int mode); nuclear@7: nuclear@7: /* Sets the vertex attribute indices to use for passing vertex and texture coordinate nuclear@7: * data. By default both are -1 which means you don't have to use a shader, and if you nuclear@7: * do they are accessible through gl_Vertex and gl_MultiTexCoord0, as usual. nuclear@7: * nuclear@7: * NOTE: If you are using OpenGL ES 2.x or OpenGL >= 3.1 pure (non-compatibility) context nuclear@7: * you must specify valid attribute indices. nuclear@7: */ nuclear@7: void dtx_vertex_attribs(int vert_attr, int tex_attr); nuclear@7: nuclear@7: /* draws a single glyph at the origin */ nuclear@7: void dtx_glyph(int code); nuclear@7: /* draws a utf-8 string starting at the origin. \n \r and \t are handled appropriately. */ nuclear@7: void dtx_string(const char *str); nuclear@7: nuclear@7: void dtx_printf(const char *fmt, ...); nuclear@7: nuclear@7: /* render any pending glyphs (see dtx_draw_buffering) */ nuclear@7: void dtx_flush(void); nuclear@7: nuclear@7: nuclear@7: /* ---- encodings ---- */ nuclear@7: nuclear@7: /* returns a pointer to the next character in a utf-8 stream */ nuclear@7: char *dtx_utf8_next_char(char *str); nuclear@7: nuclear@7: /* returns the unicode character codepoint of the utf-8 character starting at str */ nuclear@7: int dtx_utf8_char_code(const char *str); nuclear@7: nuclear@7: /* returns the number of bytes of the utf-8 character starting at str */ nuclear@7: int dtx_utf8_nbytes(const char *str); nuclear@7: nuclear@7: /* returns the number of utf-8 character in a zero-terminated utf-8 string */ nuclear@7: int dtx_utf8_char_count(const char *str); nuclear@7: nuclear@7: /* Converts a unicode code-point to a utf-8 character by filling in the buffer nuclear@7: * passed at the second argument, and returns the number of bytes taken by that nuclear@7: * utf-8 character. nuclear@7: * It's valid to pass a null buffer pointer, in which case only the byte count is nuclear@7: * returned (useful to figure out how much memory to allocate for a buffer). nuclear@7: */ nuclear@7: size_t dtx_utf8_from_char_code(int code, char *buf); nuclear@7: nuclear@7: /* Converts a unicode utf-16 wchar_t string to utf-8, filling in the buffer passed nuclear@7: * at the second argument. Returns the size of the resulting string in bytes. nuclear@7: * nuclear@7: * It's valid to pass a null buffer pointer, in which case only the size gets nuclear@7: * calculated and returned, which is useful for figuring out how much memory to nuclear@7: * allocate for the utf-8 buffer. nuclear@7: */ nuclear@7: size_t dtx_utf8_from_string(const wchar_t *str, char *buf); nuclear@7: nuclear@7: nuclear@7: /* ---- metrics ---- */ nuclear@7: float dtx_line_height(void); nuclear@7: nuclear@7: /* rendered dimensions of a single glyph */ nuclear@7: void dtx_glyph_box(int code, struct dtx_box *box); nuclear@7: float dtx_glyph_width(int code); nuclear@7: float dtx_glyph_height(int code); nuclear@7: nuclear@7: /* rendered dimensions of a string */ nuclear@7: void dtx_string_box(const char *str, struct dtx_box *box); nuclear@7: float dtx_string_width(const char *str); nuclear@7: float dtx_string_height(const char *str); nuclear@7: nuclear@7: /* returns the horizontal position of the n-th character of the rendered string nuclear@7: * (useful for placing cursors) nuclear@7: */ nuclear@7: float dtx_char_pos(const char *str, int n); nuclear@7: nuclear@7: int dtx_char_at_pt(const char *str, float pt); nuclear@7: nuclear@7: #ifdef __cplusplus nuclear@7: } nuclear@7: #endif nuclear@7: nuclear@7: #endif /* LIBDRAWTEXT_H_ */