GFXprim
2D bitmap graphics library with emphasis on speed and correctness
Loading...
Searching...
No Matches
gp_clamp.h
Go to the documentation of this file.
1// SPDX-License-Identifier: LGPL-2.1-or-later
2/*
3 * Copyright (C) 2009-2014 Cyril Hrubis <metan@ucw.cz>
4 */
5
10#ifndef CORE_GP_CLAMP_H
11#define CORE_GP_CLAMP_H
12
13#include <core/gp_compiler.h>
14
15#define GP_CLAMP_GENERIC(val, min, max) ({ \
16 typeof(val) gp_val__ = (val); \
17 typeof(max) gp_max__ = (max); \
18 typeof(min) gp_min__ = (min); \
19 gp_val__ = gp_val__ < gp_min__ ? gp_min__ : gp_val__; \
20 gp_val__ = gp_val__ > gp_max__ ? gp_max__ : gp_val__; \
21 gp_val__; \
22})
23
24#define GP_CLAMP_INT_0_255(val) ({ \
25 typeof(val) gp_val__ = (val); \
26 typeof(val) _mask = ~0xff; \
27 (gp_val__ & _mask) ? (gp_val__ < 0 ? 0 : 255) : gp_val__; \
28})
29
41#define GP_CLAMP(val, min, max) ({ \
42 (GP_IS_CONSTANT(min) && GP_IS_CONSTANT(max) && \
43 min == 0 && max == 255) ? \
44 GP_CLAMP_INT_0_255(val) : \
45 GP_CLAMP_GENERIC(val, min, max); \
46})
47
56#define GP_CLAMP_DOWN(val, max) ({ \
57 typeof(val) gp_val__ = (val); \
58 typeof(val) gp_max__ = (max); \
59 gp_val__ > gp_max__ ? gp_max__ : gp_val__; \
60})
61
73#define GP_SAT_ADD(val, add, max) ({ \
74 typeof(val) gp_val__ = (val); \
75 typeof(add) gp_add__ = (add); \
76 typeof(val) gp_max__ = (max); \
77 typeof(val) gp_ret__; \
78 typeof(val) gp_add_neg__ = -gp_add__; \
79 if (gp_add__ > 0) \
80 gp_ret__ = gp_val__ + gp_add__ > gp_max__ ? gp_max__ : gp_val__ + gp_add__; \
81 else \
82 gp_ret__ = gp_val__ < gp_add_neg__ ? 0 : gp_val__ + gp_add__; \
83 gp_ret__; \
84})
85
86#endif /* CORE_GP_CLAMP_H */
A compiler dependent macros.