1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
/*
* gxr
* Copyright 2018 Collabora Ltd.
* Author: Lubosz Sarnecki <lubosz.sarnecki@collabora.com>
* SPDX-License-Identifier: MIT
*/
#include "cairo_content.h"
#include <gxr.h>
#define WIDTH 1280
#define HEIGHT 720
#define STRIDE (WIDTH * 4)
static GulkanTexture *texture;
static void
draw_cairo (cairo_t *cr, unsigned width, unsigned height)
{
draw_gradient_quad (cr, width, height);
draw_gradient_circle (cr, width, height);
}
static cairo_surface_t*
create_cairo_surface (unsigned char *image)
{
cairo_surface_t *surface =
cairo_image_surface_create_for_data (image,
CAIRO_FORMAT_ARGB32,
WIDTH, HEIGHT,
STRIDE);
cairo_t *cr = cairo_create (surface);
cairo_rectangle (cr, 0, 0, WIDTH, HEIGHT);
cairo_set_source_rgb (cr, 1, 1, 1);
cairo_fill (cr);
draw_cairo (cr, WIDTH, HEIGHT);
cairo_destroy (cr);
return surface;
}
static gboolean
timeout_callback (gpointer data)
{
GxrOverlay *overlay = (GxrOverlay*) data;
gxr_overlay_poll_event (overlay);
return TRUE;
}
static void
_press_cb (GxrOverlay *overlay,
GdkEventButton *event,
gpointer data)
{
(void) overlay;
g_print ("press: %d %f %f (%d)\n",
event->button, event->x, event->y, event->time);
GMainLoop *loop = (GMainLoop*) data;
g_main_loop_quit (loop);
}
static void
_show_cb (GxrOverlay *overlay,
gpointer data)
{
(void) data;
g_print ("show\n");
/* skip rendering if the overlay isn't available or visible */
gboolean is_invisible = !gxr_overlay_is_visible (overlay) &&
!gxr_overlay_thumbnail_is_visible (overlay);
if (is_invisible)
return;
gxr_overlay_submit_texture (overlay, texture);
}
static void
_destroy_cb (GxrOverlay *overlay,
gpointer data)
{
(void) overlay;
g_print ("destroy\n");
GMainLoop *loop = (GMainLoop*) data;
g_main_loop_quit (loop);
}
static int
test_cat_overlay ()
{
GMainLoop *loop;
unsigned char image[STRIDE*HEIGHT];
cairo_surface_t* surface = create_cairo_surface (image);
if (surface == NULL) {
fprintf (stderr, "Could not create cairo surface.\n");
return -1;
}
loop = g_main_loop_new (NULL, FALSE);
GxrContext *context = gxr_context_new (GXR_APP_OVERLAY, "Overlay Cairo", 1);
GulkanClient *gc = gxr_context_get_gulkan (context);
texture = gulkan_texture_new_from_cairo_surface (gc, surface,
VK_FORMAT_R8G8B8A8_UNORM,
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
/* create openvr overlay */
GxrOverlay *overlay = gxr_overlay_new (context, "examples.cairo");
if (overlay == NULL)
{
fprintf (stderr, "Overlay unavailable.\n");
return -1;
}
gxr_overlay_set_mouse_scale (overlay, (float) WIDTH, (float) HEIGHT);
if (!gxr_overlay_show (overlay))
return -1;
gxr_overlay_submit_texture (overlay, texture);
g_signal_connect (overlay, "button-press-event", (GCallback) _press_cb, loop);
g_signal_connect (overlay, "show", (GCallback) _show_cb, NULL);
g_signal_connect (overlay, "destroy", (GCallback) _destroy_cb, loop);
g_timeout_add (20, timeout_callback, overlay);
g_main_loop_run (loop);
g_main_loop_unref (loop);
g_object_unref (overlay);
cairo_surface_destroy (surface);
g_object_unref (texture);
g_object_unref (context);
return 0;
}
int main () {
return test_cat_overlay ();
}
|