\9 \9 \9 \9 \9 \9 \9 \9 ");width:.75em;height:.75em;margin-bottom:-.1em;margin-left:.25em;display:inline-block}@media screen and (width<=1200px){body>.page header nav .row .left,body>.page header nav .row .right{--height:50px;--button-padding:16px;--nav-font-size:24px;gap:30px}}@media screen and (width<=1000px){body>.page header nav .row .left,body>.page header nav .row .right{--button-padding:14px;--nav-font-size:20px;gap:30px}}@media print,screen and (width<=900px){body>.page header nav .row .left,body>.page header nav .row .right{--height:40px;--button-padding:13px;--nav-font-size:18px;gap:20px}}@media print,screen and (width<=780px){body>.page header nav .row .left,body>.page header nav .row .right{--button-padding:12px;--nav-font-size:16px;gap:20px}}@media screen and (width<=680px){body>.page header nav .row .left,body>.page header nav .row .right{--height:30px;--button-padding:8px;--nav-font-size:14px;gap:16px}}@media screen and (width<=580px){body>.page header nav .row .left,body>.page header nav .row .right{--height:24px;--nav-font-size:13px;gap:12px}}@media screen and (width<=520px){body>.page header nav .row .left,body>.page header nav .row .right{--height:22px;--button-padding:6px;--nav-font-size:12px;gap:10px}}@media screen and (width<=460px){body>.page header nav .row .left,body>.page header nav .row .right{--height:20px;--button-padding:4px;--nav-font-size:11px;gap:8px}}@media screen and (width<=420px){body>.page header nav .row .left,body>.page header nav .row .right{--nav-font-size:10px;gap:6px}}@media screen and (width<=380px){body>.page header nav .row .left,body>.page header nav .row .right{--nav-font-size:9px;gap:6px}}@media screen and (width<=350px){body>.page header nav .row .left,body>.page header nav .row .right{--nav-font-size:8px;gap:6px}}body>.page header .ripple{fill:#fff;stroke:currentColor;--ripple-height:16px;height:var(--ripple-height);margin-top:calc(-1*var(--ripple-height) + var(--border-thickness));margin-bottom:calc(-1*var(--border-thickness));stroke-width:var(--border-thickness);background:0 0;display:block}body>.page header .ripple:before,body>.page header .ripple:after{content:none}body>.page header hr{background:0 0}@media screen and (width<=1400px){body>.page header .ripple{width:calc(100% + var(--page-edge-padding)*2);margin-left:calc(-1*var(--page-edge-padding));margin-right:calc(-1*var(--page-edge-padding))}body>.page header hr{display:none}}body>.page main{padding:calc(120*var(--variable-px))var(--page-edge-padding)}body>.page main>section{max-width:var(--max-width);z-index:1;margin-left:auto;margin-right:auto;position:relative}body>.page main>section~section{margin-top:calc(120*var(--variable-px))}body>.page main>section p img{max-width:100%}body>.page main>section pre{box-sizing:border-box;overflow:auto}body>.page main>section details{width:100%}body>.page main>section details summary{padding-left:18px;font-weight:800;display:inline-block;position:relative}body>.page main>section details summary:before{content:"";background:url("data:image/svg+xml;utf8,\9 \9 \9 \9 \9 \9 \9 \9 \9 \9 \9 \9 \9 \9 ");width:10px;height:10px;margin:auto;position:absolute;top:0;bottom:0;left:0}body>.page main>section details summary+*{margin-top:20px}body>.page main>section details[open] summary:before{transform:rotate(90deg)}body>.page footer{color:var(--color-walnut);flex-direction:column;align-items:center;padding:0 40px 40px;display:flex}@media screen and (width<=1400px){body>.page footer hr{width:100%}body>.page footer hr:before,body>.page footer hr:after{width:calc(var(--page-edge-padding) + 40px);height:var(--border-thickness);background:currentColor;border:none}}body>.page footer nav{flex-wrap:wrap;justify-content:center;gap:8px 40px;margin-top:40px;display:flex}body>.page footer nav a{color:var(--color-walnut)}@media screen and (width<=900px){body>.page footer nav{max-width:500px}}@media screen and (width<=780px){body>.page footer nav{max-width:440px}}@media screen and (width<=400px){body>.page footer nav{gap:6px 20px}}body>.page footer span{text-align:center;margin-top:40px}:is(h1,h2,h3,h4,article>:first-child,details>summary)~:is(p,ul,ol,ol li p,img,a:has(>img:only-child)),:is(h1,h2,h3,h4,article>:first-child)~:is(ul,ol) li p+img,:is(h1,h2,h3,h4,p)~.feature-icons,p~:is(h1,h2,h3,h4,details summary,blockquote,.image-comparison,.video-background,.youtube-embed),.youtube-embed+:is(p,.link,.button),p+p>.button,p+:is(.link,section,details),table td p~p,img+.link,article{margin-top:20px}*{min-width:0;min-height:0}h1{font-feature-settings:"lnum";margin:0;font-family:Bona Nova,Palatino,serif;font-size:2.66667rem;font-weight:700;line-height:1.25;display:inline-block}h1~h2{margin-top:40px}h1~hr{margin-top:40px;margin-bottom:20px}h2,h3,h4,h5,h6{margin:0;font-family:Inter,sans-serif;font-weight:800;line-height:1.5;display:inline-block}h2{font-size:1.77778rem;font-weight:700}h3{font-size:1.33333rem}h4,h5,h6{font-size:1rem}p{text-align:justify;text-justify:inter-character;-webkit-hyphens:auto;hyphens:auto;margin:0}p code{text-justify:auto}h1~img,h1~iframe,h1~a>img:only-child,h2~img,h2~iframe,h2~a>img:only-child,h3~img,h3~iframe,h3~a>img:only-child,h4~img,h4~iframe,h4~a>img:only-child,h5~img,h5~iframe,h5~a>img:only-child,h6~img,h6~iframe,h6~a>img:only-child,p~img,p~iframe,p~a>img:only-child{width:100%;height:auto}a{color:var(--color-crimson)}img{vertical-align:top}table{width:calc(100% + 40px);margin:20px -20px}table th,table td{vertical-align:top;border:20px solid #0000;margin:0;padding:0}table th:not(:first-child) img,table td:not(:first-child) img{max-width:100%}table th:empty{border:none}:is(h1,h2,h3,h4,h5,h6)+table{margin-top:0}ul,ol{margin:0}ul+p,ol+p{margin-top:0}ul li,ol li{margin-top:.5em}hr{color:unset}code{color:#000;background:var(--color-fog);overflow-wrap:anywhere;-webkit-hyphens:none;hyphens:none;padding:0 4px}a code{color:var(--color-crimson)}kbd{outline:calc(var(--border-thickness)/2)solid var(--color-navy);color:inherit;margin:0 4px;padding:0 8px;font-family:inherit}summary{cursor:pointer}hr{overflow:visible}hr,.ripple{height:var(--border-thickness);background:currentColor;border:none;width:calc(100% - 64px);margin:0 32px;position:relative}hr:before,.ripple:before{border-width:0 0 var(--border-thickness)40px;left:-40px}hr:after,.ripple:after{border-width:0 40px var(--border-thickness)0;right:-40px}hr:before,hr:after,.ripple:before,.ripple:after{content:"";border-style:solid;border-color:#0000 #0000 currentColor;width:0;height:0;display:block;position:absolute}.block{flex-direction:column;align-items:flex-start;width:100%;display:flex}.block.centered{align-items:center}:not(.diptych,.triptych)>.block+.block{margin-top:calc(120*var(--variable-px))}.link{font-size:var(--font-size-link);color:var(--color-crimson);white-space:nowrap;font-weight:800;text-decoration:none;display:inline-block}.link:not(.not-uppercase){text-transform:uppercase}.button{border:var(--border-thickness)solid currentColor;min-height:calc(var(--font-size-link)*2);font-size:var(--font-size-link);padding:0 var(--font-size-link);box-sizing:border-box;text-align:left;color:var(--color-crimson);font-weight:800;text-decoration:none;display:inline-block}.button:before{content:"";line-height:calc(var(--font-size-link)*2 - 2*var(--border-thickness))}.button img{height:calc(var(--font-size-link)*1.5);margin-right:calc(var(--font-size-link)/2)}.button img,.button span{vertical-align:middle}.arrow:after{content:" »";font-family:Inter,sans-serif}.video-background{font-size:0;position:relative}.video-background video{max-width:min(100%,1280px)}.video-background:after{content:"";pointer-events:none;border:2px solid #fff;position:absolute;inset:0}
Graphite progress report (Q2 2024)
By Keavon Chambers & Hypercube. July 31, 2024.
Graphite, a new open source 2D procedural graphics editor, has spent April–June introducing boolean path operations, a new gradient picker, layer locking, and more improvements.
Overall, editor functionality has been shaping up and becoming an all around useful tool suite, with notable reductions in rough edges for the vector graphics workflow (our initial focus). Raster and raw photo processing workflows are also now in-development by our Google Summer of Code student interns. Node graph quality-of-life improvements centered around tidy node organization are also the focus of the summer work that's underway. These projects are detailed below.
This is the second of our quarterly progress report blog posts. If you missed the first one, be sure to check it out as well. If you'd like to help speed up future progress, please consider getting involved with code, QA/bug testing, or art/marketing projects. Donations are also valued, as are stars on GitHub. Follow along and partake in our Discord community, too.
All Q2 2024 commits may be viewed in this list and all noteworthy changes are detailed below. To showcase the much anticipated introduction of boolean path operations, the new Painted Dreams artwork shown here extensively utilizes nondestructive booleans.
Area and Centroid nodes which calculate a shape's interior size and center of mass, respectively (#1729, #1749)
Boolean Operation node for combining two shape paths with a Union, Subtract Front, Subtract Back, Intersect, or Difference mode of cutting and combining (#1759)
Labels for artboard names displayed in the viewport (#1795)
Dennis Kobert's Google Summer of Code project has begun adding raster editing infrastructure centered around GPU acceleration — to date this has included:
Rasterize node for converting graphical content (like vector art) into an image within a chosen area and resolution scale (#1755)
Weekly updates are being posted while the project is ongoing
Elbert Ronnie's Google Summer of Code project has begun building a library for decoding raw image formats, with the goal of supporting photo processing in Graphite once the project is completed — to date this has included:
Initial code foundations including a basic custom TIFF decoder (#1757)
Initial decoder for Sony ARW data encoding formats (#1775, #1776)
Weekly updates are being posted while the project is ongoing
Adam Gerhant's Google Summer of Code project has begun upgrading the node graph UI capabilities, quality-of-life features, and automatic layout management — to date this has included:
Support for viewing and editing subgraphs by double-clicking nodes with internal node networks (#1750)
Extended support for navigating the graph just like the viewport (with autopanning on dragging near edges, working scrollbars, and zooming shortcuts) by migrating interaction code to the backend (#1768, #1790)
Weekly updates are being posted while the project is ongoing
Fixes
Polished up design for the Layers panel (commit 938a688)
Inclusion of alpha in the Extract Channel node and removal of the now-redundant Extract Alpha node (#1731)
Fixed interactive outlining of layers within the Select tool's box selection (#1727)
Insertion of duplicated layers directly above their selected source layers (#1726)