Merge pull request #2311 from mlancione/master
[mono.git] / mcs / class / Mono.Cairo / Mono.Cairo / Surface.cs
index e1a54da477666e623122d052c92778874b90bcee..07e0d4d997547e0a66698faaa66fa5affa8f1356 100644 (file)
 // distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so, subject to
 // the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be
 // included in all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -38,94 +38,88 @@ using System.Collections;
 
 namespace Cairo {
 
-       public class Surface : IDisposable 
-        {                                              
+       public class Surface : IDisposable
+       {
+               [Obsolete]
                protected static Hashtable surfaces = new Hashtable ();
-                internal IntPtr surface = IntPtr.Zero;
 
+               IntPtr handle = IntPtr.Zero;
+
+               [Obsolete]
                protected Surface()
                {
                }
-               
-                protected Surface (IntPtr ptr, bool owns)
-                {
-                        surface = ptr;
-                       lock (surfaces.SyncRoot){
-                               surfaces [ptr] = this;
-                       }
-                       if (!owns)
-                               NativeMethods.cairo_surface_reference (ptr);
-                }
-
-               static internal Surface LookupExternalSurface (IntPtr p)
-               {
-                       lock (surfaces.SyncRoot){
-                               object o = surfaces [p];
-                               if (o == null){
-                                       return new Surface (p, false);
-                               }
-                               return (Surface) o;
-                       }
-               }               
 
-               static internal Surface LookupSurface (IntPtr surface)
+               [Obsolete]
+               protected Surface (IntPtr ptr) : this (ptr, true)
+               {
+               }
+
+               protected Surface (IntPtr handle, bool owner)
+               {
+                       this.handle = handle;
+                       if (!owner)
+                               NativeMethods.cairo_surface_reference (handle);
+                       if (CairoDebug.Enabled)
+                               CairoDebug.OnAllocated (handle);
+               }
+
+               public static Surface Lookup (IntPtr surface, bool owned)
                {
                        SurfaceType st = NativeMethods.cairo_surface_get_type (surface);
                        switch (st) {
                        case SurfaceType.Image:
-                               return new ImageSurface (surface, true);
+                               return new ImageSurface (surface, owned);
                        case SurfaceType.Xlib:
-                               return new XlibSurface (surface, true);
+                               return new XlibSurface (surface, owned);
                        case SurfaceType.Xcb:
-                               return new XcbSurface (surface, true);
+                               return new XcbSurface (surface, owned);
                        case SurfaceType.Glitz:
-                               return new GlitzSurface (surface, true);
+                               return new GlitzSurface (surface, owned);
                        case SurfaceType.Win32:
-                               return new Win32Surface (surface, true);
-
+                               return new Win32Surface (surface, owned);
                        case SurfaceType.Pdf:
-                               return new PdfSurface (surface, true);
+                               return new PdfSurface (surface, owned);
                        case SurfaceType.PS:
-                               return new PSSurface (surface, true);
+                               return new PSSurface (surface, owned);
                        case SurfaceType.DirectFB:
-                               return new DirectFBSurface (surface, true);
+                               return new DirectFBSurface (surface, owned);
                        case SurfaceType.Svg:
-                               return new SvgSurface (surface, true);
-
+                               return new SvgSurface (surface, owned);
                        default:
-                               return Surface.LookupExternalSurface (surface);
+                               return new Surface (surface, owned);
                        }
                }
-               
+
                [Obsolete ("Use an ImageSurface constructor instead.")]
-                public static Cairo.Surface CreateForImage (
-                        ref byte[] data, Cairo.Format format, int width, int height, int stride)
-                {
-                        IntPtr p = NativeMethods.cairo_image_surface_create_for_data (
-                                data, format, width, height, stride);
-                        
-                        return new Cairo.Surface (p, true);
-                }
+               public static Cairo.Surface CreateForImage (
+                       ref byte[] data, Cairo.Format format, int width, int height, int stride)
+               {
+                       IntPtr p = NativeMethods.cairo_image_surface_create_for_data (
+                               data, format, width, height, stride);
+
+                       return new Cairo.Surface (p, true);
+               }
 
                [Obsolete ("Use an ImageSurface constructor instead.")]
-                public static Cairo.Surface CreateForImage (
-                        Cairo.Format format, int width, int height)
-                {
-                        IntPtr p = NativeMethods.cairo_image_surface_create (
-                                format, width, height);
+               public static Cairo.Surface CreateForImage (
+                       Cairo.Format format, int width, int height)
+               {
+                       IntPtr p = NativeMethods.cairo_image_surface_create (
+                               format, width, height);
 
-                        return new Cairo.Surface (p, true);
-                }
+                       return new Cairo.Surface (p, true);
+               }
 
 
-                public Cairo.Surface CreateSimilar (
-                        Cairo.Content content, int width, int height)
-                {
-                        IntPtr p = NativeMethods.cairo_surface_create_similar (
-                                this.Handle, content, width, height);
+               public Cairo.Surface CreateSimilar (
+                       Cairo.Content content, int width, int height)
+               {
+                       IntPtr p = NativeMethods.cairo_surface_create_similar (
+                               this.Handle, content, width, height);
 
-                        return new Cairo.Surface (p, true);
-                }
+                       return new Cairo.Surface (p, true);
+               }
 
                ~Surface ()
                {
@@ -133,13 +127,13 @@ namespace Cairo {
                }
 
                //[Obsolete ("Use Context.SetSource() followed by Context.Paint()")]
-               public void Show (Context gr, double x, double y) 
+               public void Show (Context gr, double x, double y)
                {
-                       NativeMethods.cairo_set_source_surface (gr.Handle, surface, x, y);
+                       NativeMethods.cairo_set_source_surface (gr.Handle, handle, x, y);
                        NativeMethods.cairo_paint (gr.Handle);
                }
 
-               void IDisposable.Dispose ()
+               public void Dispose ()
                {
                        Dispose (true);
                        GC.SuppressFinalize (this);
@@ -147,91 +141,92 @@ namespace Cairo {
 
                protected virtual void Dispose (bool disposing)
                {
-                       if (surface == IntPtr.Zero)
+                       if (!disposing || CairoDebug.Enabled)
+                               CairoDebug.OnDisposed<Surface> (handle, disposing);
+
+                       if (!disposing|| handle == IntPtr.Zero)
                                return;
-                       
-                       lock (surfaces.SyncRoot)
-                               surfaces.Remove (surface);
 
-                       NativeMethods.cairo_surface_destroy (surface);
-                       surface = IntPtr.Zero;
+                       NativeMethods.cairo_surface_destroy (handle);
+                       handle = IntPtr.Zero;
                }
-               
+
                public Status Finish ()
                {
-                       NativeMethods.cairo_surface_finish (surface);
+                       NativeMethods.cairo_surface_finish (handle);
                        return Status;
                }
-               
+
                public void Flush ()
                {
-                       NativeMethods.cairo_surface_flush (surface);
+                       NativeMethods.cairo_surface_flush (handle);
                }
-               
+
                public void MarkDirty ()
                {
                        NativeMethods.cairo_surface_mark_dirty (Handle);
                }
-               
+
                public void MarkDirty (Rectangle rectangle)
                {
                        NativeMethods.cairo_surface_mark_dirty_rectangle (Handle, (int)rectangle.X, (int)rectangle.Y, (int)rectangle.Width, (int)rectangle.Height);
                }
-               
-                public IntPtr Handle {
-                        get {
-                               return surface;
+
+               public IntPtr Handle {
+                       get {
+                               return handle;
                        }
-                }
+               }
 
                public PointD DeviceOffset {
                        get {
                                double x, y;
-                               NativeMethods.cairo_surface_get_device_offset (surface, out x, out y);
+                               NativeMethods.cairo_surface_get_device_offset (handle, out x, out y);
                                return new PointD (x, y);
                        }
 
                        set {
-                               NativeMethods.cairo_surface_set_device_offset (surface, value.X, value.Y);
+                               NativeMethods.cairo_surface_set_device_offset (handle, value.X, value.Y);
                        }
                }
-               
+
+               [Obsolete ("Use Dispose()")]
                public void Destroy()
                {
-                       Dispose (true);
+                       Dispose ();
                }
 
                public void SetFallbackResolution (double x, double y)
                {
-                       NativeMethods.cairo_surface_set_fallback_resolution (surface, x, y);
+                       NativeMethods.cairo_surface_set_fallback_resolution (handle, x, y);
                }
 
                public void WriteToPng (string filename)
                {
-                       NativeMethods.cairo_surface_write_to_png (surface, filename);
+                       NativeMethods.cairo_surface_write_to_png (handle, filename);
                }
-               
+
                [Obsolete ("Use Handle instead.")]
-                public IntPtr Pointer {
-                        get {
-                               return surface;
+               public IntPtr Pointer {
+                       get {
+                               return handle;
                        }
-                }
-               
+               }
+
                public Status Status {
-                       get { return NativeMethods.cairo_surface_status (surface); }
+                       get { return NativeMethods.cairo_surface_status (handle); }
                }
 
                public Content Content {
-                       get { return NativeMethods.cairo_surface_get_content (surface); }
+                       get { return NativeMethods.cairo_surface_get_content (handle); }
                }
 
                public SurfaceType SurfaceType {
-                       get { return NativeMethods.cairo_surface_get_type (surface); }
+                       get { return NativeMethods.cairo_surface_get_type (handle); }
                }
 
                public uint ReferenceCount {
-                       get { return NativeMethods.cairo_surface_get_reference_count (surface); }
+                       get { return NativeMethods.cairo_surface_get_reference_count (handle); }
                }
-        }
+       }
 }