src/video/cocoa/SDL_cocoashape.m
author egottlieb
Tue, 03 Aug 2010 23:22:31 -0400
changeset 4830 3dfe779900f5
parent 4829 7160e833c4ac
child 4831 8dabd625079f
permissions -rw-r--r--
Compiling for cocoa now works. Does it run? We'll see.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4809
329708ffe2a7 Rejiggering the way shaped windows are created as preparation for OS X implementation. Fixed overdrive bug in test program that appears to have been introduced by someone other than myself.
Eli Gottlieb <eligottlieb@gmail.com>
parents:
diff changeset
     1
/*
329708ffe2a7 Rejiggering the way shaped windows are created as preparation for OS X implementation. Fixed overdrive bug in test program that appears to have been introduced by someone other than myself.
Eli Gottlieb <eligottlieb@gmail.com>
parents:
diff changeset
     2
    SDL - Simple DirectMedia Layer
329708ffe2a7 Rejiggering the way shaped windows are created as preparation for OS X implementation. Fixed overdrive bug in test program that appears to have been introduced by someone other than myself.
Eli Gottlieb <eligottlieb@gmail.com>
parents:
diff changeset
     3
    Copyright (C) 2010 Eli Gottlieb
329708ffe2a7 Rejiggering the way shaped windows are created as preparation for OS X implementation. Fixed overdrive bug in test program that appears to have been introduced by someone other than myself.
Eli Gottlieb <eligottlieb@gmail.com>
parents:
diff changeset
     4
329708ffe2a7 Rejiggering the way shaped windows are created as preparation for OS X implementation. Fixed overdrive bug in test program that appears to have been introduced by someone other than myself.
Eli Gottlieb <eligottlieb@gmail.com>
parents:
diff changeset
     5
    This library is free software; you can redistribute it and/or
329708ffe2a7 Rejiggering the way shaped windows are created as preparation for OS X implementation. Fixed overdrive bug in test program that appears to have been introduced by someone other than myself.
Eli Gottlieb <eligottlieb@gmail.com>
parents:
diff changeset
     6
    modify it under the terms of the GNU Lesser General Public
329708ffe2a7 Rejiggering the way shaped windows are created as preparation for OS X implementation. Fixed overdrive bug in test program that appears to have been introduced by someone other than myself.
Eli Gottlieb <eligottlieb@gmail.com>
parents:
diff changeset
     7
    License as published by the Free Software Foundation; either
329708ffe2a7 Rejiggering the way shaped windows are created as preparation for OS X implementation. Fixed overdrive bug in test program that appears to have been introduced by someone other than myself.
Eli Gottlieb <eligottlieb@gmail.com>
parents:
diff changeset
     8
    version 2.1 of the License, or (at your option) any later version.
329708ffe2a7 Rejiggering the way shaped windows are created as preparation for OS X implementation. Fixed overdrive bug in test program that appears to have been introduced by someone other than myself.
Eli Gottlieb <eligottlieb@gmail.com>
parents:
diff changeset
     9
329708ffe2a7 Rejiggering the way shaped windows are created as preparation for OS X implementation. Fixed overdrive bug in test program that appears to have been introduced by someone other than myself.
Eli Gottlieb <eligottlieb@gmail.com>
parents:
diff changeset
    10
    This library is distributed in the hope that it will be useful,
329708ffe2a7 Rejiggering the way shaped windows are created as preparation for OS X implementation. Fixed overdrive bug in test program that appears to have been introduced by someone other than myself.
Eli Gottlieb <eligottlieb@gmail.com>
parents:
diff changeset
    11
    but WITHOUT ANY WARRANTY; without even the implied warranty of
329708ffe2a7 Rejiggering the way shaped windows are created as preparation for OS X implementation. Fixed overdrive bug in test program that appears to have been introduced by someone other than myself.
Eli Gottlieb <eligottlieb@gmail.com>
parents:
diff changeset
    12
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
329708ffe2a7 Rejiggering the way shaped windows are created as preparation for OS X implementation. Fixed overdrive bug in test program that appears to have been introduced by someone other than myself.
Eli Gottlieb <eligottlieb@gmail.com>
parents:
diff changeset
    13
    Lesser General Public License for more details.
329708ffe2a7 Rejiggering the way shaped windows are created as preparation for OS X implementation. Fixed overdrive bug in test program that appears to have been introduced by someone other than myself.
Eli Gottlieb <eligottlieb@gmail.com>
parents:
diff changeset
    14
329708ffe2a7 Rejiggering the way shaped windows are created as preparation for OS X implementation. Fixed overdrive bug in test program that appears to have been introduced by someone other than myself.
Eli Gottlieb <eligottlieb@gmail.com>
parents:
diff changeset
    15
    You should have received a copy of the GNU Lesser General Public
329708ffe2a7 Rejiggering the way shaped windows are created as preparation for OS X implementation. Fixed overdrive bug in test program that appears to have been introduced by someone other than myself.
Eli Gottlieb <eligottlieb@gmail.com>
parents:
diff changeset
    16
    License along with this library; if not, write to the Free Software
329708ffe2a7 Rejiggering the way shaped windows are created as preparation for OS X implementation. Fixed overdrive bug in test program that appears to have been introduced by someone other than myself.
Eli Gottlieb <eligottlieb@gmail.com>
parents:
diff changeset
    17
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
329708ffe2a7 Rejiggering the way shaped windows are created as preparation for OS X implementation. Fixed overdrive bug in test program that appears to have been introduced by someone other than myself.
Eli Gottlieb <eligottlieb@gmail.com>
parents:
diff changeset
    18
329708ffe2a7 Rejiggering the way shaped windows are created as preparation for OS X implementation. Fixed overdrive bug in test program that appears to have been introduced by someone other than myself.
Eli Gottlieb <eligottlieb@gmail.com>
parents:
diff changeset
    19
    Eli Gottlieb
329708ffe2a7 Rejiggering the way shaped windows are created as preparation for OS X implementation. Fixed overdrive bug in test program that appears to have been introduced by someone other than myself.
Eli Gottlieb <eligottlieb@gmail.com>
parents:
diff changeset
    20
    eligottlieb@gmail.com
329708ffe2a7 Rejiggering the way shaped windows are created as preparation for OS X implementation. Fixed overdrive bug in test program that appears to have been introduced by someone other than myself.
Eli Gottlieb <eligottlieb@gmail.com>
parents:
diff changeset
    21
*/
329708ffe2a7 Rejiggering the way shaped windows are created as preparation for OS X implementation. Fixed overdrive bug in test program that appears to have been introduced by someone other than myself.
Eli Gottlieb <eligottlieb@gmail.com>
parents:
diff changeset
    22
