+ super.init();
+ jaguar = isJaguar();
+ try {
+ openGL = new CarbonOpenGL();
+ openGL.init();
+ } catch(OpenGL.NotSupportedException e) {
+ Log.log(this,"WARNING: OpenGL support not available: " + e);
+ // FIXME: We need to fallback to Quartz2D
+ throw new Error("No OpenGL support");
+ }
+ natInit();
+ }
+
+ private final class CarbonOpenGL extends OpenGL {
+ public RawData rawPixelFormat;
+ public RawData rawSharedContext;
+ public int maxAglSurfaceTexSize;
+ public int maxSurfaceWidth;
+ public int maxSurfaceHeight;
+
+ private native boolean initPixelFormat();
+ private native void initSharedContext();
+
+ public CarbonOpenGL() throws NotSupportedException {
+ if(!jaguar)
+ throw new NotSupportedException("OpenGL requires Mac OS X 10.2 or greater");
+ if(!initPixelFormat())
+ throw new NotSupportedException("Couldn't get an acceptable pixel format");
+ initSharedContext();
+ }
+
+ public void init() throws NotSupportedException {
+ super.init();
+ maxAglSurfaceTexSize = rectangularTextures ? maxRectTexSize : maxTexSize;
+ if(renderer.startsWith("ATI Radeon 7500")) {
+ maxAglSurfaceTexSize = Math.min(rectangularTextures ? 1600 : 1024,maxAglSurfaceTexSize);
+ Log.log(this,"Working around Radeon 7500 bug: maxAglSurfaceTexSize: " + maxAglSurfaceTexSize);
+ }
+ maxSurfaceWidth = maxSurfaceHeight = maxAglSurfaceTexSize;
+ }
+ protected native void activateSharedContext();
+ }
+
+ static abstract class CarbonSurface extends Surface {
+ RawData rawWindowRef;
+ RawData rawEventHandlerUPP;
+ int modifiers;
+
+ private native void natSetInvisible(boolean i);
+ public void setInvisible(final boolean i) { CarbonMessage.add(new CarbonMessage() { public void perform() { natSetInvisible(i); } }); }
+ private native void nat_setMaximized(boolean b);
+ public void _setMaximized(final boolean b) { CarbonMessage.add(new CarbonMessage() { public void perform() { nat_setMaximized(b); } }); }
+ private native void nat_setMinimized(boolean b);
+ public void _setMinimized(final boolean b) { CarbonMessage.add(new CarbonMessage() { public void perform() { nat_setMinimized(b); } }); }
+ private native void natSetIcon(Picture p);
+ public void setIcon(final Picture p) { CarbonMessage.add(new CarbonMessage() { public void perform() { natSetIcon(p); } }); }
+ private native void natSetTitleBarText(String s);
+ public void setTitleBarText(final String s) { CarbonMessage.add(new CarbonMessage() { public void perform() { natSetTitleBarText(s); } }); }
+ private native void natSetSize(int w, int h);
+ public void setSize(final int w, final int h) { CarbonMessage.add(new CarbonMessage() { public void perform() { natSetSize(w,h); } }); }
+ private native void natSetLocation(int x, int y);
+ public void setLocation(final int x, final int y) { CarbonMessage.add(new CarbonMessage() { public void perform() { natSetLocation(x,y); } }); }
+ private native void natToFront();
+ public void toFront() { CarbonMessage.add(new CarbonMessage() { public void perform() { natToFront(); } }); }
+ private native void natToBack();
+ public void toBack() { CarbonMessage.add(new CarbonMessage() { public void perform() { natToBack(); } }); }
+ private native void natSetLimits(int minWidth, int minHeight, int maxWidth, int maxHeight);
+ public void setLimits(final int mnw, final int mnh, final int mxw, final int mxh) {
+ if(Carbon.singleton.jaguar)
+ CarbonMessage.add(new CarbonMessage() { public void perform() { natSetLimits(mnw,mnh,mxw,mxh); } });
+ }
+ private native void natSyncCursor(int n);
+ public void syncCursor() {
+ int n;
+ if(cursor.equals("default")) n = 0;
+ else if(cursor.equals("wait")) n = 1;
+ else if(cursor.equals("crosshair")) n = 2;
+ else if(cursor.equals("text")) n = 3;
+ else if(cursor.equals("hand")) n = 4;
+ else if(cursor.equals("move")) n = 5;
+ else if(cursor.equals("east") || cursor.equals("west")) n = 6;
+ else n = 0;
+ final int n_ = n;
+ CarbonMessage.add(new CarbonMessage() { public void perform() { natSyncCursor(n_); } });
+ }