home.social

#letterset — Public Fediverse posts

Live and recent posts from across the Fediverse tagged #letterset, aggregated by home.social.

  1. Implemented my shared world canvas and multitouch-handler library, so now we have canvas pan, individual piece rotation, and (after a lot of effort) cutting of rotated pieces!

    The world canvas and multitouch handler were ripped out of #LetterSet into their own libraries, but I had only used their canonical version in #RandomForms, so this was a nice further use. Bonus: all testing for this has been done via my insane iOS-simulator-multitouch-mcp setup!

    #swiftui #BuildInPublic

  2. In the #LetterSet app, I have a library called paper-construction, which is used for creating construction and lined paper. I’m currently working on on on the opposite, paper-destruction, and it is lovely!

    #swiftui #BuildInPublic

  3. @Tinrocket @amyworrall if you’re up for it I’d read a folder of pdfs too. Full disclosure though: I do eventually want to make a drawing app based on the rulers I made for #LetterSet, so I understand if this is too close to home.

  4. @stroughtonsmith I have been working on a “WorldCanvas” library for just this, but it’s taken so much work:
    - a multi-gesture handler (for optionally simultaneous pan, zoom, rotate)
    - a reusable world, that can translate gestures and position from non-world objects to world objects
    - a testing framework for reliably testing both of the above, together

    These are all done separately and in use in #RandomForms, but I won’t be confident in their reusability until I upgrade #LetterSet to use them.

  5. Jesse James the #cat reminds us to always take time and smell the flowers! 🌼

    #Caturday #LetterSet #typography #flowers

  6. Test harnesses beget test harnesses.

    This recording shows a new playground I’ve made to test a new “World Canvas” library. The demo encapsulates all of the common UX patterns from #LetterSet and #wishyouwerehere:
    - multitouch-handler for simultaneous pan, rotate, zoom
    - shape-elasticity for metal effects
    - world-canvas for document-based pan / zoom / state
    - protocol-based sheets with optional metal rendering.

    #RandomForms #BuildInPublic #swiftui

  7. Test harnesses beget test harnesses.

    This recording shows a new playground I’ve made to test a new “World Canvas” library. The demo encapsulates all of the common UX patterns from #LetterSet and #wishyouwerehere:
    - multitouch-handler for simultaneous pan, rotate, zoom
    - shape-elasticity for metal effects
    - world-canvas for document-based pan / zoom / state
    - protocol-based sheets with optional metal rendering.

    #RandomForms #BuildInPublic #swiftui

  8. Test harnesses beget test harnesses.

    This recording shows a new playground I’ve made to test a new “World Canvas” library. The demo encapsulates all of the common UX patterns from #LetterSet and #wishyouwerehere:
    - multitouch-handler for simultaneous pan, rotate, zoom
    - shape-elasticity for metal effects
    - world-canvas for document-based pan / zoom / state
    - protocol-based sheets with optional metal rendering.

    #RandomForms #BuildInPublic #swiftui

  9. Test harnesses beget test harnesses.

    This recording shows a new playground I’ve made to test a new “World Canvas” library. The demo encapsulates all of the common UX patterns from #LetterSet and #wishyouwerehere:
    - multitouch-handler for simultaneous pan, rotate, zoom
    - shape-elasticity for metal effects
    - world-canvas for document-based pan / zoom / state
    - protocol-based sheets with optional metal rendering.

    #RandomForms #BuildInPublic #swiftui

  10. Test harnesses beget test harnesses.

    This recording shows a new playground I’ve made to test a new “World Canvas” library. The demo encapsulates all of the common UX patterns from #LetterSet and #wishyouwerehere:
    - multitouch-handler for simultaneous pan, rotate, zoom
    - shape-elasticity for metal effects
    - world-canvas for document-based pan / zoom / state
    - protocol-based sheets with optional metal rendering.

    #RandomForms #BuildInPublic #swiftui

  11. #LetterSet #typography

    Garamond has entered the chat in version 1.2.0, just for fun. Entertaining on an iPhone, quasi-useful on an iPad with pencil.

    This new version is now live in the App Store, and the font is part of the free version.

    letterset.app

  12. LetterSet 1.2.0 is live with all of the good stuff:
    - New rulers
    - New font (Garamond)
    - Higher quality authoring
    - More weird interactions (like the very subtle sheet deformations on touch)
    - Even a new iPad / macOS gesture for moving a sheet without rotation

    And of course, the same arduous design experience... except much faster!

    apps.apple.com/us/app/letter-s

    #LetterSet #BuildInPublic

  13. In other news, the upcoming 1.2.0 version of #LetterSet fixes a long-standing, hard-to-track bug regarding complex documents becoming fuzzy over time? I thought maybe it was a scale mismatch or compression issue, but it turns out it was just because I wasn’t explicitly snapping to a pixel grid for each operation! That tiny <0.5px inadvertent rounding step eventually makes the oldest characters look badly compressed. See attached for old/new.

    Fixed, finally!

    #BuildInPublic #swiftui

  14. Given all of the recent discussions, I decided to add Garamond into the latest builds of #LetterSet, and it looks good! Cc @gruber et al.

    Related: I never get tired of looking at the clear protractor.

  15. Ok a VERY toned down deformer now lives as part of the sheet. When you play with it, the surface of the paper dents around your finger as you move it, as well as drawing a gradient. The area under the touch remains flat and undistorted for accuracy.

    Also: clear protractor is the best protractor!

    Also: circle template and negative space drawing!

    Also: touching letters now lets you move a bit, rather than just tap.

    One more bug, then v1.2.0!

    #swiftui #metalshaders #BuildInPublic #LetterSet

  16. Now that the sheet is rendered with metal, I can experiment more…. But not all experiments are good ones. I implemented pressure sensitivity, but it is really distracting. Posting this for posterity, but I’ll either remove it or tone it WAY down.

    #BuildInPublic #LetterSet

  17. And now of course there is a #LetterSet playground in the works for rulers.

  18. Ruler now incorporates this secret third state. Transient masks are used to block pencil strokes from impacting the sheet and the underlying canvas. In English: a pencil can no longer draw under the ruler. The ruler behaves like an object in the real world!


    #PencilKit #BuildInPublic #LetterSet #swiftui

  19. Ruler now incorporates this secret third state. Transient masks are used to block pencil strokes from impacting the sheet and the underlying canvas. In English: a pencil can no longer draw under the ruler. The ruler behaves like an object in the real world!


    #PencilKit #BuildInPublic #LetterSet #swiftui

  20. Ruler now incorporates this secret third state. Transient masks are used to block pencil strokes from impacting the sheet and the underlying canvas. In English: a pencil can no longer draw under the ruler. The ruler behaves like an object in the real world!


    #PencilKit #BuildInPublic #LetterSet #swiftui

  21. Ruler now incorporates this secret third state. Transient masks are used to block pencil strokes from impacting the sheet and the underlying canvas. In English: a pencil can no longer draw under the ruler. The ruler behaves like an object in the real world!


    #PencilKit #BuildInPublic #LetterSet #swiftui

  22. Ruler now incorporates this secret third state. Transient masks are used to block pencil strokes from impacting the sheet and the underlying canvas. In English: a pencil can no longer draw under the ruler. The ruler behaves like an object in the real world!


    #PencilKit #BuildInPublic #LetterSet #swiftui

  23. @emorydunn
    I mean, it isn’t anywhere nearly as complex as a “roll my own TIFF implementation,” but wow is this stuff silly.

    #BuildInPublic #LetterSet #swiftui

  24. Now I have a third state within masking. Throughout the app, I have to track:
    -the current #PencilKit stroke
    -the sum of all strokes
    -the boundary of letters that have been tapped

    I track these in two ways, as the shape of the above as it applies to the sheet is different vs its orientation to the canvas. Then add undo history across both.

    Now: the idea of a transient object that blocks transfer to the canvas, but doesn’t impact the cumulative sheet mask.

    #BuildInPublic #LetterSet #swiftui

  25. Now I have a third state within masking. Throughout the app, I have to track:
    -the current #PencilKit stroke
    -the sum of all strokes
    -the boundary of letters that have been tapped

    I track these in two ways, as the shape of the above as it applies to the sheet is different vs its orientation to the canvas. Then add undo history across both.

    Now: the idea of a transient object that blocks transfer to the canvas, but doesn’t impact the cumulative sheet mask.

    #BuildInPublic #LetterSet #swiftui

  26. Now I have a third state within masking. Throughout the app, I have to track:
    -the current #PencilKit stroke
    -the sum of all strokes
    -the boundary of letters that have been tapped

    I track these in two ways, as the shape of the above as it applies to the sheet is different vs its orientation to the canvas. Then add undo history across both.

    Now: the idea of a transient object that blocks transfer to the canvas, but doesn’t impact the cumulative sheet mask.

    #BuildInPublic #LetterSet #swiftui

  27. Now I have a third state within masking. Throughout the app, I have to track:
    -the current #PencilKit stroke
    -the sum of all strokes
    -the boundary of letters that have been tapped

    I track these in two ways, as the shape of the above as it applies to the sheet is different vs its orientation to the canvas. Then add undo history across both.

    Now: the idea of a transient object that blocks transfer to the canvas, but doesn’t impact the cumulative sheet mask.

    #BuildInPublic #LetterSet #swiftui

  28. Now I have a third state within masking. Throughout the app, I have to track:
    -the current #PencilKit stroke
    -the sum of all strokes
    -the boundary of letters that have been tapped

    I track these in two ways, as the shape of the above as it applies to the sheet is different vs its orientation to the canvas. Then add undo history across both.

    Now: the idea of a transient object that blocks transfer to the canvas, but doesn’t impact the cumulative sheet mask.

    #BuildInPublic #LetterSet #swiftui

  29. I’ve spent my free time over the last week isolating my masking into a Mask Manager package, that exposed both mask and masking utilities: mask operations for manipulating various union and intersection strategies; masking operations for applying said strategies on actual images. This is the culmination of this work, a Mask Playground that shows mask buildup over time, with transient blockers.

    #BuildInPublic #LetterSet #swiftui

  30. Meanwhile, the ruler is a really fun tool as it stands. When in use, it becomes the only way to rotate a sheet. This lets you more accurately line up a word’s baseline as you zoom, so you can be more consistent with positioning… if you want!

    #BuildInPublic #LetterSet #swiftui

  31. Also, I’ve stuck to my goal of keeping all core features free, and will likely grant Season 1 entitlements to all omce Season 2 exists… whenever rhat is.

    In the meantime, there’s a menu option to hide premium features because I hate when features I use in tools advertise things I haven’t bought. Since all paid-for features are truly optional from the core experience, you can hide all mentions of them (except the preference to show/hide them) if you also hate this.

    #BuildInPublic #LetterSet

  32. Image handling is also greatly improved. You can crop after placing an image, resize behaves more reasonably, and masking parts of the image transfer perfectly, for the most bizarre #collage experience ever since Khoi Vinh’s Mixel. This crop/mask experience also works on the new paper types!

    #BuildInPublic #LetterSet #swiftui

  33. The paper generation uses #metalshaders, a first in production for me, and masking has evolved into an art. I now have a MaskManager in the sheet library, that handles three types of masks:
    - current, a mask of the active stroke
    - cumulative, a combined mask of all strokes
    - transient, as temporary mask of views that impact transfer

    Transient impact of the ruler is not yet implemented in the app, but the library supports it now.

    #BuildInPublic #LetterSet #swiftui

  34. From a technical perspective, the improvements are so numerous. Most interesting I think is a reenvisioned zoom (that can handle zooming out!), a new canvas display system, completely reengineered sheet mechanics, and a font->glyph->svg->patched drawing command pipeline, totally automated.

    I also built three standalone utilities, not including packages. Notably, my sheet author configuration utility act as a complete test tested for all of the type pipeline features.

    #LetterSet #swiftui

  35. I’m very happy to say that LetterSet v1.1.0 is now live in the App Store. 
