aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--Makefile12
-rw-r--r--drmtest.c31
-rw-r--r--gtktest.c42
-rw-r--r--render.c54
-rw-r--r--render.h1
6 files changed, 125 insertions, 16 deletions
diff --git a/.gitignore b/.gitignore
index def7557..d6bc383 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
drminfo
drmtest
+gtktest
*.o
diff --git a/Makefile b/Makefile
index 04d7b2e..2d2f01a 100644
--- a/Makefile
+++ b/Makefile
@@ -2,13 +2,16 @@ CC ?= gcc
CFLAGS ?= -Os -g -std=c99
CFLAGS += -Wall
-TARGETS := drminfo drmtest
+TARGETS := drminfo drmtest gtktest
drminfo : CFLAGS += $(shell pkg-config --cflags libdrm)
drminfo : LDLIBS += $(shell pkg-config --libs libdrm)
-drmtest : CFLAGS += $(shell pkg-config --cflags libdrm gbm epoxy)
-drmtest : LDLIBS += $(shell pkg-config --libs libdrm gbm epoxy)
+drmtest : CFLAGS += $(shell pkg-config --cflags libdrm gbm epoxy cairo cairo-gl)
+drmtest : LDLIBS += $(shell pkg-config --libs libdrm gbm epoxy cairo cairo-gl)
+
+gtktest : CFLAGS += $(shell pkg-config --cflags gtk+-3.0 cairo)
+gtktest : LDLIBS += $(shell pkg-config --libs gtk+-3.0 cairo)
all: $(TARGETS)
@@ -17,4 +20,5 @@ clean:
rm -f *~
drminfo: drminfo.o drmtools.o
-drmtest: drmtest.o drmtools.o
+drmtest: drmtest.o drmtools.o render.o
+gtktest: gtktest.o render.o
diff --git a/drmtest.c b/drmtest.c
index 70501a7..cc602fb 100644
--- a/drmtest.c
+++ b/drmtest.c
@@ -18,7 +18,11 @@
#include <epoxy/gl.h>
#include <epoxy/egl.h>
+#include <cairo.h>
+#include <cairo-gl.h>
+
#include "drmtools.h"
+#include "render.h"
/* ------------------------------------------------------------------ */
@@ -42,6 +46,10 @@ static EGLConfig cfg;
static EGLContext ctx;
static EGLSurface surface;
+/* cairo */
+cairo_surface_t *cs;
+cairo_t *cc;
+
/* ------------------------------------------------------------------ */
static void drm_init_dev(int devnr, const char *output,
@@ -193,22 +201,21 @@ static void drm_init_dumb_fb(void)
fprintf(stderr, "framebuffer mmap: %s\n", strerror(errno));
exit(1);
}
+
+ cs = cairo_image_surface_create_for_data(fbmem,
+ CAIRO_FORMAT_ARGB32,
+ creq.width,
+ creq.height,
+ creq.pitch);
}
static void drm_draw_dumb_fb(void)
{
- int x, y;
- uint8_t *ptr;
-
- for (y = 0; y < creq.height; y++) {
- for (x = 0; x < creq.width; x++) {
- ptr = fbmem + creq.pitch * y + 4 * x;
- ptr[0] = 0; /* blue */
- ptr[1] = x & 0xff; /* green */
- ptr[2] = y & 0xff; /* red */
- ptr[3] = 0; /* alpha */
- }
- }
+ cairo_t *cr;
+
+ cr = cairo_create(cs);
+ render_test(cr, mode->hdisplay, mode->vdisplay);
+ cairo_destroy(cr);
drmModeDirtyFB(fd, fb_id, 0, 0);
}
diff --git a/gtktest.c b/gtktest.c
new file mode 100644
index 0000000..0726bbe
--- /dev/null
+++ b/gtktest.c
@@ -0,0 +1,42 @@
+#include <cairo.h>
+#include <gtk/gtk.h>
+
+#include "render.h"
+
+static gboolean on_draw_event(GtkWidget *widget, cairo_t *cr,
+ gpointer user_data)
+{
+ int width, height;
+
+ width = gtk_widget_get_allocated_width(widget);
+ height = gtk_widget_get_allocated_height(widget);
+ render_test(cr, width, height);
+ return FALSE;
+}
+
+int main(int argc, char *argv[])
+{
+ GtkWidget *window;
+ GtkWidget *darea;
+
+ gtk_init(&argc, &argv);
+
+ window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+
+ darea = gtk_drawing_area_new();
+ gtk_container_add(GTK_CONTAINER(window), darea);
+
+ g_signal_connect(G_OBJECT(darea), "draw",
+ G_CALLBACK(on_draw_event), NULL);
+ g_signal_connect(window, "destroy",
+ G_CALLBACK(gtk_main_quit), NULL);
+
+ gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
+ gtk_window_set_default_size(GTK_WINDOW(window), 400, 300);
+ gtk_window_set_title(GTK_WINDOW(window), "gtktest");
+
+ gtk_widget_show_all(window);
+
+ gtk_main();
+ return 0;
+}
diff --git a/render.c b/render.c
new file mode 100644
index 0000000..5c650f2
--- /dev/null
+++ b/render.c
@@ -0,0 +1,54 @@
+#include <cairo.h>
+
+static int pad = 10;
+
+static void render_color_bar(cairo_t *cr, int x, int y, int w, int h,
+ double r, double g, double b, const char *name)
+{
+ cairo_font_extents_t ext;
+ cairo_pattern_t *gr;
+
+ gr = cairo_pattern_create_linear(x, y+h/2, w, y+h/2);
+ cairo_pattern_add_color_stop_rgb(gr, 0, 0, 0, 0);
+ cairo_pattern_add_color_stop_rgb(gr, 1, r, g, b);
+ cairo_rectangle (cr, x, y, w, h);
+ cairo_set_source (cr, gr);
+ cairo_fill (cr);
+ cairo_pattern_destroy(gr);
+
+ cairo_set_source_rgb(cr, r, g, b);
+ cairo_select_font_face(cr, "mono",
+ CAIRO_FONT_SLANT_NORMAL,
+ CAIRO_FONT_WEIGHT_NORMAL);
+ cairo_set_font_size(cr, h - 2*pad);
+ cairo_font_extents (cr, &ext);
+ cairo_move_to(cr, x + pad, y + pad + ext.ascent);
+ cairo_show_text(cr, name);
+}
+
+void render_test(cairo_t *cr, int width, int height)
+{
+ int bar = 100;
+
+ while (6 * bar + 2 * pad > height &&
+ bar > 4 * pad)
+ bar -= 10;
+
+ cairo_set_source_rgb(cr, 0, 0, 0);
+ cairo_rectangle (cr, 0, 0, width, height);
+ cairo_fill (cr);
+
+ cairo_set_line_width (cr, 1);
+ cairo_set_source_rgb (cr, 1, 1, 1);
+ cairo_rectangle (cr, pad - 0.5, pad - 0.5, width - 2*pad + 1, 6*bar + 1);
+ cairo_stroke (cr);
+
+ render_color_bar(cr, pad, bar * 0 + pad, width - 2*pad, bar, 1, 0, 0, "red");
+ render_color_bar(cr, pad, bar * 1 + pad, width - 2*pad, bar, 1, 1, 0, "yellow");
+ render_color_bar(cr, pad, bar * 2 + pad, width - 2*pad, bar, 0, 1, 0, "green");
+ render_color_bar(cr, pad, bar * 3 + pad, width - 2*pad, bar, 0, 1, 1, "cyan");
+ render_color_bar(cr, pad, bar * 4 + pad, width - 2*pad, bar, 0, 0, 1, "blue");
+ render_color_bar(cr, pad, bar * 5 + pad, width - 2*pad, bar, 1, 0, 1, "magenta");
+}
+
+
diff --git a/render.h b/render.h
new file mode 100644
index 0000000..93a53c5
--- /dev/null
+++ b/render.h
@@ -0,0 +1 @@
+void render_test(cairo_t *cr, int width, int height);