Hi Ronie,

On Tue, Mar 14, 2017 at 5:08 PM, Ronie Salgado <ronies...@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.ber...@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

Reply via email to