4827
5660aac926e9 Got basic, pre-actually-writing-anything Cocoa to build.
egottlieb
parents: 4811
diff changeset
    23
#include "SDL_stdinc.h"
4811
d79939f20c45 Working on Cocoa implementation.
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4810
diff changeset
    24
#include "SDL_cocoavideo.h"
4809
329708ffe2a7 Rejiggering the way shaped windows are created as preparation for OS X implementation. Fixed overdrive bug in test program that appears to have been introduced by someone other than myself.
Eli Gottlieb <eligottlieb@gmail.com>
parents:
diff changeset
    25
#include "SDL_shape.h"
4810
7a602fd2121f OK, it appears that dramatic hacks are not necessary to make Cocoa work...
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4809
diff changeset
    26
#include "SDL_cocoashape.h"
4827
5660aac926e9 Got basic, pre-actually-writing-anything Cocoa to build.
egottlieb
parents: 4811
diff changeset
    27
#include "SDL_sysvideo.h"
4809
329708ffe2a7 Rejiggering the way shaped windows are created as preparation for OS X implementation. Fixed overdrive bug in test program that appears to have been introduced by someone other than myself.
Eli Gottlieb <eligottlieb@gmail.com>
parents:
diff changeset
    28
4810
7a602fd2121f OK, it appears that dramatic hacks are not necessary to make Cocoa work...
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4809
diff changeset
    29
