How to get dimensions (extent) of a SpPresenter

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
17 messages Options
kmo
Reply | Threaded
Open this post in threaded view
|

How to get dimensions (extent) of a SpPresenter

kmo
I'm porting a little Morphic geometry program from Morphic to a Spec 2
application using GTK.

I need to draw a shape in an SpAthensPresenter but to draw it I need to know
the current dimensions (extent) of the presenter so it can still work OK
even when the  window is resized.

The old Morphic version also used An Athens canvas but I had no problem then
as a morph has an extent method that provides this information. But now that
I can't use a morph I find that the extent method of an SpPresenter always
seems to answer nil.

Is that right? How d you get the current size of a presenter? Is it a bug?

I'm using a very recent Pharo 9 image and headless VM on Linux.

Image
-----
/home/kmp/Pharo/images/gtkRoses/gtkRoses.image
Pharo9.0.0
Build information:
Pharo-9.0.0+build.1399.sha.9ae8329dedfbad7915b7b2cdc4accc7ce8109ce0 (64 Bit)
Unnamed

Virtual Machine
---------------
/home/kmp/Pharo/vms/90-x64-headless/lib/pharo
CoInterpreter VMMaker-tonel.1 uuid: 286e9806-8e7d-0d00-ab06-4e280faf8631 Apr
30 2021
StackToRegisterMappingCogit VMMaker-tonel.1 uuid:
286e9806-8e7d-0d00-ab06-4e280faf8631 Apr 30 2021
5125110 - Commit: 5125110 - Date: 2021-04-30 10:05:04 +0200

Pharo 9.0.0 built on Apr 30 2021 10:22:47 Compiler: 5.4.0 20160609
VMMaker versionString 5125110 - Commit: 5125110 - Date: 2021-04-30 10:05:04
+0200
CoInterpreter VMMaker-tonel.1 uuid: 286e9806-8e7d-0d00-ab06-4e280faf8631 Apr
30 2021
StackToRegisterMappingCogit VMMaker-tonel.1 uuid:
286e9806-8e7d-0d00-ab06-4e280faf8631 Apr 30 2021


Any help woudl be appreciated.





--
Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html
Reply | Threaded
Open this post in threaded view
|

Re: How to get dimensions (extent) of a SpPresenter

Esteban Lorenzano
Hi,

short answer:  you can't (and you shouldn't) :)
long answer: conceptually, a presenter does not has an extent because it is not a component by itself, is just a set of other presenters arranged into a layout.

However,  that does not means you can't know the extent where your athens component will be drawn!

Basically, you cannot know the presenter size (or position), but you can know the extent assigned to  your athens canvas because the renderer will call your drawBlock with a canvas already initialized.
So, you can do something like:

athensPresenter := self newAthens
    drawBlock: [ :aCanvas | | extent |
        extent := aCanvas surface extent.
        ... etc ... ].

But! This is poorly documented and even less used, so there may be missing parts (both bugs and things I didn't think on when I implemented the component).
Please let me know if this is working for you :)

cheers!
Esteban

On May 24 2021, at 5:18 pm, kmo <[hidden email]> wrote:
I'm porting a little Morphic geometry program from Morphic to a Spec 2
application using GTK.

I need to draw a shape in an SpAthensPresenter but to draw it I need to know
the current dimensions (extent) of the presenter so it can still work OK
even when the window is resized.

The old Morphic version also used An Athens canvas but I had no problem then
as a morph has an extent method that provides this information. But now that
I can't use a morph I find that the extent method of an SpPresenter always
seems to answer nil.

Is that right? How d you get the current size of a presenter? Is it a bug?

I'm using a very recent Pharo 9 image and headless VM on Linux.

Image
-----
/home/kmp/Pharo/images/gtkRoses/gtkRoses.image
Pharo9.0.0
Build information:
Pharo-9.0.0+build.1399.sha.9ae8329dedfbad7915b7b2cdc4accc7ce8109ce0 (64 Bit)
Unnamed

Virtual Machine
---------------
/home/kmp/Pharo/vms/90-x64-headless/lib/pharo
CoInterpreter VMMaker-tonel.1 uuid: 286e9806-8e7d-0d00-ab06-4e280faf8631 Apr
30 2021
StackToRegisterMappingCogit VMMaker-tonel.1 uuid:
286e9806-8e7d-0d00-ab06-4e280faf8631 Apr 30 2021
5125110 - Commit: 5125110 - Date: 2021-04-30 10:05:04 +0200

