<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p>Hi Milan,</p>
    <p>(inline)</p>
    <blockquote type="cite"
      cite="mid:2f04f5df-9333-4ee6-8eee-c217e6932415@cuis.st">
      <div class="moz-forward-container"><br>
        <meta http-equiv="content-type"
          content="text/html; charset=UTF-8">
        Hello Juan,
        <div><br>
        </div>
        <div>thank you for your kind words. Live demo is always the best
          showcase of some work. Though I will do better job at
          narration next time. Personal target = zero filler words. :)</div>
      </div>
    </blockquote>
    <p>If you ask me, filler words are OK. Not everyone needs to be an
      absolute pro at presentations.</p>
    <p>What I think is more important, though, is to be careful with the
      assertions made. Youtube keeps videos for a long time, way long
      after any context is lost. Talk that suggest Cuis not having
      usability, not supporting emoji, calling it "the damn thing", etc.
      will be taken literally by many. The best place to be harsh is
      here. Being polite is welcome, but if someone is not polite in the
      mail list, they will get an appropriate answer, that will also be
      part of the thread in the archive. No harm done then. But in media
      where context and responses may not be available, and may reach a
      wider uninformed audience, it is best to be careful with words.</p>
    <p><br>
    </p>
    <blockquote type="cite"
      cite="mid:2f04f5df-9333-4ee6-8eee-c217e6932415@cuis.st">
      <div class="moz-forward-container">
        <div><br>
        </div>
        <div>One thing that really bugs me (and I can't seem to find a
          definitive answer) is the `DisplayScreen hostOSScaleFactor`
          usage. Since I am designing in Figma, all pixel-sized values
          (extents, insets, stroke widths, corner radii, gaps, padding,
          font size, line height, etc.) have to be scaled by that
          factor. Example:</div>
        <div><br>
        </div>
        <div>```smalltalk</div>
        <div>
          <div>initialize</div>
          <div>    | s |</div>
          <div>    super initialize.</div>
          <div>    s := DisplayScreen hostOSScaleFactor.</div>
          <div>    cellSize := 64 * s.</div>
          <div>    cornerRadius := 16 * s.</div>
          <div>    padding := 8 * s.</div>
          <div>    ...</div>
        </div>
        <div>```</div>
        <div>This feels very, very wrong. I would expect `world scale`
          (or some other approach) to do that automatically. Hm, I'll
          try that.</div>
      </div>
    </blockquote>
    <p>Well, of course the root problem here is that we don't have any
      indication of the real size of the pixels we're given. So we
      should improve, but we don't have real guarantees of what "ten
      pixels" really mean. For instance, set Cuis to Full Screen and the
      compare `Display extent` with whatever the OS says about display
      resolution, and with the phisical specs of the display. Apple made
      a big mess here. And AFAIK no desktop OS has a good api to query
      what's the actual size of a pixel.</p>
    <p>In any case, using #hostOSScaleFactor seems reasonable. One way
      is do what you did. Another one is to scale your morphs, perhaps
      when opening. Another is what most Cuis tools do, call `FontFamily
      defaultPointSize` to adapt size of elements to user preference.
      Scaling the whole world is possible too, although we generally
      prefer to size elements with `FontFamily defaultPointSize`, and
      drawing a scale = 1. This gives best drawing performance.</p>
    <br>
    <blockquote type="cite"
      cite="mid:2f04f5df-9333-4ee6-8eee-c217e6932415@cuis.st">
      <div class="moz-forward-container">
        <div>—</div>
        <div><br>
        </div>
        <div>Thank you for fixing the switched hyphen and dash!</div>
      </div>
    </blockquote>
    <p>Thanks for bringing up the issue! The fix will be useful to many.</p>
    <p><br>
    </p>
    <blockquote type="cite"
      cite="mid:2f04f5df-9333-4ee6-8eee-c217e6932415@cuis.st">
      <div class="moz-forward-container">
        <div>—</div>
        <div><br>
        </div>
        <div>Gradients and blend modes: I found that blend modes are
          available only via BitBlt, not Vector Engine. Are gradients
          and blend modes something you think would be useful?</div>
      </div>
    </blockquote>
    <p>I tried to keep the API small and relevant, and expand it as
      needs arise. I think that blend modes are not really necesary if
      we handle transparency of stroke and fill colors correctly. Do we
      have a use case for a "blend mode" feature?</p>
    <p>WRT gradients, something similar happens. They are part of the
      SVG standard, but they make everything look like it is over 20
      years old and they are not very used nowadays. Is there any actual
      need for them? I think having textures would be much more useful
      and interesting.</p>
    <p><br>
    </p>
    <blockquote type="cite"
      cite="mid:2f04f5df-9333-4ee6-8eee-c217e6932415@cuis.st">
      <div class="moz-forward-container">
        <div><br>
        </div>
        <div>—</div>
        <div><br>
        </div>
        <div>I am not going to comment on rasterizer output as I haven't
          understood the pre-filtering paper yet.</div>
      </div>
    </blockquote>
    <p>No real need to read the paper, although it is good to read it.
      All you need is to render the same SVG file with Cuis and any
      other renderer and compare.</p>
    <p>The filter widh used is configurable. Edit
      VectorEngineWithPluginWholePixel >>
      #defaultAntiAliasingWidth, then resize the main Cuis window for
      the change to take effect. Instead of 1.6, something like 4 will
      be much smoother. Try 1.2. It still won't be too pixelated, but it
      will be closer to what other renderers do. 1.0 will be still
      crispier, but pixellation starts to be quite visible.</p>
    <p>Play with the VectorEngine 'experiments' class side methods.</p>
    <p>If you're really interested in this stuff, after a quick read of
      the paper you can start hacking VectorEngineSmalltalk. I promise
      you'll have a lot of fun.</p>
    <p><br>
    </p>
    <blockquote type="cite"
      cite="mid:2f04f5df-9333-4ee6-8eee-c217e6932415@cuis.st">
      <div class="moz-forward-container">
        <div>—</div>
        <div><br>
        </div>
        <div>I think code for `spanBottom` has a bug:</div>
        <div><br>
        </div>
        <div>```smalltalk</div>
        <div>
          <div>!VectorEnginePlugin methodsFor: 'accessing' stamp: 'jmv
            3/10/2021 10:53:54'!</div>
          <div>spanBottom</div>
          <div><span class="Apple-tab-span" style="white-space:pre">    </span>self</div>
          <div><span class="Apple-tab-span" style="white-space:pre">            </span>primitive:
            'primSpanBottom'</div>
          <div><span class="Apple-tab-span" style="white-space:pre">            </span>parameters:
            #().</div>
          <div><br>
          </div>
          <div><span class="Apple-tab-span" style="white-space:pre">    </span>^(spanBottom
            + auxStrokeWidthDilatedHalf) asInteger asOop: SmallInteger.!
            !</div>
        </div>
        <div>```</div>
        <div><br>
        </div>
        <div>Compare that to `spanRight`:</div>
        <div><br>
        </div>
        <div>```smalltalk</div>
        <div>
          <div>!VectorEnginePlugin methodsFor: 'accessing' stamp: 'jmv
            4/6/2021 16:13:38'!</div>
          <div>spanRight</div>
          <div><span class="Apple-tab-span" style="white-space:pre">    </span>self</div>
          <div><span class="Apple-tab-span" style="white-space:pre">            </span>primitive:
            'primSpanRight'</div>
          <div><span class="Apple-tab-span" style="white-space:pre">            </span>parameters:
            #().</div>
          <div><br>
          </div>
          <div><span class="Apple-tab-span" style="white-space:pre">    </span>"Make
            room not just for updated mask, but also edges (hence, +1)"</div>
          <div><span class="Apple-tab-span" style="white-space:pre">    </span>^(spanRight
            + auxStrokeWidthDilatedHalf + subPixelDelta) asInteger +1
            asOop: SmallInteger.! !</div>
        </div>
        <div>```</div>
        <div><br>
        </div>
        <div>Bottom edge (the anti-aliased pixels) of the Dock was being
          cut off, and I traced it to that method. I can't really tell
          if "+1" in `spanBottom` is intentional omission or not.</div>
      </div>
    </blockquote>
    <p>Most likely this is a bug in your code. Read the 'Note:' in class
      comment of BoxMorph. Read the comments at #submorphsMightProtrude.</p>
    <p><br>
    </p>
    <blockquote type="cite"
      cite="mid:2f04f5df-9333-4ee6-8eee-c217e6932415@cuis.st">
      <div class="moz-forward-container">
        <div>—</div>
        <div><br>
        </div>
        <div>I think that is a lot of questions for today, thank you for
          taking the interest.</div>
      </div>
    </blockquote>
    <p>A few further notes:</p>
    <p>- Font subtitution: Yes. We need this. If someone volunteers to
      work on this they will have by full support.</p>
    <p>- Shadows and Vector Feathering. If someone is interested enough
      to work on it, it could be done.</p>
    <p>For other issues mentioned in your video, you may bring them up
      here anytime.</p>
    <br>
    <blockquote type="cite"
      cite="mid:2f04f5df-9333-4ee6-8eee-c217e6932415@cuis.st">
      <div class="moz-forward-container">
        <div><br>
        </div>
        <div>—</div>
        <div><br>
        </div>
        <div>The main contribution of Blueprint should be non-code in
          nature. Rather, to show that software revolution is happening
          (code agents) and Smalltalk is the ideal vehicle for it. I put
          together this short guide – <a
