Mercurial > molko
view libmlk-example/mlk/example/glower.c @ 582:8a7648480e2d
mlk-bcc: named mlk-bcc in molko
author | David Demelier <markand@malikania.fr> |
---|---|
date | Mon, 13 Mar 2023 13:01:21 +0100 |
parents | d49a05e7a5b5 |
children |
line wrap: on
line source
/* * glower.c -- simple color animation * * Copyright (c) 2020-2023 David Demelier <markand@malikania.fr> * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include <assert.h> #include <mlk/core/color.h> #include "glower.h" static inline unsigned int increment(unsigned long ccmp, unsigned long ctgt) { if (ctgt > ccmp) return (unsigned int)(ccmp + 2 > ctgt ? ctgt : ccmp + 2); if (ctgt < ccmp) return (unsigned int)(ccmp - 2 < ctgt ? ctgt : ccmp - 2); return (unsigned int)ccmp; } void mlk_glower_init(struct mlk_glower *glow) { assert(glow); glow->color = glow->start; glow->target = glow->end; } void mlk_glower_update(struct mlk_glower *glow, unsigned int ticks) { assert(glow); unsigned int r, g, b; glow->elapsed += ticks; if (glow->elapsed >= glow->delay) { glow->elapsed = 0; /* Color target reached, invert target color. */ if (glow->color == glow->target) glow->target = glow->target == glow->start ? glow->end : glow->start; else { r = increment(MLK_COLOR_R(glow->color), MLK_COLOR_R(glow->target)); g = increment(MLK_COLOR_G(glow->color), MLK_COLOR_G(glow->target)); b = increment(MLK_COLOR_B(glow->color), MLK_COLOR_B(glow->target)); glow->color = MLK_COLOR_HEX(r, g, b, 0xff); } } }