Pharo 9.0.0 built on Apr 30 2021 10:22:47 Compiler: 5.4.0 20160609
VMMaker versionString 5125110 - Commit: 5125110 - Date: 2021-04-30 10:05:04
+0200
CoInterpreter VMMaker-tonel.1 uuid: 286e9806-8e7d-0d00-ab06-4e280faf8631 Apr
30 2021
StackToRegisterMappingCogit VMMaker-tonel.1 uuid:
286e9806-8e7d-0d00-ab06-4e280faf8631 Apr 30 2021


Any help woudl be appreciated.





--
Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html
kmo
Reply | Threaded
Open this post in threaded view
|

Re: How to get dimensions (extent) of a SpPresenter

kmo
I'm afraid it still doesn't work for me.

If I have a drawBlock like this:

drawBlock

^ [ :aCanvas |
          | paint surface |
          surface := aCanvas surface.
          paint := surface
                           createLinearGradient: {
                                           (0 -> Color blue).
                                           (1 -> Color black) }
                           start: 0 @ 0
                           stop: aCanvas surface extent.
          surface clear.
          aCanvas setPaint: paint.
          aCanvas drawShape: (0 @ 0 corner: aCanvas surface extent) ]

I get just a blank canvas.- nothing is drawn.

If I replace the aCanvas surface extent with a fixed size like this:

drawBlock

        ^ [ :aCanvas |
          | paint surface |
          surface := aCanvas surface.

          paint := surface
                           createLinearGradient: {
                                           (0 -> Color red).
                                           (1 -> Color green) }
                           start: 0 @ 0
                           stop: 300 @ 300.
          surface clear.
          aCanvas setPaint: paint.
          aCanvas drawShape: (0 @ 0 corner: 300 @ 300) ]

then it works.

Any ideas what i might be doing wrong?










--
Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html
kmo
Reply | Threaded
Open this post in threaded view
|

Re: How to get dimensions (extent) of a SpPresenter

kmo
I should also point out that nothing works unless I also set a surfaceExtent
when the presenter is set up -

initializePresenters

        rosesAthensPresenter := RosesAthensPresenter new.
        rosesAthensPresenter surfaceExtent: 400 @ 400.
        rosesAthensPresenter drawBlock: [ :aCanvas |
                | paint surface |
                surface := aCanvas surface.
                paint := surface
                                 createLinearGradient: {
                                                 (0 -> Color blue).
                                                 (1 -> Color black) }
                                 start: 0 @ 0
                                 stop: 300 @ 300.
                surface clear.
                aCanvas setPaint: paint.
                aCanvas drawShape: (0 @ 0 corner: 300 @ 300) ].
 



--
Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html
Reply | Threaded
Open this post in threaded view
|

Re: How to get dimensions (extent) of a SpPresenter

Esteban Lorenzano
Well, I noticed that it was working on gtk  backend but not in morphic

this works perfect:

exampleResizing
| extent |
extent := 350@300.
SpAthensPresenter new
application: (SpApplication new useBackend: #Gtk);
surfaceExtent: extent;
drawBlock: [ :aCanvas | | paint surface |
surface := aCanvas surface.
paint := surface
createLinearGradient: {
0->Color red.
1->Color green }
start: 0@0
stop: surface extent.
surface clear.
aCanvas setPaint: paint.
aCanvas drawShape: (0@0 corner: surface extent) ];
openWithSpec.

but it does not work if you change the backend for morphic.

Anyway, I submit a fix:

It will be in image soon :)

Esteban

On May 24 2021, at 8:06 pm, kmo <[hidden email]> wrote:
I should also point out that nothing works unless I also set a surfaceExtentwhen the presenter is set up -

initializePresenters

rosesAthensPresenter := RosesAthensPresenter new.
rosesAthensPresenter surfaceExtent: 400 @ 400.
rosesAthensPresenter drawBlock: [ :aCanvas |
| paint surface |
surface := aCanvas surface.
paint := surface
createLinearGradient: {
(0 -> Color blue).
(1 -> Color black) }
start: 0 @ 0
stop: 300 @ 300.
surface clear.
aCanvas setPaint: paint.
aCanvas drawShape: (0 @ 0 corner: 300 @ 300) ].




--
Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html
kmo
Reply | Threaded
Open this post in threaded view
|

Re: How to get dimensions (extent) of a SpPresenter

kmo
Hi Estaban.

Thank you for your helpful and prompt replies to my problem. Unfortunately,
your code does not work for me.

I pasted your code into a playground. When it runs I get no errors but I get
a completely blank window - no sign of the colour gradient.

If I change the backend to #Morphic, I get the gradient but, as you say, it
does not resize.

I just seem to be very unlucky with Gtk.

Ken



--
Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html
Reply | Threaded
Open this post in threaded view
|

Re: How to get dimensions (extent) of a SpPresenter