This is a huge release that includes:
    - New, more flexible letter set sheets, that look more realistic, behave more predictably and have a greater selection of weights and variants
    - The start of the Season 1 featureset, including 5 custom paper types, and very fun ruler (for constraining the angle of letter sheets on mobile devices)
Please try it, and spread the word! letterSet.app/download
    #LetterSet #typography

  36. Rejected again because of section 3.1.1, the very section I presented on at @SwiftLeeds this year!

    In Apple’s defense, I did not follow the guidelines to have a “restore purchases” button; an honest mistake on my part as this is the first time that I’ve used non-consumable in-app purchases. They also offered to let me submit it as a bug fix without further review, but I declined so I could add the polish I had done since the last build.

    New build submitted now…

    #LetterSet #BuildInPublic

  37. I pulled the original build and re-submitted with the ruler. Hopefully this one makes it through!

    At this point though, I feel like "season 1" features are at least real:
    - Lined paper
    - Graph paper
    - Construction paper
    - Halftone
    - Screentone
    - Custom ruler

    I said at the beginning of the public beta that all of the actually core features in #LetterSet would remain free, and that only consider it for subsequent features. I feel like I'm making good on that promise.

  38. But at least I got to build a ruler tool in my free time? #LetterSet

  39. Rejected. Forgot to describe how to test the in-app purchase. On the positive side: this means my feature-gating is not insanely overbearing?

    Resubmitted.

    #LetterSet