diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2009-07-21 22:28:44 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2009-07-21 22:28:44 +0100 |
commit | 1ae5942a3aa9f73aa71438dc40221836b0dff7e2 (patch) | |
tree | a39297460aaaf3b88c4b26480d12b40ec4eed545 /boilerplate | |
parent | fd9df4978d56bbb85ecd795afce72c0310dbcf3f (diff) | |
parent | 6a5957475139a7c80a6bb55fb63927e5ec8866f6 (diff) |
Merge commit 'anholt/gl'
Conflicts:
boilerplate/Makefile.sources
boilerplate/cairo-boilerplate.c
build/configure.ac.features
src/cairo.h
util/cairo-script/Makefile.am
Diffstat (limited to 'boilerplate')
-rw-r--r-- | boilerplate/Makefile.sources | 2 | ||||
-rw-r--r-- | boilerplate/Makefile.win32.features | 20 | ||||
-rw-r--r-- | boilerplate/cairo-boilerplate-gl.c | 162 |
3 files changed, 183 insertions, 1 deletions
diff --git a/boilerplate/Makefile.sources b/boilerplate/Makefile.sources index b40df4ce..3e3135ab 100644 --- a/boilerplate/Makefile.sources +++ b/boilerplate/Makefile.sources @@ -23,7 +23,7 @@ cairo_boilerplate_private = \ # following lines, even if beos surface is not enabled. Disable it for now. #libcairoboilerplate_la_SOURCES += cairo-boilerplate-beos.cpp -cairo_boilerplate_directfb_sources = cairo-boilerplate-directfb.c +cairo_boilerplate_gl_sources = cairo-boilerplate-gl.c cairo_boilerplate_glitz_sources = \ cairo-boilerplate-glitz-agl.c \ cairo-boilerplate-glitz-glx.c \ diff --git a/boilerplate/Makefile.win32.features b/boilerplate/Makefile.win32.features index e691118b..44ca95fe 100644 --- a/boilerplate/Makefile.win32.features +++ b/boilerplate/Makefile.win32.features @@ -139,6 +139,16 @@ enabled_cairo_boilerplate_private += $(cairo_boilerplate_png_private) enabled_cairo_boilerplate_sources += $(cairo_boilerplate_png_sources) endif +unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_gl_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_gl_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_gl_private) +all_cairo_boilerplate_sources += $(cairo_boilerplate_gl_sources) +ifeq ($(CAIRO_HAS_GL_SURFACE),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_gl_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_gl_private) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_gl_sources) +endif + unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_glitz_headers) all_cairo_boilerplate_headers += $(cairo_boilerplate_glitz_headers) all_cairo_boilerplate_private += $(cairo_boilerplate_glitz_private) @@ -169,6 +179,16 @@ enabled_cairo_boilerplate_private += $(cairo_boilerplate_vg_private) enabled_cairo_boilerplate_sources += $(cairo_boilerplate_vg_sources) endif +supported_cairo_boilerplate_headers += $(cairo_boilerplate_eagle_headers) +all_cairo_boilerplate_headers += $(cairo_boilerplate_eagle_headers) +all_cairo_boilerplate_private += $(cairo_boilerplate_eagle_private) +all_cairo_boilerplate_sources += $(cairo_boilerplate_eagle_sources) +ifeq ($(CAIRO_HAS_EAGLE_FUNCTIONS),1) +enabled_cairo_boilerplate_headers += $(cairo_boilerplate_eagle_headers) +enabled_cairo_boilerplate_private += $(cairo_boilerplate_eagle_private) +enabled_cairo_boilerplate_sources += $(cairo_boilerplate_eagle_sources) +endif + supported_cairo_boilerplate_headers += $(cairo_boilerplate_egl_headers) all_cairo_boilerplate_headers += $(cairo_boilerplate_egl_headers) all_cairo_boilerplate_private += $(cairo_boilerplate_egl_private) diff --git a/boilerplate/cairo-boilerplate-gl.c b/boilerplate/cairo-boilerplate-gl.c new file mode 100644 index 00000000..940fd756 --- /dev/null +++ b/boilerplate/cairo-boilerplate-gl.c @@ -0,0 +1,162 @@ +/* Cairo - a vector graphics library with display and print output + * + * Copyright © 2009 Chris Wilson + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Chris Wilson. + */ + +#include "cairo-boilerplate-private.h" + +#include <cairo-gl.h> + +typedef struct _gl_target_closure { + Display *dpy; + int screen; + + GLXContext gl_ctx; + cairo_gl_context_t *ctx; + cairo_surface_t *surface; +} gl_target_closure_t; + +static void +_cairo_boilerplate_gl_cleanup (void *closure) +{ + gl_target_closure_t *gltc = closure; + + cairo_gl_context_destroy (gltc->ctx); + glXDestroyContext (gltc->dpy, gltc->gl_ctx); + XCloseDisplay (gltc->dpy); + free (gltc); +} + +static cairo_surface_t * +_cairo_boilerplate_gl_create_surface (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + int id, + void **closure) +{ + int rgba_attribs[] = { GLX_RGBA, + GLX_RED_SIZE, 1, + GLX_GREEN_SIZE, 1, + GLX_BLUE_SIZE, 1, + GLX_ALPHA_SIZE, 1, + GLX_DOUBLEBUFFER, + None }; + int rgb_attribs[] = { GLX_RGBA, + GLX_RED_SIZE, 1, + GLX_GREEN_SIZE, 1, + GLX_BLUE_SIZE, 1, + GLX_DOUBLEBUFFER, + None }; + XVisualInfo *visinfo; + GLXContext gl_ctx; + gl_target_closure_t *gltc; + Display *dpy; + + gltc = malloc (sizeof (gl_target_closure_t)); + *closure = gltc; + + if (width == 0) + width = 1; + if (height == 0) + height = 1; + + dpy = XOpenDisplay (NULL); + gltc->dpy = dpy; + if (!gltc->dpy) { + fprintf (stderr, "Failed to open display: %s\n", XDisplayName(0)); + free (gltc); + return NULL; + } + + if (mode == CAIRO_BOILERPLATE_MODE_TEST) + XSynchronize (gltc->dpy, 1); + + if (content == CAIRO_CONTENT_COLOR) + visinfo = glXChooseVisual (dpy, DefaultScreen (dpy), rgb_attribs); + else + visinfo = glXChooseVisual (dpy, DefaultScreen (dpy), rgba_attribs); + + if (visinfo == NULL) { + fprintf (stderr, "Failed to create RGB, double-buffered visual\n"); + XCloseDisplay (dpy); + free (gltc); + return NULL; + } + + gl_ctx = glXCreateContext (dpy, visinfo, NULL, True); + XFree (visinfo); + + gltc->gl_ctx = gl_ctx; + gltc->ctx = cairo_glx_context_create (dpy, gl_ctx); + + gltc->surface = cairo_gl_surface_create (gltc->ctx, content, + ceil (width), ceil (height)); + + if (gltc->surface == NULL || cairo_surface_status (gltc->surface)) + _cairo_boilerplate_gl_cleanup (gltc); + + return gltc->surface; +} + +static void +_cairo_boilerplate_gl_synchronize (void *closure) +{ + gl_target_closure_t *gltc = closure; + + cairo_gl_surface_glfinish (gltc->surface); +} + +static const cairo_boilerplate_target_t targets[] = { + { + "gl", "gl", NULL, NULL, + CAIRO_SURFACE_TYPE_GL, CAIRO_CONTENT_COLOR_ALPHA, 1, + _cairo_boilerplate_gl_create_surface, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_gl_cleanup, + _cairo_boilerplate_gl_synchronize + }, + { + "gl", "gl", NULL, NULL, + CAIRO_SURFACE_TYPE_GL, CAIRO_CONTENT_COLOR, 1, + _cairo_boilerplate_gl_create_surface, + NULL, NULL, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_gl_cleanup, + _cairo_boilerplate_gl_synchronize + }, +}; +CAIRO_BOILERPLATE (gl, targets) |