+2008-01-23 Geoff Norton <gnorton@novell.com>
+
+ * carbonFunctions.cs: If we get a -ve size from carbon, swizzle to
+ 0 to prevent a OOM from cairo malloc. Remove support for
+ GetCGContextForNSView as its deprecated and doesn't work.
+ * gdipFunctions.cs: Refactor the environment variable support out
+ and make the Carbon driver the default on a Mac. Fix RunningOnUnix
+ to report true on the mac.
+ * Graphics.cs: Drop support for CocoaDrawable.
+
2008-01-21 Geoff Norton <gnorton@novell.com>
* Graphics.cs: Support Graphics.FromHwnd (IntPtr.Zero) on X11
if (GDIPlus.UseX11Drawable) {
CopyFromScreenX11 (sourceX, sourceY, destinationX, destinationY, blockRegionSize, copyPixelOperation);
- } else if (GDIPlus.UseCocoaDrawable || GDIPlus.UseQuartzDrawable) {
+ } else if (GDIPlus.UseCarbonDrawable) {
CopyFromScreenMac (sourceX, sourceY, destinationX, destinationY, blockRegionSize, copyPixelOperation);
} else {
CopyFromScreenWin32 (sourceX, sourceY, destinationX, destinationY, blockRegionSize, copyPixelOperation);
{
Status status;
if (! disposed) {
- if ((GDIPlus.UseQuartzDrawable || GDIPlus.UseCocoaDrawable) && context.ctx != IntPtr.Zero) {
+ if (GDIPlus.UseCarbonDrawable && context.ctx != IntPtr.Zero) {
Flush ();
Carbon.CGContextSynchronize (context.ctx);
Carbon.ReleaseContext (context.port, context.ctx);
Status status = GDIPlus.GdipFlush (nativeObject, intention);
GDIPlus.CheckStatus (status);
- if ((GDIPlus.UseQuartzDrawable || GDIPlus.UseCocoaDrawable) && context.ctx != IntPtr.Zero)
+ if (GDIPlus.UseCarbonDrawable && context.ctx != IntPtr.Zero)
Carbon.CGContextSynchronize (context.ctx);
}
{
IntPtr graphics;
- if (GDIPlus.UseCocoaDrawable) {
- throw new NotImplementedException ();
-/* TODO: Fix this code to handle the new libgdiplus
- CarbonContext context = Carbon.GetCGContextForNSView (hwnd);
- GDIPlus.GdipCreateFromQuartz_macosx (context.ctx, context.width, context.height, out graphics);
-
- Graphics g = new Graphics (graphics);
- g.context = context;
-
- return g;
-*/
- }
- if (GDIPlus.UseQuartzDrawable) {
+ if (GDIPlus.UseCarbonDrawable) {
CarbonContext context = Carbon.GetCGContextForView (hwnd);
- GDIPlus.GdipCreateFromQuartz_macosx (context.ctx, context.width, context.height, out graphics);
+ GDIPlus.GdipCreateFromContext_macosx (context.ctx, context.width, context.height, out graphics);
Graphics g = new Graphics (graphics);
g.context = context;
}
}
- internal static CarbonContext GetCGContextForNSView (IntPtr handle) {
- IntPtr context = IntPtr.Zero;
- Rect view_bounds = new Rect ();
-
- context = objc_msgSend (objc_msgSend (objc_getClass ("NSGraphicsContext"), sel_registerName ("currentContext")), sel_registerName ("graphicsPort"));
- objc_msgSend_stret (ref view_bounds, handle, sel_registerName ("bounds"));
- return new CarbonContext (IntPtr.Zero, context, (int)view_bounds.size.width, (int)view_bounds.size.height);
- }
-
internal static CarbonContext GetCGContextForView (IntPtr handle) {
IntPtr context = IntPtr.Zero;
IntPtr port = IntPtr.Zero;
HIViewGetBounds (handle, ref view_bounds);
HIViewConvertRect (ref view_bounds, handle, IntPtr.Zero);
+
+ if (view_bounds.size.height < 0) view_bounds.size.height = 0;
+ if (view_bounds.size.width < 0) view_bounds.size.width = 0;
CGContextTranslateCTM (context, view_bounds.origin.x, (window_bounds.bottom - window_bounds.top) - (view_bounds.origin.y + view_bounds.size.height));
public const int FACESIZE = 32;
public const int LANG_NEUTRAL = 0;
public static IntPtr Display = IntPtr.Zero;
- public static bool UseX11Drawable;
- public static bool UseQuartzDrawable = (Environment.GetEnvironmentVariable ("MONO_MWF_USE_CARBON_BACKEND") != null);
- public static bool UseCocoaDrawable = (Environment.GetEnvironmentVariable ("MONO_GDIP_USE_COCOA_BACKEND") != null);
+ public static bool UseX11Drawable = false;
+ public static bool UseCarbonDrawable = false;
#region gdiplus.dll functions
static GDIPlus ()
{
- // check for Unix platforms - see FAQ for more details
- // http://www.mono-project.com/FAQ:_Technical#How_to_detect_the_execution_platform_.3F
int platform = (int) Environment.OSVersion.Platform;
- UseX11Drawable = ((platform == 4) || (platform == 128));
+ if ((platform == 4) || (platform == 128)) {
+ if (Environment.GetEnvironmentVariable ("not_supported_MONO_MWF_USE_NEW_X11_BACKEND") != null || Environment.GetEnvironmentVariable ("MONO_MWF_MAC_FORCE_X11") != null) {
+ UseX11Drawable = true;
+ } else {
+ IntPtr buf = Marshal.AllocHGlobal (8192);
+ // This is kind of a hack but gets us sysname from uname (struct utsname *name) on
+ // linux and darwin
+ if (uname (buf) != 0) {
+ // WTH: We couldn't detect the OS; lets default to X11
+ UseX11Drawable = true;
+ } else {
+ string os = Marshal.PtrToStringAnsi (buf);
+ if (os == "Darwin")
+ UseCarbonDrawable = true;
+ else
+ UseX11Drawable = true;
+ }
+ Marshal.FreeHGlobal (buf);
+ }
+ }
GdiplusStartupInput input = GdiplusStartupInput.MakeGdiplusStartupInput();
GdiplusStartupOutput output = GdiplusStartupOutput.MakeGdiplusStartupOutput();
static public bool RunningOnWindows ()
{
- return !UseX11Drawable;
+ return !UseX11Drawable && !UseCarbonDrawable;
}
static public bool RunningOnUnix ()
{
- return UseX11Drawable;
+ return UseX11Drawable || UseCarbonDrawable;
}
// Copies a Ptr to an array of Points and releases the memory
/* Mac only function calls */
[DllImport("gdiplus.dll")]
- internal static extern Status GdipCreateFromQuartz_macosx (IntPtr cgref, int width, int height, out IntPtr graphics);
+ internal static extern Status GdipCreateFromContext_macosx (IntPtr cgref, int width, int height, out IntPtr graphics);
/* Linux only function calls*/
[DllImport("gdiplus.dll")]
StreamGetBytesDelegate getBytes, StreamPutBytesDelegate putBytes, StreamSeekDelegate doSeek,
StreamCloseDelegate close, StreamSizeDelegate size, IntPtr hdc, EmfType type, ref Rectangle frameRect,
MetafileFrameUnit frameUnit, [MarshalAs (UnmanagedType.LPWStr)] string description, out IntPtr metafile);
+
+ [DllImport ("libc")]
+ static extern int uname (IntPtr buf);
#endregion
}
}