[cairo] [patch] gl: add test cases for nsgl-window
Henry (Yu) Song - SISA
hsong at sisa.samsung.com
Fri Jan 4 18:08:51 PST 2013
>From da087e70822996ed0d8e2556a3bd9fda5a0b5d9d Mon Sep 17 00:00:00 2001
From: Henry Song <hsong at sisa.samsung.com>
Date: Fri, 4 Jan 2013 18:05:53 -0800
Subject: [PATCH] gl: add test cases for nsgl-window
---
boilerplate/cairo-boilerplate-nsgl.m | 134 ++++++++++++++++++++++++++++++++++-
1 file changed, 132 insertions(+), 2 deletions(-)
diff --git a/boilerplate/cairo-boilerplate-nsgl.m b/boilerplate/cairo-boilerplate-nsgl.m
index f6ead00..2247886 100644
--- a/boilerplate/cairo-boilerplate-nsgl.m
+++ b/boilerplate/cairo-boilerplate-nsgl.m
@@ -40,17 +40,50 @@
#import <AppKit/NSOpenGL.h>
#import <Foundation/NSAutoreleasePool.h>
+#import <Cocoa/Cocoa.h>
static const cairo_user_data_key_t gl_closure_key;
typedef struct _nsgl_target_closure {
NSOpenGLContext *ctx;
NSAutoreleasePool *pool;
+ NSOpenGLView *view;
+ NSWindow *window;
cairo_device_t *device;
cairo_surface_t *surface;
} nsgl_target_closure_t;
+ at interface NSGLTestView : NSOpenGLView {
+}
+
+ at end
+
+ at implementation NSGLTestView
+
++ (NSOpenGLPixelFormat*)defaultPixelFormat
+{
+ NSOpenGLPixelFormatAttribute attrs[] =
+ {
+ NSOpenGLPFADoubleBuffer,
+ NSOpenGLPFADepthSize, 24,
+ NSOpenGLPFAStencilSize, 8,
+ NSOpenGLPFAAlphaSize, 8,
+ NSOpenGLPFASampleBuffers, 1,
+ NSOpenGLPFASamples, 4,
+ NSOpenGLPFAMultisample,
+ 0
+ };
+
+ NSOpenGLPixelFormat *classPixelFormat = [[[NSOpenGLPixelFormat alloc] initWithAttributes:attrs] autorelease];
+ if (!classPixelFormat)
+ exit (-1);
+
+ return classPixelFormat;
+}
+
+ at end
+
static void
_cairo_boilerplate_nsgl_cleanup (void *closure)
{
@@ -60,7 +93,15 @@ _cairo_boilerplate_nsgl_cleanup (void *closure)
cairo_device_destroy (gltc->device);
[NSOpenGLContext clearCurrentContext];
- [gltc->ctx release];
+
+ if (gltc->window) {
+ [gltc->window orderOut: nil];
+ [gltc->window release];
+ [gltc->view release];
+ }
+ else
+ [gltc->ctx release];
+
[gltc->pool release];
free (gltc);
@@ -88,6 +129,8 @@ _cairo_boilerplate_nsgl_create_surface (const char *name,
};
gltc = xcalloc (1, sizeof (nsgl_target_closure_t));
+ gltc->window = nil;
+ gltc->view = nil;
*closure = gltc;
gltc->pool = [[NSAutoreleasePool alloc] init];
@@ -119,6 +162,78 @@ _cairo_boilerplate_nsgl_create_surface (const char *name,
return surface;
}
+static cairo_surface_t *
+_cairo_boilerplate_nsgl_create_view (const char *name,
+ cairo_content_t content,
+ double width,
+ double height,
+ double max_width,
+ double max_height,
+ cairo_boilerplate_mode_t mode,
+ void **closure)
+{
+ nsgl_target_closure_t *gltc;
+ cairo_surface_t *surface;
+ int style = NSTexturedBackgroundWindowMask;
+
+ NSWindow *win;
+ NSOpenGLView *view;
+
+ NSScreen *screen = [NSScreen mainScreen];
+ NSRect frame = [screen frame];
+ 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 = surface = cairo_gl_surface_create_for_view (gltc->device,
+ gltc->view,
+ ceil (width),
+ ceil (height));
+ if (cairo_surface_status (surface))
+ _cairo_boilerplate_nsgl_cleanup (gltc);
+
+ [win orderFront: win];
+
+ return surface;
+}
+
+static cairo_status_t
+_cairo_boilerplate_nsgl_finish_window (cairo_surface_t *surface)
+{
+ cairo_gl_surface_swapbuffers (surface);
+ return CAIRO_STATUS_SUCCESS;
+}
+
static void
_cairo_boilerplate_nsgl_synchronize (void *closure)
{
@@ -136,7 +251,7 @@ static const cairo_boilerplate_target_t targets[] = {
{
"nsgl", "gl", NULL, NULL,
CAIRO_SURFACE_TYPE_GL, CAIRO_CONTENT_COLOR_ALPHA, 1,
- "cairo_nsgl_device_create",
+ "cairo_nsgl_surface_create",
_cairo_boilerplate_nsgl_create_surface,
cairo_surface_create_similar,
NULL, NULL,
@@ -146,6 +261,21 @@ static const cairo_boilerplate_target_t targets[] = {
_cairo_boilerplate_nsgl_synchronize,
NULL,
TRUE, FALSE, FALSE
+ },
+ {
+ "nsgl-window", "gl", NULL, NULL,
+ CAIRO_SURFACE_TYPE_GL, CAIRO_CONTENT_COLOR_ALPHA, 1,
+ "cairo_nsgl_surface_create_for_window",
+ _cairo_boilerplate_nsgl_create_view,
+ 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,
+ NULL,
+ FALSE, FALSE, FALSE
}
};
CAIRO_BOILERPLATE (nsgl, targets)
--
1.8.0.1
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cairographics.org/archives/cairo/attachments/20130105/14fc1c2f/attachment-0001.html>
More information about the cairo
mailing list