Hi,
How about changing AthensCairoSurface >> asForm into the following definition?:
asForm
������ "create a form and copy an image data there"
������ | form |
������ self checkSession.
������
������ self flush.
������ form := Form extent: (self width@self height) depth: 32.
������ form unhibernate.
������ LibC memCopy: self getDataPtr to: form bits size: self width*self height*4.
������ ^ form
This involves a whole copy, but it removes completely the dependency on the surface plugin.
If we want to keep using the surface plugin with Cairo, the old definition of asForm still has a bug, which can be reproduced with the following snippet:
Smalltalk compiler evaluate: '
| surface |
surface := AthensCairoSurface extent: 640@480.
surface drawDuring: [ :canvas |
������ surface clear: Color blue.
].
surface asForm asMorph openInWindow
'
The problem with asForm, is that the form returned can be used after the cairo surface which holds the pixels is garbage collected. The solution to that problem, is the following (attached):
asForm
������ "create a form and copy an image data there"
������ self checkSession.
������
������ self flush.
������ ^ (AthensCairoSurfaceForm extent: (self width@self height) depth: 32 bits: id)
������ ������ surface: self;
������ ������ yourself
Where AthensCairoSurfaceForm(attached) is just a subclass of Form, that holds a reference to the surface object that manages the lifetime of the pixels referenced by the bits in the form. By having an extra reference to the surface, we can prevent the finalization of it, until is not being referenced by a form that uses its storage.