<div dir="ltr"><div><div><div><div><div><div><div>The target inst. var. is used exclusively by the PostscriptCanvas.<br></div>And IMO it is a classical mistake of inheritance versus composition.</div><div><br></div>A
PostScript canvas will have to encode the sequence of graphics
instruction into a stream of PostScript instructions written into a
PostScript file.<br></div>For this purpose, it has a target PostscriptEncoder, which is itself an encoder already.<br><br></div>An Encoder implements a processing unit that transform a stream by using a kind of generic double dispatching.</div><div><br></div>Why the PostscriptCanvas has to be considered as an Encoder itself is very suspect, unless we ask<br><br></div> canvas write: aMorph.<br><br></div>Do we really want to do that, have a stream of Morphs (or other graphical objects)?<br></div><div class="gmail_extra"><br><div class="gmail_quote">2017-09-29 17:33 GMT+02:00 H. Hirzel <span dir="ltr"><<a href="mailto:hannes.hirzel@gmail.com" target="_blank">hannes.hirzel@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Tobias<br>
<br>
You write that NullEncoder and subclasses could be summarized as<br>
<span class=""><br>
"Put objects onto another thing with encoding inbetween".<br>
<br>
</span>which I think is helpful for understanding.<br>
<br>
Maybe we consider for the class comment of NullEncoder<br>
<br>
"Put objects onto another thing with encoding/transformation inbetween".<br>
<br>
<br>
But also note that this is not only related to PostscriptCanvas as we have<br>
<br>
<br>
NullEncoder<br>
FlattenEncoder<br>
Canvas<br>
FormCanvas<br>
<br>
FormCanvas has some nice usage examples.<br>
<br>
#test1 is<br>
<br>
test1<br>
"FormCanvas test1"<br>
<br>
| canvas |<br>
canvas := FormCanvas extent: 200@200.<br>
canvas fillColor: (Color black).<br>
canvas line: 10@10 to: 50@30 width: 1 color: (Color red).<br>
canvas frameRectangle: ((20@20) corner: (120@120)) width: 4 color:<br>
(Color green).<br>
canvas point: 100@100 color: (Color black).<br>
canvas drawString: 'Hello, World!' at: 40@40 font: nil color: (Color cyan).<br>
canvas fillRectangle: ((10@80) corner: (31@121)) color: (Color magenta).<br>
canvas fillOval: ((10@80) corner: (31@121)) color: (Color cyan).<br>
canvas frameOval: ((40@80) corner: (61@121)) color: (Color blue).<br>
canvas frameOval: ((70@80) corner: (91@121)) width: 3 color: (Color<br>
red alpha: 0.2).<br>
canvas fillRectangle: ((130@30) corner: (170@80)) color: (Color lightYellow).<br>
canvas showAt: 0@0.<br>
<br>
<br>
This works fine in an MVC project<br>
<br>
--Hannes<br>
<div class="HOEnZb"><div class="h5"><br>
On 9/29/17, Tobias Pape <<a href="mailto:Das.Linux@gmx.de">Das.Linux@gmx.de</a>> wrote:<br>
> Hi Hannes<br>
><br>
>> On 29.09.2017, at 15:21, H. Hirzel <<a href="mailto:hannes.hirzel@gmail.com">hannes.hirzel@gmail.com</a>> wrote:<br>
>><br>
>> And there is no 'FlattenEncoder' in Pharo 6<br>
><br>
>><br>
>><br>
>> On 9/29/17, H. Hirzel <<a href="mailto:hannes.hirzel@gmail.com">hannes.hirzel@gmail.com</a>> wrote:<br>
>>> We have<br>
>>><br>
>>> NullEncoder<br>
>>> FlattenEncoder<br>
>>> Canvas<br>
><br>
> So here's the Thing: I looked in 3.8, and there's:<br>
><br>
> Object<br>
> NullEncoder - Morphic-Postscript Filters<br>
> FlattenEncoder - Morphic-Postscript Filters<br>
> Canvas - Morphic-Support<br>
> PostscriptCanvas - Morphic-Postscript Canvases<br>
><br>
> But also note that they all have a callback via class>>filterSelector:<br>
><br>
> NullEncoder>>filterSelector ^ #writeOnFilterStream:<br>
> FlattenEncoder>>filterSelector ^ #flattenOnStream:<br>
> Canvas>>filterSelector ^ #drawOnCanvas:<br>
> PostscriptCanvas>><wbr>filterSelector ^ #fullDrawPostscriptOn:<br>
><br>
> I think part of that happened because this all shared common functionallity,<br>
> In the sense that all those things "Put objects onto another thing with<br>
> encoding inbetween".<br>
> Thinking of things like a n-dimensonal stream or so…<br>
><br>
> I checked and It is like that even in Squeak 3.6, 3.0, 2.8.<br>
> Squeak 1.13 does not have any of those, and it has no Morphic.<br>
><br>
> Self Morphic does not have such Encoders, tho.<br>
><br>
> In the end it all seems to be related to the PostScript Canvas, which,<br>
> understandably, has to have access to certain objects and actually has to<br>
> "encode" them into a file.<br>
><br>
> Best regards<br>
> -Tobias<br>
><br>
><br>
><br>
>>><br>
>>> there are no direct users of NullEncoder and FlattenEncoder.<br>
>>><br>
>>> FlattenEncoder class comment is just<br>
>>><br>
>>> 'The simplest possible encoding: leave the objects as is.'<br>
>>><br>
>>> a bit terse. Does not really say what the issue is about.<br>
>>><br>
>>><br>
>>><br>
>>> On 9/29/17, H. Hirzel <<a href="mailto:hannes.hirzel@gmail.com">hannes.hirzel@gmail.com</a>> wrote:<br>
>>>> P.S.<br>
>>>><br>
>>>> There is no NullEncoder in Pharo.<br>
>>>><br>
>>>> The class Canvas is not in a package 'Morphic-Support' but in a<br>
>>>> package 'Graphics-Canvas'.<br>
>>>><br>
>>>> There is no 'Graphics-Canvas' package in Squeak. [2]<br>
>>>><br>
>>>> Seems like a good idea to move Canvas and subclasses to a package<br>
>>>> 'Graphics-Canvas' as well.<br>
>>>><br>
>>>><br>
>>>> [2] Graphics package in Squeak 6.0a-17405<br>
>>>><br>
>>>> Graphics-Display Objects<br>
>>>> Graphics-External-Ffenestri<br>
>>>> Graphics-Files<br>
>>>> Graphics-Fonts<br>
>>>> Graphics-Primitives<br>
>>>> Graphics-Text<br>
>>>> Graphics-Transformations<br>
>>>> GraphicsTests-Files<br>
>>>> GraphicsTests-Primitives<br>
>>>> GraphicsTests-Text<br>
>>>><br>
>>>> On 9/29/17, H. Hirzel <<a href="mailto:hannes.hirzel@gmail.com">hannes.hirzel@gmail.com</a>> wrote:<br>
>>>>> Hello<br>
>>>>><br>
>>>>> NullEncoder is subclass of object ([1] for full hierachy). It is a<br>
>>>>> superclass of Canvas.<br>
>>>>><br>
>>>>> What is the function of NullEncoder. No class comment so far?<br>
>>>>><br>
>>>>> Regards<br>
>>>>> Hannes<br>
>>>>><br>
>>>>><br>
>>>>> ------------------------------<wbr>------------------------------<wbr>------------------------------<wbr>------------------------------<wbr>-------<br>
>>>>><br>
>>>>> [1] NullEncoder printHierarchy '<br>
>>>>> ProtoObject #()<br>
>>>>> Object #()<br>
>>>>> NullEncoder #(''target'' ''filterSelector'')<br>
>>>>> FlattenEncoder #()<br>
>>>>> ByteEncoder #()<br>
>>>>> PrintableEncoder #()<br>
>>>>> PostscriptEncoder #()<br>
>>>>> PostscriptEncoderToDisk #()<br>
>>>>> PropertyListEncoder #()<br>
>>>>> Canvas #()<br>
>>>>> ColorMappingCanvas #(''myCanvas'')<br>
>>>>> AlphaBlendingCanvas #(''alpha'')<br>
>>>>> ShadowDrawingCanvas #(''shadowColor'')<br>
>>>>> FormCanvas #(''origin'' ''clipRect'' ''form'' ''port''<br>
>>>>> ''shadowColor'')<br>
>>>>> BalloonCanvas #(''transform'' ''colorTransform'' ''engine''<br>
>>>>> ''aaLevel'' ''deferred'')<br>
>>>>> BlueFormCanvas #()<br>
>>>>> ColorPatchCanvas #(''stopMorph'' ''foundMorph'' ''doStop'')<br>
>>>>> MultiResolutionCanvas #(''deferredMorphs'')<br>
>>>>> PluggableCanvas #()<br>
>>>>> BufferedCanvas #(''remote'' ''previousVersion'' ''lastTick''<br>
>>>>> ''dirtyRect'' ''mirrorOfScreen'')<br>
>>>>> CachingCanvas #(''cacheCanvas'' ''mainCanvas'')<br>
>>>>> ClippingCanvas #(''canvas'' ''clipRect'')<br>
>>>>> MultiCanvas #(''canvases'' ''extent'' ''depth'')<br>
>>>>> NullCanvas #()<br>
>>>>> PostscriptCanvas #(''origin'' ''clipRect'' ''currentColor''<br>
>>>>> ''shadowColor'' ''currentFont'' ''morphLevel'' ''gstateStack''<br>
>>>>> ''fontMap'' ''usedFonts'' ''psBounds'' ''topLevelMorph''<br>
>>>>> ''initialScale'' ''savedMorphExtent'' ''currentTransformation''<br>
>>>>> ''printSpecs'' ''pages'')<br>
>>>>> DSCPostscriptCanvas #()<br>
>>>>> DSCPostscriptCanvasToDisk #()<br>
>>>>> EPSCanvas #()<br>
>>>>> RemoteCanvas #(''innerClipRect'' ''outerClipRect'' ''transform''<br>
>>>>> ''connection'' ''shadowColor'')'<br>
>>>>><br>
>>>><br>
>>><br>
>><br>
><br>
><br>
><br>
<br>
</div></div></blockquote></div><br></div>