2 // Mono.Cairo.Surface.cs
9 // (C) Ximian Inc, 2003.
10 // (C) Novell, Inc. 2003.
12 // This is an OO wrapper API for the Cairo API
14 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
16 // Permission is hereby granted, free of charge, to any person obtaining
17 // a copy of this software and associated documentation files (the
18 // "Software"), to deal in the Software without restriction, including
19 // without limitation the rights to use, copy, modify, merge, publish,
20 // distribute, sublicense, and/or sell copies of the Software, and to
21 // permit persons to whom the Software is furnished to do so, subject to
22 // the following conditions:
24 // The above copyright notice and this permission notice shall be
25 // included in all copies or substantial portions of the Software.
27 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
28 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
29 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
30 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
31 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
32 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
33 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
37 using System.Collections;
41 public class Surface : IDisposable
43 protected static Hashtable surfaces = new Hashtable ();
44 internal IntPtr surface = IntPtr.Zero;
50 protected Surface (IntPtr ptr, bool owns)
53 lock (surfaces.SyncRoot){
54 surfaces [ptr] = this;
57 NativeMethods.cairo_surface_reference (ptr);
60 static internal Surface LookupExternalSurface (IntPtr p)
62 lock (surfaces.SyncRoot){
63 object o = surfaces [p];
65 return new Surface (p, false);
71 static internal Surface LookupSurface (IntPtr surface)
73 SurfaceType st = NativeMethods.cairo_surface_get_type (surface);
75 case SurfaceType.Image:
76 return new ImageSurface (surface, true);
77 case SurfaceType.Xlib:
78 return new XlibSurface (surface, true);
80 return new XcbSurface (surface, true);
81 case SurfaceType.Glitz:
82 return new GlitzSurface (surface, true);
83 case SurfaceType.Win32:
84 return new Win32Surface (surface, true);
87 return new PdfSurface (surface, true);
89 return new PSSurface (surface, true);
90 case SurfaceType.DirectFB:
91 return new DirectFBSurface (surface, true);
93 return new SvgSurface (surface, true);
96 return Surface.LookupExternalSurface (surface);
100 [Obsolete ("Use an ImageSurface constructor instead.")]
101 public static Cairo.Surface CreateForImage (
102 ref byte[] data, Cairo.Format format, int width, int height, int stride)
104 IntPtr p = NativeMethods.cairo_image_surface_create_for_data (
105 data, format, width, height, stride);
107 return new Cairo.Surface (p, true);
110 [Obsolete ("Use an ImageSurface constructor instead.")]
111 public static Cairo.Surface CreateForImage (
112 Cairo.Format format, int width, int height)
114 IntPtr p = NativeMethods.cairo_image_surface_create (
115 format, width, height);
117 return new Cairo.Surface (p, true);
121 public Cairo.Surface CreateSimilar (
122 Cairo.Content content, int width, int height)
124 IntPtr p = NativeMethods.cairo_surface_create_similar (
125 this.Handle, content, width, height);
127 return new Cairo.Surface (p, true);
135 //[Obsolete ("Use Context.SetSource() followed by Context.Paint()")]
136 public void Show (Context gr, double x, double y)
138 NativeMethods.cairo_set_source_surface (gr.Handle, surface, x, y);
139 NativeMethods.cairo_paint (gr.Handle);
142 public void Dispose ()
145 GC.SuppressFinalize (this);
148 protected virtual void Dispose (bool disposing)
150 if (surface == IntPtr.Zero)
153 lock (surfaces.SyncRoot)
154 surfaces.Remove (surface);
156 NativeMethods.cairo_surface_destroy (surface);
157 surface = IntPtr.Zero;
160 public Status Finish ()
162 NativeMethods.cairo_surface_finish (surface);
168 NativeMethods.cairo_surface_flush (surface);
171 public void MarkDirty ()
173 NativeMethods.cairo_surface_mark_dirty (Handle);
176 public void MarkDirty (Rectangle rectangle)
178 NativeMethods.cairo_surface_mark_dirty_rectangle (Handle, (int)rectangle.X, (int)rectangle.Y, (int)rectangle.Width, (int)rectangle.Height);
181 public IntPtr Handle {
187 public PointD DeviceOffset {
190 NativeMethods.cairo_surface_get_device_offset (surface, out x, out y);
191 return new PointD (x, y);
195 NativeMethods.cairo_surface_set_device_offset (surface, value.X, value.Y);
199 public void Destroy()
204 public void SetFallbackResolution (double x, double y)
206 NativeMethods.cairo_surface_set_fallback_resolution (surface, x, y);
209 public void WriteToPng (string filename)
211 NativeMethods.cairo_surface_write_to_png (surface, filename);
214 [Obsolete ("Use Handle instead.")]
215 public IntPtr Pointer {
221 public Status Status {
222 get { return NativeMethods.cairo_surface_status (surface); }
225 public Content Content {
226 get { return NativeMethods.cairo_surface_get_content (surface); }
229 public SurfaceType SurfaceType {
230 get { return NativeMethods.cairo_surface_get_type (surface); }
233 public uint ReferenceCount {
234 get { return NativeMethods.cairo_surface_get_reference_count (surface); }