[sysprof/wip/visualizers] color-cycle: add color generator helper
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [sysprof/wip/visualizers] color-cycle: add color generator helper
- Date: Wed, 28 Sep 2016 02:19:59 +0000 (UTC)
commit e7e8e913b51c99e19b7f47ed680463fbbc8beee6
Author: Christian Hergert <chergert redhat com>
Date: Tue Sep 27 19:16:07 2016 -0700
color-cycle: add color generator helper
We need a simple helper to choose colors for visualizers so
they do not overlap. This is just a simple cycle using some
predefined colors.
We should come up with something more unique in the future or
possibly do this with CSS and :nth-child(n) once we have access
to CSS nodes.
lib/Makefile.am | 2 +
lib/sp-color-cycle.c | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++
lib/sp-color-cycle.h | 39 ++++++++++++++++
3 files changed, 163 insertions(+), 0 deletions(-)
---
diff --git a/lib/Makefile.am b/lib/Makefile.am
index acd604d..ac7d1c9 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -159,6 +159,8 @@ libsysprof_ui_@API_VERSION@_la_SOURCES = \
$(uiheaders_DATA) \
sp-callgraph-view.c \
sp-cell-renderer-percent.c \
+ sp-color-cycle.c \
+ sp-color-cycle.h \
sp-cpu-visualizer-row.c \
sp-empty-state-view.c \
sp-failed-state-view.c \
diff --git a/lib/sp-color-cycle.c b/lib/sp-color-cycle.c
new file mode 100644
index 0000000..4c71fa0
--- /dev/null
+++ b/lib/sp-color-cycle.c
@@ -0,0 +1,122 @@
+/* sp-color-cycle.c
+ *
+ * Copyright (C) 2016 Christian Hergert <chergert redhat com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#define G_LOG_DOMAIN "sp-color-cycle"
+
+#include "sp-color-cycle.h"
+
+G_DEFINE_BOXED_TYPE (SpColorCycle, sp_color_cycle, sp_color_cycle_ref, sp_color_cycle_unref)
+
+static const gchar *default_colors[] = {
+ "#73d216",
+ "#f57900",
+ "#3465a4",
+ "#ef2929",
+ "#75507b",
+ "#ce5c00",
+ "#c17d11",
+ "#cc0000",
+ "#edd400",
+ "#555753",
+ "#4e9a06",
+ "#204a87",
+ "#5c3566",
+ "#a40000",
+ "#c4a000",
+ "#8f5902",
+ "#2e3436",
+ "#8ae234",
+ "#729fcf",
+ "#ad7fa8",
+ "#fce94f",
+ "#fcaf3e",
+ "#e9b96e",
+ "#888a85",
+ NULL
+};
+
+struct _SpColorCycle
+{
+ volatile gint ref_count;
+ GdkRGBA *colors;
+ gsize n_colors;
+ guint position;
+};
+
+static void
+sp_color_cycle_destroy (SpColorCycle *self)
+{
+ g_free (self->colors);
+ g_slice_free (SpColorCycle, self);
+}
+
+SpColorCycle *
+sp_color_cycle_new (void)
+{
+ SpColorCycle *self;
+
+ self = g_slice_new0 (SpColorCycle);
+ self->ref_count = 1;
+ self->n_colors = g_strv_length ((gchar **)default_colors);
+ self->colors = g_new0 (GdkRGBA, self->n_colors);
+
+ for (guint i = 0; default_colors[i]; i++)
+ {
+ if G_UNLIKELY (!gdk_rgba_parse (&self->colors[i], default_colors[i]))
+ g_warning ("Failed to parse color %s into an RGBA", default_colors[i]);
+ }
+
+ return self;
+}
+
+SpColorCycle *
+sp_color_cycle_ref (SpColorCycle *self)
+{
+ g_return_val_if_fail (self != NULL, NULL);
+ g_return_val_if_fail (self->ref_count > 0, NULL);
+ g_atomic_int_inc (&self->ref_count);
+ return self;
+}
+
+void
+sp_color_cycle_unref (SpColorCycle *self)
+{
+ g_return_if_fail (self != NULL);
+ g_return_if_fail (self->ref_count > 0);
+ if (g_atomic_int_dec_and_test (&self->ref_count))
+ sp_color_cycle_destroy (self);
+}
+
+void
+sp_color_cycle_next (SpColorCycle *self,
+ GdkRGBA *rgba)
+{
+ g_return_if_fail (self != NULL);
+ g_return_if_fail (self->position < self->n_colors);
+
+ *rgba = self->colors[self->position];
+
+ /*
+ * TODO: Adjust color HSV/etc
+ *
+ * We could simply adjust the brightness/etc after we dispatch
+ * a color so that we get darker as we go.
+ */
+
+ self->position = (self->position + 1) % self->n_colors;
+}
diff --git a/lib/sp-color-cycle.h b/lib/sp-color-cycle.h
new file mode 100644
index 0000000..bbac504
--- /dev/null
+++ b/lib/sp-color-cycle.h
@@ -0,0 +1,39 @@
+/* sp-color-cycle.h
+ *
+ * Copyright (C) 2016 Christian Hergert <chergert redhat com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef SP_COLOR_CYCLE_H
+#define SP_COLOR_CYCLE_H
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define SP_TYPE_COLOR_CYCLE (sp_color_cycle_get_type())
+
+typedef struct _SpColorCycle SpColorCycle;
+
+GType sp_color_cycle_get_type (void);
+SpColorCycle *sp_color_cycle_ref (SpColorCycle *self);
+void sp_color_cycle_unref (SpColorCycle *self);
+SpColorCycle *sp_color_cycle_new (void);
+void sp_color_cycle_next (SpColorCycle *self,
+ GdkRGBA *rgba);
+
+G_END_DECLS
+
+#endif /* SP_COLOR_CYCLE_H */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]