Esteban Lorenzano
Hi again,

Mmm.... that should not be possible. Can you tell me how are you installing and running your gtk backend?
Also, not today and not tomorrow (because I am busy), but you can contact me from thursday in discord and I can try to help you pair programming with you.

Esteban

On May 25 2021, at 11:43 am, kmo <[hidden email]> wrote:
Hi Estaban.

Thank you for your helpful and prompt replies to my problem. Unfortunately,
your code does not work for me.

I pasted your code into a playground. When it runs I get no errors but I get
a completely blank window - no sign of the colour gradient.

If I change the backend to #Morphic, I get the gradient but, as you say, it
does not resize.

I just seem to be very unlucky with Gtk.

Ken



--
Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html
kmo
Reply | Threaded
Open this post in threaded view
|

Re: How to get dimensions (extent) of a SpPresenter

kmo
I'm running Xubuntu 20.04. I didn't install Gtk - it comes with the OS.

I'm using the Nvidia video driver. Perhaps that has an effect.  



--
Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html
Reply | Threaded
Open this post in threaded view
|

Re: How to get dimensions (extent) of a SpPresenter

Esteban Lorenzano
x11 ?

On May 25 2021, at 12:43 pm, kmo <[hidden email]> wrote:
I'm running Xubuntu 20.04. I didn't install Gtk - it comes with the OS.

I'm using the Nvidia video driver. Perhaps that has an effect.



--
Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html
Reply | Threaded
Open this post in threaded view
|

Re: How to get dimensions (extent) of a SpPresenter

Esteban Lorenzano

and which vm?
On May 25 2021, at 1:43 pm, Esteban Lorenzano <[hidden email]> wrote:
x11 ?

On May 25 2021, at 12:43 pm, kmo <[hidden email]> wrote:
I'm running Xubuntu 20.04. I didn't install Gtk - it comes with the OS.

I'm using the Nvidia video driver. Perhaps that has an effect.



--
Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html
kmo
Reply | Threaded
Open this post in threaded view
|

Re: How to get dimensions (extent) of a SpPresenter

kmo
Here are details of X11, the Image and the VM

X11
-------

xdpyinfo | grep version
version number:    11.0
X.Org version: 1.20.9


Image
-----
/home/kmp/Pharo/images/gtkRoses/gtkRoses.image
Pharo9.0.0
Build information:
Pharo-9.0.0+build.1399.sha.9ae8329dedfbad7915b7b2cdc4accc7ce8109ce0 (64 Bit)
Unnamed

Virtual Machine
---------------
/home/kmp/Pharo/vms/90-x64-headless/lib/pharo
CoInterpreter VMMaker-tonel.1 uuid: 286e9806-8e7d-0d00-ab06-4e280faf8631 Apr
30 2021
StackToRegisterMappingCogit VMMaker-tonel.1 uuid:
286e9806-8e7d-0d00-ab06-4e280faf8631 Apr 30 2021
5125110 - Commit: 5125110 - Date: 2021-04-30 10:05:04 +0200

Pharo 9.0.0 built on Apr 30 2021 10:22:47 Compiler: 5.4.0 20160609
VMMaker versionString 5125110 - Commit: 5125110 - Date: 2021-04-30 10:05:04
+0200
CoInterpreter VMMaker-tonel.1 uuid: 286e9806-8e7d-0d00-ab06-4e280faf8631 Apr
30 2021
StackToRegisterMappingCogit VMMaker-tonel.1 uuid:
286e9806-8e7d-0d00-ab06-4e280faf8631 Apr 30 2021





--
Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html
Reply | Threaded
Open this post in threaded view
|

Re: How to get dimensions (extent) of a SpPresenter

Esteban Lorenzano
Hi,

