[patch 2/2] gl: add nsgl test cases for nsgl-window&
"Henry (Yu) Song - SISA" <[email protected]>
| Newsgroups | gmane.comp.lib.cairo |
|---|---|
| Message-ID | <3955FA337689574EB32F94B12A7E6E9E248481FE@sisaex01sj> |
From ed13470c39ad6806a5351d80a21415390183b4b4 Mon Sep 17 00:00:00 2001 From: Henry Song <[email protected]> Date: Fri, 4 Jan 2013 19:04:21 -0800 Subject: [PATCH 2/2] gl: add nsgl test case for nsgl-window& --- boilerplate/cairo-boilerplate-nsgl.m | 133 +++++++++++++++++++++++++++++++++-- 1 file changed, 129 insertions(+), 4 deletions(-) diff --git a/boilerplate/cairo-boilerplate-nsgl.m b/boilerplate/cairo-boilerplate-nsgl.m index aea5c75..2b66eaa 100644 --- a/boilerplate/cairo-boilerplate-nsgl.m +++ b/boilerplate/cairo-boilerplate-nsgl.m @@ -180,7 +180,7 @@ _cairo_boilerplate_nsgl_create_view (const char *name, NSOpenGLView *view; NSScreen *screen = [NSScreen mainScreen]; - NSRect frame = [screen frame]; + NSRect frame = [screen visibleFrame]; int screen_height = frame.size.height; gltc = xcalloc (1, sizeof (nsgl_target_closure_t)); @@ -227,9 +227,98 @@ _cairo_boilerplate_nsgl_create_view (const char *name, return surface; } +static cairo_surface_t * +_cairo_boilerplate_nsgl_create_view_db (const char *name, + cairo_content_t content, + double width, + double height, + double max_width, + double max_height, + cairo_boilerplate_mode_t mode, + void **closure) +{ + cairo_status_t status; + nsgl_target_closure_t *gltc; + cairo_surface_t *surface; + int style = NSTexturedBackgroundWindowMask; + + NSWindow *win; + NSOpenGLView *view; + + NSScreen *screen = [NSScreen mainScreen]; + NSRect frame = [screen visibleFrame]; + int screen_height = frame.size.height; + + gltc = xcalloc (1, sizeof (nsgl_target_closure_t)); + gltc->window = nil; + gltc->view = nil; + *closure = gltc; + + gltc->pool = [[NSAutoreleasePool alloc] init]; + [NSApplication sharedApplication]; + + if (width < 1) + width = 1; + if (height < 1) + height = 1; + + win = [[NSWindow alloc] initWithContentRect: NSMakeRect (0, screen_height - ceil (height), ceil (width), ceil (height)) + styleMask: style + backing: NSBackingStoreBuffered + defer: NO]; + + view = [[NSGLTestView alloc] initWithFrame: NSMakeRect (0, 0, ceil (width), ceil (height))]; + [win setContentView: view]; + + gltc->view = view; + gltc->window = win; + + gltc->ctx = [gltc->view openGLContext]; + + if (!gltc->ctx) + return NULL; + + [gltc->ctx makeCurrentContext]; + gltc->device = cairo_nsgl_device_create (gltc->ctx); + + gltc->surface = cairo_gl_surface_create_for_view (gltc->device, + gltc->view, + ceil (width), + ceil (height)); + surface = cairo_surface_create_similar (gltc->surface, content, width, height); + + status = cairo_surface_set_user_data (surface, &gl_closure_key, gltc, NULL); + + if (status == CAIRO_STATUS_SUCCESS) { + [win orderFront: win]; + return surface; + } + + cairo_surface_destroy (surface); + _cairo_boilerplate_nsgl_cleanup (gltc); + + return cairo_boilerplate_surface_create_in_error (status); +} + static cairo_status_t _cairo_boilerplate_nsgl_finish_window (cairo_surface_t *surface) { + nsgl_target_closure_t *gltc = cairo_surface_get_user_data (surface, + &gl_closure_key); + + if (gltc != NULL && gltc->surface != NULL) { + cairo_t *cr; + + cr = cairo_create (gltc->surface); + cairo_surface_set_device_offset (surface, 0, 0); + cairo_set_source_surface (cr, surface, 0, 0); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr); + cairo_destroy (cr); + + surface = gltc->surface; + } + cairo_gl_surface_swapbuffers (surface); return CAIRO_STATUS_SUCCESS; } @@ -247,6 +336,27 @@ _cairo_boilerplate_nsgl_synchronize (void *closure) cairo_device_release (gltc->device); } +static char * +_cairo_boilerplate_nsgl_describe (void *closure) +{ + nsgl_target_closure_t *gltc = closure; + char *s; + const GLubyte *vendor, *renderer, *version; + + if (cairo_device_acquire (gltc->device)) + return NULL; + + vendor = glGetString (GL_VENDOR); + renderer = glGetString (GL_RENDERER); + version = glGetString (GL_VERSION); + + xasprintf (&s, "%s %s %s", vendor, renderer, version); + + cairo_device_release (gltc->device); + + return s; +} + static const cairo_boilerplate_target_t targets[] = { { "nsgl", "gl", NULL, NULL, @@ -259,7 +369,7 @@ static const cairo_boilerplate_target_t targets[] = { cairo_surface_write_to_png, _cairo_boilerplate_nsgl_cleanup, _cairo_boilerplate_nsgl_synchronize, - NULL, + _cairo_boilerplate_nsgl_describe, TRUE, FALSE, FALSE }, { @@ -273,7 +383,7 @@ static const cairo_boilerplate_target_t targets[] = { cairo_surface_write_to_png, _cairo_boilerplate_nsgl_cleanup, _cairo_boilerplate_nsgl_synchronize, - NULL, + _cairo_boilerplate_nsgl_describe, TRUE, FALSE, FALSE }, { @@ -288,7 +398,22 @@ static const cairo_boilerplate_target_t targets[] = { cairo_surface_write_to_png, _cairo_boilerplate_nsgl_cleanup, _cairo_boilerplate_nsgl_synchronize, - NULL, + _cairo_boilerplate_nsgl_describe, + FALSE, FALSE, FALSE + }, + { + "nsgl-windowi&", "gl", NULL, NULL, + CAIRO_SURFACE_TYPE_GL, CAIRO_CONTENT_COLOR_ALPHA, 1, + "cairo_nsgl_surface_create_for_window", + _cairo_boilerplate_nsgl_create_view_db, + cairo_surface_create_similar, + NULL, + _cairo_boilerplate_nsgl_finish_window, + _cairo_boilerplate_get_image_surface, + cairo_surface_write_to_png, + _cairo_boilerplate_nsgl_cleanup, + _cairo_boilerplate_nsgl_synchronize, + _cairo_boilerplate_nsgl_describe, FALSE, FALSE, FALSE } }; -- 1.8.0.1 -- cairo mailing list [email protected] http://lists.cairographics.org/mailman/listinfo/cairo