1 /*
2 * Copyright © 2018 Christian Persch
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 3 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <https://www.gnu.org/licenses/>.
16 */
17
18 #pragma once
19
20 #include <cstdint>
21
22 #define VTE_ATTR_VALUE_MASK(bits) ((1U << (bits)) - 1U)
23 #define VTE_ATTR_MASK(shift,bits) (VTE_ATTR_VALUE_MASK(bits) << (shift))
24
25 /* Number of visible columns (as determined by g_unicode_iswide(c)).
26 * Also (ab)used for tabs; bug 353610.
27 */
28 #define VTE_ATTR_COLUMNS_SHIFT (0)
29 #define VTE_ATTR_COLUMNS_BITS (4) /* Has to be able to store the value of 8. */
30 #define VTE_ATTR_COLUMNS_MASK (VTE_ATTR_MASK(VTE_ATTR_COLUMNS_SHIFT, VTE_ATTR_COLUMNS_BITS))
31 #define VTE_ATTR_COLUMNS_VALUE_MASK (VTE_ATTR_VALUE_MASK(VTE_ATTR_COLUMNS_BITS))
32 #define VTE_ATTR_COLUMNS(v) ((v) << VTE_ATTR_COLUMNS_SHIFT)
33
34 /* A continuation cell */
35 #define VTE_ATTR_FRAGMENT_SHIFT (VTE_ATTR_COLUMNS_SHIFT + VTE_ATTR_COLUMNS_BITS)
36 #define VTE_ATTR_FRAGMENT_BITS (1)
37 #define VTE_ATTR_FRAGMENT_MASK (VTE_ATTR_MASK(VTE_ATTR_FRAGMENT_SHIFT, VTE_ATTR_FRAGMENT_BITS))
38 #define VTE_ATTR_FRAGMENT (1U << VTE_ATTR_FRAGMENT_SHIFT)
39
40 #define VTE_ATTR_BOLD_SHIFT (VTE_ATTR_FRAGMENT_SHIFT + VTE_ATTR_FRAGMENT_BITS)
41 #define VTE_ATTR_BOLD_BITS (1)
42 #define VTE_ATTR_BOLD_MASK (VTE_ATTR_MASK(VTE_ATTR_BOLD_SHIFT, VTE_ATTR_BOLD_BITS))
43 #define VTE_ATTR_BOLD (1U << VTE_ATTR_BOLD_SHIFT)
44
45 #define VTE_ATTR_ITALIC_SHIFT (VTE_ATTR_BOLD_SHIFT + VTE_ATTR_BOLD_BITS)
46 #define VTE_ATTR_ITALIC_BITS (1)
47 #define VTE_ATTR_ITALIC_MASK (VTE_ATTR_MASK(VTE_ATTR_ITALIC_SHIFT, VTE_ATTR_ITALIC_BITS))
48 #define VTE_ATTR_ITALIC (1U << VTE_ATTR_ITALIC_SHIFT)
49
50 /* 0: none, 1: single, 2: double, 3: curly */
51 #define VTE_ATTR_UNDERLINE_SHIFT (VTE_ATTR_ITALIC_SHIFT + VTE_ATTR_ITALIC_BITS)
52 #define VTE_ATTR_UNDERLINE_BITS (2)
53 #define VTE_ATTR_UNDERLINE_MASK (VTE_ATTR_MASK(VTE_ATTR_UNDERLINE_SHIFT, VTE_ATTR_UNDERLINE_BITS))
54 #define VTE_ATTR_UNDERLINE_VALUE_MASK (VTE_ATTR_VALUE_MASK(VTE_ATTR_UNDERLINE_BITS))
55 #define VTE_ATTR_UNDERLINE(v) ((v) << VTE_ATTR_UNDERLINE_SHIFT)
56
57 #define VTE_ATTR_STRIKETHROUGH_SHIFT (VTE_ATTR_UNDERLINE_SHIFT + VTE_ATTR_UNDERLINE_BITS)
58 #define VTE_ATTR_STRIKETHROUGH_BITS (1)
59 #define VTE_ATTR_STRIKETHROUGH_MASK (VTE_ATTR_MASK(VTE_ATTR_STRIKETHROUGH_SHIFT, VTE_ATTR_STRIKETHROUGH_BITS))
60 #define VTE_ATTR_STRIKETHROUGH (1U << VTE_ATTR_STRIKETHROUGH_SHIFT)
61
62 #define VTE_ATTR_OVERLINE_SHIFT (VTE_ATTR_STRIKETHROUGH_SHIFT + VTE_ATTR_STRIKETHROUGH_BITS)
63 #define VTE_ATTR_OVERLINE_BITS (1)
64 #define VTE_ATTR_OVERLINE_MASK (VTE_ATTR_MASK(VTE_ATTR_OVERLINE_SHIFT, VTE_ATTR_OVERLINE_BITS))
65 #define VTE_ATTR_OVERLINE (1U << VTE_ATTR_OVERLINE_SHIFT)
66
67 #define VTE_ATTR_REVERSE_SHIFT (VTE_ATTR_OVERLINE_SHIFT + VTE_ATTR_OVERLINE_BITS)
68 #define VTE_ATTR_REVERSE_BITS (1)
69 #define VTE_ATTR_REVERSE_MASK (VTE_ATTR_MASK(VTE_ATTR_REVERSE_SHIFT, VTE_ATTR_REVERSE_BITS))
70 #define VTE_ATTR_REVERSE (1U << VTE_ATTR_REVERSE_SHIFT)
71
72 #define VTE_ATTR_BLINK_SHIFT (VTE_ATTR_REVERSE_SHIFT + VTE_ATTR_REVERSE_BITS)
73 #define VTE_ATTR_BLINK_BITS (1)
74 #define VTE_ATTR_BLINK_MASK (VTE_ATTR_MASK(VTE_ATTR_BLINK_SHIFT, VTE_ATTR_BLINK_BITS))
75 #define VTE_ATTR_BLINK (1U << VTE_ATTR_BLINK_SHIFT)
76
77 /* also known as faint, half intensity etc. */
78 #define VTE_ATTR_DIM_SHIFT (VTE_ATTR_BLINK_SHIFT + VTE_ATTR_BLINK_BITS)
79 #define VTE_ATTR_DIM_BITS (1)
80 #define VTE_ATTR_DIM_MASK (VTE_ATTR_MASK(VTE_ATTR_DIM_SHIFT, VTE_ATTR_DIM_BITS))
81 #define VTE_ATTR_DIM (1U << VTE_ATTR_DIM_SHIFT)
82
83 #define VTE_ATTR_INVISIBLE_SHIFT (VTE_ATTR_DIM_SHIFT + VTE_ATTR_DIM_BITS)
84 #define VTE_ATTR_INVISIBLE_BITS (1)
85 #define VTE_ATTR_INVISIBLE_MASK (VTE_ATTR_MASK(VTE_ATTR_INVISIBLE_SHIFT, VTE_ATTR_INVISIBLE_BITS))
86 #define VTE_ATTR_INVISIBLE (1U << VTE_ATTR_INVISIBLE_SHIFT)
87
88 /* Used internally only */
89 #define VTE_ATTR_BOXED_SHIFT (31)
90 #define VTE_ATTR_BOXED_BITS (1)
91 #define VTE_ATTR_BOXED_MASK (VTE_ATTR_MASK(VTE_ATTR_BOXED_SHIFT, VTE_ATTR_BOXED_BITS))
92 #define VTE_ATTR_BOXED (1U << VTE_ATTR_BOXED_SHIFT)
93
94 /* All attributes except DIM and BOXED */
95 #define VTE_ATTR_ALL_MASK (VTE_ATTR_BOLD_MASK | \
96 VTE_ATTR_ITALIC_MASK | \
97 VTE_ATTR_UNDERLINE_MASK | \
98 VTE_ATTR_STRIKETHROUGH_MASK | \
99 VTE_ATTR_OVERLINE_MASK | \
100 VTE_ATTR_REVERSE_MASK | \
101 VTE_ATTR_BLINK_MASK | \
102 VTE_ATTR_INVISIBLE_MASK)
103
104 #define VTE_ATTR_NONE (0U)
105 #define VTE_ATTR_DEFAULT (VTE_ATTR_COLUMNS(1))
106
vte_attr_set_bool(uint32_t * attr,uint32_t mask,bool value)107 static inline void vte_attr_set_bool(uint32_t* attr,
108 uint32_t mask,
109 bool value)
110 {
111 if (value)
112 *attr |= mask;
113 else
114 *attr &= ~mask;
115 }
116
vte_attr_set_value(uint32_t * attr,uint32_t mask,unsigned int shift,uint32_t value)117 static inline void vte_attr_set_value(uint32_t* attr,
118 uint32_t mask,
119 unsigned int shift,
120 uint32_t value)
121 {
122 g_assert_cmpuint(value << shift, <=, mask); /* assurance */
123 *attr = (*attr & ~mask) | ((value << shift) & mask /* assurance */);
124 }
125
vte_attr_get_bool(uint32_t attr,unsigned int shift)126 static constexpr inline bool vte_attr_get_bool(uint32_t attr,
127 unsigned int shift)
128 {
129 return (attr >> shift) & 1U;
130 }
131
vte_attr_get_value(uint32_t attr,uint32_t value_mask,unsigned int shift)132 static constexpr inline unsigned int vte_attr_get_value(uint32_t attr,
133 uint32_t value_mask,
134 unsigned int shift)
135 {
136 return (attr >> shift) & value_mask;
137 }
138