1 /* -*- c-basic-offset:2; tab-width:2; indent-tabs-mode:nil -*- */
2 
3 #ifndef __UI_PICTURE_H__
4 #define __UI_PICTURE_H__
5 
6 #include <pobl/bl_types.h> /* u_int16_t */
7 #include <vt_term.h>
8 
9 #include "ui.h" /* XA_PIXMAP */
10 #include "ui_window.h"
11 
12 typedef struct ui_picture_modifier {
13   u_int16_t brightness; /* 0 - 65535 */
14   u_int16_t contrast;   /* 0 - 65535 */
15   u_int16_t gamma;      /* 0 - 65535 */
16 
17   u_int8_t alpha; /* 0 - 255 */
18   u_int8_t blend_red;
19   u_int8_t blend_green;
20   u_int8_t blend_blue;
21 
22 } ui_picture_modifier_t;
23 
24 typedef struct ui_picture {
25   Display *display;
26   ui_picture_modifier_t *mod;
27   char *file_path;
28   u_int width;
29   u_int height;
30 
31   Pixmap pixmap;
32 
33   u_int ref_count;
34 
35 } ui_picture_t;
36 
37 typedef struct ui_icon_picture {
38   ui_display_t *disp;
39   char *file_path;
40 
41   Pixmap pixmap;
42   PixmapMask mask;
43   u_int32_t *cardinal;
44 
45   u_int ref_count;
46 
47 } ui_icon_picture_t;
48 
49 typedef struct ui_inline_picture {
50   Pixmap pixmap;
51   PixmapMask mask;
52   char *file_path;
53   u_int width;
54   u_int height;
55   ui_display_t *disp;
56   vt_term_t *term;
57   u_int8_t col_width;
58   u_int8_t line_height;
59 
60   int16_t next_frame;
61 
62 } ui_inline_picture_t;
63 
64 #define MAX_INLINE_PICTURES (1 << PICTURE_ID_BITS)
65 #define MAKE_INLINEPIC_POS(col, row, num_rows) ((col) * (num_rows) + (row))
66 #define INLINEPIC_AVAIL_ROW -MAX_INLINE_PICTURES
67 
68 #ifdef NO_IMAGE
69 
70 #define ui_picture_display_opened(display) (0)
71 #define ui_picture_display_closed(display) (0)
72 #define ui_picture_modifiers_equal(a, b) (0)
73 #define ui_acquire_bg_picture(win, mod, file_path) (NULL)
74 #define ui_release_picture(pic) (0)
75 #define ui_acquire_icon_picture(disp, file_path) (NULL)
76 #define ui_release_icon_picture(pic) (0)
77 #define ui_load_inline_picture(disp, file_path, width, height, col_width, line_height, \
78                                keep_aspect, term) (-1)
79 #define ui_get_inline_picture(idx) (NULL)
80 
81 #else
82 
83 /* defined in c_sixel.c */
84 u_int32_t *ui_set_custom_sixel_palette(u_int32_t *palette);
85 
86 void ui_picture_display_opened(Display *display);
87 
88 void ui_picture_display_closed(Display *display);
89 
90 int ui_picture_modifiers_equal(ui_picture_modifier_t *a, ui_picture_modifier_t *b);
91 
92 ui_picture_t *ui_acquire_bg_picture(ui_window_t *win, ui_picture_modifier_t *mod, char *file_path);
93 
94 void ui_release_picture(ui_picture_t *pic);
95 
96 ui_icon_picture_t *ui_acquire_icon_picture(ui_display_t *disp, char *file_path);
97 
98 void ui_release_icon_picture(ui_icon_picture_t *pic);
99 
100 int ui_load_inline_picture(ui_display_t *disp, char *file_path, u_int *width, u_int *height,
101                            u_int col_width, u_int line_height, int keep_aspect, vt_term_t *term);
102 
103 ui_inline_picture_t *ui_get_inline_picture(int idx);
104 
105 int ui_add_frame_to_animation(int prev_idx, int next_idx);
106 
107 int ui_animate_inline_pictures(vt_term_t *term);
108 
109 int ui_load_tmp_picture(ui_display_t *disp, char *file_path, Pixmap *pixmap, PixmapMask *mask,
110                         u_int *width, u_int *height);
111 
112 void ui_destroy_tmp_picture(ui_display_t *disp, Pixmap pixmap, PixmapMask mask);
113 
114 #endif
115 
116 #define ui_picture_modifier_is_normal(pic_mod) (ui_picture_modifiers_equal((pic_mod), NULL))
117 
118 #endif
119