* Color Sampler tool (#1046) Add the Color Sampler to the Eyedropper (I) flyout: click to pin numbered sample points to canvas pixels, drag to move, Alt-click (or drag off-canvas) to remove, Clear All in the options bar, at most 10 per document. Each point reads one composite pixel (RGB 0-255 and naive device CMYK, same as the pointer readout) and the Info panel lists them under their number with the position in the ruler unit; the readouts refresh when the document changes. Points are per-document engine view state (DocState.color_samplers): they belong to their document, are discarded on close, and are not saved to .pcraft or PSD. They are driven by commands shared by the UI, CLI, control channel and MCP (view.colorSamplers.add/.move/.delete/.clear/.list); the mutations change no pixels and add no History step. Points follow the canvas geometry (crop, Canvas Size, Image Size, Image rotation/flip, rotated crop) through a pending Session.sampler_map that Session::edit applies before culling the points that land outside the new canvas; the count removed is reported in the status bar. - engine: new sampler_cmds.rs (commands + shared readout helpers) and the sampler_map wiring in lib.rs, image_cmds.rs, mode_cmds.rs, commands.rs, analysis_cmds.rs (compound rolls points back on error). - ui-egui: Tool::ColorSampler + original sampler.svg icon, toolbar slot, Info panel list, options bar, pointer handling, overlay markers, cursor. - docs/scorecard.md regenerated (TOOL-1649-1 no longer says the tool is missing). No menu item, so parity is unchanged (627/627). * Color Sampler follow-up: tool count, README, i18n, roadmap The full ui-egui suite (not just the filtered tests) surfaced these gaps: - state.rs: Tool::ALL.len() assertion 52 -> 53. - README.md: "52 tools" -> "53 tools" and add Color Sampler to the list, so readme_tool_list_matches_tool_all passes. - i18n: the options-bar hint, "{n} of {max} sample points" and "No document open" need entries in every catalog that claims complete menus (every_tl_literal_is_translated); added to all 16 (coverage 1584/1584). The translations were drafted alongside the tool. - docs/roadmap.md: drop Color Sampler from the missing-tools list and note it landed. * Color Sampler: fit main's new tools and Image Size resample type Reset Tool covers ColorSampler, the test ViewXform sets aspect, and Image Size checks Method::None instead of an Option. Co-Authored-By: Claude Opus 5.5 <[email protected]> --------- Co-authored-by: Brandon Thomas <[email protected]> Co-authored-by: Claude Opus 5.5 <[email protected]>
19 KiB
Attribution
Every non-code asset in this repository, with its author, source and license. PhotoCraft's own
code and original assets are MIT OR Apache-2.0 (see LICENSE-MIT,
LICENSE-APACHE and NOTICE). When you add an asset, add a row here
in the same change; third-party assets must be permissively licensed and keep their license file
next to them.
Bundled in the app
| Path | Title | Author | Source | License |
|---|---|---|---|---|
crates/ui-egui/src/i18n/el.tsv |
Greek UI translations | PhotoCraft contributors | Original translations of PhotoCraft's English labels | MIT OR Apache-2.0, LICENSE-translations.txt |
crates/ui-egui/src/i18n/de.tsv |
German UI translations | PhotoCraft contributors | Original translations of PhotoCraft's English labels | MIT OR Apache-2.0, LICENSE-translations.txt |
crates/ui-egui/src/i18n/it.tsv |
Italian UI translations | PhotoCraft contributors | Original translations of PhotoCraft's English labels | MIT OR Apache-2.0, LICENSE-translations.txt |
crates/ui-egui/src/i18n/ko.tsv |
Korean UI translations | PhotoCraft contributors | Original translations of PhotoCraft's English labels | MIT OR Apache-2.0, LICENSE-translations.txt |
crates/ui-egui/src/i18n/nl.tsv |
Dutch UI translations | PhotoCraft contributors | Original translations of PhotoCraft's English labels | MIT OR Apache-2.0, LICENSE-translations.txt |
crates/ui-egui/src/i18n/pl.tsv |
Polish UI translations | PhotoCraft contributors | Original translations of PhotoCraft's English labels | MIT OR Apache-2.0, LICENSE-translations.txt |
crates/ui-egui/src/i18n/pt-br.tsv |
Brazilian Portuguese UI translations | PhotoCraft contributors | Original translations of PhotoCraft's English labels | MIT OR Apache-2.0, LICENSE-translations.txt |
crates/ui-egui/src/i18n/uk.tsv |
Ukrainian UI translations | PhotoCraft contributors | Original translations of PhotoCraft's English labels | MIT OR Apache-2.0, LICENSE-translations.txt |
assets/fonts/Inter-Regular.ttf, Inter-Medium.ttf, Inter-SemiBold.ttf |
Inter 4.001 (UI font) | The Inter Project Authors (Rasmus Andersson) | https://github.com/rsms/inter | SIL OFL 1.1, assets/fonts/OFL-Inter.txt |
assets/fonts/JetBrainsMono-Regular.ttf |
JetBrains Mono 2.305 (numeric font) | The JetBrains Mono Project Authors | https://github.com/JetBrains/JetBrainsMono | SIL OFL 1.1, assets/fonts/OFL-JetBrainsMono.txt |
assets/icons/*.svg except slice-knife.svg, sampler.svg, artboard.svg, perspective-crop.svg, frame-placeholder.svg, type-mask.svg, type-mask-vertical.svg, clip-below.svg, clip-release.svg, layer-mask.svg, adjustment-layer.svg, brush-replace.svg, eraser-background.svg, eraser-magic.svg, lasso-magnetic.svg, direct-select.svg, convert-point.svg, pen-add-anchor.svg, pen-delete-anchor.svg, pen-freeform.svg, pen-curvature.svg, bandage-sparkle.svg, painting-symmetry.svg, symmetry-*.svg and marquee-{row,column}.svg (113 files; star-filled.svg is star.svg with a solid fill) |
Lucide icons | Lucide Icons and Contributors | https://github.com/lucide-icons/lucide (icons/<name>.svg; align-* are now named text-align-* upstream) |
ISC, assets/icons/LICENSE-lucide.txt |
assets/icons/{check,chevron-down,chevron-left,chevron-right,chevron-up,chevrons-left,chevrons-right,circle,clock,compass,info,link,link-2,lock,minus,monitor,moon,move,navigation,plus,search,square,trash,triangle,type,x,zoom-in}.svg |
Lucide icons derived from Feather (subset of the row above) | Cole Bemis (Feather), Lucide Contributors | https://github.com/feathericons/feather via Lucide | MIT (Feather) and ISC (Lucide), assets/icons/LICENSE-lucide.txt |
assets/icons/slice-knife.svg |
Slice tool glyph | PhotoCraft contributors | Original work | MIT OR Apache-2.0 |
assets/icons/sampler.svg |
Color Sampler tool glyph: a target reticle marking a sampled pixel | PhotoCraft contributors | Original work | MIT OR Apache-2.0 |
assets/icons/convert-point.svg |
Convert Point tool glyph: an angle with a square anchor on its apex, drawn on Lucide's 24 px grid and stroke | PhotoCraft contributors | Original work | MIT OR Apache-2.0 |
assets/icons/artboard.svg |
Artboard tool glyph: a board with a tick at each end of its edges | PhotoCraft contributors | Original work | MIT OR Apache-2.0 |
assets/icons/perspective-crop.svg |
Perspective Crop tool glyph: a crop frame in perspective with its grid and crop-mark ticks | PhotoCraft contributors | Original work | MIT OR Apache-2.0 |
assets/icons/type-mask.svg, assets/icons/type-mask-vertical.svg |
Horizontal and Vertical Type Mask tool glyphs: a T drawn as marching ants (the vertical one beside a downward arrow), on Lucide's 24 px grid and stroke | PhotoCraft contributors | Original work | MIT OR Apache-2.0 |
assets/icons/marquee-row.svg, assets/icons/marquee-column.svg |
Single Row and Single Column Marquee tool glyphs: a dashed row (column) between two edge bars, drawn on Lucide's 24 px grid and stroke | PhotoCraft contributors | Original work | MIT OR Apache-2.0 |
assets/icons/clip-below.svg, assets/icons/clip-release.svg |
Clipping-mask cursors (⌥ over the line between two layers): a hooked arrow onto the layer below; the same with a small "no" badge to release | PhotoCraft contributors | Original work | MIT OR Apache-2.0 |
assets/icons/layer-mask.svg, assets/icons/adjustment-layer.svg |
Layers panel footer glyphs: Add a mask (a frame around a solid disc) and New Fill or Adjustment Layer (a circle, one half solid), drawn on Lucide's 24 px grid and stroke | PhotoCraft contributors | Original work | MIT OR Apache-2.0 |
assets/icons/frame-placeholder.svg |
Frame tool glyph: an empty placeholder frame, crossed corner to corner | PhotoCraft contributors | Original work | MIT OR Apache-2.0 |
assets/icons/eraser-background.svg, assets/icons/eraser-magic.svg |
Background Eraser and Magic Eraser tool glyphs: Lucide eraser plus added marks |
Lucide Icons and Contributors; marks by PhotoCraft contributors | Derived from https://github.com/lucide-icons/lucide icons/eraser.svg |
ISC, assets/icons/LICENSE-lucide.txt |
assets/icons/brush-replace.svg |
Color Replacement tool glyph: Lucide brush plus two swap arrows |
Lucide Icons and Contributors; arrows by PhotoCraft contributors | Derived from https://github.com/lucide-icons/lucide icons/brush.svg |
ISC, assets/icons/LICENSE-lucide.txt |
assets/icons/bandage-sparkle.svg |
Remove tool glyph: Lucide bandage moved down, plus a sparkle mark |
Lucide Icons and Contributors; mark by PhotoCraft contributors | Derived from https://github.com/lucide-icons/lucide icons/bandage.svg |
ISC, assets/icons/LICENSE-lucide.txt |
assets/icons/direct-select.svg |
Direct Selection tool glyph: Lucide mouse-pointer-2 plus an anchor square |
Lucide Icons and Contributors; square by PhotoCraft contributors | Derived from https://github.com/lucide-icons/lucide icons/mouse-pointer-2.svg |
ISC, assets/icons/LICENSE-lucide.txt |
assets/icons/pen-freeform.svg, assets/icons/pen-curvature.svg |
Freeform Pen and Curvature Pen tool glyphs: Lucide pen-tool scaled down, plus a freehand squiggle or a curve through two points |
Lucide Icons and Contributors; marks by PhotoCraft contributors | Derived from https://github.com/lucide-icons/lucide icons/pen-tool.svg |
ISC, assets/icons/LICENSE-lucide.txt |
assets/icons/pen-add-anchor.svg, assets/icons/pen-delete-anchor.svg |
Add Anchor Point and Delete Anchor Point tool glyphs: Lucide pen-tool plus a + or − mark |
Lucide Icons and Contributors; marks by PhotoCraft contributors | Derived from https://github.com/lucide-icons/lucide icons/pen-tool.svg |
ISC, assets/icons/LICENSE-lucide.txt |
assets/icons/painting-symmetry.svg |
Painting symmetry glyph: Lucide heart with a central axis |
Lucide Icons and Contributors; adapted by @shorbank | Derived from https://github.com/lucide-icons/lucide icons/heart.svg |
ISC, assets/icons/LICENSE-lucide.txt |
assets/icons/symmetry-{vertical,horizontal,dual,diagonal}.svg |
Painting symmetry axis glyphs | @shorbank | Original work; supplied SVG line geometry centred on a common square canvas, stroke adjusted to match the painting-symmetry glyph | MIT OR Apache-2.0, assets/icons/LICENSE-symmetry-axes.txt |
assets/icons/lasso-magnetic.svg |
Magnetic Lasso tool glyph, adapted from "Magnetic Lasso Tool" (redrawn on the 24 px toolbar grid) | Lil' Seal (Noun Project); adapted by PhotoCraft contributors | https://thenounproject.com/icon/magnetic-lasso-tool-177513/ | CC BY 3.0, assets/icons/LICENSE-noun-magnetic-lasso.txt |
assets/dict/en_US-scowl-50.txt.gz |
English word list for Check Spelling (SCOWL 2020.12.07, size 50, en_US; 72,403 words) | Kevin Atkinson and the SCOWL contributors | http://wordlist.aspell.net/ | SCOWL license (permissive, keep the notice), assets/dict/LICENSE-SCOWL.txt, which also has the build recipe |
crates/cms/profiles/photocraft-coated-cmyk.icc |
PhotoCraft Coated CMYK (synthetic) ICC profile | PhotoCraft contributors (generated by photocraft-cms, src/synth.rs) |
Original work, see crates/cms/README.md |
CC0-1.0 |
assets/app-icon/ (all files) |
PhotoCraft app icon (nine-tailed kitsune) | The project owner (drawn in ArtCraft, vectorised) | Original work, see assets/app-icon/README.md |
MIT OR Apache-2.0, assets/app-icon/LICENSE.txt |
packaging/macos/dmg/ (all files) |
PhotoCraft DMG window background and layout | @XusBadia, from the PhotoCraft app icon | Original work, see packaging/macos/dmg/README.md |
MIT OR Apache-2.0, like the code |
crates/ui-egui/src/theme.rs (Solarized Dark palette) |
Solarized colour scheme used by the Solarized Dark theme | Ethan Schoonover | https://ethanschoonover.com/solarized/ | MIT, LICENSE-solarized.txt |
crates/ui-egui/src/theme.rs (Breeze Light and Breeze Dark themes) |
The Breeze Light and Breeze Dark themes are original colour values on PhotoCraft's Studio layout, chosen to look close to KDE Plasma's Breeze (cool blue-greys, blue accent, 5 px frame radius) so the app blends into a Plasma desktop. None of Breeze's colour values, files or code are copied; the values are a few levels away from its schemes and tuned for text contrast | PhotoCraft contributors | Inspired by the look of KDE Breeze, https://invent.kde.org/plasma/breeze (its colour schemes are LGPL-2.0-or-later) | Original work |
Optional build input: craft-fonts (not files in this repo)
Builds made with CRAFT_FONTS_DIR (all official releases) embed fonts from
storytold/craft-fonts at a pinned commit; no font file
from it is committed here. Per-file authors, sources and licences:
craft-fonts ATTRIBUTION.md.
| Font (embedded at build time) | Use | License |
|---|---|---|
| BIZ UDPGothic Regular, Bold (Morisawa) | Japanese UI and sans Type fallback (desktop) | SIL OFL 1.1, shipped as OFL-biz-ud-pgothic.txt |
| Shippori Mincho Regular (FONTDASU) | Japanese serif Type fallback (desktop) | SIL OFL 1.1, shipped as OFL-shippori-mincho.txt |
| BIZ UDMincho Regular (Morisawa) | Japanese serif Type fallback (desktop) | SIL OFL 1.1, shipped as OFL-biz-ud-mincho.txt |
The other built-in ICC profiles and the generated LUT looks are produced by code at runtime
(crates/cms/src/builtin.rs, crates/cms/src/lutfile.rs) and dedicated to the public domain
(CC0-1.0); they are not separate files.
Documentation and README
| Path | Title | Author | Source | License |
|---|---|---|---|---|
docs/brand/ (all files) |
ArtCraft name, wordmark and mark | ArtCraft Team | getartcraft.com | Not open source; trademarks of the ArtCraft Team, docs/brand/LICENSE-brand.txt |
docs/images/photocraft-*.jpg |
PhotoCraft screenshots | PhotoCraft contributors (UI) | Rendered offscreen with the snapshot example |
MIT OR Apache-2.0 (UI); the artwork in each is public domain, listed below |
docs/images/preferences-apply-*.png |
Preferences before and after adding Apply (no artwork) | PhotoCraft contributors | PhotoCraft control-channel capture and offscreen snapshot example |
MIT OR Apache-2.0 |
Artwork shown in the screenshots (all public domain, via Wikimedia Commons; details in
docs/images/SOURCES.md):
| Screenshot | Artwork | Source |
|---|---|---|
photocraft-demo.jpg |
The Great Wave off Kanagawa, Katsushika Hokusai, c. 1831 | Commons |
photocraft-layer-styles.jpg |
Earthrise, William Anders, Apollo 8, 1968 (NASA) | Commons |
photocraft-masks.jpg |
Girl with a Pearl Earring, Johannes Vermeer, c. 1665 | Commons |
photocraft-vector.jpg |
Water Lilies, Claude Monet, 1906 | Commons |
photocraft-filters.jpg |
The Starry Night, Vincent van Gogh, 1889 | Commons |
photocraft-adjustments.jpg |
Impression, Sunrise, Claude Monet, 1872 | Commons |
photocraft-transform.jpg |
The Tetons and the Snake River, Ansel Adams, 1942 (U.S. National Archives) | Commons |
photocraft-type.jpg |
Among the Sierra Nevada, California, Albert Bierstadt, 1868 | Commons |
photocraft-export-light.jpg |
The Kiss, Gustav Klimt, 1907–1908 | Commons |
Test data (not committed, not shipped)
corpus/ is gitignored and no test fixtures are committed to the repository.
cargo xtask corpus --all fetches every corpus at the pinned commits in xtask/src/corpus_pins.rs
and verifies each file against the sha256 lists in xtask/*.sha256, with the upstream licence
next to the files:
| Path (fetched) | Title | Author | Source | License |
|---|---|---|---|---|
corpus/photoshop/ (256 PSDs) |
Photoshop oracle corpus: smart filters, layer-style effects, type, adjustments in every mode and depth | PhotoCraft contributors (authored with Adobe Photoshop 2026 by a script) | https://github.com/storytold/photocraft-corpus (photoshop/, with its generator and README) |
MIT OR Apache-2.0 |
corpus/psd-tools/ (309 files) |
psd-tools test set | Kota Yamaguchi and contributors | psd-tools tests/psd_files |
MIT, Copyright (c) 2019 Kota Yamaguchi |
corpus/psd/ (170 files) |
Small selection of the psd-tools and ag-psd test files | Kota Yamaguchi; Agamnentzar | psd-tools (above) and ag-psd test/ |
MIT (both) |
corpus/heif/ (9 files, 0.1 MB) |
HEIC/HEIF test files: heic-rs/ checkerboards, RGB strips and a grid-tiled photo with EXIF and XMP (synthetic pixels encoded by macOS sips, each .ref.png Apple's decode); pillow-heif/ the 10-bit RGBA RGBA_10__29x100.heif and its source RGBA_16__29x100.png |
Thomas Braun (heic-rs); Pillow-Heif contributors | heic-rs tests/fixtures, pillow-heif tests/images |
MIT OR Apache-2.0 (heic-rs); BSD-3-Clause (pillow-heif) |
corpus/exr/ (5 files, 2.3 MB) |
The deep OpenEXR test images 11, 42, 64, multivariate and objectid.deep.exr |
Contributors to the OpenEXR Project | openexr src/test/bin/test_images |
BSD-3-Clause |
corpus/affinity/ (60 files) |
Public Affinity documents and PNG references: vector-art/ (9 documents), afdesignload/ (9), jac21/ (2), asset-store-template/ (1), and affinity-samples/ (18 CC0 documents plus exported references) |
samuel-etver; Nick Beeuwsaert; Jeremy Cantu; DAIKI (eviltwo); satoshoe-dev | vector-art simple/, AFDesignLoad testDesigns/, Jac21/Branding Logos/JC/DesignerFiles/Affinity, AssetStoreTemplate AssetStoreTemplate/, affinity-samples |
CC0-1.0 (vector-art and affinity-samples); MIT, Copyright (c) 2015 Nick Beeuwsaert; MIT, Copyright (c) 2018 Jeremy Cantu; MIT, Copyright (c) 2024 DAIKI |
corpus/pngsuite/ |
PngSuite | Willem van Schaik | http://www.schaik.com/pngsuite/ | Public domain |
corpus/pixls/ (7 files, 226 MB) |
Real camera raws, one per decode path: Canon PowerShot SX50 HS (CR2 and its DNG conversion), Nikon D3 uncompressed NEF, Sony DSC-RX0 cRAW ARW, Panasonic DC-G9 high-res RW2, Olympus E-1 GRBG ORF, plus the E-5 packed ORF as the documented known-unsupported case. Per file (each CC0, per its database entry): IMG_4059.CR2, CRW_4061.DNG, JD1_8203.NEF, DSC00009.ARW, P1000475.RW2, E_1__C106743_gredos.ORF, _7061961_copy.ORF | The photographers of the pixls.us raw samples database | raw.pixls.us data/, fetched per xtask/src/corpus_pins.rs |
CC0 / public domain, per file as linked |
Files copied into corpus/ by hand (tiff, exr, raw) must be MIT, BSD or CC0.