SDL_WindowShaper* Cocoa_CreateShaper(SDL_Window* window) {
7a602fd2121f OK, it appears that dramatic hacks are not necessary to make Cocoa work...
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4809
diff changeset
    30
	SDL_WindowData* data = (SDL_WindowData*)window->driverdata;
7a602fd2121f OK, it appears that dramatic hacks are not necessary to make Cocoa work...
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4809
diff changeset
    31
	[data->nswindow setAlpha:1.0];
7a602fd2121f OK, it appears that dramatic hacks are not necessary to make Cocoa work...
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4809
diff changeset
    32
	[data->nswindow setOpaque:YES];
4811
d79939f20c45 Working on Cocoa implementation.
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4810
diff changeset
    33
	[data->nswindow setStyleMask:NSBorderlessWindowMask];
4827
5660aac926e9 Got basic, pre-actually-writing-anything Cocoa to build.
egottlieb
parents: 4811
diff changeset
    34
	SDL_WindowShaper* result = SDL_malloc(sizeof(SDL_WindowShaper));
4810
7a602fd2121f OK, it appears that dramatic hacks are not necessary to make Cocoa work...
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4809
diff changeset
    35
	result->window = window;
7a602fd2121f OK, it appears that dramatic hacks are not necessary to make Cocoa work...
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4809
diff changeset
    36
	result->mode.mode = ShapeModeDefault;
7a602fd2121f OK, it appears that dramatic hacks are not necessary to make Cocoa work...
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4809
diff changeset
    37
	result->mode.parameters.binarizationCutoff = 1;
7a602fd2121f OK, it appears that dramatic hacks are not necessary to make Cocoa work...
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4809
diff changeset
    38
	result->usershownflag = 0;
7a602fd2121f OK, it appears that dramatic hacks are not necessary to make Cocoa work...
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4809
diff changeset
    39
	window->shaper = result;
4811
d79939f20c45 Working on Cocoa implementation.
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4810
diff changeset
    40
	
4827
5660aac926e9 Got basic, pre-actually-writing-anything Cocoa to build.
egottlieb
parents: 4811
diff changeset
    41
	SDL_ShapeData* shape_data = SDL_malloc(sizeof(SDL_ShapeData));
5660aac926e9 Got basic, pre-actually-writing-anything Cocoa to build.
egottlieb
parents: 4811
diff changeset
    42
	result->driverdata = shape_data;
5660aac926e9 Got basic, pre-actually-writing-anything Cocoa to build.
egottlieb
parents: 4811
diff changeset
    43
	shape_data->context = [data->nswindow graphicsContext];
5660aac926e9 Got basic, pre-actually-writing-anything Cocoa to build.
egottlieb
parents: 4811
diff changeset
    44
	shape_data->saved = SDL_FALSE;
5660aac926e9 Got basic, pre-actually-writing-anything Cocoa to build.
egottlieb
parents: 4811
diff changeset
    45
	shape_data->shape = NULL;
4811
d79939f20c45 Working on Cocoa implementation.
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4810
diff changeset
    46
	
4810
7a602fd2121f OK, it appears that dramatic hacks are not necessary to make Cocoa work...
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4809
diff changeset
    47
	int resized_properly = Cocoa_ResizeWindowShape(window);
7a602fd2121f OK, it appears that dramatic hacks are not necessary to make Cocoa work...
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4809
diff changeset
    48
	assert(resized_properly == 0);
7a602fd2121f OK, it appears that dramatic hacks are not necessary to make Cocoa work...
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4809
diff changeset
    49
	return result;
7a602fd2121f OK, it appears that dramatic hacks are not necessary to make Cocoa work...
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4809
diff changeset
    50
}
7a602fd2121f OK, it appears that dramatic hacks are not necessary to make Cocoa work...
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4809
diff changeset
    51
4829
7160e833c4ac Implemented shaped windows for Cocoa. Still need to see if they actually work.
egottlieb
parents: 4827
diff changeset
    52
