summaryrefslogtreecommitdiffstats
path: root/demos/colors.c
diff options
context:
space:
mode:
Diffstat (limited to 'demos/colors.c')
-rw-r--r--demos/colors.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/demos/colors.c b/demos/colors.c
new file mode 100644
index 0000000..41712e1
--- /dev/null
+++ b/demos/colors.c
@@ -0,0 +1,88 @@
+/* Simplistic demo that just makes the window colorful, including alpha
+ * transparency if supported by the windowing system.
+ *
+ * License: CC0 / Public Domain
+ */
+
+#include <assert.h>
+#include <errno.h>
+#include <math.h>
+#include <string.h>
+
+#include "common.h"
+#include "pl_clock.h"
+#include "window.h"
+
+static pl_log logger;
+static struct window *win;
+
+static void uninit(int ret)
+{
+ window_destroy(&win);
+ pl_log_destroy(&logger);
+ exit(ret);
+}
+
+int main(int argc, char **argv)
+{
+ logger = pl_log_create(PL_API_VER, pl_log_params(
+ .log_cb = pl_log_color,
+ .log_level = PL_LOG_DEBUG,
+ ));
+
+ win = window_create(logger, &(struct window_params) {
+ .title = "colors demo",
+ .width = 640,
+ .height = 480,
+ .alpha = true,
+ });
+ if (!win)
+ uninit(1);
+
+ pl_clock_t ts_start, ts;
+ if ((ts_start = pl_clock_now()) == 0) {
+ uninit(1);
+ }
+
+ while (!win->window_lost) {
+ if (window_get_key(win, KEY_ESC))
+ break;
+
+ struct pl_swapchain_frame frame;
+ bool ok = pl_swapchain_start_frame(win->swapchain, &frame);
+ if (!ok) {
+ // Something unexpected happened, perhaps the window is not
+ // visible? Wait for events and try again.
+ window_poll(win, true);
+ continue;
+ }
+
+ if ((ts = pl_clock_now()) == 0)
+ uninit(1);
+
+ const double period = 10.; // in seconds
+ double secs = fmod(pl_clock_diff(ts, ts_start), period);
+
+ double pos = 2 * M_PI * secs / period;
+ float alpha = (cos(pos) + 1.0) / 2.0;
+
+ assert(frame.fbo->params.blit_dst);
+ pl_tex_clear(win->gpu, frame.fbo, (float[4]) {
+ alpha * (sinf(2 * pos + 0.0) + 1.0) / 2.0,
+ alpha * (sinf(2 * pos + 2.0) + 1.0) / 2.0,
+ alpha * (sinf(2 * pos + 4.0) + 1.0) / 2.0,
+ alpha,
+ });
+
+ ok = pl_swapchain_submit_frame(win->swapchain);
+ if (!ok) {
+ fprintf(stderr, "libplacebo: failed submitting frame!\n");
+ uninit(3);
+ }
+
+ pl_swapchain_swap_buffers(win->swapchain);
+ window_poll(win, false);
+ }
+
+ uninit(0);
+}