So, I was able to reproduce your problem : for some reason, cairo does not answer a correct surface extent while in x11 (I didn't noticed before because I use wayland).
I can hack a solution (and I will), but have fear that will cause future problems :/ 
Anyway, I will commit a fix and you will be able to use the surface extent message.

Esteban

On May 25 2021, at 1:59 pm, kmo <[hidden email]> wrote:
Here are details of X11, the Image and the VM

X11
-------

xdpyinfo | grep version
version number: 11.0
X.Org version: 1.20.9


Image
-----
/home/kmp/Pharo/images/gtkRoses/gtkRoses.image
Pharo9.0.0
Build information:
Pharo-9.0.0+build.1399.sha.9ae8329dedfbad7915b7b2cdc4accc7ce8109ce0 (64 Bit)
Unnamed

Virtual Machine
---------------
/home/kmp/Pharo/vms/90-x64-headless/lib/pharo
CoInterpreter VMMaker-tonel.1 uuid: 286e9806-8e7d-0d00-ab06-4e280faf8631 Apr
30 2021
StackToRegisterMappingCogit VMMaker-tonel.1 uuid:
286e9806-8e7d-0d00-ab06-4e280faf8631 Apr 30 2021
5125110 - Commit: 5125110 - Date: 2021-04-30 10:05:04 +0200

Pharo 9.0.0 built on Apr 30 2021 10:22:47 Compiler: 5.4.0 20160609
VMMaker versionString 5125110 - Commit: 5125110 - Date: 2021-04-30 10:05:04
+0200
CoInterpreter VMMaker-tonel.1 uuid: 286e9806-8e7d-0d00-ab06-4e280faf8631 Apr
30 2021
StackToRegisterMappingCogit VMMaker-tonel.1 uuid:
286e9806-8e7d-0d00-ab06-4e280faf8631 Apr 30 2021





--
Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html
kmo
Reply | Threaded
Open this post in threaded view
|

Re: How to get dimensions (extent) of a SpPresenter

kmo
kmo
Reply | Threaded
Open this post in threaded view
|

Re: How to get dimensions (extent) of a SpPresenter

kmo
In reply to this post by Esteban Lorenzano
Hi Esteban

Do you know when the fix for the extent problem under Gtk will be in the
image? I downloaded the latest Pharo 9 image a couple of days ago and,
though the fix was in for the extent problem in Morphic, it still didn't
work in Gtk.

Thanks.

Ken




--
Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html
Reply | Threaded
Open this post in threaded view
|

Re: How to get dimensions (extent) of a SpPresenter

Esteban Lorenzano

Hi,

Yes, it is there.
Thing is... since cairo does not informs correctly extent of surface in x11, what I did is to add an extra parameter to the drawing block, as you can see in the example :

SpAthensPresenter>>#exampleResizing
| extent |
extent := 350@300.
self new
surfaceExtent: extent;
drawBlock: [ :aCanvas :boundingBox | | paint surface |
"Since sometimes a cairo surface does not brings the correct extent (in X11 or Windows,
for example), we use the bounding box of the component."
surface := aCanvas surface.
paint := surface
createLinearGradient: {
0->Color red.
1->Color green }
start: 0@0
stop: boundingBox extent.
surface clear.
aCanvas setPaint: paint.
aCanvas drawShape: (0@0 extent: boundingBox extent) ];
openWithSpec

That was tested on Wayland and x11 and it was working properly :)

Esteban

 

On Jun 16 2021, at 2:20 pm, kmo <[hidden email]> wrote:
Hi Esteban

Do you know when the fix for the extent problem under Gtk will be in the
image? I downloaded the latest Pharo 9 image a couple of days ago and,
though the fix was in for the extent problem in Morphic, it still didn't
work in Gtk.

Thanks.

Ken




--
Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html
Reply | Threaded
Open this post in threaded view
|

Re: How to get dimensions (extent) of a SpPresenter

Esteban Lorenzano
boo... format lost :P


On Jun 16 2021, at 2:27 pm, Esteban Lorenzano <[hidden email]> wrote:

Hi,

Yes, it is there.
Thing is... since cairo does not informs correctly extent of surface in x11, what I did is to add an extra parameter to the drawing block, as you can see in the example :

SpAthensPresenter>>#exampleResizing
| extent |
extent := 350@300.
self new
surfaceExtent: extent;
drawBlock: [ :aCanvas :boundingBox | | paint surface |
"Since sometimes a cairo surface does not brings the correct extent (in X11 or Windows,
for example), we use the bounding box of the component."
surface := aCanvas surface.
paint := surface
createLinearGradient: {
0->Color red.
1->Color green }
start: 0@0
stop: boundingBox extent.
surface clear.
aCanvas setPaint: paint.
aCanvas drawShape: (0@0 extent: boundingBox extent) ];
openWithSpec

That was tested on Wayland and x11 and it was working properly :)

Esteban

 

On Jun 16 2021, at 2:20 pm, kmo <[hidden email]> wrote:
Hi Esteban

Do you know when the fix for the extent problem under Gtk will be in the
image? I downloaded the latest Pharo 9 image a couple of days ago and,
though the fix was in for the extent problem in Morphic, it still didn't
work in Gtk.

Thanks.

Ken




--
Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html
kmo
Reply | Threaded
Open this post in threaded view
|

Re: How to get dimensions (extent) of a SpPresenter

kmo
In reply to this post by Esteban Lorenzano
Many thanks esteban - works fine now in Gtk



--
Sent from: http://forum.world.st/Pharo-Smalltalk-Users-f1310670.html