[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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.