Hi Ronie,

On Tue, Mar 14, 2017 at 5:08 PM, Ronie Salgado <roniesalg@gmail.com> wrote:
Hi Alex,

I gave the following script:

Smalltalk compiler evaluate: '
| surface |
surface := AthensCairoSurface extent: 640@480.
surface drawDuring: [ :canvas |
������ surface clear: Color blue.
].

surface asForm asMorph openInWindow
'

Notice that I am wrapping the script in a string that I am passing to the compiler, so that the workspace cannot retain any reference to the surface.

Can you experiment with VMs at or later than VMMaker.oscog-eem.2156?�� I added a solution to the BitBlt primitives to detect GC occurring in a BitBlt primitive and for the Cairo surface callbacks returning errors.�� This is orthogonal to the GC issue you raise, but both issues need solutions.�� Hopefully we have them now.�� Another thing to note is that in my latest commit of the entire tree I modified the surface plugin to allow defaulting some of the functions (those for ioGetSurfaceFormat, isUnlockSurface & ioShowSurface), this means that one can default the null callbacks created in createShowSurfaceFn & createUnlockSurfaceFn to answer 0 (provided you change the installation code suitably to not send thunk when the argument is 0, not a Callback).�� This should speed up small Athens blits noticeably.


Best regards,
Ronie

2017-03-14 16:12 GMT-03:00 Alexandre Bergel <alexandre.bergel@me.com>:
Hi Ronie,

Below you said:
The problem with asForm, is that the form returned can be used after the cairo surface which holds the pixels is garbage collected.

I cannot reproduce this case. You gave a script:

surface := AthensCairoSurface extent: 640@480.
surface drawDuring: [ :canvas |
������ surface clear: Color blue.
].

surface asForm asMorph openInWindow

I see a blue window.

Cheers,
Alexandre


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.





--
_,,,^..^,,,_
best,��Eliot