typedef struct {
7160e833c4ac Implemented shaped windows for Cocoa. Still need to see if they actually work.
egottlieb
parents: 4827
diff changeset
    53
	NSBezierPath* clipPath;
7160e833c4ac Implemented shaped windows for Cocoa. Still need to see if they actually work.
egottlieb
parents: 4827
diff changeset
    54
	SDL_Window* window;
7160e833c4ac Implemented shaped windows for Cocoa. Still need to see if they actually work.
egottlieb
parents: 4827
diff changeset
    55
} SDL_PathConglomeration;
7160e833c4ac Implemented shaped windows for Cocoa. Still need to see if they actually work.
egottlieb
parents: 4827
diff changeset
    56
7160e833c4ac Implemented shaped windows for Cocoa. Still need to see if they actually work.
egottlieb
parents: 4827
diff changeset
    57
NSRect convert_rect(SDL_Rect rect,SDL_Window* window) {
7160e833c4ac Implemented shaped windows for Cocoa. Still need to see if they actually work.
egottlieb
parents: 4827
diff changeset
    58
	NSRect nsrect = NSMakeRect(rect.x,window->h-(rect.y+rect.h),rect.w,rect.h);
7160e833c4ac Implemented shaped windows for Cocoa. Still need to see if they actually work.
egottlieb
parents: 4827
diff changeset
    59
	return [[((SDL_WindowData*)window->driverdata)->nswindow contentView] convertRectFromBase:nsrect];
7160e833c4ac Implemented shaped windows for Cocoa. Still need to see if they actually work.
egottlieb
parents: 4827
diff changeset
    60
}
7160e833c4ac Implemented shaped windows for Cocoa. Still need to see if they actually work.
egottlieb
parents: 4827
diff changeset
    61
4830
3dfe779900f5 Compiling for cocoa now works. Does it run? We'll see.
egottlieb
parents: 4829
diff changeset
    62
void ConglomerateShapeTree(SDL_ShapeTree* tree,SDL_PathConglomeration* cong) {
4829
7160e833c4ac Implemented shaped windows for Cocoa. Still need to see if they actually work.
egottlieb
parents: 4827
diff changeset
    63
	if(tree->kind == OpaqueShape) {
7160e833c4ac Implemented shaped windows for Cocoa. Still need to see if they actually work.
egottlieb
parents: 4827
diff changeset
    64
		NSRect rect = convert_rect(tree->data.shape,cong->window);
7160e833c4ac Implemented shaped windows for Cocoa. Still need to see if they actually work.
egottlieb
parents: 4827
diff changeset
    65
		[cong->clipPath appendBezierPathWithRect:rect];
7160e833c4ac Implemented shaped windows for Cocoa. Still need to see if they actually work.
egottlieb
parents: 4827
diff changeset
    66
	}
7160e833c4ac Implemented shaped windows for Cocoa. Still need to see if they actually work.
egottlieb
parents: 4827
diff changeset
    67
}
7160e833c4ac Implemented shaped windows for Cocoa. Still need to see if they actually work.
egottlieb
parents: 4827
diff changeset
    68
4811
d79939f20c45 Working on Cocoa implementation.
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4810
diff changeset
    69
