1 /*
2  * Copyright © 2018, 2019 Christian Persch
3  *
4  * This library is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License as published
6  * by the Free Software Foundation, either version 3 of the License, or
7  * (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
12  * GNU Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public License
15  * along with this library.  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_unichar_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