Ejemplo n.º 1
0
        internal static CarbonContext GetCGContextForView(IntPtr handle)
        {
            IntPtr context = IntPtr.Zero;
            IntPtr port    = IntPtr.Zero;
            IntPtr window  = IntPtr.Zero;

            window = GetControlOwner(handle);

            if (handle == IntPtr.Zero || window == IntPtr.Zero)
            {
                // FIXME: Can we actually get a CGContextRef for the desktop?  this makes context IntPtr.Zero
                port = GetQDGlobalsThePort();
                CreateCGContextForPort(port, ref context);

                Rect desktop_bounds = CGDisplayBounds(CGMainDisplayID());

                return(new CarbonContext(port, context, (int)desktop_bounds.size.width, (int)desktop_bounds.size.height));
            }

            QDRect window_bounds = default(QDRect);
            Rect   view_bounds   = default(Rect);

            port = GetWindowPort(window);

            context = GetContext(port);

            GetWindowBounds(window, 32, ref window_bounds);

            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));

            // Create the original rect path and clip to it
            Rect rc_clip = new Rect(0, 0, view_bounds.size.width, view_bounds.size.height);

            CGContextSaveGState(context);

            CGContextBeginPath(context);
            CGContextAddRect(context, rc_clip);
            CGContextClosePath(context);
            CGContextClip(context);

            return(new CarbonContext(port, context, (int)view_bounds.size.width, (int)view_bounds.size.height));
        }
Ejemplo n.º 2
0
		internal static CarbonContext GetCGContextForView (IntPtr handle) {
			IntPtr context = IntPtr.Zero;
			IntPtr port = IntPtr.Zero;
			IntPtr window = IntPtr.Zero;

			window = GetControlOwner (handle);

			if (handle == IntPtr.Zero || window == IntPtr.Zero) {
				// FIXME: Can we actually get a CGContextRef for the desktop?  this makes context IntPtr.Zero
				port = GetQDGlobalsThePort ();
				CreateCGContextForPort (port, ref context);

				Rect desktop_bounds = CGDisplayBounds (CGMainDisplayID ());

				return new CarbonContext (port, context, (int)desktop_bounds.size.width, (int)desktop_bounds.size.height);
			}

			QDRect window_bounds = new QDRect ();
			Rect view_bounds = new Rect ();

			port = GetWindowPort (window);
			
			context = GetContext (port);

			GetWindowBounds (window, 32, ref window_bounds);

			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));

			// Create the original rect path and clip to it
			Rect rc_clip = new Rect (0, 0, view_bounds.size.width, view_bounds.size.height);

			CGContextSaveGState (context);

			Rectangle [] clip_rectangles = (Rectangle []) hwnd_delegate.DynamicInvoke (new object [] {handle});
			if (clip_rectangles != null && clip_rectangles.Length > 0) {
				int length = clip_rectangles.Length;
				
				CGContextBeginPath (context);
				CGContextAddRect (context, rc_clip);

				for (int i = 0; i < length; i++) {
					CGContextAddRect (context, new Rect (clip_rectangles [i].X, view_bounds.size.height - clip_rectangles [i].Y - clip_rectangles [i].Height, clip_rectangles [i].Width, clip_rectangles [i].Height));
				}
				CGContextClosePath (context);
				CGContextEOClip (context);
#if DEBUG_CLIPPING
				if (clip_rectangles.Length >= debug_threshold) {
					CGContextSetRGBFillColor (context, red, green, blue, 0.5f);
					CGContextFillRect (context, rc_clip);
					CGContextFlush (context);
					System.Threading.Thread.Sleep (500);
					if (red == 1.0f) { red = 0.0f; blue = 1.0f; } 
					else if (blue == 1.0f) { blue = 0.0f; green = 1.0f; } 
					else if (green == 1.0f) { green = 0.0f; red = 1.0f; } 
				}
#endif
			} else {
				CGContextBeginPath (context);
				CGContextAddRect (context, rc_clip);
				CGContextClosePath (context);
				CGContextClip (context);
			}

			return new CarbonContext (port, context, (int)view_bounds.size.width, (int)view_bounds.size.height);
		}
Ejemplo n.º 3
0
		internal static extern int GetWindowBounds (IntPtr wHnd, uint reg, ref QDRect rect);
Ejemplo n.º 4
0
 internal static extern int GetWindowBounds(IntPtr wHnd, uint reg, ref QDRect rect);
Ejemplo n.º 5
0
 internal static partial int GetWindowBounds(IntPtr wHnd, uint reg, ref QDRect rect);
        internal static CarbonContext GetCGContextForView(IntPtr handle)
        {
            IntPtr context = IntPtr.Zero;
            IntPtr port    = IntPtr.Zero;
            IntPtr window  = IntPtr.Zero;

            window = GetControlOwner(handle);

            if (handle == IntPtr.Zero || window == IntPtr.Zero)
            {
                // FIXME: Can we actually get a CGContextRef for the desktop?  this makes context IntPtr.Zero
                port = GetQDGlobalsThePort();
                CreateCGContextForPort(port, ref context);

                Rect desktop_bounds = CGDisplayBounds(CGMainDisplayID());

                return(new CarbonContext(port, context, (int)desktop_bounds.size.width, (int)desktop_bounds.size.height));
            }

            QDRect window_bounds = default(QDRect);
            Rect   view_bounds   = default(Rect);

            port = GetWindowPort(window);

            context = GetContext(port);

            GetWindowBounds(window, 32, ref window_bounds);

            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));

            // Create the original rect path and clip to it
            Rect rc_clip = new Rect(0, 0, view_bounds.size.width, view_bounds.size.height);

            CGContextSaveGState(context);

            Rectangle[]? clip_rectangles = (Rectangle[]?)hwnd_delegate !.DynamicInvoke(new object[] { handle });
            if (clip_rectangles != null && clip_rectangles.Length > 0)
            {
                int length = clip_rectangles.Length;

                CGContextBeginPath(context);
                CGContextAddRect(context, rc_clip);

                for (int i = 0; i < length; i++)
                {
                    CGContextAddRect(context, new Rect(clip_rectangles[i].X, view_bounds.size.height - clip_rectangles[i].Y - clip_rectangles[i].Height, clip_rectangles[i].Width, clip_rectangles[i].Height));
                }
                CGContextClosePath(context);
                CGContextEOClip(context);
#if DEBUG_CLIPPING
                if (clip_rectangles.Length >= debug_threshold)
                {
                    CGContextSetRGBFillColor(context, red, green, blue, 0.5f);
                    CGContextFillRect(context, rc_clip);
                    CGContextFlush(context);
                    System.Threading.Thread.Sleep(500);
                    if (red == 1.0f)
                    {
                        red = 0.0f; blue = 1.0f;
                    }
                    else if (blue == 1.0f)
                    {
                        blue = 0.0f; green = 1.0f;
                    }
                    else if (green == 1.0f)
                    {
                        green = 0.0f; red = 1.0f;
                    }
                }
#endif
            }
            else
            {
                CGContextBeginPath(context);
                CGContextAddRect(context, rc_clip);
                CGContextClosePath(context);
                CGContextClip(context);
            }

            return(new CarbonContext(port, context, (int)view_bounds.size.width, (int)view_bounds.size.height));
        }