int Cocoa_SetWindowShape(SDL_WindowShaper *shaper,SDL_Surface *shape,SDL_WindowShapeMode *shapeMode) {
4827
5660aac926e9 Got basic, pre-actually-writing-anything Cocoa to build.
egottlieb
parents: 4811
diff changeset
    70
	SDL_ShapeData* data = (SDL_ShapeData*)shaper->driverdata;
5660aac926e9 Got basic, pre-actually-writing-anything Cocoa to build.
egottlieb
parents: 4811
diff changeset
    71
	if(data->saved == SDL_TRUE) {
4811
d79939f20c45 Working on Cocoa implementation.
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4810
diff changeset
    72
		[data->context restoreGraphicsState];
4827
5660aac926e9 Got basic, pre-actually-writing-anything Cocoa to build.
egottlieb
parents: 4811
diff changeset
    73
		data->saved = SDL_FALSE;
4811
d79939f20c45 Working on Cocoa implementation.
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4810
diff changeset
    74
	}
d79939f20c45 Working on Cocoa implementation.
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4810
diff changeset
    75
		
d79939f20c45 Working on Cocoa implementation.
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4810
diff changeset
    76
	[data->context saveGraphicsState];
4827
5660aac926e9 Got basic, pre-actually-writing-anything Cocoa to build.
egottlieb
parents: 4811
diff changeset
    77
	data->saved = SDL_TRUE;
4811
d79939f20c45 Working on Cocoa implementation.
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4810
diff changeset
    78
	
4829
7160e833c4ac Implemented shaped windows for Cocoa. Still need to see if they actually work.
egottlieb
parents: 4827
diff changeset
    79
	//[[NSColor clearColor] set];
7160e833c4ac Implemented shaped windows for Cocoa. Still need to see if they actually work.
egottlieb
parents: 4827
diff changeset
    80
	//NSRectFill([[((SDL_WindowData*)shaper->window->driverdata)->nswindow contentView] frame]);
4811
d79939f20c45 Working on Cocoa implementation.
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4810
diff changeset
    81
	/* TODO: It looks like Cocoa can set a clipping path based on a list of rectangles.  That's what we get from the
d79939f20c45 Working on Cocoa implementation.
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4810
diff changeset
    82
           Windoze shape-calculation code: a list of rectangles.  This will work... I think. */
4829
7160e833c4ac Implemented shaped windows for Cocoa. Still need to see if they actually work.
egottlieb
parents: 4827
diff changeset
    83
	NSBezierPath* clipPath = [NSBezierPath bezierPath];
7160e833c4ac Implemented shaped windows for Cocoa. Still need to see if they actually work.
egottlieb
parents: 4827
diff changeset
    84
	
7160e833c4ac Implemented shaped windows for Cocoa. Still need to see if they actually work.
egottlieb
parents: 4827
diff changeset
    85
	SDL_PathConglomeration cong = {clipPath,shaper->window};
7160e833c4ac Implemented shaped windows for Cocoa. Still need to see if they actually work.
egottlieb
parents: 4827
diff changeset
    86
	
4830
3dfe779900f5 Compiling for cocoa now works. Does it run? We'll see.
egottlieb
parents: 4829
diff changeset
    87
	SDL_TraverseShapeTree(data->shape,(SDL_TraversalFunction)&ConglomerateShapeTree,(void*)&cong);
4829
7160e833c4ac Implemented shaped windows for Cocoa. Still need to see if they actually work.
egottlieb
parents: 4827
diff changeset
    88
	
7160e833c4ac Implemented shaped windows for Cocoa. Still need to see if they actually work.
egottlieb
parents: 4827
diff changeset
    89
	[clipPath addClip];
4811
d79939f20c45 Working on Cocoa implementation.
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4810
diff changeset
    90
}
d79939f20c45 Working on Cocoa implementation.
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4810
diff changeset
    91
d79939f20c45 Working on Cocoa implementation.
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4810
diff changeset
    92
int Cocoa_ResizeWindowShape(SDL_Window *window) {
d79939f20c45 Working on Cocoa implementation.
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4810
diff changeset
    93
	SDL_ShapeData* data = window->shaper->driverdata;
d79939f20c45 Working on Cocoa implementation.
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4810
diff changeset
    94
	assert(data != NULL);
4827
5660aac926e9 Got basic, pre-actually-writing-anything Cocoa to build.
egottlieb
parents: 4811
diff changeset
    95
	
5660aac926e9 Got basic, pre-actually-writing-anything Cocoa to build.
egottlieb
parents: 4811
diff changeset
    96
	if(data->shape != NULL)
5660aac926e9 Got basic, pre-actually-writing-anything Cocoa to build.
egottlieb
parents: 4811
diff changeset
    97
		SDL_FreeShapeTree(&data->shape);
5660aac926e9 Got basic, pre-actually-writing-anything Cocoa to build.
egottlieb
parents: 4811
diff changeset
    98
	
4811
d79939f20c45 Working on Cocoa implementation.
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4810
diff changeset
    99
	return 0;
d79939f20c45 Working on Cocoa implementation.
Eli Gottlieb <eligottlieb@gmail.com>
parents: 4810
diff changeset
   100
}