acid-drop- Hacking the planet from a LilyGo T-Deck using custom firmware |
git clone git://git.acid.vegas/acid-drop.git |
Log | Files | Refs | Archive | README | LICENSE |
lv_area.h (8242B)
1 /** 2 * @file lv_area.h 3 * 4 */ 5 6 #ifndef LV_AREA_H 7 #define LV_AREA_H 8 9 #ifdef __cplusplus 10 extern "C" { 11 #endif 12 13 /********************* 14 * INCLUDES 15 *********************/ 16 #include "../lv_conf_internal.h" 17 #include <stdbool.h> 18 #include <stdint.h> 19 20 /********************* 21 * DEFINES 22 *********************/ 23 24 #if LV_USE_LARGE_COORD 25 typedef int32_t lv_coord_t; 26 #else 27 typedef int16_t lv_coord_t; 28 #endif 29 30 /********************** 31 * TYPEDEFS 32 **********************/ 33 34 /** 35 * Represents a point on the screen. 36 */ 37 typedef struct { 38 lv_coord_t x; 39 lv_coord_t y; 40 } lv_point_t; 41 42 /** Represents an area of the screen.*/ 43 typedef struct { 44 lv_coord_t x1; 45 lv_coord_t y1; 46 lv_coord_t x2; 47 lv_coord_t y2; 48 } lv_area_t; 49 50 /** Alignments*/ 51 enum { 52 LV_ALIGN_DEFAULT = 0, 53 LV_ALIGN_TOP_LEFT, 54 LV_ALIGN_TOP_MID, 55 LV_ALIGN_TOP_RIGHT, 56 LV_ALIGN_BOTTOM_LEFT, 57 LV_ALIGN_BOTTOM_MID, 58 LV_ALIGN_BOTTOM_RIGHT, 59 LV_ALIGN_LEFT_MID, 60 LV_ALIGN_RIGHT_MID, 61 LV_ALIGN_CENTER, 62 63 LV_ALIGN_OUT_TOP_LEFT, 64 LV_ALIGN_OUT_TOP_MID, 65 LV_ALIGN_OUT_TOP_RIGHT, 66 LV_ALIGN_OUT_BOTTOM_LEFT, 67 LV_ALIGN_OUT_BOTTOM_MID, 68 LV_ALIGN_OUT_BOTTOM_RIGHT, 69 LV_ALIGN_OUT_LEFT_TOP, 70 LV_ALIGN_OUT_LEFT_MID, 71 LV_ALIGN_OUT_LEFT_BOTTOM, 72 LV_ALIGN_OUT_RIGHT_TOP, 73 LV_ALIGN_OUT_RIGHT_MID, 74 LV_ALIGN_OUT_RIGHT_BOTTOM, 75 }; 76 typedef uint8_t lv_align_t; 77 78 enum { 79 LV_DIR_NONE = 0x00, 80 LV_DIR_LEFT = (1 << 0), 81 LV_DIR_RIGHT = (1 << 1), 82 LV_DIR_TOP = (1 << 2), 83 LV_DIR_BOTTOM = (1 << 3), 84 LV_DIR_HOR = LV_DIR_LEFT | LV_DIR_RIGHT, 85 LV_DIR_VER = LV_DIR_TOP | LV_DIR_BOTTOM, 86 LV_DIR_ALL = LV_DIR_HOR | LV_DIR_VER, 87 }; 88 89 typedef uint8_t lv_dir_t; 90 91 /********************** 92 * GLOBAL PROTOTYPES 93 **********************/ 94 95 /** 96 * Initialize an area 97 * @param area_p pointer to an area 98 * @param x1 left coordinate of the area 99 * @param y1 top coordinate of the area 100 * @param x2 right coordinate of the area 101 * @param y2 bottom coordinate of the area 102 */ 103 void lv_area_set(lv_area_t * area_p, lv_coord_t x1, lv_coord_t y1, lv_coord_t x2, lv_coord_t y2); 104 105 /** 106 * Copy an area 107 * @param dest pointer to the destination area 108 * @param src pointer to the source area 109 */ 110 inline static void lv_area_copy(lv_area_t * dest, const lv_area_t * src) 111 { 112 dest->x1 = src->x1; 113 dest->y1 = src->y1; 114 dest->x2 = src->x2; 115 dest->y2 = src->y2; 116 } 117 118 /** 119 * Get the width of an area 120 * @param area_p pointer to an area 121 * @return the width of the area (if x1 == x2 -> width = 1) 122 */ 123 static inline lv_coord_t lv_area_get_width(const lv_area_t * area_p) 124 { 125 return (lv_coord_t)(area_p->x2 - area_p->x1 + 1); 126 } 127 128 /** 129 * Get the height of an area 130 * @param area_p pointer to an area 131 * @return the height of the area (if y1 == y2 -> height = 1) 132 */ 133 static inline lv_coord_t lv_area_get_height(const lv_area_t * area_p) 134 { 135 return (lv_coord_t)(area_p->y2 - area_p->y1 + 1); 136 } 137 138 /** 139 * Set the width of an area 140 * @param area_p pointer to an area 141 * @param w the new width of the area (w == 1 makes x1 == x2) 142 */ 143 void lv_area_set_width(lv_area_t * area_p, lv_coord_t w); 144 145 /** 146 * Set the height of an area 147 * @param area_p pointer to an area 148 * @param h the new height of the area (h == 1 makes y1 == y2) 149 */ 150 void lv_area_set_height(lv_area_t * area_p, lv_coord_t h); 151 152 /** 153 * Set the position of an area (width and height will be kept) 154 * @param area_p pointer to an area 155 * @param x the new x coordinate of the area 156 * @param y the new y coordinate of the area 157 */ 158 void _lv_area_set_pos(lv_area_t * area_p, lv_coord_t x, lv_coord_t y); 159 160 /** 161 * Return with area of an area (x * y) 162 * @param area_p pointer to an area 163 * @return size of area 164 */ 165 uint32_t lv_area_get_size(const lv_area_t * area_p); 166 167 void lv_area_increase(lv_area_t * area, lv_coord_t w_extra, lv_coord_t h_extra); 168 169 void lv_area_move(lv_area_t * area, lv_coord_t x_ofs, lv_coord_t y_ofs); 170 171 /** 172 * Get the common parts of two areas 173 * @param res_p pointer to an area, the result will be stored her 174 * @param a1_p pointer to the first area 175 * @param a2_p pointer to the second area 176 * @return false: the two area has NO common parts, res_p is invalid 177 */ 178 bool _lv_area_intersect(lv_area_t * res_p, const lv_area_t * a1_p, const lv_area_t * a2_p); 179 180 /** 181 * Join two areas into a third which involves the other two 182 * @param res_p pointer to an area, the result will be stored here 183 * @param a1_p pointer to the first area 184 * @param a2_p pointer to the second area 185 */ 186 void _lv_area_join(lv_area_t * a_res_p, const lv_area_t * a1_p, const lv_area_t * a2_p); 187 188 /** 189 * Check if a point is on an area 190 * @param a_p pointer to an area 191 * @param p_p pointer to a point 192 * @param radius radius of area (e.g. for rounded rectangle) 193 * @return false:the point is out of the area 194 */ 195 bool _lv_area_is_point_on(const lv_area_t * a_p, const lv_point_t * p_p, lv_coord_t radius); 196 197 /** 198 * Check if two area has common parts 199 * @param a1_p pointer to an area. 200 * @param a2_p pointer to an other area 201 * @return false: a1_p and a2_p has no common parts 202 */ 203 bool _lv_area_is_on(const lv_area_t * a1_p, const lv_area_t * a2_p); 204 205 /** 206 * Check if an area is fully on an other 207 * @param ain_p pointer to an area which could be in 'aholder_p' 208 * @param aholder_p pointer to an area which could involve 'ain_p' 209 * @param radius radius of `aholder_p` (e.g. for rounded rectangle) 210 * @return true: `ain_p` is fully inside `aholder_p` 211 */ 212 bool _lv_area_is_in(const lv_area_t * ain_p, const lv_area_t * aholder_p, lv_coord_t radius); 213 214 215 /** 216 * Check if an area is fully out of an other 217 * @param aout_p pointer to an area which could be in 'aholder_p' 218 * @param aholder_p pointer to an area which could involve 'ain_p' 219 * @param radius radius of `aholder_p` (e.g. for rounded rectangle) 220 * @return true: `aout_p` is fully outside `aholder_p` 221 */ 222 bool _lv_area_is_out(const lv_area_t * aout_p, const lv_area_t * aholder_p, lv_coord_t radius); 223 224 /** 225 * Check if 2 area is the same 226 * @param a pointer to an area 227 * @param b pointer to another area 228 */ 229 bool _lv_area_is_equal(const lv_area_t * a, const lv_area_t * b); 230 231 /** 232 * Align an area to an other 233 * @param base an are where the other will be aligned 234 * @param to_align the area to align 235 * @param align `LV_ALIGN_...` 236 */ 237 void lv_area_align(const lv_area_t * base, lv_area_t * to_align, lv_align_t align, lv_coord_t ofs_x, lv_coord_t ofs_y); 238 239 /********************** 240 * MACROS 241 **********************/ 242 243 #if LV_USE_LARGE_COORD 244 #define _LV_COORD_TYPE_SHIFT (29U) 245 #else 246 #define _LV_COORD_TYPE_SHIFT (13U) 247 #endif 248 249 #define _LV_COORD_TYPE_MASK (3 << _LV_COORD_TYPE_SHIFT) 250 #define _LV_COORD_TYPE(x) ((x) & _LV_COORD_TYPE_MASK) /*Extract type specifiers*/ 251 #define _LV_COORD_PLAIN(x) ((x) & ~_LV_COORD_TYPE_MASK) /*Remove type specifiers*/ 252 253 #define _LV_COORD_TYPE_PX (0 << _LV_COORD_TYPE_SHIFT) 254 #define _LV_COORD_TYPE_SPEC (1 << _LV_COORD_TYPE_SHIFT) 255 #define _LV_COORD_TYPE_PX_NEG (3 << _LV_COORD_TYPE_SHIFT) 256 257 #define LV_COORD_IS_PX(x) (_LV_COORD_TYPE(x) == _LV_COORD_TYPE_PX || \ 258 _LV_COORD_TYPE(x) == _LV_COORD_TYPE_PX_NEG ? true : false) 259 #define LV_COORD_IS_SPEC(x) (_LV_COORD_TYPE(x) == _LV_COORD_TYPE_SPEC ? true : false) 260 261 #define LV_COORD_SET_SPEC(x) ((x) | _LV_COORD_TYPE_SPEC) 262 263 /*Special coordinates*/ 264 #define LV_PCT(x) (x < 0 ? LV_COORD_SET_SPEC(1000 - (x)) : LV_COORD_SET_SPEC(x)) 265 #define LV_COORD_IS_PCT(x) ((LV_COORD_IS_SPEC(x) && _LV_COORD_PLAIN(x) <= 2000) ? true : false) 266 #define LV_COORD_GET_PCT(x) (_LV_COORD_PLAIN(x) > 1000 ? 1000 - _LV_COORD_PLAIN(x) : _LV_COORD_PLAIN(x)) 267 #define LV_SIZE_CONTENT LV_COORD_SET_SPEC(2001) 268 269 LV_EXPORT_CONST_INT(LV_SIZE_CONTENT); 270 271 /*Max coordinate value*/ 272 #define LV_COORD_MAX ((1 << _LV_COORD_TYPE_SHIFT) - 1) 273 #define LV_COORD_MIN (-LV_COORD_MAX) 274 275 LV_EXPORT_CONST_INT(LV_COORD_MAX); 276 LV_EXPORT_CONST_INT(LV_COORD_MIN); 277 278 /** 279 * Convert a percentage value to `lv_coord_t`. 280 * Percentage values are stored in special range 281 * @param x the percentage (0..1000) 282 * @return a coordinate that stores the percentage 283 */ 284 static inline lv_coord_t lv_pct(lv_coord_t x) 285 { 286 return LV_PCT(x); 287 } 288 289 #ifdef __cplusplus 290 } /*extern "C"*/ 291 #endif 292 293 #endif