taisei/src/color.h

91 lines
2.5 KiB
C

/*
* This software is licensed under the terms of the MIT License.
* See COPYING for further information.
* ---
* Copyright (c) 2011-2019, Lukas Weber <laochailan@web.de>.
* Copyright (c) 2012-2019, Andrei Alexeyev <akari@taisei-project.org>.
*/
#ifndef IGUARD_color_h
#define IGUARD_color_h
#include "taisei.h"
#include "util.h"
typedef struct Color {
float r, g, b, a;
} Color;
/*
* These macros return a pointer to a new Color instance, which is *block-scoped*,
* and has automatic storage-class.
*/
#define RGBA(r, g, b, a) (&(Color) { (r), (g), (b), (a) })
#define RGBA_MUL_ALPHA(r, g, b, a) color_mul_alpha(RGBA((r), (g), (b), (a)))
#define RGB(r, g, b) RGBA((r), (g), (b), 1)
#define HSLA(h, s, l, a) color_hsla((&(Color) { 0 }), (h), (s), (l), (a))
#define HSLA_MUL_ALPHA(h, s, l, a) color_mul_alpha(HSLA((h), (s), (l), (a)))
#define HSL(h, s, l) HSLA((h), (s), (l), 1)
#define COLOR_COPY(c) color_copy((&(Color) { 0 }), (c))
/*
* All of these modify the first argument in-place, and return it for convenience.
*/
Color* color_copy(Color *dst, const Color *src)
attr_nonnull(1) attr_returns_nonnull;
Color* color_hsla(Color *clr, float h, float s, float l, float a)
attr_nonnull(1) attr_returns_nonnull;
void color_get_hsl(const Color *c, float *out_h, float *out_s, float *out_l)
attr_nonnull(1);
Color* color_add(Color *clr, const Color *clr2)
attr_nonnull(1) attr_returns_nonnull;
Color* color_sub(Color *clr, const Color *clr2)
attr_nonnull(1) attr_returns_nonnull;
Color* color_mul(Color *clr, const Color *clr2)
attr_nonnull(1) attr_returns_nonnull;
Color* color_mul_alpha(Color *clr)
attr_nonnull(1) attr_returns_nonnull;
Color* color_mul_scalar(Color *clr, float scalar)
attr_nonnull(1) attr_returns_nonnull;
Color* color_div(Color *clr, const Color *clr2)
attr_nonnull(1) attr_returns_nonnull;
Color* color_div_alpha(Color *clr)
attr_nonnull(1) attr_returns_nonnull;
Color* color_div_scalar(Color *clr, float scalar)
attr_nonnull(1) attr_returns_nonnull;
Color* color_lerp(Color *clr, const Color *clr2, float a)
attr_nonnull(1) attr_returns_nonnull;
Color* color_approach(Color *clr, const Color *clr2, float delta)
attr_nonnull(1) attr_returns_nonnull;
Color* color_set_opacity(Color *clr, float opacity)
attr_nonnull(1) attr_returns_nonnull;
/*
* End of color manipulation routines.
*/
bool color_equals(const Color *clr, const Color *clr2)
attr_nonnull(1, 2);
char* color_str(const Color *clr)
attr_nonnull(1) attr_returns_allocated;
#endif // IGUARD_color_h