text-hb.h (2740B)
1 /* 2 * This file is part of the Lumidify ToolKit (LTK) 3 * Copyright (c) 2017, 2018, 2020 lumidify <nobody@lumidify.org> 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a copy 6 * of this software and associated documentation files (the "Software"), to deal 7 * in the Software without restriction, including without limitation the rights 8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 * copies of the Software, and to permit persons to whom the Software is 10 * furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice shall be included in all 13 * copies or substantial portions of the Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 * SOFTWARE. 22 */ 23 24 #ifndef _TEXT_HB_H_ 25 #define _TEXT_HB_H_ 26 27 /* 28 Requires the following includes: 29 <X11/Xlib.h>, <X11/Xutil.h>, "stb_truetype.h", 30 "khash.h", <harfbuzz/hb.h>, <fribidi.h>, 31 <fontconfig/fontconfig.h>, "text-common.h" 32 */ 33 34 /* Single segment of text with same font */ 35 typedef struct LtkTextSegment { 36 uint16_t font_id; 37 uint16_t font_size; 38 unsigned int w; 39 unsigned int h; 40 int start_x; 41 int start_y; 42 int x_min; 43 int y_min; 44 int x_max; 45 int y_max; 46 hb_direction_t dir; 47 uint32_t *str; 48 LtkGlyph *start_glyph; 49 struct LtkTextSegment *next; 50 } LtkTextSegment; 51 52 /* Single line of text */ 53 typedef struct { 54 unsigned int w; 55 unsigned int h; 56 int x_max; 57 int x_min; 58 int y_max; 59 int y_min; 60 FriBidiParType dir; 61 LtkTextSegment *start_segment; 62 } LtkTextLine; 63 64 /* TODO: different sizes, colors, styles, etc. */ 65 LtkTextLine *ltk_create_text_line(LtkTextManager *tm, char *text, uint16_t fontid, uint16_t size); 66 67 /* FIXME: could use unsigned int for fontid and size as long as there is code to check neither of them become too large 68 -> in case I want to get rid of uint_16_t, etc. */ 69 LtkTextSegment *ltk_create_text_segment(LtkTextManager *tm, uint32_t *text, unsigned int text_len, uint16_t fontid, uint16_t size, hb_script_t script); 70 71 void ltk_destroy_text_segment(LtkTextSegment *ts); 72 73 XImage *ltk_render_text_line(LtkTextLine *tl, Display *dpy, Window window, GC gc, Colormap colormap, XColor fg, XColor bg); 74 75 void ltk_render_text_segment(LtkTextSegment *ts, unsigned int start_x, unsigned int start_y, XImage *img, XColor fg); 76 77 78 #endif /* _TEXT_HB_H_ */