[HN Gopher] Show HN: Forma - An efficient vector-graphics renderer
       ___________________________________________________________________
        
       Show HN: Forma - An efficient vector-graphics renderer
        
       Author : dragostis
       Score  : 179 points
       Date   : 2022-12-16 15:53 UTC (7 hours ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | Zaskoda wrote:
       | I hope this makes its way into web browser rendering. I've been
       | working on a "game engine" using SVG in the browser. When I
       | started, everything I read said don't - because performance.
       | However, manipulating an SVG using a reactive framework (I use
       | Vue) makes for very readable code. Our game client is meant to be
       | a "reference" client so readability is more important than
       | performance, which just needs to be "good enough." However, a
       | significant boost in SVG rendering performance would be amazing.
       | 
       | edit: although, as I look more deeply, I may be misunderstanding
       | and this may not be something that would benefit existing SVG
       | browser rendering in any way...
        
       | simonw wrote:
       | The README mentions WebGPU - do you have a URL to a demo of this
       | running in the browser using WebAssembly?
        
         | dragostis wrote:
         | It's quite easy to get the CPU back-end running with WASM. GPU
         | might work as well with Chrome Canary, but I haven't tested it
         | yet. Using WebGPU should make this just as easy.
        
       | TheRealPomax wrote:
       | Slightly curious why it's on the google github account, if it's
       | not an official google project, or even endorsed by google?
       | Surely this should live over on github.com/dragostis/forma then?
        
         | cmrdporcupine wrote:
         | If you're a Google employee, there's a few different paths to
         | 'legally' open sourcing stuff without violating your employment
         | contract. The simplest and fastest one is just to assign
         | copyright to Google, use an approved license (basically
         | anything non-copyleft) and stick it under the google/ github
         | org. It being there doesn't mean Google sponsored or authored
         | it, just that a Googler worked/works on it. And the "not
         | official Google product" text is mandatory in the README.
         | 
         | There are other processes that allow you to retain copyright
         | for yourself, but they require approval process.
         | 
         | (I used to work at Google, and have followed this process
         | before.)
        
           | wmf wrote:
           | Putting "not official Google products" under
           | github.com/google is the dumbest policy. I wonder why they
           | don't realize/care about this.
        
             | cmrdporcupine wrote:
             | Yeah, I suppose they could create a separate org, "Google
             | Open Source" and put it there, but probably they'd like to
             | reserve the right to own and then change the "not official"
             | to "official" whenever they please.
             | 
             | There are many lawyers and such at Google who think about
             | these things more intensely than you and I do. I'm sure
             | they have looked at all angles.
             | 
             | EDIT: I do find it amusing to watch HN and other forums
             | whenever something new and interesting is dumped under the
             | /google org and people need to be convinced it's not some
             | radical new direction Google is taking. But I've also been
             | wrong before. I dismissed Fuchsia as a personal hobby
             | project that grew out of control, until it grew out of
             | control enough that it rm -r'd everything I'd been working
             | on for 2+ years.
        
           | afandian wrote:
           | When you leave employment at Google do you typically retain
           | your github account and contribution rights to the repo?
        
             | cmrdporcupine wrote:
             | Most people I think just use their personal github but join
             | the Google org. And then you get booted from it when you
             | quit.
             | 
             | Commit rights, I'm actually not clear on, but by default I
             | think you'd lose rights. I believe there's likely a process
             | for keeping them,, but I don't recall what it is. The one
             | repo I contributed to that followed this process was
             | essentially abandoned long before I left Google.
        
               | afandian wrote:
               | Thanks, that's interesting. Is any production Google code
               | written this way, or is it only Google-adjacent open
               | source?
        
               | cmrdporcupine wrote:
               | There are definitely things under the google github org
               | that are used in production, though they are typically
               | mirrored from Google3 in some way. But not sure what, if
               | any, has its origins in a personal open source projects.
        
               | zem wrote:
               | i work on https://github.com/google/pytype which is
               | largely developed internally and then pushed to github
               | every few days. the github commits are associated with
               | the team's personal github accounts. pytype is not an
               | "official google _product_ " insofar as the open source
               | version is presented as is without official google
               | support, but it is "production code" in the sense that it
               | is very much used extensively within google.
        
       | screwreg wrote:
       | Please, write more about the implementation! There is so little
       | information on this topic in general.
       | 
       | Like, how does sorting pixel segments result in coverage masks?
       | Is there an accumulator somewhere that isn't mentioned?
        
       | programmarchy wrote:
       | This is cool. Being able to render SVG animations natively,
       | without having to embed a browser, is awesome.
       | 
       | The map of Paris rendered in 40ms on my M1 Air which is crazy
       | considering it's a 14MB file with tons of overlapping shapes.
       | 
       | I'm guessing supporting stroke is difficult because you would
       | need to ultimately convert them to shapes which can travel
       | through the pipeline.
        
         | pcwalton wrote:
         | Converting strokes to fills isn't that hard conceptually and
         | it's what Pathfinder did. Most of the work is just supporting
         | all the stroke features that SVG supports (joins, caps, dashes,
         | etc.)
        
       | junon wrote:
       | Neat. Just in time for a project I'm working on. Thanks for
       | sharing!
        
       | Waterluvian wrote:
       | A while ago I wanted to make some vector-based toy games for fun.
       | I surveyed the available options and basically couldn't find any.
       | If an engine supports vector graphics, it wants to rasterize them
       | ASAP. If I asked online, the general answer was, "GPUs are for
       | rasters, it gets rasterized one way or another. So just do that."
       | 
       | I dunno. I'm not that bright. I don't fully understand it all.
       | But I feel like it should be easy to say, "here's some SVG files
       | for my toy 2D game. I expect they'll scale infinitely well when I
       | zoom the viewport" but alas it was such a migraine with
       | PhaserJS/PixiJs, Godot, and Unity3D.
       | 
       | I'm excited about any sort of project to get you vector graphics
       | as close to the metal as possible before being rasterized
       | (ideally upon draw to the graphics buffer)
        
         | zozbot234 wrote:
         | > I'm excited about any sort of project to get you vector
         | graphics as close to the metal as possible before being
         | rasterized
         | 
         | Get a NeXT workstation and use Display Postscript?
        
           | Waterluvian wrote:
           | Don't suggest such brilliantly horrible ideas during the
           | beginning of my three week holiday... must resist urge to
           | wander eBay.
        
       | matlin wrote:
       | I'm curious how this relates to Skia (the library that handles
       | cross-platform rendering for Chrome and Flutter). Seems like this
       | could be an alternative backend but also could serve as faster
       | replacement?
        
         | dragostis wrote:
         | forma is geared towards vector-graphics heavy use cases. A very
         | good example would be Lottie or Rive animations or games that
         | make use of vector graphics. Another possible use case would be
         | places where you need a very small software renderer, like an
         | OS's early boot.
        
           | adamrezich wrote:
           | about a decade ago I wanted to get started prototyping
           | gameplay with vector graphics and I was dismayed at the state
           | of available libraries to do this efficiently. I'm glad
           | things seem to be getting much better in this space!
        
       | raphlinus wrote:
       | I'm very happy to see this work! The era of rendering vector
       | graphics in GPU compute shaders is upon us, and I have no doubt
       | it we'll start seeing these in production soon, as there's just
       | such a performance advantage over CPU rendering, and I believe
       | trying to run vector 2D graphics through the GPU rasterization
       | pipeline doesn't quite work.
       | 
       | This code is simpler than Vello (the new name for piet-gpu),
       | focused on vector path rendering. It's also a strong demo of the
       | power of WebGPU, while also having a performant software-only
       | pipeline. I definitely encourage people to take a closer look.
        
         | [deleted]
        
         | gct wrote:
         | Haven't Skia et al been GPU accelerated for ages?
        
           | [deleted]
        
           | jahewson wrote:
           | Yes, Skia uses the traditional method of tessellating path
           | geometry on the CPU and then having the GPU handle
           | transforming and shading it as if it were 3D geometry.
           | Compare that with what we see here, which uses compute
           | shaders for the whole process.
        
         | dragostis wrote:
         | Thank you for the endorsement. Looking forward to collaborating
         | more with you on 2D graphics.
        
           | nerpderp82 wrote:
           | How does this compare to https://github.com/RazrFalcon/resvg
           | ?
        
             | mkl wrote:
             | That's a different kind of thing, I think. It renders using
             | tiny-skia, so probably comparing to tiny-skia would be more
             | appropriate? It also sounds like resvg's renderer can be
             | swapped out, so it may be possible to have it render with
             | Forma.
        
               | nerpderp82 wrote:
               | That sounds neat.
        
         | tsuru wrote:
         | I saw google, I saw Rust, and I was betting it was you. I lost
         | my bet but still happy to see it!
        
       | phkahler wrote:
       | Mozilla peeps, is it conceivable that this could eventually get
       | into firefox, or is it not the right fit in some way.
       | 
       | There was a recent discussion about map rendering and I commented
       | to "just convert to SVG and let the browser render it" to which
       | someone said that's too slow, to which I said "so improve the
       | browsers vector rendering" rather than do a high performance
       | renderer just for map software.
        
         | bepvte wrote:
         | You might be interested in https://github.com/servo/pathfinder
        
         | seanw444 wrote:
         | Was this conversation about OsmAnd+ by chance? Because that
         | could use something like this.
         | 
         | Edit: glossed over the "browser" part. My bad.
        
           | xxswagmasterxx wrote:
           | I wonder why their renderer is so slow. Organic Maps is super
           | fast and smooth on my phone, though.
        
       | tayistay wrote:
       | > Line segments are transformed into pixel segments by
       | intersecting them with the pixel grid. We developed a simple
       | method that performs this computation in O(1) and which is run in
       | parallel.
       | 
       | What's a pixel segment exactly? Just a list of pixel coordinates
       | that intersect?
        
         | dragostis wrote:
         | A pixel segment is a line segment that fits inside of a pixel's
         | square box. It can start and end anywhere inside of this 1x1
         | square box and it has a 64bit compact representation.
        
         | 323 wrote:
         | I don't know for sure, but I suspect a list of consecutive
         | horizontal pixels (no diagonal).
        
       | AlbertoGP wrote:
       | I've just filed an issue
       | (https://github.com/google/forma/issues/11) describing how, on an
       | old GPU (AMD 7990) but using the CPU device, it fails to start.
       | 
       | This looks like an issue with wgpu-rs, but am I wrong in assuming
       | that the CPU device would work regardless of the graphic card?
        
         | revilotom wrote:
         | Nice to hear someone else still rocking the 7990
        
       ___________________________________________________________________
       (page generated 2022-12-16 23:00 UTC)