[Cuis-dev] VectorEnginePlugin (was Re: UK Smalltalk User Group meeting - Wednesday March 31st)
Bernhard Pieber
bernhard at pieber.com
Tue Mar 23 11:31:50 PDT 2021
Hi Juan,
I have never been far. :-)
Thank you for the quick answer. I could follow all the examples. This is great!
Interestingly Display extent is reporting 1792 at 1120 as the display resolution on the Retina display of my MacBook Pro. This is 7/10 of the real resolution of 2560 at 1600. Any idea why that might be the case?
A few things I noticed. I am sure you know most of these already.
Resizing windows with the mouse does not seem to work anymore. I can resize using the window menu. However, the world menu does not work on the former extent of the window.
When I make a workspace smaller using the zoom halo button the last line disappears.
Thanks for working on this!
Cheers,
Bernhard
> Am 23.03.2021 um 18:53 schrieb Juan Vuletich via Cuis-dev <cuis-dev at lists.cuis.st>:
>
>
> Hi Bernhard!
>
> It is great to see you around!
>
> I gosh. And I thought I wrote detailed and complete instructions.
>
> I forgot to say this in the instructions. After starting Cuis, the
> _first_ thing to do is to install updates.
>
> Cheers,
> Juan Vuletich
>
> On 3/23/2021 1:39 PM, Bernhard Pieber via Cuis-dev wrote:
>> Hi Juan,
>>
>> You know I have been waiting for this announcement. ;-) So I could not wait to try.
>>
>> I am running macOS Big Sur 11.2.3.
>>
>> I used Cuis5.0-4526.image. The other images don’t start.
>>
>> I set ComputerModernSans as the system font. That’s a TrueType font, right?
>>
>> When I evaluate M3Exp01Morph new openInWorld Cuis asks if I want to install and activate VectorGraphics support.
>>
>> I answer yes. A morph appears near the top left of the screen. When I try moving it Cuis freezes and CuisDebug.log files appear, see below.
>>
>> I tried the same with all packages loaded with the same result.
>>
>> Any idea?
>>
>> Cheers,
>> Bernhard
>>
>> Error: MessageNotUnderstood: Array>>offset
>> 23 March 2021 5:11:39.776127 pm
>>
>> VM: Mac OS - Open Smalltalk Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2945] 5.0.202103010116
>> Image: Cuis 5.0 [latest update: #4526]
>>
>> Array(Object)>>error:
>> Receiver: #(Form(135x114x32) Form(135x114x32))
>> Arguments and temporary variables:
>> aString: 'MessageNotUnderstood: Array>>offset'
>> Receiver's instance variables:
>> #(Form(135x114x32) Form(135x114x32))
>> [] in WorldMorph>>displayWorldSafely
>> Receiver: [world]
>> Arguments and temporary variables:
>> err: 'MessageNotUnderstood: Array>>offset'
>> rcvr: #(Form(135x114x32) Form(135x114x32))
>> Receiver's instance variables:
>> owner: nil
>> submorphs: #(Workspace System Browser Transcript a TaskbarMorph(3157524))
>> properties: nil
>> id: 267
>> privateDisplayBounds: nil
>> location: MorphicTranslation(translation 0.0 at 0.0)
>> layoutSpec: nil
>> extent: 2560 at 1540
>> color: (Color r: 0.800 g: 1.000 b: 0.600)
>> backgroundImage: Form(2560x1540x-32)
>> backgroundImageData: #[255 216 255 236 0 17 68 117 99 107 121 0 1 0 4 0 0 0 81 [..]
>> activeHand: a HandMorph(3748314)
>> hands: #(a HandMorph(3748314))
>> canvas: a HybridCanvas on: DisplayScreen(2560x1540x32)
>> damageRecorder: a DamageRecorder
>> stepList: a Heap(StepMessage(#stepAt: -> an UpdatingLabelMorph(148227)'17:11:39[..]
>> lastCycleTime: 3793972299555
>> alarms: a Heap()
>> lastAlarmTime: 0
>> deferredUIMessages: a SharedQueue(1)
>> drawingFailingMorphs: a WeakIdentitySet( [world])
>> waitDelay: a Delay(50 msecs)
>> pause: 20
>> lastCycleHadAnyEvent: true
>> taskbar: a TaskbarMorph(3157524)
>>
>> BlockClosure>>valueWithPossibleArgument:and:
>> Receiver: [closure] in WorldMorph>>displayWorldSafely
>> Arguments and temporary variables:
>> anArg: 'MessageNotUnderstood: Array>>offset'
>> secondArg: #(Form(135x114x32) Form(135x114x32))
>> Receiver's instance variables:
>> outerContext: WorldMorph>>displayWorldSafely
>> startpc: 76
>> numArgs: 2
>>
>> [] in BlockClosure>>ifError:
>> Receiver: [closure] in WorldMorph>>displayWorldSafely
>> Arguments and temporary variables:
>> errorHandlerBlock: MessageNotUnderstood: Array>>offset
>> ex: [closure] in WorldMorph>>displayWorldSafely
>> Receiver's instance variables:
>> outerContext: WorldMorph>>displayWorldSafely
>> startpc: 69
>> numArgs: 0
>>
>> BlockClosure>>valueWithPossibleArgument:
>> Receiver: [closure] in BlockClosure>>ifError:
>> Arguments and temporary variables:
>> anArg: MessageNotUnderstood: Array>>offset
>> Receiver's instance variables:
>> outerContext: BlockClosure>>ifError:
>> startpc: 72
>> numArgs: 1
>>
>> [] in [] in MessageNotUnderstood(Exception)>>evaluateHandlerBlock:
>> Receiver: MessageNotUnderstood: Array>>offset
>> Arguments and temporary variables:
>> <<error during printing>
>> Receiver's instance variables:
>> messageText: nil
>> tag: nil
>> signalContext: MessageNotUnderstood(Exception)>>signal
>> handlerContexts: an OrderedCollection(BlockClosure>>on:do:)
>> outerContext: nil
>> handlerBlockNotCurtailed: false
>> message: offset
>> receiver: #(Form(135x114x32) Form(135x114x32))
>> reachedDefaultHandler: false
>>
>> BlockClosure>>on:do:
>> Receiver: [closure] in [] in MessageNotUnderstood(Exception)>>evaluateHandlerBlock:
>> Arguments and temporary variables:
>> exception: Exception
>> handlerAction: [closure] in [] in MessageNotUnderstood(Exception)>>evaluateHand[..]
>> Receiver's instance variables:
>> outerContext: [] in MessageNotUnderstood(Exception)>>evaluateHandlerBlock:
>> startpc: 202
>> numArgs: 0
>>
>> [] in MessageNotUnderstood(Exception)>>evaluateHandlerBlock:
>> Receiver: MessageNotUnderstood: Array>>offset
>> Arguments and temporary variables:
>> aBlock: [closure] in BlockClosure>>ifError:
>> handlerEx: #(UnhandledError)
>> answer: nil
>> Receiver's instance variables:
>> messageText: nil
>> tag: nil
>> signalContext: MessageNotUnderstood(Exception)>>signal
>> handlerContexts: an OrderedCollection(BlockClosure>>on:do:)
>> outerContext: nil
>> handlerBlockNotCurtailed: false
>> message: offset
>> receiver: #(Form(135x114x32) Form(135x114x32))
>> reachedDefaultHandler: false
>>
>> BlockClosure>>ifCurtailed:
>> Receiver: [closure] in MessageNotUnderstood(Exception)>>evaluateHandlerBlock:
>> Arguments and temporary variables:
>> aBlock: [closure] in MessageNotUnderstood(Exception)>>evaluateHandlerBlock:
>> complete: nil
>> result: nil
>> Receiver's instance variables:
>> outerContext: MessageNotUnderstood(Exception)>>evaluateHandlerBlock:
>> startpc: 196
>> numArgs: 0
>>
>> MessageNotUnderstood(Exception)>>evaluateHandlerBlock:
>> Receiver: MessageNotUnderstood: Array>>offset
>> Arguments and temporary variables:
>> aBlock: [closure] in BlockClosure>>ifError:
>> handlerEx: #(UnhandledError)
>> Receiver's instance variables:
>> messageText: nil
>> tag: nil
>> signalContext: MessageNotUnderstood(Exception)>>signal
>> handlerContexts: an OrderedCollection(BlockClosure>>on:do:)
>> outerContext: nil
>> handlerBlockNotCurtailed: false
>> message: offset
>> receiver: #(Form(135x114x32) Form(135x114x32))
>> reachedDefaultHandler: false
>>
>> MethodContext(ContextPart)>>evaluateSignal:
>> Receiver: BlockClosure>>on:do:
>> Arguments and temporary variables:
>> exception: MessageNotUnderstood: Array>>offset
>> value: nil
>> Receiver's instance variables:
>> sender: BlockClosure>>ifError:
>> pc: 30
>> stackp: 2
>> method: (BlockClosure>>#on:do: "a CompiledMethod(1623573)")
>> closureOrNil: nil
>> receiver: [closure] in WorldMorph>>displayWorldSafely
>>
>> MethodContext(ContextPart)>>handleSignal:
>> Receiver: BlockClosure>>on:do:
>> Arguments and temporary variables:
>> exception: MessageNotUnderstood: Array>>offset
>> Receiver's instance variables:
>> sender: BlockClosure>>ifError:
>> pc: 30
>> stackp: 2
>> method: (BlockClosure>>#on:do: "a CompiledMethod(1623573)")
>> closureOrNil: nil
>> receiver: [closure] in WorldMorph>>displayWorldSafely
>>
>> MessageNotUnderstood(Exception)>>signalIn:
>> Receiver: MessageNotUnderstood: Array>>offset
>> Arguments and temporary variables:
>> aContext: MessageNotUnderstood(Exception)>>signal
>> Receiver's instance variables:
>> messageText: nil
>> tag: nil
>> signalContext: MessageNotUnderstood(Exception)>>signal
>> handlerContexts: an OrderedCollection(BlockClosure>>on:do:)
>> outerContext: nil
>> handlerBlockNotCurtailed: false
>> message: offset
>> receiver: #(Form(135x114x32) Form(135x114x32))
>> reachedDefaultHandler: false
>>
>> MessageNotUnderstood(Exception)>>signal
>> Receiver: MessageNotUnderstood: Array>>offset
>> Arguments and temporary variables:
>>
>> Receiver's instance variables:
>> messageText: nil
>> tag: nil
>> signalContext: MessageNotUnderstood(Exception)>>signal
>> handlerContexts: an OrderedCollection(BlockClosure>>on:do:)
>> outerContext: nil
>> handlerBlockNotCurtailed: false
>> message: offset
>> receiver: #(Form(135x114x32) Form(135x114x32))
>> reachedDefaultHandler: false
>>
>> Array(Object)>>doesNotUnderstand: #offset
>> Receiver: #(Form(135x114x32) Form(135x114x32))
>> Arguments and temporary variables:
>> aMessage: offset
>> exception: MessageNotUnderstood: Array>>offset
>> resumeValue: nil
>> Receiver's instance variables:
>> #(Form(135x114x32) Form(135x114x32))
>> HybridCanvas(MorphicCanvas)>>restorePatch:
>> Receiver: a HybridCanvas on: DisplayScreen(2560x1540x32)
>> Arguments and temporary variables:
>> savedPatch: #(Form(135x114x32) Form(135x114x32))
>> Receiver's instance variables:
>> world: [world]
>> form: DisplayScreen(2560x1540x32)
>> clipRect: 0 at 0 corner: 2560 at 1540
>> transformations: an OrderedCollection(MorphicTranslation(translation 0.0 at 0.0) [..]
>> currentTransformation: MorphicTranslation(translation 0.0 at 0.0)
>> cti: 2
>> currentMorph: [world]
>> drawingMorphStack: an OrderedCollection(nil [world] nil nil nil nil nil nil)
>> engine: a BitBltCanvasEngine
>> clippingMorphDisplayBounds: nil
>> vectorCanvas: a VectorCanvas on: DisplayScreen(2560x1540x32)
>> morphIDsForm: Form(2560x1540x32)
>> drawingOnMorphIDs: false
>>
>> HandMorph>>restoreSavedPatchOn:
>> Receiver: a HandMorph(3748314)
>> Arguments and temporary variables:
>> aCanvas: a HybridCanvas on: DisplayScreen(2560x1540x32)
>> Receiver's instance variables:
>> owner: [world]
>> submorphs: #(a M3Exp01Morph(4145143))
>> properties: nil
>> id: 26634
>> privateDisplayBounds: nil
>> location: MorphicTranslation(translation 95.0 at 81.0)
>> layoutSpec: nil
>> extent: 16 at 16
>> color: (Color r: 0.976 g: 0.451 b: 0.024)
>> mouseFocus: nil
>> keyboardFocus: nil
>> mouseClickState: nil
>> mouseOverHandler: a MouseOverHandler
>> lastMouseEvent: a MouseMoveEvent
>> hasChanged: false
>> savedPatch: #(Form(135x114x32) Form(135x114x32))
>> lastEventBuffer: #(1 47791 95 81 4 0 0 1)
>> lastKeyDownValue: 2
>> lastMouseEventTime: 3793972299391
>> prevFullBounds: 39 at 40 corner: 174 at 154
>> grabMorphData: an IdentityDictionary(a M3Exp01Morph(4145143)->#( [world] 50.0 at 5[..]
>> lastPosition: 95.0 at 81.0
>>
>> [] in WorldMorph>>displayWorld
>> Receiver: [world]
>> Arguments and temporary variables:
>> <<error during printing>
>> Receiver's instance variables:
>> owner: nil
>> submorphs: #(Workspace System Browser Transcript a TaskbarMorph(3157524))
>> properties: nil
>> id: 267
>> privateDisplayBounds: nil
>> location: MorphicTranslation(translation 0.0 at 0.0)
>> layoutSpec: nil
>> extent: 2560 at 1540
>> color: (Color r: 0.800 g: 1.000 b: 0.600)
>> backgroundImage: Form(2560x1540x-32)
>> backgroundImageData: #[255 216 255 236 0 17 68 117 99 107 121 0 1 0 4 0 0 0 81 [..]
>> activeHand: a HandMorph(3748314)
>> hands: #(a HandMorph(3748314))
>> canvas: a HybridCanvas on: DisplayScreen(2560x1540x32)
>> damageRecorder: a DamageRecorder
>> stepList: a Heap(StepMessage(#stepAt: -> an UpdatingLabelMorph(148227)'17:11:39[..]
>> lastCycleTime: 3793972299555
>> alarms: a Heap()
>> lastAlarmTime: 0
>> deferredUIMessages: a SharedQueue(1)
>> drawingFailingMorphs: a WeakIdentitySet( [world])
>> waitDelay: a Delay(50 msecs)
>> pause: 20
>> lastCycleHadAnyEvent: true
>> taskbar: a TaskbarMorph(3157524)
>>
>> OrderedCollection>>do:
>> Receiver: an OrderedCollection(a HandMorph(3748314))
>> Arguments and temporary variables:
>> aBlock: [closure] in WorldMorph>>displayWorld
>> index: 3
>> Receiver's instance variables:
>> array: #(nil nil a HandMorph(3748314) nil nil nil nil nil nil nil)
>> firstIndex: 3
>> lastIndex: 3
>>
>>
>> --- The full stack ---
>> Array(Object)>>error:
>> [] in WorldMorph>>displayWorldSafely
>> BlockClosure>>valueWithPossibleArgument:and:
>> [] in BlockClosure>>ifError:
>> BlockClosure>>valueWithPossibleArgument:
>> [] in [] in MessageNotUnderstood(Exception)>>evaluateHandlerBlock:
>> BlockClosure>>on:do:
>> [] in MessageNotUnderstood(Exception)>>evaluateHandlerBlock:
>> BlockClosure>>ifCurtailed:
>> MessageNotUnderstood(Exception)>>evaluateHandlerBlock:
>> MethodContext(ContextPart)>>evaluateSignal:
>> MethodContext(ContextPart)>>handleSignal:
>> MessageNotUnderstood(Exception)>>signalIn:
>> MessageNotUnderstood(Exception)>>signal
>> Array(Object)>>doesNotUnderstand: #offset
>> HybridCanvas(MorphicCanvas)>>restorePatch:
>> HandMorph>>restoreSavedPatchOn:
>> [] in WorldMorph>>displayWorld
>> OrderedCollection>>do:
>> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
>> WorldMorph>>displayWorld
>> [] in WorldMorph>>displayWorldSafely
>> BlockClosure>>on:do:
>> BlockClosure>>ifError:
>> WorldMorph>>displayWorldSafely
>> WorldMorph>>doOneCycleNow
>> WorldMorph>>doOneCycle
>> WorldMorph>>mainLoop
>> [] in WorldMorph>>runProcess
>> [] in BlockClosure>>newProcess
>>
>>
>>
>>
>>> Am 23.03.2021 um 00:48 schrieb Juan Vuletich via Cuis-dev<cuis-dev at lists.cuis.st>:
>>>
>>> On 3/22/2021 5:55 PM, David T. Lewis via Cuis-dev wrote:
>>>> Hello Juan,
>>>>
>>>> I recall from previous presentations that development of a VM plugin
>>>> was on the to-do list for your vector graphics package. Could you
>>>> please say a few words about what is needed? If it is something that
>>>> I could help with, I would be happy to assist.
>>>>
>>>> Dave
>>>>
>>> Hello David, Eliot,
>>>
>>> I've been working on it for a couple of weeks, and it is starting to
>>> take off! So, David, you just triggered an announcement.
>>>
>>> I have just pushed the relevant files to GitHub. There are several ways
>>> to explore this.
>>>
>>> A - You want to see it running. Experimental. I only buit it for MacOS.
>>> 1) Grab VM including the plugin from
>>> https://www.dropbox.com/sh/rhkt4ayq24t2xbf/AACDb3mrjMUDB8Mptd-Bi6Zsa?dl=0
>>> 2) Pull Cuis repo.
>>> 3) Start Cuis with the VM above
>>> 4) Evaluate: Feature require: 'VectorGraphics'.
>>> 5) Set a TT Font (Stuff will break with StrikeFonts and you'll need to
>>> kill the image)
>>> 6) Evaluate: M3Exp01Morph new openInWorld.
>>> 7) Play with the halo. Very slow! Still running the Smalltalk code for
>>> VectorEngine
>>> 8) Evaluate: (self runningWorld canvas instVarNamed: 'vectorCanvas')
>>> usePlugin.
>>> 9) Play with the halo. Rotate (bottom left handle) and Zool (bottom
>>> right handle) Now it is very fast! The plugin is working.
>>> 10) Hide the taskbar
>>> 11) redefine WidgetMorph>>requiresVectorCanvas to answer true,
>>> 12) refresh the display. Now every window and window element, including
>>> all the text, is drawn by VectorEngine. You might notice that all the
>>> appareances of any glyph, for example $a are no longer identical. Text
>>> layout and Glyph placement is done with Float arithmetic, using subpixel
>>> locations!
>>> 13) redefine WidgetMorph>>hasVariableExtent to answer false.
>>> 14) Open the halo on any window. Use the rotate and zoom handles.
>>> 15) Yes. We can do high quality, subpixel antialiased text at _any_
>>> scale and rotation angle! I don't know of any other Smalltalk or
>>> windowing system that can do this. It is like pdf scaling, but for _all_
>>> the UI!
>>>
>>> B - You want to look at the generated C code for the plugin, or build it
>>> for another platform. You need a working setup to build the
>>> OpenSmalltalk VM. The dropbox opensmalltalk-vm includes the files needed
>>> to build the VM with the plugin.
>>>
>>> C - You want to experiment with the Slang plugin source code. I have
>>> only done this in Cuis, not yet in the official Squeak VMMaker image.
>>> 1) Clone / pull VMMaker repo
>>> 2) Feature require: 'VMMaker'.
>>> 3) FileIn 'IntegerArrayWordArray-stdint-VMMaker-jmv.006.cs.st'
>>> 4) Feature require: 'VectorEnginePlugin'
>>> 5) VectorEnginePlugin translateInDirectory: DirectoryEntry
>>> currentDirectory doInlining: true
>>> I wanted to use stdint.h C types. The file
>>> IntegerArrayWordArray-stdint-VMMaker-jmv.006.cs.st includes changes to
>>> VMMaker to generate the proper declarations.
>>>
>>> David, Eliot, do you think this is a sensible way to enable the use of
>>> stdint.h? It would affect any uses of IntegerArray and WordArray. I
>>> think we'd use stdint.h as much as possible. But I'm not certain if
>>> these changes could break other things.
>>>
>>> Feedback is most welcome.
>>>
>>> Cheers,
>>>
>>> --
>>> Juan Vuletich
>>> www.cuis-smalltalk.org
>>> https://github.com/Cuis-Smalltalk/Cuis-Smalltalk-Dev
>>> https://github.com/jvuletich
>>> https://www.linkedin.com/in/juan-vuletich-75611b3
>>> @JuanVuletich
>>>
>>> --
>>> Cuis-dev mailing list
>>> Cuis-dev at lists.cuis.st
>>> https://lists.cuis.st/mailman/listinfo/cuis-dev
>>
>
>
> --
> Juan Vuletich
> www.cuis-smalltalk.org
> https://github.com/Cuis-Smalltalk/Cuis-Smalltalk-Dev
> https://github.com/jvuletich
> https://www.linkedin.com/in/juan-vuletich-75611b3
> @JuanVuletich
>
> --
> Cuis-dev mailing list
> Cuis-dev at lists.cuis.st
> https://lists.cuis.st/mailman/listinfo/cuis-dev
More information about the Cuis-dev
mailing list