text.h (4044B)
1 /* 2 * Copyright (c) 2021-2023 lumidify <nobody@lumidify.org> 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 #ifndef LTK_TEXT_H 18 #define LTK_TEXT_H 19 20 #include "color.h" 21 #include "graphics.h" 22 #include "ltk.h" 23 24 typedef struct ltk_text_line ltk_text_line; 25 /* typedef struct ltk_text_context ltk_text_context; */ 26 27 ltk_text_context *ltk_text_context_create(ltk_renderdata *data, char *default_font); 28 void ltk_text_context_destroy(ltk_text_context *ctx); 29 30 /* FIXME: allow to give length of text */ 31 /* FIXME: uint16_t as size is kind of ugly (also see window theme) */ 32 ltk_text_line *ltk_text_line_create(ltk_text_context *ctx, uint16_t font_size, char *text, int take_over_text, int width); 33 void ltk_text_line_set_width(ltk_text_line *tl, int width); 34 void ltk_text_line_get_size(ltk_text_line *tl, int *w, int *h); 35 void ltk_text_line_destroy(ltk_text_line *tl); 36 /* FIXME: length of text */ 37 void ltk_text_line_set_text(ltk_text_line *line, char *text, int take_over_text); 38 39 /* Draw the entire line to a surface. */ 40 /* FIXME: Some widgets rely on this to not fail when negative coordinates are given or 41 the text goes outside of the surface boundaries - in the stb backend, this is taken 42 into account and the pango-xft backend doesn't *seem* to have any problems with it, 43 but I don't know if that's guaranteed. */ 44 void ltk_text_line_draw(ltk_text_line *tl, ltk_surface *s, ltk_color *color, int x, int y); 45 46 /* Draw a line onto a surface at position x,y and clipped to 'clip'. 47 Note that 'clip' is relative to the origin of the given surface, not 'x' and 'y'. */ 48 void ltk_text_line_draw_clipped(ltk_text_line *tl, ltk_surface *s, ltk_color *color, int x, int y, ltk_rect clip); 49 50 void ltk_text_line_clear_attrs(ltk_text_line *tl); 51 void ltk_text_line_add_attr_bg(ltk_text_line *tl, size_t start, size_t end, ltk_color *color); 52 void ltk_text_line_add_attr_fg(ltk_text_line *tl, size_t start, size_t end, ltk_color *color); 53 54 typedef enum { 55 LTK_TEXT_LTR, 56 LTK_TEXT_RTL, 57 } ltk_text_direction; 58 59 /* FIXME: support for strong and weak cursor */ 60 /* FIXME: better interface that doesn't just return ltr on error (e.g. invalid index) */ 61 ltk_text_direction ltk_text_line_get_byte_direction(ltk_text_line *tl, size_t byte); 62 ltk_text_direction ltk_text_line_get_softline_direction(ltk_text_line *tl, size_t line); 63 size_t ltk_text_line_get_num_softlines(ltk_text_line *tl); 64 size_t ltk_text_line_xy_to_pos(ltk_text_line *tl, int x, int y, int snap_nearest); 65 void ltk_text_line_pos_to_rect(ltk_text_line *tl, size_t pos, int *x_ret, int *y_ret, int *w_ret, int *h_ret); 66 size_t ltk_text_line_x_softline_to_pos(ltk_text_line *tl, int x, size_t softline, int snap_nearest); 67 void ltk_text_line_pos_to_x_softline(ltk_text_line *tl, size_t pos, int middle, int *x_ret, size_t *softline_ret); 68 size_t ltk_text_line_move_cursor_visually(ltk_text_line *tl, size_t pos, int movement, size_t *prev_index_ret); 69 70 /* FIXME: two versions: bigline and normal line with text stored in memory but no bidi etc. */ 71 /* need to set endline separator so it can return when end of line reached! */ 72 /* FIXME: does this even make sense? */ 73 void ltk_text_bline_create( 74 size_t (*iter_cur)(void *data), 75 void (*iter_next)(void *data, char **text_ret, size_t *len_ret), 76 void (*iter_prev)(void *data, size_t maxlen, char **text_ret, size_t *len_ret), 77 void *data 78 ); 79 80 #endif /* LTK_TEXT_H */