code cleanup: BKE_ naming, also make bpy.data.images.load() always load a new image...
[blender.git] / source / blender / windowmanager / intern / wm_apple.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version. 
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2007 Blender Foundation.
19  * All rights reserved.
20  *
21  * 
22  * Contributor(s): Blender Foundation
23  *
24  * ***** END GPL LICENSE BLOCK *****
25  */
26
27 /** \file blender/windowmanager/intern/wm_apple.c
28  *  \ingroup wm
29  */
30
31 /* note, this file builds on apple-carbon only! */
32
33 #include "BKE_context.h"
34 #include "BKE_global.h"
35 #include "WM_api.h"
36
37 #include <OpenGL/OpenGL.h>
38 #define __CARBONSOUND__
39 /* XXX BIG WARNING: carbon.h can not be included in blender code, it conflicts with struct ID */
40 #define ID ID_
41 #include <Carbon/Carbon.h>
42
43 /* To avoid killing small end comps, we want to allow
44  * blender to start maximised if all the followings are true :
45  * - Renderer is OpenGL capable
46  * - Hardware acceleration
47  * - VRAM > 16 Mo
48  *
49  * We will bail out if VRAM is less than 8Mo
50  */
51
52 /* bad global, used in wm_window.c to open windows */
53 int macPrefState = 0;
54
55 static int checkAppleVideoCard(void) 
56 {
57         CGLRendererInfoObj rend;
58         long theErr;
59         unsigned long display_mask;
60         long nrend;
61         int j;
62         long value;
63         long maxvram = 0;   /* we get always more than 1 renderer, check one, at least, has 8 Mo */
64         
65         display_mask = CGDisplayIDToOpenGLDisplayMask(CGMainDisplayID() );
66         
67         theErr = CGLQueryRendererInfo(display_mask, &rend, &nrend);
68         if (theErr == 0) {
69                 theErr = CGLDescribeRenderer(rend, 0, kCGLRPRendererCount, &nrend);
70                 if (theErr == 0) {
71                         for (j = 0; j < nrend; j++) {
72                                 theErr = CGLDescribeRenderer(rend, j, kCGLRPVideoMemory, &value);
73                                 if (value > maxvram)
74                                         maxvram = value;
75                                 if ((theErr == 0) && (value >= 20000000)) {
76                                         theErr = CGLDescribeRenderer(rend, j, kCGLRPAccelerated, &value);
77                                         if ((theErr == 0) && (value != 0)) {
78                                                 theErr = CGLDescribeRenderer(rend, j, kCGLRPCompliant, &value);
79                                                 if ((theErr == 0) && (value != 0)) {
80                                                         /*fprintf(stderr,"make it big\n");*/
81                                                         CGLDestroyRendererInfo(rend);
82                                                         macPrefState = 8;
83                                                         return 1;
84                                                 }
85                                         }
86                                 }
87                         }
88                 }
89         }
90         if (maxvram < 7500000) {        /* put a standard alert and quit*/
91                 SInt16 junkHit;
92                 char inError[] = "* Not enough VRAM    ";
93                 char inText[] = "* blender needs at least 8Mb    ";
94                 inError[0] = 16;
95                 inText[0] = 28;
96                 
97                 fprintf(stderr, " vram is %li . not enough, aborting\n", maxvram);
98                 StandardAlert(kAlertStopAlert, (ConstStr255Param) & inError, (ConstStr255Param) & inText, NULL, &junkHit);
99                 abort();
100         }
101         CGLDestroyRendererInfo(rend);
102         return 0;
103 }
104
105 static void getMacAvailableBounds(short *top, short *left, short *bottom, short *right) 
106 {
107         Rect outAvailableRect;
108         
109         GetAvailableWindowPositioningBounds(GetMainDevice(), &outAvailableRect);
110         
111         *top = outAvailableRect.top;  
112         *left = outAvailableRect.left;
113         *bottom = outAvailableRect.bottom; 
114         *right = outAvailableRect.right;
115 }
116
117
118 void wm_set_apple_prefsize(int scr_x, int scr_y)
119 {
120         
121         /* first let us check if we are hardware accelerated and with VRAM > 16 Mo */
122         
123         if (checkAppleVideoCard()) {
124                 short top, left, bottom, right;
125                 
126                 getMacAvailableBounds(&top, &left, &bottom, &right);
127                 WM_setprefsize(left + 10, scr_y - bottom + 10, right - left - 20, bottom - 64);
128                 G.windowstate = 0;
129                 
130         }
131         else {
132                 
133                 /* 40 + 684 + (headers) 22 + 22 = 768, the powerbook screen height */
134                 WM_setprefsize(120, 40, 850, 684);
135                 G.windowstate = 0;
136         }
137 }