href="https://gist.github.com/mlajtos/e6f86323507ed30877b35f9f1f64fb37"
            moz-do-not-send="true" class="moz-txt-link-freetext">https://gist.github.com/mlajtos/e6f86323507ed30877b35f9f1f64fb37</a> –
          to bootstrap the Claude Code – Cuis bridge, so anyone can
          leverage this. (Please report any issues you have with it.) I
          bet real Smalltalker can do wonders with it! Think cheap
          massive refactorings, automatic Smalltalk to Slang
          translation, recovering borked images, easy enriching
          Smalltalk class environment – new data structures, algorithms,
          systems, etc.</div>
        <div><br>
        </div>
        <div>For hot-air balloon sky is the limit. Smalltalk with code
          agent is more akin to space-faring rocket. Please adjust your
          ambitions. :)</div>
      </div>
    </blockquote>
    <p>I'm sure many people will have a lot of fun with this. Kudos.</p>
    <p>Cheers,</p>
    <pre class="moz-signature" cols="72">-- 
Juan Vuletich
<a class="moz-txt-link-abbreviated" href="http://www.cuis.st">www.cuis.st</a>
github.com/jvuletich
researchgate.net/profile/Juan-Vuletich
independent.academia.edu/JuanVuletich
patents.justia.com/inventor/juan-manuel-vuletich</pre>
  </body>
</html>