diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2017-04-12 12:27:29 +0200 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2017-04-12 12:27:29 +0200 |
commit | f4622608baf58fed2d7d2b6cf2326b595c906d0d (patch) | |
tree | 46c426ea5c099939c5d01261d6177f597b514ddc | |
parent | 5db94c2bb0f900b4e6b4287764f49658535fb9d1 (diff) | |
download | drminfo-f4622608baf58fed2d7d2b6cf2326b595c906d0d.tar.gz |
cairo rendering
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | Makefile | 12 | ||||
-rw-r--r-- | drmtest.c | 31 | ||||
-rw-r--r-- | gtktest.c | 42 | ||||
-rw-r--r-- | render.c | 54 | ||||
-rw-r--r-- | render.h | 1 |
6 files changed, 125 insertions, 16 deletions
@@ -1,3 +1,4 @@ drminfo drmtest +gtktest *.o @@ -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 @@ -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); |