[Cuis-dev] VectorEnginePlugin (was Re: UK Smalltalk User Group meeting - Wednesday March 31st)

Bernhard Pieber bernhard at pieber.com
Tue Mar 23 09:39:47 PDT 2021


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




More information about the Cuis-dev mailing list