graphics.h - ltk - GUI toolkit for X11 (WIP)
HTML git clone git://lumidify.org/ltk.git (fast, but not encrypted)
HTML git clone https://lumidify.org/git/ltk.git (encrypted, but very slow)
HTML git clone git://4kcetb7mo7hj6grozzybxtotsub5bempzo4lirzc3437amof2c2impyd.onion/ltk.git (over tor)
DIR Log
DIR Files
DIR Refs
DIR README
DIR LICENSE
---
graphics.h (4854B)
---
1 /*
2 * Copyright (c) 2021-2024 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_GRAPHICS_H
18 #define LTK_GRAPHICS_H
19
20 typedef struct ltk_renderdata ltk_renderdata;
21 typedef struct ltk_renderwindow ltk_renderwindow;
22
23 #include <stddef.h>
24
25 #include "rect.h"
26 #include "color.h"
27
28 typedef enum {
29 LTK_BORDER_NONE = 0,
30 LTK_BORDER_TOP = 1,
31 LTK_BORDER_RIGHT = 2,
32 LTK_BORDER_BOTTOM = 4,
33 LTK_BORDER_LEFT = 8,
34 LTK_BORDER_ALL = 0xF
35 } ltk_border_sides;
36
37 typedef struct {
38 int val;
39 enum {
40 LTK_UNIT_PX,
41 LTK_UNIT_PT,
42 LTK_UNIT_MM,
43 } unit;
44 } ltk_size;
45
46 typedef struct ltk_surface ltk_surface;
47
48 /* FIXME: graphics context */
49 ltk_surface *ltk_surface_create(ltk_renderwindow *window, int w, int h);
50 void ltk_surface_destroy(ltk_surface *s);
51 /* returns 0 if successful, 1 if not resizable */
52 int ltk_surface_resize(ltk_surface *s, int w, int h);
53 /* FIXME: kind of hacky */
54 void ltk_surface_update_size(ltk_surface *s, int w, int h);
55 ltk_surface *ltk_surface_from_window(ltk_renderwindow *window, int w, int h);
56 void ltk_surface_get_size(ltk_surface *s, int *w, int *h);
57 void ltk_surface_copy(ltk_surface *src, ltk_surface *dst, ltk_rect src_rect, int dst_x, int dst_y);
58 void ltk_surface_draw_rect(ltk_surface *s, ltk_color *c, ltk_rect rect, int line_width);
59 void ltk_surface_fill_rect(ltk_surface *s, ltk_color *c, ltk_rect rect);
60 /* FIXME: document properly, especially difference to draw_rect with offsets and line_width */
61 void ltk_surface_draw_border(ltk_surface *s, ltk_color *c, ltk_rect rect, int line_width, ltk_border_sides border_sides);
62 void ltk_surface_draw_border_clipped(ltk_surface *s, ltk_color *c, ltk_rect rect, int line_width, ltk_border_sides border_sides, ltk_rect clip);
63 void ltk_surface_fill_polygon(ltk_surface *s, ltk_color *c, ltk_point *points, size_t npoints);
64 void ltk_surface_fill_polygon_clipped(ltk_surface *s, ltk_color *c, ltk_point *points, size_t npoints, ltk_rect clip);
65 void ltk_surface_fill_ellipse(ltk_surface *s, ltk_color *c, ltk_rect rect);
66 void ltk_surface_fill_ellipse_clipped(ltk_surface *s, ltk_color *c, ltk_rect rect, ltk_rect clip);
67
68 /* dpi is actually 5 * the real dpi! */
69 /* sz.val is scaled by 100! */
70 /* FIXME: overflow prevention */
71 /* -> maybe add max value for dpi and numbers that is checked beforehand */
72 /* It might make sense to just use double for everything */
73 static inline unsigned int
74 ltk_size_to_pixel(ltk_size sz, unsigned int dpi) {
75 if (sz.val < 0) {
76 switch (sz.unit) {
77 case LTK_UNIT_PT:
78 return (sz.val * dpi - 18000) / 36000;
79 break;
80 case LTK_UNIT_MM:
81 return (sz.val * dpi - 6300) / 12700;
82 break;
83 default:
84 return (sz.val - 50) / 100;
85 }
86 } else {
87 switch (sz.unit) {
88 case LTK_UNIT_PT:
89 return (sz.val * dpi + 18000) / 36000;
90 break;
91 case LTK_UNIT_MM:
92 return (sz.val * dpi + 6300) / 12700;
93 break;
94 default:
95 return (sz.val + 50) / 100;
96 }
97 }
98 }
99
100 /* TODO */
101 /*
102 void ltk_surface_draw_arc(ltk_surface *s, ltk_color *c, int x, int y, int w, int h, int angle1, int angle2, int line_width);
103 void ltk_surface_fill_arc(ltk_surface *s, ltk_color *c, int x, int y, int w, int h, int angle1, int angle2);
104 void ltk_surface_draw_circle(ltk_surface *s, ltk_color *c, int xc, int yc, int r, int line_width);
105 void ltk_surface_fill_circle(ltk_surface *s, ltk_color *c, int xc, int yc, int r);
106 */
107
108 /* FIXME: rename some of these functions */
109 void ltk_renderer_set_imspot(ltk_renderwindow *window, int x, int y);
110 ltk_renderdata *ltk_renderer_create(void);
111 ltk_renderwindow *ltk_renderer_create_window(ltk_renderdata *data, const char *title, int x, int y, unsigned int w, unsigned int h, unsigned int initial_dpi);
112 void ltk_renderer_destroy_window(ltk_renderwindow *window);
113 void ltk_renderer_destroy(ltk_renderdata *data);
114 void ltk_renderer_set_window_properties(ltk_renderwindow *window, ltk_color *bg);
115 unsigned int ltk_renderer_get_window_dpi(ltk_renderwindow *window);
116 /* FIXME: this is kind of out of place */
117 void ltk_renderer_swap_buffers(ltk_renderwindow *window);
118 /* FIXME: this is just for the socket name in ltkd and is a bit weird */
119 unsigned long ltk_renderer_get_window_id(ltk_renderwindow *window);
120
121 #endif /* LTK_GRAPHICS_H */