cocoa: change Shape data to use ObjC objects instead of C structs. Fixes #6089
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
diff --git a/src/video/cocoa/SDL_cocoashape.h b/src/video/cocoa/SDL_cocoashape.h
index 25c4162..358d878 100644
--- a/src/video/cocoa/SDL_cocoashape.h
+++ b/src/video/cocoa/SDL_cocoashape.h
@@ -29,12 +29,11 @@
#include "SDL_shape.h"
#include "../SDL_shape_internals.h"
-typedef struct {
- NSGraphicsContext* context;
- SDL_bool saved;
-
- SDL_ShapeTree* shape;
-} SDL_ShapeData;
+@interface SDL_ShapeData : NSObject
+ @property (nonatomic) NSGraphicsContext* context;
+ @property (nonatomic) SDL_bool saved;
+ @property (nonatomic) SDL_ShapeTree* shape;
+@end
extern SDL_WindowShaper* Cocoa_CreateShaper(SDL_Window* window);
extern int Cocoa_SetWindowShape(SDL_WindowShaper *shaper,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode);
diff --git a/src/video/cocoa/SDL_cocoashape.m b/src/video/cocoa/SDL_cocoashape.m
index f594cb0..6dbd64b 100644
--- a/src/video/cocoa/SDL_cocoashape.m
+++ b/src/video/cocoa/SDL_cocoashape.m
@@ -27,6 +27,18 @@
#include "SDL_cocoashape.h"
#include "../SDL_sysvideo.h"
+@implementation SDL_ShapeData
+@end
+
+@interface SDL_CocoaClosure : NSObject
+ @property (nonatomic) NSView* view;
+ @property (nonatomic) NSBezierPath* path;
+ @property (nonatomic) SDL_Window* window;
+@end
+
+@implementation SDL_CocoaClosure
+@end
+
SDL_WindowShaper*
Cocoa_CreateShaper(SDL_Window* window)
{ @autoreleasepool
@@ -46,30 +58,26 @@ Cocoa_CreateShaper(SDL_Window* window)
result->userx = result->usery = 0;
window->shaper = result;
- data = (SDL_ShapeData *)SDL_malloc(sizeof(SDL_ShapeData));
- result->driverdata = data;
- data->context = [windata.nswindow graphicsContext];
- data->saved = SDL_FALSE;
- data->shape = NULL;
+ data = [[SDL_ShapeData alloc] init];
+ data.context = [windata.nswindow graphicsContext];
+ data.saved = SDL_FALSE;
+ data.shape = NULL;
+
+ /* TODO: There's no place to release this... */
+ result->driverdata = (void*) CFBridgingRetain(data);
resized_properly = Cocoa_ResizeWindowShape(window);
SDL_assert(resized_properly == 0);
return result;
}}
-typedef struct {
- NSView* view;
- NSBezierPath* path;
- SDL_Window* window;
-} SDL_CocoaClosure;
-
void
ConvertRects(SDL_ShapeTree* tree, void* closure)
{
- SDL_CocoaClosure* data = (SDL_CocoaClosure*)closure;
+ SDL_CocoaClosure* data = (__bridge SDL_CocoaClosure*)closure;
if(tree->kind == OpaqueShape) {
- NSRect rect = NSMakeRect(tree->data.shape.x,data->window->h - tree->data.shape.y,tree->data.shape.w,tree->data.shape.h);
- [data->path appendBezierPathWithRect:[data->view convertRect:rect toView:nil]];
+ NSRect rect = NSMakeRect(tree->data.shape.x, data.window->h - tree->data.shape.y, tree->data.shape.w, tree->data.shape.h);
+ [data.path appendBezierPathWithRect:[data.view convertRect:rect toView:nil]];
}
}
@@ -77,26 +85,28 @@ int
Cocoa_SetWindowShape(SDL_WindowShaper *shaper, SDL_Surface *shape, SDL_WindowShapeMode *shape_mode)
{ @autoreleasepool
{
- SDL_ShapeData* data = (SDL_ShapeData*)shaper->driverdata;
+ SDL_ShapeData* data = (__bridge SDL_ShapeData*)shaper->driverdata;
SDL_WindowData* windata = (__bridge SDL_WindowData*)shaper->window->driverdata;
- SDL_CocoaClosure closure;
- if(data->saved == SDL_TRUE) {
- [data->context restoreGraphicsState];
- data->saved = SDL_FALSE;
+ SDL_CocoaClosure* closure;
+ if(data.saved == SDL_TRUE) {
+ [data.context restoreGraphicsState];
+ data.saved = SDL_FALSE;
}
- /*[data->context saveGraphicsState];*/
- /*data->saved = SDL_TRUE;*/
- [NSGraphicsContext setCurrentContext:data->context];
+ /*[data.context saveGraphicsState];*/
+ /*data.saved = SDL_TRUE;*/
+ [NSGraphicsContext setCurrentContext:data.context];
[[NSColor clearColor] set];
NSRectFill([windata.sdlContentView frame]);
- data->shape = SDL_CalculateShapeTree(*shape_mode,shape);
+ data.shape = SDL_CalculateShapeTree(*shape_mode, shape);
+
+ closure = [[SDL_CocoaClosure alloc] init];
closure.view = windata.sdlContentView;
closure.path = [NSBezierPath bezierPath];
closure.window = shaper->window;
- SDL_TraverseShapeTree(data->shape,&ConvertRects,&closure);
+ SDL_TraverseShapeTree(data.shape, &ConvertRects, (__bridge void*)closure);
[closure.path addClip];
return 0;
@@ -104,11 +114,11 @@ Cocoa_SetWindowShape(SDL_WindowShaper *shaper, SDL_Surface *shape, SDL_WindowSha
int
Cocoa_ResizeWindowShape(SDL_Window *window)
-{
- SDL_ShapeData* data = window->shaper->driverdata;
+{ @autoreleasepool {
+ SDL_ShapeData* data = (__bridge SDL_ShapeData*)window->shaper->driverdata;
SDL_assert(data != NULL);
return 0;
-}
+}}
#endif /* SDL_VIDEO_DRIVER_COCOA */