<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>