[{"data":1,"prerenderedAt":386},["ShallowReactive",2],{"project-34015953":3},{"id":4,"name":5,"line":6,"line_source":7,"title":8,"url":9,"domain":10,"maker":11,"posted_at":12,"year":13,"points":14,"comments":15,"rank_in_year":16,"shown_in_year":17,"top":18,"tier":19,"category":20,"subcategory":21,"format":22,"keywords":23,"reception":29,"sentiment":30,"stance_mix":31,"scored_comments":36,"aspects":37,"strip":43,"post_text":47,"what":48,"said":89,"maker_in_thread":190,"shape":199,"grid":203,"attempts":348,"same_week":349,"maker_shows":45,"maker_hidden":378,"reader_version":379,"card":380},"34015953","Forma","An efficient vector-graphics renderer","title","Show HN: Forma – An efficient vector-graphics renderer","https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fforma","github.com","dragostis",1671206029,2022,291,58,148,2570,6,"legend","languages","graphics rendering library","library",[24,25,26,27,28],"vector graphics","gpu rendering","webgpu","compute shaders","svg rendering","curious",0.243,{"positive":32,"neutral":33,"mixed":34,"critical":35},7,13,0,2,22,{"performance":38,"execution":40,"idea":41,"docs":42},{"positive":39,"critical":34},4,{"positive":34,"critical":35},{"positive":35,"critical":34},{"positive":34,"critical":34},[44,34,45,34,46,45,44,34,45,34,34,34,34,34,44,34,34,44,34,45,46,45,34,44,34,45,34,45,44,45,34,45,34,34,34,34,34,34,34,44],5,3,1,null,{"problem":49,"audience":56,"pricing":47,"motivation":47,"time_to_build":47,"stack":60,"openness":86,"stage":87,"team_size":88},{"value":50,"source":51,"evidence":52},"Rendering vector graphics efficiently, especially for animations and GPU-heavy use","maker",[53],{"id":54,"by":11,"text":55},"34016470","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…",{"value":57,"source":51,"evidence":58},"Developers needing fast vector rendering, such as Lottie or Rive animation and game makers",[59],{"id":54,"by":11,"text":55},[61,69,79],{"value":62,"source":63,"evidence":64},"Rust","commenter",[65],{"id":66,"by":67,"text":68},"34018545","tsuru","I saw google, I saw Rust, and I was betting it was you. I lost my bet but still happy to see it!",{"value":70,"source":51,"evidence":71},"WebGPU",[72,76],{"id":73,"by":74,"text":75},"34018835","simonw","The README mentions WebGPU - do you have a URL to a demo of this running in the browser using WebAssembly?",{"id":77,"by":11,"text":78},"34021696","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.",{"value":80,"source":63,"evidence":81},"wgpu",[82],{"id":83,"by":84,"text":85},"34017528","AlbertoGP","I’ve just filed an issue (https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fforma\u002Fissues\u002F11) describing how, on an old GPU (AMD 7990) but using the CPU device, it fails to start. This looks like an…","open_source","prototype","unknown",{"praise":90,"objections":113,"requests":129,"questions":141,"alternatives":163},[91,102],{"value":92,"source":63,"evidence":93},"Fast vector rendering on GPU compute; strong WebGPU demo",[94,98],{"id":95,"by":96,"text":97},"34016707","raphlinus","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…",{"id":99,"by":100,"text":101},"34016837","programmarchy","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…",{"value":103,"source":63,"evidence":104},"Could help games and animation tools needing vector graphics",[105,109],{"id":106,"by":107,"text":108},"34019439","Waterluvian","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…",{"id":110,"by":111,"text":112},"34018031","adamrezich","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…",[114,122],{"value":115,"source":63,"evidence":116},"Missing stroke support limits comparisons and use",[117,121],{"id":118,"by":119,"text":120},"34032378","CryZe","I just tried it in my own renderer (that uses tiny-skia) to compare performance, but unfortunately forma is still lacking some features to do a proper comparison (strokes, the…",{"id":99,"by":100,"text":101},{"value":123,"source":63,"evidence":124},"No browser demo available",[125,126],{"id":73,"by":74,"text":75},{"id":127,"by":74,"text":128},"34034556","Feature request: a demo URL that does that! I'm interested enough to click on a demo, but I'm not _quite_ interested enough to figure out what hoops I would need to jump through…",[130,134],{"value":131,"source":63,"evidence":132},"A demo URL running in the browser",[133],{"id":127,"by":74,"text":128},{"value":135,"source":63,"evidence":136},"More implementation detail in documentation",[137],{"id":138,"by":139,"text":140},"34020151","screwreg","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…",[142,153],{"value":143,"source":63,"evidence":144},"How it compares to Skia and tiny-skia",[145,149],{"id":146,"by":147,"text":148},"34016410","matlin","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…",{"id":150,"by":151,"text":152},"34019889","nerpderp82","How does this compare to https:\u002F\u002Fgithub.com\u002FRazrFalcon\u002Fresvg ?",{"value":154,"source":63,"evidence":155},"What a pixel segment and its sort order are",[156,160],{"id":157,"by":158,"text":159},"34020314","tayistay","> 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…",{"id":161,"by":158,"text":162},"34024539","Ok, and when you sort these pixel-contained segments, what's the ordering?",[164,175,179,186],{"value":165,"source":63,"evidence":166},"Skia",[167,171],{"id":168,"by":169,"text":170},"34019617","gct","Haven't Skia et al been GPU accelerated for ages?",{"id":172,"by":173,"text":174},"34020516","jahewson","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…",{"value":176,"source":63,"evidence":177},"resvg \u002F tiny-skia",[178],{"id":150,"by":151,"text":152},{"value":180,"source":63,"evidence":181},"Pathfinder",[182],{"id":183,"by":184,"text":185},"34019661","bepvte","You might be interested in https:\u002F\u002Fgithub.com\u002Fservo\u002Fpathfinder",{"value":187,"source":63,"evidence":188},"Vello (piet-gpu)",[189],{"id":95,"by":96,"text":97},{"comments":39,"answered":45,"key":191},[192,195,196],{"id":193,"text":194},"34016848","Thank you for the endorsement. Looking forward to collaborating more with you on 2D graphics.",{"id":54,"text":55},{"id":197,"text":198},"34021638","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.",{"commenters":200,"max_depth":18,"maker_replies":39,"first_comment_mins":201,"lifespan_hours":202},44,30,180,[204,206,208,210,214,216,218,220,221,224,226,229,232,236,240,243,245,248,250,251,254,257,259,262,264,267,270,273,276,278,279,282,283,284,285,288,291,293,296,298,299,302,304,306,308,309,312,313,317,320,323,325,327,329,332,336,338,340,343],[95,34,44,205,96,34],"project\u002Fpositive\u002Fperformance",[193,34,34,207,11,46],"maker\u002Fpositive\u002Fnone",[150,34,45,209,151,34],"project\u002Fneutral\u002Fnone",[211,34,34,212,213,34],"34021264","commenter\u002Fneutral\u002Fnone","mkl",[215,34,34,212,151,34],"34021578",[118,34,46,217,119,34],"project\u002Fcritical\u002Fexecution",[66,34,45,219,67,34],"maker\u002Fneutral\u002Fnone",[168,34,45,209,169,34],[222,34,44,205,223,34],"34019869","fathyb",[172,34,45,225,173,34],"project\u002Fneutral\u002Fidea",[227,34,34,212,228,34],"34022516","pcwalton",[230,46,45,225,231,34],"34016457","phkahler",[233,46,34,234,235,34],"34019041","other\u002Fneutral\u002Fnone","seanw444",[237,46,34,238,239,34],"34021689","other\u002Fneutral\u002Fperformance","xxswagmasterxx",[241,46,34,234,242,34],"34023056","nine_k",[244,46,34,238,235,34],"34053099",[246,46,34,234,247,34],"34027088","Self-Perfection",[249,46,34,234,235,34],"34053076",[183,46,34,234,184,34],[252,46,34,234,253,34],"34026970","timvisee",[255,46,34,234,256,34],"34028223","ReD_CoDE",[106,35,44,258,107,34],"project\u002Fpositive\u002Fidea",[260,35,34,234,261,34],"34019829","zozbot234",[263,35,34,234,107,34],"34020046",[265,35,34,234,266,34],"34023429","paul_manias",[268,45,44,205,269,34],"34020865","Zaskoda",[271,45,34,234,272,34],"34024458","danielvaughn",[274,45,34,234,275,34],"34025139","rawoke083600",[138,39,45,277,139,34],"project\u002Fneutral\u002Fdocs",[83,44,46,217,84,34],[280,44,34,212,281,34],"34018542","revilotom",[146,18,45,225,147,34],[54,18,34,225,11,46],[110,18,44,258,111,34],[286,18,45,225,287,34],"34022041","naasking",[289,18,34,234,290,34],"34047067","cercatrova",[157,32,45,292,158,34],"project\u002Fneutral\u002Fexecution",[294,32,34,212,295,34],"34020748","323",[197,32,34,297,11,46],"maker\u002Fneutral\u002Fexecution",[161,32,45,297,158,34],[300,32,34,212,301,34],"34113745","yangvz",[99,303,44,205,100,34],8,[305,303,45,292,228,34],"34018848",[73,307,45,209,74,34],9,[77,307,34,297,11,46],[310,307,34,212,311,34],"34022144","modeless",[127,307,45,277,74,34],[314,315,34,234,316,34],"34019113",10,"TheRealPomax",[318,315,34,234,319,34],"34019225","cmrdporcupine",[321,315,34,234,322,34],"34019326","afandian",[324,315,34,234,319,34],"34019883",[326,315,34,234,322,34],"34020736",[328,315,34,234,319,34],"34020949",[330,315,34,234,331,34],"34020997","zem",[333,315,34,334,335,34],"34020935","other\u002Fcritical\u002Fnone","wmf",[337,315,34,234,319,34],"34020986",[339,315,34,234,335,34],"34021912",[341,315,34,234,342,34],"34023752","kvark",[344,345,44,346,347,34],"34017620",11,"project\u002Fpositive\u002Fnone","junon",[],[350,355,360,365,369,374],{"id":351,"name":352,"points":353,"category":354},"34066824","Obsidian Canvas",1380,"productivity",{"id":356,"name":357,"points":358,"category":359},"34083366","Portable Secret",1290,"security_privacy",{"id":361,"name":362,"points":363,"category":364},"34035628","I made an Ethernet transceiver from logic gates",460,"hardware",{"id":366,"name":367,"points":368,"category":354},"34006202","Readwise Reader",326,{"id":370,"name":371,"points":372,"category":373},"34067109","paid link to",316,"web_saas",{"id":375,"name":376,"points":377,"category":354},"34034414","bramses highly opinionated vault 2023",258,false,"v2",{"id":381,"name":5,"line":6,"ai":378,"cat":20,"year":13,"points":14,"comments":15,"rec":29,"s":382,"top":18,"kw":383,"maker":11,"domain":10,"tier":19,"attempts":34,"strip":384,"url":9,"mix":385,"praise":92,"objection":115,"sub":21},34015953,0.24,[24,25,26,27,28],"5030135030000050050313050303530300000005",[32,33,34,35],1793991056655]