github storytold/photocraft v0.11.1
PhotoCraft v0.11.1

3 hours ago

What's Changed

  • perf(canvas): a Properties-panel adjustment drag refreshes only the view, 4.2× faster (#6839) by @skylartaylor in #7155
  • Linux: Reveal never hands xdg-open a file (#7166) by @Higgs32584 in #7168
  • Stack Mode: Kurtosis and Skewness give the same bits on Windows and Linux by @dotCooCoo in #7126
  • Content-Aware Fill workspace, as Photoshop's by @Unemars in #2376
  • perf(stack): one loop per statistic, up to 2.2× faster, bit for bit the same by @nicolasfalesy in #7118
  • Trap: refuse locked layers (#5623) by @davidmann4 in #5624
  • Lens Flare: don't darken 32-bit pixels above 1.0 (#5785) by @davidmann4 in #5786
  • Duotone: view and flat export clamp ink density like the Multichannel conversion (#6854) by @davidmann4 in #6855
  • Custom filter: in CMYK a positive offset brightens (#7076) by @davidmann4 in #7077
  • Measurement Scale: large pixel lengths print their real value (#7016) by @davidmann4 in #7017
  • Clamp filter.cameraRaw exposure to its documented -5..5 range by @Silvertree2010 in #6876
  • fix(engine): check the define-brush tip size multiply before reserving (wasm32) by @wwewtech in #6902
  • Ignore a leading UTF-8 BOM in variable data set CSV import by @Silvertree2010 in #6485
  • fix(engine): flip and rotate presets turn about the selection's bounds, as Free Transform does (#6928) by @Korg1ch in #6967
  • Actions: a Paint Bucket step keeps its explicit colour through .atn (#7199) by @Korg1ch in #7208
  • EXR: the ACEScg preference applies to every way of opening a file (#6782) by @davidmann4 in #6783
  • Type: Paste Lorem Ipsum inserts into the type layer named by "layer" (#5659) by @davidmann4 in #5660
  • Place Scale Marker: lay out the label in points, not pixels (#5754) by @davidmann4 in #5755
  • Fix generator spaced size keeping size text in asset file name by @Silvertree2010 in #6628
  • Stamp Visible fills an empty active pixel layer instead of adding another (#6785) by @MarekSpodBiedry in #6828
  • test(type): PostScript names guessed apart from their installed family resolve exactly by @FinnNk in #5471
  • GPU: a group's effect cache follows its vector mask and children's Blend If (#5706) by @davidmann4 in #5707
  • Pencil: a 1 px line paints the same pixels whichever end it starts from, at any Smoothing (#6336) by @Higgs32584 in #6341
  • Twirl, Pinch and Spherize fill the inscribed ellipse (#5643) by @Higgs32584 in #5871
  • Reject out-of-range leading, baseline shift and scales in type styles by @Silvertree2010 in #6196
  • Snapping: layer targets ignore the selection, so a moved selection snaps to guides and the document (#6290) by @davidmann4 in #6355
  • Krita: uncompressed tiles are read as interleaved pixels (#7082) by @davidmann4 in #7083
  • Fix GPU startup requests exceeding adapter limits by @Bortlesboat in #6050
  • Paste: an image pastes with Ctrl+V whichever key is let go first (#6329) by @Higgs32584 in #6360
  • fix(linux): file dialog probe sees a portal with no FileChooser backend (#5739) by @nicolasfalesy in #6422
  • Reject notes.set moves that make the popup non-finite by @Silvertree2010 in #6174
  • Document tab says "Quick Mask" in Quick Mask mode, as in Photoshop by @arnav-hiwarkar in #6660
  • Preset Manager: renaming or deleting a brush keeps the current preset and names consistent (#5681) by @davidmann4 in #5682
  • PSD: layer_tree_max_depth hoists layers under unclosed dividers past the cap (#5758) by @davidmann4 in #5759
  • Swatches: the .ase reader refuses files with more than 10,000 groups by @dotCooCoo in #5811
  • fix(io): exclude transparent palette entries for opaque PNG pixels by @0x6Ason in #5869
  • perf(psd): 8-bit merged composite unmattes through a table, not a division per sample (#5694) by @xsvm in #6029
  • Menus: rows scrolled out of view no longer open their submenus (#5896, #6225) by @davidmann4 in #6356
  • Check unclamped transform dimensions against the pixel budget by @denstu473 in #6493
  • Remove tool: every queued stroke is tinted in full (#6555) by @davidmann4 in #6642
  • Keep Color Sampler points on their pixel after flips and turns by @Silvertree2010 in #6720
  • Upload 16-bit layer masks as R16Float instead of R32Float by @Silvertree2010 in #6845
  • fix(ui): distinct Elliptical Marquee and Quick Selection icons (#6875) by @Higgs32584 in #6917
  • OpenRaster: layer locks no longer change silently on save (#7018) by @davidmann4 in #7019
  • fix(ui): Ctrl/Cmd-drag in the Navigator zooms to the drawn rectangle, as in Photoshop (#6872) by @Korg1ch in #7140
  • Menus: one checkmark column keeps every label aligned (#5705) by @davidmann4 in #5809
  • fix(codecs): keep EXR color channels within one layer by @0x6Ason in #5866
  • Focus font search when opening the picker by @carterwsmith in #7222
  • Assign Profile and Convert to Profile: Preview, as in Photoshop; "Black Point Compensation" spelled out by @ingling in #6825
  • Korean: consistent terms in the Gradient Editor, Object Selection messages and shortcut hints by @junhyun-dev in #6882
  • docs: write product name as PhotoCraft in engine docs, LUT export header and image sources by @wwewtech in #5454
  • Saving onto a dangling symlink writes through to its target (#6605) by @mroxso in #6649
  • Document tabs: keep whole names, hide what doesn't fit, list every document in the » menu by @marcoarnulfo in #4525
  • Translate the brush size and hardness shortcut rows in every language (#6742) by @MarekSpodBiedry in #6831
  • i18n(uk): translate color picker titles and rasterization warnings by @PerchAnton in #6153
  • Tests: fix the flaky file-lock tests and the occasional portal_save hang by @echelon in #7418
  • Fix nested Free Transform preview isolation by @driftee in #7280
  • Open Photoshop guides stored in a JPEG's APP13 resources (#7300) by @MarekSpodBiedry in #7348
  • Centre stacked ruler digits and the Properties W/H/X/Y labels (#7314) by @MarekSpodBiedry in #7349
  • Esc leaves full screen with the Crop tool showing its default frame (#7315) by @MarekSpodBiedry in #7350
  • Crop and Straighten Photos keeps Duotone inks and is disabled for Indexed Color (#7354) by @davidmann4 in #7355
  • Tool Presets: + saves only the current tool's options (#7356) by @davidmann4 in #7357
  • Canvas Size: growing the canvas re-renders PSD fill layers (#7362) by @davidmann4 in #7363
  • Rotate Canvas Arbitrary: keep the angle at full precision, so rotated crops land on the pixel (#7369) by @davidmann4 in #7370
  • Image Rotation: Arbitrary keeps Color Sampler points on their pixel (#7372) by @davidmann4 in #7373
  • Spot Healing Brush trail is Photoshop's dark half-opaque tint (#7342) by @wanikhawar in #7374
  • Crop: Esc and Enter go to an open options bar popup first (#7386) by @davidmann4 in #7388
  • Refuse strict ATN export of Close with an explicit document target by @Silvertree2010 in #7393
  • Save Actions ATN files atomically so a failed write keeps the old file by @Silvertree2010 in #7403
  • Raw tone curve: no NaN between a knot at black and the next one by @Unemars in #7416
  • Camera Raw histogram: spikes run off the top, as in Photoshop's Camera Raw by @Unemars in #7419
  • Keep fractional translation-only Free Transform on .atn import by @Silvertree2010 in #7401
  • Integration batch: 19 PRs on main by @aiongg in #7405
  • fix(svg): budget rasterised fallback layers across imports by @Ni-zav in #5671
  • Retouch: bound every stroke command before its dense buffers (#4961, #6110) by @saad-mughal435 in #5992
  • Help › Search: typed letters go to the field, not to menu mnemonics (fixes #5996) by @itsF4LCON in #6030
  • Image Size: Indexed Color resamples with Nearest Neighbor only (fixes #6019) by @itsF4LCON in #6035
  • Type: Korean paragraph text wraps between words, not syllables (fixes #5959) by @itsF4LCON in #6038
  • Window › Arrange: tiles keep their documents, and every tile has rulers (fixes #6017) by @itsF4LCON in #6039
  • Replace Color: the sample eyedropper is armed when the dialog opens (fixes #6279) by @itsF4LCON in #6335
  • Smart filters: an edited filter's dialog previews again (fixes #6324) by @itsF4LCON in #6338
  • Replace Color: a Result swatch whose Color Picker sets the sliders (fixes #6278) by @itsF4LCON in #6344
  • File › Open: a file type filter per format (fixes #6337) by @itsF4LCON in #6346
  • Type: the text caret shows on a white background (part of #6085) by @itsF4LCON in #6366
  • Brush: the Dual Brush tip keeps its proportion at tiny main sizes (#4809) by @davidmann4 in #6399
  • Automation: a control token authenticates in either letter case (#6425) by @switch87 in #6476
  • Desktop: a control/automation flag without its value is a usage error (#6429) by @mroxso in #6499
  • Engine: reject numeric overflow before document edits by @PerchAnton in #6502
  • Character and Paragraph panels: size, leading, baseline shift and indents follow the Type units preference by @marcoarnulfo in #6505
  • Refuse Affinity spot colours nested more than 4 levels deep by @jonathanwxh-cell in #6506
  • Integration batch: 11 PRs on main by @aiongg in #7432
  • Native format: refuse a .pcraft with out-of-range numbers when it is opened (#6862) by @davidmann4 in #6863
  • Render Video: GIF frame delay follows timelines under 1 fps (#7045) by @davidmann4 in #7046
  • Perspective Crop and Rotate Arbitrary keep the Background opaque (#7138) by @davidmann4 in #7139
  • perf(camera-raw): Shadows/Highlights 1.5× faster, bit for bit the same by @nicolasfalesy in #7141
  • Count tool: deleting an earlier count group keeps the active group (#5653) by @davidmann4 in #5654
  • Count: reject unknown groups instead of adding markers to the wrong group by @chrisgleissner in #6003
  • fix(path): validate Make Selection options and guard selection state by @Ni-zav in #6046
  • Plug-ins: running a filter plug-in respects layer locks (#6770) by @davidmann4 in #6771
  • Object Selection: enclosed background gaps stay unselected, only object-like holes fill (#6556) by @MarekSpodBiedry in #6834
  • perf(canvas): report how long the GPU spends on a composite by @skylartaylor in #7275
  • Color panel field fills its group in a custom workspace too by @aiongg in #7477
  • ci: configure Dependabot for Cargo and GitHub Actions by @dylanmtaylor in #7475
  • Preferences: the settings fill the resized dialog, buttons at the bottom (#7420) by @skylartaylor in #7462
  • Tests: the slow-job frame loop test waits for the worker's progress message by @dotCooCoo in #7424
  • Tests: the authentication deadline test writes its first line before the deadline starts by @dotCooCoo in #7428
  • Font menu: hovering a font no longer grows its row and makes the list jump (#7406) by @Korg1ch in #7425
  • Font field: ↑/↓ step through the fonts after a pick, as in Photoshop (#7407) by @Korg1ch in #7426
  • Fix clipped ancestors in nested transform previews by @driftee in #7438
  • file.saveACopy refuses the document's own file without "overwrite" (#7437) by @wanikhawar in #7456
  • Replacing selected type keeps its size by @hodd1444 in #7457
  • Fade: restore uniformly inverted layer masks (#7383) by @Ni-zav in #7463
  • Remove: cancel queued strokes when the paint target changes (#7380) by @Ni-zav in #7464
  • Fix/7381 action worker failure 20261018t2254jkt by @Ni-zav in #7465
  • Make .pcraft reload f64 coordinates bit-exact by @Silvertree2010 in #7498
  • perf(canvas): composite and upload an inline filter preview once (#7490) by @wanikhawar in #7501
  • fix(shortcuts): plain , and ; bindings follow the typed character on AZERTY by @Byxis in #7521
  • image.crop: accept whole-number float targetWidth/targetHeight (#7551) by @davidmann4 in #7552
  • Filters: normalize nonpositive explicit tile sizes (#7493) by @bommerts in #7554
  • Perspective Crop: draw the crop quad's side of the horizon (#7557) by @davidmann4 in #7558
  • Refuse strict .atn export of plain events whose target is not the layer pixels by @Silvertree2010 in #7564
  • Print: the last print's settings survive a relaunch, as in Photoshop (#7410) by @Korg1ch in #7526
  • Type: right-click on committed text opens the type layer menu (#7324) by @jlange91 in #7430
  • Save for Web and Quick Export: "All" keeps the photo's EXIF by @marcoarnulfo in #7471
  • Curves: Cmd/Ctrl-click on the image adds a point at the pixel's tone by @marcoarnulfo in #7473
  • Preferences: Enable Gestures off ignores touch-screen pinch and twist (#204) by @KLBMinhLong in #7478
  • Edit: Copy with no selection keeps fill and adjustment layers (#2344) by @odgrim in #7497
  • Lens Blur: an alpha channel as the depth map source, as in Photoshop (#7400) by @Korg1ch in #7508
  • docs: add user docs in docs/user by @itrycodinganditsbad in #3951
  • Save: keep the replaced file's metadata by @skylartaylor in #7206
  • Integration batch: 12 PRs on main by @aiongg in #7569
  • Smart Filters: deleting the last filter removes its filter mask (#5619) by @davidmann4 in #5620
  • Image > Adjustments: locked smart objects refuse new smart filters (#5655) by @davidmann4 in #5656
  • Brush smoothing: the lagging brush keeps the pressure of where it is (#5713) by @Higgs32584 in #5726
  • Menu bar: zooming with Alt+scroll, then holding Space to pan, no longer opens New Document by @artman67 in #6256
  • fix(engine): refuse a Content-Aware Fill with nothing to sample instead of filling black (#6532) by @Korg1ch in #6670
  • Presets: refuse renaming a group to a name another group has (#6768) by @davidmann4 in #6769
  • Image Size: a gradient fill's centre offset stays a fraction of the frame (#6778) by @davidmann4 in #6779
  • Mesh warp: about twice as fast, same pixels (tiles encoded in parallel, direct in-bounds reads) (#1015) by @ianswope in #6800
  • Transform: drop a fill layer's cached render when its frame changes (#6808) by @davidmann4 in #6809
  • Artboards to Files: paths, notes, slices and marks move with the board (#7010) by @davidmann4 in #7011
  • Video: Interpret Footage and New Video Layer from File reject an invalid frame rate (#5657) by @davidmann4 in #5658
  • PNG: keep a stereo file's sTER pairing on save (#6063) by @mroxso in #6285
  • fix(actions): flush pending recorded steps on save (#7193) by @seotarek in #7244
  • Show File Name In Title: hide the file name from the title bar (#5037) by @mroxso in #5129
  • Actions: Photoshop Shadows/Highlights steps play (#5830) by @Higgs32584 in #5854
  • Free Transform: show a flip as -100 % on the flipped axis (#7749) by @davidmann4 in #7750
  • Type: formatting commands respect Lock All (#7718) by @davidmann4 in #7720
  • Docs: install the CLI and register it with MCP clients by @KnottyDyes in #7663
  • refactor: use photocraft-color's srgb transfer functions in algo and proof simulation by @osaidahmed in #7604
  • Layers: ⌘-click on the Background thumbnail is a plain click, as in Photoshop by @Unemars in #7165
  • Minimum / Maximum: CMYK spreads paper white with Maximum, ink with Minimum (#7074) by @davidmann4 in #7075
  • Export and import saved tool presets (#6560) by @vbasky in #6889
  • Fix live gradient fill scale limits to match OG program by @nanopink in #6797
  • Histogram: count the document's pixels, not a blurred thumbnail (#6538) by @davidmann4 in #6724
  • Affinity: bound compound geometry expansion and reject cycles by @PerchAnton in #6486
  • Color Settings: the working-space menus list the installed profiles of their space (#6323) by @Higgs32584 in #6359
  • Scripts: Flatten All Layer Effects bakes with the document's Global Light and patterns (#5719) by @davidmann4 in #5720
  • Gradient Overlay: repaint the whole layer when a stroke moves its frame (#4053) by @davidmann4 in #5340
  • Add Liquify's Show Backdrop Use and Mode (#7609) by @hectorviov in #7644
  • Actions: Smart Blur quality uses Photoshop's SBQL/SBQM/SBQH codes (#6312) by @davidmann4 in #6313
  • Color Lookup: warn when it opens without its usable table (part of #1763) by @ahmedhosnypro in #6322
  • Crop: a preset picked in Tool Presets fits the frame to its ratio (#7143) by @davidmann4 in #7144
  • Actions: a function key can take Shift and Command (#7646) by @hectorviov in #7674
  • perf(photomerge): build multi-band bands in bounded batches (#7758) by @wanikhawar in #7763
  • Guides: colours follow Crop, Canvas Size and rotations (#7724) by @davidmann4 in #7725
  • Keep arbitrary canvas rotation interpolation in ATN export by @Silvertree2010 in #7630
  • Type: a click inside the paragraph box off the glyphs moves the caret by @zrsix1 in #7606
  • Presets: Migrate Presets reads tool presets like the launch loader (#7375) by @davidmann4 in #7376
  • fix(linux): keep crash-recovery autosaves in $XDG_STATE_HOME, out of the config folder (#6612) by @Korg1ch in #6941
  • Hide the Hyphenate checkbox until layout hyphenates (#6710) by @vbasky in #6869
  • Disable Save for Web while a Free Transform is pending (#6737) by @MarekSpodBiedry in #6832
  • Layer Mask Properties: the Feather slider has fine steps near 0 px, as in Photoshop (#6545) by @marcoarnulfo in #6727
  • GPU canvas: redraw mip levels of 128 px or less whole; fixes AMD Vulkan corruption after partial updates (#6418) by @00xJS in #6438
  • Free Transform: W and H take a typed length in percent view (#6284) by @davidmann4 in #6293
  • fix(engine): keep layer-based slices when duplicating a document by @osaidahmed in #6133
  • refactor(engine): drop the second damage pass after single-edit duplicates and pastes by @FinnNk in #5880
  • Tools: Sample All Layers is each tool's own, as in Photoshop (#5524) by @wanikhawar in #5570
  • Actions: Apply Layer Comp is recorded by the comp's name, so it plays in any document (#7181) by @Korg1ch in #7790
  • Reject exporting a partial Play Action call to .atn by @Silvertree2010 in #7602
  • refactor(algo): route the splitmix64 copies through one function by @osaidahmed in #7603
  • Explain the Memory Usage budget and GPU caps (#6546) by @vbasky in #6892
  • Actions: export Box Blur, Surface Blur, Flatten Image and Black & White under ids Photoshop runs (#6330) by @davidmann4 in #6331
  • Home screen: fit the card and stack the buttons in a narrow window by @TaylorBurke in #5774
  • perf(codecs): Avoid redundant PNG filter passes by @reneleonhardt in #7690
  • Crop: a ui.pointer click on the frame leaves it alone (#7740) by @davidmann4 in #7741
  • Apply background jobs to the layers they started on by @Silvertree2010 in #7620
  • Print: Save as PDF gets a Browse… button (#5328) by @Higgs32584 in #7586
  • Reveal All: one History step named "Reveal All" (#7145) by @davidmann4 in #7147
  • Crop: Enter during a drag ends the drag (#7055) by @davidmann4 in #7056
  • fix(psd): make packbits::decode_into crate-private and overflow-safe by @FinnNk in #6950
  • Content-Aware Fill: preview at full resolution so it matches the result (#6530) by @MarekSpodBiedry in #6838
  • Actions: loading a set renames each Play target once (#6806) by @davidmann4 in #6807
  • Preferences: a wrongly typed value resets only that field (#6611) by @davidmann4 in #6641
  • Guides: Ctrl/Cmd drags a guide with every tool that moves guides, and the cursor shows it (#6288) by @davidmann4 in #6294
  • PSD save: check the Background's opacity without copying the canvas by @persi-man in #5998
  • Flatpak on Wayland: say why a paste finds nothing, and how to paste anyway (#5031) by @nicolasfalesy in #5279
  • fix(engine): apply document-wide image and colour conversions to stored video frames (#4956) by @MarekSpodBiedry in #5078
  • Crop: a turned crop rotates only what the frame keeps (#5006) by @davidmann4 in #5007
  • Toolbar: Edit Toolbar, Quick Mask and Screen Mode in every theme by @marcoarnulfo in #4680
  • Layered TIFF: Photoshop opened only the composite of a many-layer file (PSB-style layer data) by @llduyll10 in #5514
  • docs: regenerate the scorecard after today's landings by @echelon in #7829
  • Integration batch: 8 PRs on main by @aiongg in #7823
  • Limit blend-mode hover refreshes to the visible canvas region by @jonathanwxh-cell in #5413
  • perf: chisel bevel size changes, CPU passes on threads and GPU fields share their sharp edges (results unchanged) by @xsvm in #5477
  • PSD: keep guide resources 1092/1097 only while they match the guides (#5966) by @bramheerink in #5976
  • Brushes: importing an .abr file numbers repeated brush names in linear time by @dotCooCoo in #5984
  • fix(perf): validate regression minimum threshold by @ersoynarin-code in #6193
  • perf(io): Interleave PSD pixels in the final buffer by @reneleonhardt in #7691
  • perf(raster): Avoid redundant default pixel work by @reneleonhardt in #7692
  • perf(text): rasterize a type layer's pixels on all cores, bit for bit the same by @ebosido444-ai in #7022

New Contributors

Full Changelog: v0.10.0...v0.11.1

Don't miss a new photocraft release

NewReleases is sending notifications on new releases.