On Tue, Dec 29, 2009 at 9:20 AM, Andy Selvig <[email protected]> wrote: > Hi- > > First of all, this is a Mono.Cairo question and I've noticed there's a lot > of experience with it on this list, but if there's a better place to > discuss, please let me know. > > I've working on a project using Mono.Cairo. Most of my recent development > has been on Linux and everything is working well. However, I recently tried > to run the project on Windows and I keep getting access violations from > Cairo calls: > > "Attempted to read or write protected memory. This is often an indication > that other memory is corrupt." > > The part of the code this seems to be happening in is when I create a Cairo > image surface and render to it. It looks something like this: > > // remake the image surface, if needed > if (surface == null || surface.Width != IntWidth || > surface.Height != IntHeight) > { > imageData = new byte[IntWidth * IntHeight * 4]; > surface = new ImageSurface( ref imageData, Format.ARGB32, > IntWidth, IntHeight, 4 * IntWidth); > } > > // render the control to the surface > using (Context cr = new Context(surface)) > { > cr.Operator = Operator.Source; > cr.Color = new Cairo.Color(1, 1, 1, 0); > cr.Paint(); > > cr.Operator = Operator.Over; > cr.MoveTo(0,0); > RenderCairo(new RenderContext(cr, > DecoratorService.Get(viewport))); > > surface.Flush(); > }; > > This happens every render cycle and then the image data from the surface > gets copied to an OpenGL texture and rendered to the screen. So, there's no > direct Gtk# involved, but I run it inside a Gtk# app on Linux and a WPF app > on Windows (both using the Tao OpenGL bindings). > > The access violations seem to happen randomly, but generally within a couple > seconds of interacting with the app. It happens on either the cr.Paint() > call or one of the cr.Operator calls. > > One thing that I had to change to get it to compile on Windows is adding a > ref to the image data argument in the ImageSurface constructor. It compiles > and runs fine without it on Linux, but not on Windows. I'm not even sure how > this could be as I'm using the same version of Mono.Cairo (2.0.0). > > Anyway, I'm at a bit of a loss as to how to debug this issue. Obviously some > memory (the image data buffer?) is being moved or freed unintentionally and > then accessed later, but I just don't see why that would be, especially > since it works wonderfully on Linux. Any help would be appreciated.
The "ref" version of the ctor is obsolete: http://anonsvn.mono-project.com/viewvc/trunk/mcs/class/Mono.Cairo/Mono.Cairo/ImageSurface.cs Because the obsoleted version does nothing, that means that the ImageSurface's "surface" pointer is zero, so code that dereferences it will explode. -- Michael Hutchinson http://mjhutchinson.com _______________________________________________ Gtk-sharp-list maillist - [email protected] http://lists.ximian.com/mailman/listinfo/gtk-sharp-list
