Files
photocraft/docs/atn.md
T
David MannandClaude Opus 5.5 8caea149c1 Integration: regenerate docs/atn.md for the batch (144 supported events, settings each PR keeps)
Supported table read from the batch's events.rs. The PRs' own sections (settings and command
options retained, Render defaults, steps kept disabled) are kept; the known-gaps tables that
#10702 and #10704 close are gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 13:03:44 +01:00

114 KiB
Raw Blame History

Actions files (.atn)

PhotoCraft loads and saves action sets in the reference application's .atn format: Load Actions and Save Actions in the Actions panel menu, actions.load / actions.save for agents, and photocraft batch --actions set.atn on the command line. Reading and writing the file lives in photocraft-psd (crates/psd/src/atn.rs, version 16 sets, exact round trip); the mapping between the application's events and PhotoCraft commands lives in photocraft-engine (crates/engine/src/cmd/atn_cmds/, table EVENTS in events.rs).

A step whose event is in the table below loads as the PhotoCraft command it names, plays, and saves back as the same event. Any other step loads as a kept step (actions.photoshopStep), and Save Actions writes it back unchanged. Playback stops at an enabled kept step with its name, so an action never silently skips work. Kept steps with no effect on the document (tool selections and the like) are imported switched off, so playback skips them.

This page covers the events PhotoCraft maps today, the settings some of them still lose, how steps name layers and documents, newer and older events and files, and a measured reference for the events it does not map yet, with everything needed to implement them without the reference application.

Supported events (144)

Code String ID Label PhotoCraft command(s)
AdNs addNoise Add Noise filter.noise.addNoise
Algn align Align layer.align.leftEdges, layer.align.horizontalCenters, layer.align.rightEdges, layer.align.topEdges, layer.align.verticalCenters, layer.align.bottomEdges
AppI applyImageEvent Apply Image image.applyImage
(string ID only) applyComp Apply Layer Comp layerComp.apply
(string ID only) applyLocking Apply Locking layer.lockLayers
(string ID only) assignProfile Assign Profile edit.assignProfile
(string ID only) autoColor Auto Color image.autoColor
Avrg Avrg Average filter.blur.average
(string ID only) blackAndWhite Black & White image.adjustments.blackWhite
Blr blur Blur filter.blur.blur
BlrM blurMore Blur More filter.blur.blurMore
Brdr border Border select.modify.border
(string ID only) boxblur Box Blur filter.blur.boxBlur
BrgC brightnessEvent Brightness/Contrast image.adjustments.brightnessContrast
(string ID only) Adobe Camera Raw Filter Camera Raw Filter filter.cameraRaw
CnvS canvasSize Canvas Size image.canvasSize
ChnM channelMixer Channel Mixer image.adjustments.channelMixer
(string ID only) clearEvent Clear select.editInQuickMaskMode, history.clear
Cls close Close file.close
Clds clouds Clouds filter.render.clouds
(string ID only) collapseAllGroupsEvent Collapse All Groups layer.setExpanded
ClrB colorBalance Color Balance image.adjustments.colorBalance
ClrR colorRange Color Range select.colorRange
Cntc contract Contract select.modify.contract
CnvM convertMode Convert Mode image.mode.rgb, image.mode.grayscale, image.mode.cmyk, image.mode.lab, image.mode.multichannel, image.mode.bits8, image.mode.bits16, image.mode.bits32, image.mode.bitmap
(string ID only) convertToProfile Convert to Profile edit.convertToProfile
(string ID only) newPlacedLayer Convert to Smart Object layer.smartObjects.convertToSmartObject
copy copyEvent Copy edit.copy
(string ID only) copyEffects Copy Layer Style layer.layerStyle.copyLayerStyle
CpyM copyMerged Copy Merged edit.copyMerged
GrpL groupEvent Create Clipping Mask layer.createClippingMask
Crop crop Crop image.crop
Crst crystallize Crystallize filter.pixelate.crystallize
Crvs curves Curves image.adjustments.curves
Cstm custom Custom filter.other.custom
cut cut Cut edit.cut
Dntr deInterlace De-Interlace filter.video.deInterlace
Dfrg defringe Defringe layer.matting.defringe
Dlt delete Delete layer.delete, edit.clear, layer.layerMask.delete, layer.smartFilter.deleteFilterMask
Dstt desaturate Desaturate image.adjustments.desaturate
(string ID only) selectNoLayers Deselect Layers select.deselectLayers
Dspc despeckle Despeckle filter.noise.despeckle
DfrC differenceClouds Difference Clouds filter.render.differenceClouds
Dfs diffuse Diffuse filter.stylize.diffuse
Dplc duplicate Duplicate layer.duplicate, image.duplicate
DstS dustAndScratches Dust & Scratches filter.noise.dustAndScratches
(string ID only) placedLayerEditContents Edit Contents layer.smartObjects.editContents
Embs emboss Emboss filter.stylize.emboss
Eqlz equalize Equalize image.adjustments.equalize
Exch exchange Exchange tools.swapColors
Expn expand Expand select.modify.expand
Expr export Export file.export.saveForWebLegacy
Exps exposure Exposure image.adjustments.exposure
Fthr feather Feather select.modify.feather
Fbrs Fibers filter.render.fibers
Fl fill Fill edit.fill, paint.bucket
GEfc filterGallery Filter Gallery filter.gallery.accentedEdges, filter.gallery.angledStrokes, filter.gallery.basRelief, filter.gallery.chalkCharcoal, filter.gallery.charcoal, filter.gallery.chrome, filter.gallery.coloredPencil, filter.gallery.conteCrayon, filter.gallery.craquelure, filter.gallery.crosshatch, filter.gallery.cutout, filter.gallery.darkStrokes, filter.gallery.diffuseGlow, filter.gallery.dryBrush, filter.gallery.filmGrain, filter.gallery.fresco, filter.gallery.glass, filter.gallery.glowingEdges, filter.gallery.graphicPen, filter.gallery.halftonePattern, filter.gallery.inkOutlines, filter.gallery.mosaicTiles, filter.gallery.neonGlow, filter.gallery.notePaper, filter.gallery.oceanRipple, filter.gallery.paintDaubs, filter.gallery.paletteKnife, filter.gallery.patchwork, filter.gallery.photocopy, filter.gallery.plaster, filter.gallery.plasticWrap, filter.gallery.posterEdges, filter.gallery.reticulation, filter.gallery.roughPastels, filter.gallery.smudgeStick, filter.gallery.spatter, filter.gallery.sponge, filter.gallery.sprayedStrokes, filter.gallery.stainedGlass, filter.gallery.stamp, filter.gallery.sumiE, filter.gallery.texturizer, filter.gallery.tornEdges, filter.gallery.underpainting, filter.gallery.waterPaper, filter.gallery.watercolor, filter.gallery.grain
FltI flattenImage Flatten Image layer.flattenImage
Flip flip Flip image.imageRotation.flipCanvasHorizontal, image.imageRotation.flipCanvasVertical, edit.transform.flipHorizontal, edit.transform.flipVertical
(string ID only) focusMask Focus Area select.focusArea
GsnB gaussianBlur Gaussian Blur filter.blur.gaussianBlur
(string ID only) gradientMapEvent Gradient Map image.adjustments.gradientMap
Grow grow Grow select.grow
Hd hide Hide layer.hideLayers
HghP highPass High Pass filter.other.highPass
HsbP HsbP HSB/HSL filter.other.hsbHsl
HStr hueSaturation Hue/Saturation image.adjustments.hueSaturation
(string ID only) conditional If actions.conditional
ImgS imageSize Image Size image.imageSize
Invs inverse Inverse select.inverse
Invr invert Invert image.adjustments.invert
CpTL copyToLayer Layer Via Copy layer.new.layerViaCopy
CtTL cutToLayer Layer Via Cut layer.new.layerViaCut
LnsF lensFlare Lens Flare filter.render.lensFlare
Lvls levels Levels image.adjustments.levels, image.autoTone, image.autoContrast
Mk make Make layer.new.layer, layer.new.group, layer.groupLayers, layer.duplicate, layer.new.layerViaCopy, layer.new.layerViaCut, layer.newFillLayer.solidColor, layer.newFillLayer.pattern, layer.newAdjustmentLayer.levels, layer.newAdjustmentLayer.curves, layer.newAdjustmentLayer.hueSaturation, layer.newAdjustmentLayer.brightnessContrast, layer.newAdjustmentLayer.threshold, layer.newAdjustmentLayer.posterize, layer.newAdjustmentLayer.invert, layer.newAdjustmentLayer.colorBalance, layer.newAdjustmentLayer.vibrance, layer.newAdjustmentLayer.exposure, layer.newAdjustmentLayer.photoFilter, layer.newAdjustmentLayer.blackWhite, layer.newAdjustmentLayer.channelMixer, layer.newAdjustmentLayer.selectiveColor, layer.newAdjustmentLayer.gradientMap, layer.layerMask.revealAll, layer.layerMask.hideAll, layer.layerMask.revealSelection, layer.layerMask.hideSelection, file.new, file.newFromClipboard, history.newSnapshot
(string ID only) animationFramesFromLayers Make Frames from Layers
(string ID only) matchColor Match Color image.adjustments.matchColor
Mxm maximum Maximum filter.other.maximum
Mdn median Median filter.noise.median
Mrg2 mergeLayersNew Merge Layers layer.mergeLayers
MSpt mergeSpotChannel Merge Spot Channel channel.mergeSpot
MrgV mergeVisible Merge Visible layer.mergeVisible, layer.stampVisible
Mnm minimum Minimum filter.other.minimum
MtnB motionBlur Motion Blur filter.blur.motionBlur
move move Move layer.translate, layer.moveTo, layer.arrange.bringToFront, layer.arrange.sendToBack, layer.arrange.bringForward, layer.arrange.sendBackward
NTSC NTSC NTSC Colors filter.video.ntscColors
Ofst offset Offset filter.other.offset
(string ID only) oilPaint Oil Paint filter.stylize.oilPaint
Opn open Open file.openAs
past paste Paste edit.paste, edit.pasteSpecial.pasteInPlace
(string ID only) pasteEffects Paste Layer Style layer.layerStyle.pasteLayerStyle
(string ID only) photoFilter Photo Filter image.adjustments.photoFilter
Pnch pinch Pinch filter.distort.pinch
Plc placeEvent Place file.placeEmbedded, file.placeLinked
Ply play Play actions.play
Plr polar Polar Coordinates filter.distort.polarCoordinates
Pstr posterize Posterize image.adjustments.posterize
Prge purge Purge edit.purge.all, edit.purge.clipboard, edit.purge.histories, edit.purge.undo
RdlB radialBlur Radial Blur filter.blur.radialBlur
(string ID only) rasterizeLayer Rasterize layer.rasterize.layer
Ungr ungroup Release Clipping Mask layer.releaseClippingMask
(string ID only) removeBackground Remove Background layer.removeBackground
RmvB removeBlackMatte Remove Black Matte layer.matting.removeBlackMatte
RmvW removeWhiteMatte Remove White Matte layer.matting.removeWhiteMatte
Rset reset Reset tools.defaultColors
RvlA revealAll Reveal All image.revealAll
Rvrt revert Revert file.revert
Rple ripple Ripple filter.distort.ripple
Rtte rotateEventEnum Rotate image.imageRotation.90cw, image.imageRotation.90ccw, image.imageRotation.180, image.rotation.arbitrary, edit.transform.rotate90Cw, edit.transform.rotate90Ccw, edit.transform.rotate180
save save Save file.save, file.saveAs, file.saveACopy
slct select Select layer.select, layer.selectAbove, layer.selectBelow, layer.addAboveToSelection, layer.addBelowToSelection, layer.selectTop, layer.selectBottom, channel.target, edit.undo, edit.redo, view.fitOnScreen, view.actualPixels, view.zoomIn, view.zoomOut, document.activate
(string ID only) selectAllLayers Select All Layers select.allLayers
(string ID only) refineSelectionEdge Select and Mask select.refineEdge
(string ID only) smartBrushWorkspace Select and Mask select.refineEdge
(string ID only) autoCutout Select Subject select.subject
SlcC selectiveColor Selective Color image.adjustments.selectiveColor
setd set Set select.all, select.deselect, select.reselect, select.loadSelection, select.rect, select.lasso, select.editInQuickMaskMode, tools.setColors, layer.setProps, layer.renameLayer, layer.setLabelColor, layer.setAdjustment, layer.fill.pattern.set, layer.new.layerFromBackground, layer.layerStyle.blendingOptions, layer.smartFilter.blendingOptions
(string ID only) adaptCorrect Shadows/Highlights image.adjustments.shadowsHighlights
Shrp sharpen Sharpen filter.sharpen.sharpen
ShrE sharpenEdges Sharpen Edges filter.sharpen.sharpenEdges
ShrM sharpenMore Sharpen More filter.sharpen.sharpenMore
Shw show Show layer.showLayers, layer.showOnly
Smlr similar Similar select.similar
(string ID only) selectSky Sky select.sky
SmrB smartBlur Smart Blur filter.blur.smartBlur
(string ID only) smartSharpen Smart Sharpen filter.sharpen.smartSharpen
Smth smoothness Smooth select.modify.smooth
Sphr spherize Spherize filter.distort.spherize
SplC splitChannels Split Channels channel.split
Stop stop Stop STOP_MESSAGE
Strk stroke Stroke edit.stroke
(string ID only) surfaceBlur Surface Blur filter.blur.surfaceBlur
Thrs threshold Threshold image.adjustments.threshold
Trnf transform Transform edit.transform, select.transformSelection
Trap trap Trap image.trap
(string ID only) trim Trim image.trim
Twrl twirl Twirl filter.distort.twirl
(string ID only) ungroupLayersEvent Ungroup Layers layer.ungroupLayers
UnsM unsharpMask Unsharp Mask filter.sharpen.unsharpMask
(string ID only) updatePlacedLayer Update Smart Objects layer.smartObjects.updateModifiedContent
(string ID only) vibrance Vibrance image.adjustments.vibrance
Wave wave Wave filter.distort.wave
ZgZg zigZag ZigZag filter.distort.zigZag

Settings retained by mapped events

  • Transform keeps its recorded FTcs reference point. Show with TglO true maps to layer.showOnly; repeating it restores the other layers' visibility.
  • Make keeps top-level group names, new-layer clipping (Usng.Grup) and adjustment colour labels (Usng.Clr ). Layer via Copy / Cut keeps names, blend modes, opacity and colour labels.
  • Loading another layer's transparency keeps its source reference. Background property references remain independent of translated names; ordinary layer-name references remain names.
  • Close without Svng preserves the unanswered save choice. Headless playback refuses to discard a changed document. Native file.close still defaults to discard; save: "ask" opts into this policy.
  • Photo Filter converts recorded Lab colours through photocraft-cms.
  • Direct Vibrance and Gradient Map save as the string events vibrance and gradientMapEvent. Stroke Outside uses StrL.Otsd, group Pass Through uses BlnM.passThrough, Canvas Size extension colours use FrgC and Clr , and Absolute Colorimetric intent uses Inte.AClr.
  • Make adjustment layers keeps surrounding Usng.Opct as layer opacity, independently of the adjustment settings. Recorded percentages use eight-bit layer-opacity storage at every document depth: 70 % becomes 179/255. Native creation accepts an optional 0..1 opacity fraction. A default adjustment with only layer opacity still saves as a default preset.
  • Document offsets wrap in opening order, independently of dragged tabs. An ATN zero offset remains a kept step; the native command retains its existing zero-offset no-op.
  • Convert Mode saves T as a class. Layer-retaining RGB, grayscale, CMYK and Lab conversions read and write explicit false Fltt and Rstr flags. True or malformed flags remain kept steps; depth, bitmap and multichannel recordings with these flags also remain kept.
  • Canvas Size preserves percentage units and resolves them against the playback document. Percentages are absolute sizes; mixed units and relative percentages remain kept steps.
  • Image Size preserves points (#Rlt) and resolves them using the playback document's resolution. Mixed units and unsupported physical-size/resolution combinations remain kept steps. Without resampling, native Image Size still changes only resolution.

Shape creation (contentLayer) with geometry or stroke settings remains a kept step. Save preserves its descriptor, and enabled playback stops instead of creating a canvas-wide solid fill. Editable shape creation is not mapped yet.

The Vibrance event and adjustment-opacity handling incorporate @bommerts' contribution in #8659.

Command options retained by mapped events

  • Image Size preserves scaleStyles. Native calls default to true; an absent ATN flag means false (the reference application plays both alike), so Save writes the key only when it is true. Crop and resolution-only resizing retain their existing behavior.
  • Convert to Profile preserves Dthr, Fltt and rasterizePlaced, defaulting to false. sdwM is written as the reference application records it (-1); other values and malformed flags remain kept steps. Absolute intent writes AClr, with AbsC still accepted on import.
  • Content-Aware Fill preserves colour, quarter-turn rotation, scale and mirror adaptation. Existing native defaults remain unchanged.
  • Paste Layer Style preserves allowPasteFXOnLayerSet. False skips selected groups without applying their styles to children; a selection with no eligible targets fails without editing.
  • Paste preserves As path or shape using the original bounded SVG source. Unsupported geometry fails instead of silently rasterizing. As Pxel plays as an ordinary Paste (or Paste in Place), as does omission.

Generated fixtures verify these native options and their load/save/playback behavior. Conversion order, SVG rasterization and placement were not compared with the reference application.

Render filters

Native commands without an explicit Lens Flare center still use 0.5 / 0.5. Imported steps materialize the measured center above. A missing Fibers seed is captured once at import and preserved for later playback and export. Native color overrides and other settings without ATN fields are refused during strict export.

Recognized steps kept disabled

These recognized events have no playable command. They load as kept steps switched off, and Save Actions preserves their descriptors. They are excluded from the supported-event count and the measured unmapped reference.

String ID Label
animationFramesFromLayers Make Frames from Layers

Known gaps in mapped events

A mapped event can still lose a setting. Every mapped event was checked on 2026-11-01: the 5 296 steps of the .atn corpus (sets the reference application recorded) and factory descriptors measured in the reference application went through actions.load and actions.save, and each saved descriptor was compared with the original. Then every step PhotoCraft saves for the cases in every_mapped_command_exports_and_imports_back was played in the reference application: 128 of 151 ran. Three failed on a wrong code (Vibrance, Gradient Map, Stroke Outside); the others needed a document the test did not have (a mask, a group, a named pattern or channel). Checking every code the mapping writes found three more (Pass Through, canvas extension colour, Absolute Colorimetric). The steps below change what a step does. Every one of them is fixed now: the sections "Settings retained by mapped events" and "Command options retained by mapped events" above say how each setting is kept. What remains are differences that do not change what a step does.

Differences that do not change the result

  • Value types: long and unit values are interchangeable for the reference application (Motion Blur Angl, Dust & Scratches Rds , Apply Image Ofst: same pixels either way); Apply Image's With object plays the same with class null.
  • Save writes the 4-character event code where the file had the string ID, writes null as the top-level class (the application writes the event code), and writes an empty descriptor for steps that had none.
  • Ids of the recording session (LyrI, DocI, Idnt, layerSectionStart, layerSectionEnd, Vrsn, forceNotify) and default flags (MkVs false, Adjs false) are not written back.
  • An adjustment layer's values equal to the defaults are not written back (other values are).
  • Colours are kept as 8-bit values (51.0031 becomes 51); gradient names become "Custom".
  • Levels and Curves write the composite as Chnl.Cmps (the application skips Ordn.Trgt, #8543).

Reference forms

How the reference application resolves a layer or document a step names, measured on 2026-11-01 by playing select and move steps with each form (documents with and without a Background, a group, layers above and below it). A recorded step can use any of these; PhotoCraft reads names and the target today.

Layers

The stack is counted from the bottom and includes a hidden "group end" entry below each group's children. Example stack, bottom to top: Background, L1, L2, group end, Gchild, G (the group), L3.

Form Meaning Measured
By name (name) The layer with that name (the first match). (supported)
Target (Ordn.Trgt) The active layer. (supported)
By index (indx) Position in the stack above. With a Background, the Background is 0 and L1 is 1. Without one, the bottom layer is 1, and 0 fails. The group end is a position but cannot be selected: the step leaves the selection unchanged. A number past the top fails. with Background: 0 Background, 1 L1, 2 L2, 3 (group end: no change), 4 Gchild, 5 G, 6 L3, 7 fails
By id (Idnt) The layer id of the document the step was recorded in (LyrI, never reused in that document). In another document it names an unrelated layer or none. id 3 = L2 with a Background, L1 without
By offset (rele) Not supported for layers: every offset fails. -3..3 all fail
Ordn.Frwr / Ordn.Bckw The next layer up / down in the stack, entering groups (group ends are skipped). from L2: Frwr Gchild, Bckw L1
Ordn.Frnt / Ordn.Back The top layer / the bottom layer (the Background when there is one). L3 / Background

Move to an index (move, T = layer by index m): counted as above on the stack before the move. Moving down, the layer lands at index m; moving up, at m - 1 (directly below the layer that had index m). With a Background, m = 0 fails; without one, m = 0 sends the layer to the bottom. Moving to an index inside a group puts the layer into that group.

m (with Background, moving L2 at index 2) 0 1 2, 3 4 5 6
Stack after fails Bg, L2, L1, ... unchanged Bg, L1, end, L2, Gchild, G, L3 (L2 inside G, bottom) ... end, Gchild, L2, G (inside G, top) ... G, L2, L3

Documents

Form Meaning Measured (D1, D2, D3 opened in that order, D2 active)
By offset (rele) That many documents after (positive) or before (negative) the active one, in opening order, wrapping around at the ends. 0 fails. -1 D1, +1 D3, -2 D3, +2 D1
By index (indx) 1-based, in opening order; 0 fails. 1 D1, 2 D2, 3 D3

PhotoCraft's document.activate {"offset"} refuses to wrap (#7103); the reference application wraps.

Layer comps

Measured with three comps (CompA, CompB, CompC) that each show a different layer, applied with applyComp and every reference form. The document's compsList gives each comp's title, itemIndex (1-based), ID (long) and selection.

Form Result
By name (name) Applies that comp. An unknown name fails.
By index (indx) 1-based, in panel order. 0, negative and past-the-end indexes are accepted and change nothing.
By ID (Idnt) Applies the comp with that ID. An unknown ID fails.
By offset (rele) Always fails, for every offset.
Ordinal (Ordn) Trgt, Nxt , Prvs Applies the current (last applied) comp; Nxt and Prvs do not move.
Ordinal Frst, Lst , Al Applies the first comp (also for Lst ).

Delete (Dlt ) by index uses the same 1-based numbering. PhotoCraft's applyComp import reads only the name form today; the index, ID and ordinal forms load as kept steps.

Newer events (string ID only)

The events the reference application records for the menu items PhotoCraft has that are neither mapped nor in the reference below: 63 candidates from PhotoCraft's menu catalogue, each run in the reference application without a dialog on a document prepared for it (layers, a selection, a smart object, a type layer, a layer style or a group) on 2026-11-01. 27 more menu items record no event of their own (puppet warp and warp splits, combine shapes, scripts such as Load Files into Stack and Statistics, artboard and video export, missing-font commands): they cannot be recorded or play as a script step.

Measured: no settings beyond the target. A step with these events carries at most null (the target layer reference, Ordn.Trgt); mapping them needs only the event name.

Event Menu item
reverse Layer > Arrange > Reverse (several layers selected)
linkSelectedLayers / unlinkSelectedLayers Layer > Link Layers / Unlink Layers
selectLinkedLayers Layer > Select Linked Layers
disableLayerStyle Layer > Layer Style > Clear Layer Style
placedLayerMakeCopy Layer > Smart Objects > New Smart Object via Copy
placedLayerConvertToLayers Layer > Smart Objects > Convert to Layers
placedLayerConvertToEmbedded Layer > Smart Objects > Embed Linked
placedLayerUpdateAllModified Layer > Smart Objects > Update All Modified Content (the returned documentID and layerIDs are session ids, not settings)
rasterizeAll Layer > Rasterize > All Layers
addBlankVideoLayer Layer > Video Layers > New Blank Video Layer
isolateLayers Select > Isolate Layers
textLoadDefaultTypeStyles / textSaveDefaultTypeStyles Type > Load / Save Default Type Styles
recordMeasurements Image > Analysis > Record Measurements
CropPhotosAuto0001 File > Automate > Crop and Straighten Photos

Measured: settings.

Event Menu item Keys
placedLayerExportContents Layer > Smart Objects > Export Contents null: path of the file written
placedLayerConvertToLinked Layer > Smart Objects > Convert to Linked null: target layer; Usng: path of the file written
placedLayerRelinkToFile Layer > Smart Objects > Relink to File null: path; LyrI: session layer id
placedLayerReplaceContents Layer > Smart Objects > Replace Contents null: path; LyrI: session layer id
artboardFromLayerGroupEvent Layer > New > Artboard from Group null target; artboard (object: guideIDs list, artboardPresetName text, Clr RGB background colour, artboardBackgroundType long: 1 white, 2 black, 3 transparent, 4 other = Clr ); changeBackground long. See Artboard from Group: guides and background below.
shapeBlur Filter > Blur > Shape Blur Rds radius in pixels (factory 10); the shape itself comes from the dialog
Make contentLayer with Usng = reference to textLayer Ordn.Trgt Type > Convert to Shape (recorded as Make, not as convertToShape) null: class contentLayer; Usng: the type layer

Recorded through the menus (2026-11-01, steps read back from the saved Actions panel):

Menu Recorded step Keys
Layer > Layer Style > Scale Effects scaleEffectsEvent Scl percent, whole number 1..1000 (the dialog clamps)
Layer > Layer Style > Create Layer(s) Make, null = class Lyr , Usng = reference to the Lefx property of the target layer none; the dialog first warns that some effects cannot be reproduced with layers (OK / Cancel)
Layer > New > Frame from Layers Make, null = class framedGroupSection, From = layer by name, layerSectionStart, layerSectionEnd long, Nm text the dialog also shows width and height, which are not recorded
Layer > New > Artboard from Layers Make, null = class artboardSection, From = layer target, layerSectionStart, layerSectionEnd, Nm
Layer > New > Artboard Make, null = class artboardSection, layerSectionStart, layerSectionEnd, Nm , artboardRect (Top , Left, Btom, Rght doubles, pixels)
Properties panel > Artboard Background Color (Artboard selected) editArtboardEvent null target; artboard (object: artboardRect Top /Left/Btom/Rght pixels, guideIDs list, artboardPresetName text, Clr , artboardBackgroundType 1..4 as above); changeSizes long (8 when only the background changed), changeBackground 1. Clr is only meaningful with type 4: with types 1..3 it holds the previously used colour
Layer > Smart Objects > Stack Mode > mode applyImageStackPluginRenderer: imageStackPlugin class with the mode's code, Nm text = the menu name (localised, except "Entropy") codes: Range rang, Entropy entr, Kurtosis kurt, Maximum maxx, Median medn, Minimum minn, Mean avrg, Skewness skew, Standard Deviation stdv, Summation summ, Variance vari
Layer > Smart Objects > Stack Mode > None imageStackConvertSmartObject none
Layer > Video Layers > New Blank Video Layer, Insert Blank Frame, Delete Frame, Show / Hide Altered Video addBlankVideoLayer, insertBlankFrame, deleteFrame, showAlteredVideo / hideAlteredVideo none
Layer > Video Layers > Interpret Footage interpretFootage Vrsn long (1), interpretAlpha (alphaInterpretation: Ignr ignore, …), colorConvertAlterations bool
Type > Create Work Path Make, null = class Path, From = text layer (TxLr) target
Edit > Find and Replace Text (Replace All) replace, null = reference: property replace of all text layers (TxLr Ordn.Al), Usng = find text, replace text, checkAll, Fwd , caseSensitive, wholeWord, ignoreAccents bool
Edit > Check Spelling spellCheck, null = property spellCheck of all text layers, Usng = checkAll bool recorded with its dialog switched on; the corrections themselves are not recorded
Image > Analysis > Set Measurement Scale > Custom Set, null = property measurementScale of the document target, T = pixelLength long, logicalLength double, logicalUnits text
Image > Analysis > Place Scale Marker a script step (AdobeScriptAutomation Scripts) with jsop = measurementScaleMarkerLength, measurementScaleMarkerDisplayText, measurementScaleMarkerTextPositionBottom bool, measurementScaleMarkerColor text (FFFFFF / 000000), measurementScaleMarkerFont, measurementScaleMarkerFontSize text ("4 pt") the dialog is a bundled script; the step stores its options
Image > Analysis > Record Measurements recordMeasurements none
File > Close All one close per document: Svng (YsN N when "don't save" was chosen), DocI, forceNotify not a closeAll event

Not recorded: File > Close Others, Image > Variables > Define (the variables are kept, no step).

Recorded with source files (2026-11-01):

Menu Recorded step Keys
Image > Apply Data Set apply, null = dataSetClass by name
File > Export > Data Sets as Files exportDataSet, null = class dataSetClass All bool (all data sets), T alias (folder), fileNamingRules (fileNamingComponents list of 7 incl. None; components as in Batch plus underscore and dataSetName; Mcnt, Win , unix)
File > Import > Variable Data Sets importDataSets, null = class dataSetClass Usng alias (the text file), Encd (dataSetEncoding: dataSetEncodingAuto, …), eraseAll bool (replace existing), useFirstColumn bool (first column = data set names)
File > Package packageFile T alias (folder); writes " Folder" (localised) with the document and a Links folder
File > Import > Video Frames to Layers importVideoToLayers Usng alias (video), makeAnimation bool, frameSkip long (limit to every n-th frame; absent when off)
File > Import > Notes (Annotations) importAnnots Usng alias (PDF). A file without notes shows "No annotations were imported" and records nothing
Layer > Video Layers > New Video Layer from File addVideoLayer null alias (video)
Layer > Video Layers > Replace Footage replaceFootage null alias (video)
Layer > Video Layers > Duplicate Frame, Restore Frame, Restore All Frames, Reload Frame duplicateFrame, restoreFrame, restoreAllFrames, reloadFrame none. Duplicate needs a painted frame; Restore needs an altered frame; Restore All asks for confirmation
File > Automate > Photomerge the steps the script runs (open dialog, open, duplicate, addLayerFromFile, align with layerTransformation, mergeAlignedLayers …), then the script event 0f9db13f-a772-4035-9020-840f0e5e2f02 with an empty descriptor (class cjsp) the layout and options are not in the step
File > Automate > Crop and Straighten Photos CropPhotosAuto0001 (no keys), then the steps it runs: CropPhotos0001 with Vl (list of 8 doubles: the four corners), duplicate, crop needs a selected, visible, unlocked layer, otherwise an error message and a step without effect
File > Automate > Conditional Mode Change the Convert Mode it runs, then 8cba8cd6-cb66-11d1-bc43-0060b0a13dc4 Msge text, SrcM list of Cndn enums (UGry, URGB, …: the source modes), DstM object whose class is the target mode (CMYM for CMYK)
File > Automate > Fit Image the Image Size it runs, then 3caa3434-cb67-11d1-bc43-0060b0a13dc4 Msge text, Hght, Wdth pixels, limit bool (don't enlarge)

Not recorded: importing or applying inside Image > Variables > Data Sets (only the separate menu commands record).

Artboard from Group: guides and background (measured 2026-11-02, script runs and a recording through the menu):

  • Recorded form: the menu item opens no dialog. The step always has guideIDs empty, artboardPresetName "", changeBackground 1, and the background type and colour last used for an artboard (the Properties panel choice is sticky: after picking Black for one artboard, the next Artboard from Group records type 2 and makes a black artboard). Guides in the document do not change the recorded step.
  • guideIDs: session metadata, not a playback input. Guide ids are a counter for the whole application session (a new document's guides got 5, 6, 7 after an earlier one's 2, 3, 4). Playing the step with the document's own guide ids, an unknown id (99999) or an empty list gives the same result: no error, the guides stay document guides (kind document), and the new artboard's guideIDs is empty. An implementation can ignore the list on playback and write [].
  • changeBackground: 1 or absent applies artboardBackgroundType and Clr . Any other value (0, 2, 3, -1, 7 tried) ignores both and makes a white artboard (type 1, Clr 255/255/255), and the step's result then has no changeBackground key. artboardBackgroundType absent with changeBackground 1 gives type 1 (white).
  • The artboard takes the group's bounds; Clr is stored on the artboard as given even when the type is 1..3.

Measured for the mapped events (2026-11-02, script runs in the reference application):

  • Transform reference point (FTcs, type QCSt): Qcs0 top-left, Qcs1 top-right, Qcs2 bottom-right, Qcs3 bottom-left corner; Qcs4 top, Qcs5 right, Qcs6 bottom, Qcs7 left edge centre; Qcsa the centre. Qcs8 and unknown values also scale about the centre (not recorded).
  • Convert to Profile records sdwM = -1 (with Inte, Dthr, Fltt, rasterizePlaced).
  • Plain Edit > Paste records AntA = Annt.Anno and As = class Pxel.
  • Link Layers (linkSelectedLayers) toggles when played: played twice on the same two layers it links, then unlinks them.
  • Split Channels splits a document with a single layer, Background or not (a lone layer gives one more document); a document with more than one layer is refused.
  • Load Actions with a set whose name is already in the panel adds a second set of that name; nothing is replaced.

Measured through dialogs and recordings

Measured on 2026-11-01 in two ways: by running the event with its dialog and pressing OK (the reference application then returns the full descriptor), and by recording actions through the menus and reading the recorded steps back from the saved Actions panel. Ranges come from the dialog's own "a value between … is required" message.

Event Keys (recorded order) Notes
Custom (Cstm) Scl long 1..9999, Ofst long -9999..9999, Mtrx list of 25 longs -999..999 Without the dialog the step needs all 25 cells, or the application fails.
Fibers (Fbrs) Vrnc long 1..64, Strg long 1..64, RndS long (seed)
Displace (Dspl) HrzS, VrtS long -999..999; DspM (StrF stretch to fit, or tile); UndA (RptE repeat edge pixels, or wrap around); DspF alias: path of the displacement map (.psd) The map file is chosen after OK.
Color Lookup (colorLookup) lookupType (colorLookupType: 3DLUT, abstract, device link); Nm text: the file's path; Dthr bool; profile raw data (ICC); LUTFormat (LUTFormatType, e.g. LUTFormatLOOK); LUT3DFileData raw data: the LUT file itself; LUT3DFileName text The LUT travels inside the step.
Shape Blur (shapeBlur) Rds pixels 5..1000; customShape object (Nm text, Idnt text: the shape's id); keyOriginType long (9)
Lighting Effects (lightFilterLightingEffects) k3DLights list of lights (Nm , colour Rd /Grn /Bl 0..1, hots, FlOf, shdw, attenuation keys, Type, ison, key3DMatrix raw + floats, X /Y /Z , target tarx/tary/tarz, key3DPosition), key3DCurrentCameraPosition, Glos, Mtrl, Exps, AmbB, AmbC RGB, BmpA, BmpC (texture channel by name, localised: "Ohne" = none), Wdth, Hght A dialog-less run returns nothing; only a recording shows the keys.
Blur Gallery (blurbTransform) blurbType, VrsM, VrsN, referenceRect (rectangle), blurbOpenPanel, blurbGeneralBlurEffectApplied, blurbSaveMaskChannel, blurbHighQuality, blurbWidgetList (per widget: blurbWidgetType (0 = field blur), blurbWidgetLocationX/Y, blurbWidgetSelected, blurbWidgetEffectEnabled, blurbGeneralBlurAmount) One event for all five Blur Gallery filters.
Liquify (LqFy) LqMe raw data: the mesh Opaque; keep the step as recorded.
Camera Raw Filter CrVe text (version), PrVN long, PrVe long With settings at their defaults; changed settings add keys.
Vanishing Point (VnPt) none The planes are not recorded.
Calculations recorded as Make: Nw class channel, Usng object (T reference: source 1 channel and layer, Clcl blend mode, Src2 reference) Not a calculations event.
Image Size, size in cm or inches Wdth in #Rlt (points), scaleStyles, CnsP, Intr A physical size is recorded in points, not pixels: playback needs the document's resolution.
Canvas Size only the changed side; canvasExtensionColorType FrgC for the foreground colour
Convert Mode, several layers, "Don't Flatten" T as a class (Grys), Fltt false, Rstr false With Fltt and Rstr the step plays without the flatten question.
New Group with a colour Usng (Clr label), layerSectionStart, layerSectionEnd, top-level Nm
Shear (Shr ) ShrP list of Pnt (Hrzn, Vrtc doubles), UndA (WrpA wrap around, RptE repeat edge pixels), ShrS long, ShrE long The dialog writes whole numbers: Hrzn -64..63 (dragging past the grid clamps), Vrtc 1..128 with the first point at 1 and the last at 128; dragging a point out of the grid deletes it. ShrS is 0 and ShrE the last point's index (count - 1). Script runs take any value unclamped and crashed on far-off ShrE/ShrS or a first Vrtc below 1.
Gradient tool, classic (Grdn / gradientClassEvent) From, T points in pixels; Opct percent, Md blend mode, Type (GrdT: Lnr , Rdl , Angl, Rflc, Dmnd), Rvrs bool, Dthr bool, UsMs bool (transparency), gradientsInterpolationMethod (Perc perceptual, …), Grad gradient object (as in Gradient Map) Recorded in that order. Opct, Md and Rvrs appear only when they differ from 100 %, Normal and off; Dthr and UsMs only when on. The five types are the only accepted values. A step without Grad fails.
Gradient tool, default mode two steps: Make (null = class contentLayer, Usng = Type gradient layer object) then Set (null = contentLayer target, T = the same object plus Algn false) The object: Dthr, gradientsInterpolationMethod, Angl angle, Type, Scl percent, Ofst (Hrzn, Vrtc percent), Grad. The new tool makes a gradient fill layer; Make holds the first click, Set the finished drag.
Content-Aware Fill (cafWorkspace) cafSamplingRegion (cafSamplingRegionRectangular, …), cafSampleAllLayers bool, cafColorAdaptationLevel (cafColorAdaptationDefault, …), cafRotationAmount (cafRotationAmountNone, …), cafScale bool, cafMirror bool, cafOutput (cafOutputToNewLayer, …) Runs on the selection, which is recorded as its own step before it.
Perspective Warp (perspectiveWarpTransform) null = layer target, Md (perspectiveWarpMode: warp), referenceRect rectangle in pixels, vertices list of points in pixels (the layout quad), warpedVertices (the same points after warping), quads list of indices (4 vertex indexes each) Layout and warp are one step.
Print (print) then Print One Copy (printOneCopy) print: null = reference printOutput property of the target document; printOutput (PstS, Inte, printSixteenBit, printerName text, printProofSetup), printViewProofSetup, printOutputOptions (caption, marks, Bckg colour, BrdT, Bld , Rslt, vectorData, PgPs, Left, Top , Scl , crop rectangle), osSpecificPrintInfo raw data, Cptn text. printOneCopy has no keys. Pressing Print in the dialog records both steps.
Create Droplet (CrtD) In alias: the droplet file; Fldr bool (include subfolders); Usng reference to the action; then the Batch keys below (destination, file naming, error log) when set The same settings as Batch, with the droplet file instead of a source folder.
Sky Replacement (skyReplacement) shiftEdge double, borderSmoothness long (fade edge, default 50), Brgh long, temperature long, harmonizationOpacity long (35), foregroundLightingOpacity long, lightingMode blend mode (Mltp), edgeLightingOpacity long (70), skyReplacementOutput (skyReplacementOutputToNewSheets new layers, …), Idnt text (the sky preset's id), Nm text (its name), File alias (the sky image) Scale and Flip are not in the step: with 150 % and Flip on, the returned keys were the same. foregroundLightingOpacity is computed from the sky (44 and 29 for two skies). Without a chosen sky the dialog returns no keys.

Not recordable: Edit > Purge (no step is recorded; this version's Purge menu has Clipboard, Histories, All and Video Cache, no Undo); File > Export > Export As and Quick Export as PNG (the file is written, no step is recorded). vectorStrokeToFill (Convert Stroke to Fill) exists only internally: the reference application knows it by a localised command name ("command … is not currently available"), but it is in no menu, panel menu, context menu, the stroke options (incl. their gear menu), the Properties panel or the Keyboard Shortcuts summary of all commands and tools, and the event is refused even with a stroked path component selected. It can't be triggered, so it is never recorded: no action contains it, nothing to map.

Batch

Running Batch while recording records the steps the batch played, not a Batch step. The Batch descriptor itself (Btch, as the dialog returns it):

Key Type Meaning
null alias, or enum source folder; for open documents the enum batchSourceType sourceOpenFiles
OvrO bool override action "Open" commands (written only when on)
Fldr bool include all subfolders
suppressWarnings bool suppress colour profile warnings
suppressOpenOptions bool suppress file open options dialogs
Usng reference the action: Actn by name in ASet by name
T alias destination folder (destination Folder)
SvAn bool destination Save and Close (written instead of T )
Ovrd bool override action "Save As" commands (written only when on)
fileNamingRules object file naming (below)
Log alias folder of the error log ("log errors to file")
Nm text error log file name

fileNamingRules: fileNamingComponents (list of up to six objects; each is component enum fileNamingComponent, or Txt text for typed text), Strt long (starting serial number), Mcnt, Win , unix bool (compatibility).

Component Menu entry
Nm / lowerCase / upperCase Document Name / document name / DOCUMENT NAME
oneDigit twoDigit threeDigit fourDigit 1, 2, 3, 4 digit serial number
lowerCaseSerial / upperCaseSerial serial letter (a, b, c…) / (A, B, C…)
mmddyy mmdd yyyymmdd yymmdd yyddmm ddmmyy ddmm dates
lowerCaseExtension / upperCaseExtension extension / EXTENSION

The extension component is written without a dot, unless it is the last component, and nothing else adds an extension: the name is exactly what the components spell. Measured on a.png:

Components Saved as
Name + extension a.png
Name + EXTENSION a.PNG
Name + extension + 3 digit serial apng001 (no extension)
Name + 3 digit serial a001 (no extension)
Name + extension + text x apngx
Name + extension + extension apng.png
Name + text .jpg a.jpg (still PNG data)
DOCUMENT NAME + _ + serial letter + _ + SERIAL LETTER A_a_A

The two short date entries are mmdd and ddmm (on 1 November they give 1101 and 0111).

Batch behaviour

Measured with a folder in holding a.png, b.png, notes.txt and sub/a.png, sub/c.png, sub/deeper/d.png:

  • Order: the folder's files by name, then each subfolder (by name, depth first). The serial number counts across all of them: a_001 (in/a), b_002, a_003 (in/sub/a), c_004, d_005.

  • Include All Subfolders: results all go flat into the destination folder; the subfolder structure is not rebuilt. A later file with the same output name silently overwrites an earlier one (in/a.png and in/sub/a.png give one a.png).

  • Destination None: every processed file stays open, changed and unsaved. Save and Close saves each file over itself in its own format and closes it. Folder saves a copy named by the file naming rules. An open document that was never saved asks with a Save As dialog (Photoshop format, the document's name) even with Folder as the destination.

  • Override Open: files are opened only by the action's own Open steps; without one the action runs with no document and every file fails. Override Save As: files are saved only by the action's own Save As steps, into the destination folder; without one nothing is saved. The dialog says both when the box is ticked.

  • Files that are not images (notes.txt) are an error for that file (code -25600, "extension not recognised"), not skipped silently.

  • Errors, Stop For Errors (no Log key): the batch stops at the failing file; files before it are saved, nothing after it is processed.

  • Errors, Log Errors To File: the batch goes on, and at the end a message says an error occurred and the details are in the log. The log file is UTF-16 LE with BOM and CRLF, and is written even when nothing failed. In German the lines are (the application's own language):

    Stapelanfang
    <blank>
    Datei: "<full path, or the document's name for open documents>"
    Fehler: <message> (<error code>)
    <blank>
    …one pair per failed file…
    Stapelende
    
  • Cancel: Esc during a batch stops the running command and asks "A command was cancelled or stopped during batch processing. Continue with the next file or stop?" (Continue / Stop). Stop ends the batch at once; the file being processed is not saved (12 of 60 written in the test). There is no progress bar: the documents open and close in the window as they are processed.

  • Return value: when any file failed, the Batch step itself reports "cancelled" (the dialog returns no descriptor); a script run with Stop For Errors reports success even though it stopped.

Actions panel menu

Button Mode; New Action, New Set, Duplicate, Delete, Play; Start Recording, Record Again, Insert Menu Item, Insert Stop, Insert Conditional, Insert Path; Action Options, Playback Options, Allow Tool Recording; Clear All Actions, Reset Actions, Load Actions, Replace Actions, Save Actions; the bundled sets (Commands, Frames, Image Effects, LAB Black & White Technique, Production, Star Trails, Text Effects, Textures, Video Actions); Close, Close Tab Group. Playback Options: Accelerated, Step by Step, Pause For 1..60 seconds.

How two menu entries record: Insert Menu Item records the chosen menu command's own event with no descriptor (Image > Image Size gives an imageSize step without settings; playback opens its dialog). Insert Path records a set of the work path: null = reference Path property WrPt, T = list of path components (shapeOperation, SbpL list of subpaths, each with Clsp closed and Pts list of points with Anch in pixels).

Recording that plays on any document

What the reference application records when a user works normally, measured on 2026-11-01 by recording an action through the panel, mouse and keyboard on a document with layers A, B and C and a second open document, then reading the steps back. This is the form PhotoCraft's recorder should write (AUTO-219-1); today it copies journal entries with explicit layer ids.

User action Recorded step
Click a layer in the Layers panel select, null = layer by name ("B"), MkVs false, LyrI list of layer ids (a hint, not the reference)
Ctrl+J (Layer via Copy) copyToLayer, no keys
Click an empty spot of the canvas with Auto-Select on selectNoLayers, null = layer target
Arrow keys with the Move tool one move step per run of key presses, null = layer target, T offset in pixels: Right, Right, Right, Shift+Down gave Hrzn 3, Vrtc 10
Eye icon hide (or show), null = list of layers by name
Opacity typed in the Layers panel set of the target layer, T = Opct percent (pressing Enter after typing recorded the same step twice)
Select All, Deselect set of the selection (fsel) to Al / None
Alt+Backspace (fill with foreground) fill, Usng FrgC, Opct 100 %, Md Normal
Type tool: click, type "Hallo", commit one make of a text layer (TxLr) with Txt = the whole text; position TxtC in percent of the canvas; bounds in points
Ctrl+E (Merge Down) mergeLayersNew, no keys
Ctrl+Tab / Ctrl+Shift+Tab select of a document by offset (rele +1 / -1) plus DocI (the document id, a hint) and forceNotify

So the recorder names layers by name and acts on the target layer, never by id; it merges a run of nudges into one relative move and a typing session into one text step; text and document positions are relative.

Playing on another document

The same recording played on two other documents (Play from step 2, skipping the setup step):

  • Same layer names, new ids: plays through; layers are found by name, LyrI and DocI are ignored.
  • No layer with that name (layers X, Y, Z): each step that names a missing layer stops with a message and Continue / Stop. Select by name: "The command 'Select' is not currently available". Hide by name: "The object 'Layer "A"' is not currently available". Steps on the target layer act on whatever layer is selected (Ctrl+J copied Z into "Z Kopie").
  • After selectNoLayers, steps that need a target layer (move, set opacity, fill) each stop with "The command '…' is not currently available" and Continue / Stop. Continue skips the step; nothing is undone.
  • Play from a step: selecting a step in the panel and pressing Play plays from that step to the end.

Older files: version 12

Action sets saved by the reference application's version 5 era use file version 12. PhotoCraft rejects them today; this is what reading them needs. Checked on 2026-11-01 on 325 real version 12 sets (all parse to the end with this layout) and against AtnKit (MIT), which reads version 12 but gets two details wrong (noted below).

Only the descriptor differs. The file header, the action record and the step record are the same as in version 16 (set and action names are UTF-16 strings with a counted NUL; events are almost always 4-character codes, so the existing event table applies). Trailing bytes after the last action occur in 22 of 325 files (stale data from an overwritten file): keep them a warning.

The version 12 descriptor:

  • The step's descriptor has no name and no class: it starts with the item count.
  • Every identifier is a bare 4-byte code, with no length prefix: keys, classes, enum types and values, units, reference classes. No Unicode class names anywhere.
  • Strings (TEXT, reference names) are the same UTF-16 strings as in version 16.
step descriptor := count u32, count × (key [4], type [4], value)
object          := class [4], count u32, count × (key [4], type [4], value)

bool u8 | long i32 | comp i64 | doub f64 | UntF unit [4] + f64
UnFl unit [4] + n u32 + n × f64
TEXT UTF-16 string | enum type [4] + value [4]
Objc / GlbO object | type / GlbC class [4]
VlLs n u32 + n × (type [4] + value)
ObAr class [4] + object count u32 + count u32 + count × (key [4], type [4], value)
obj  n u32 + n × reference item
tdta / alis / Pth  u32 length + bytes

reference item := form [4] + class [4] + (prop: key [4] | Clss: nothing | Enmr: type [4] + value [4]
                  | rele: i32 | indx: u32 | Idnt: u32 | name: UTF-16 string)

AtnKit reads indx without its class code and has no case for UnFl, ObAr and Pth ; with those fixed, all 325 files parse. Idnt was not seen in a version 12 file; its layout follows indx.

Into PhotoCraft's model: every id becomes a 4-character code; the step descriptor gets the empty name and class null that version 16 files use for code events; nested classes get the empty name. Save Actions keeps writing version 16. Version 7 files (a different layout with 8-bit strings) and sets wrapped in MacBinary stay rejected.

Event reference: measured specs

Each entry below is an event the reference application records, as measured there: its 4-character code and string ID, the PhotoCraft command it maps to (or should map to), and every key the step carries, in the order it is recorded, with type, unit, factory default and allowed values. The Supported events table says which of them PhotoCraft maps today; for the others an entry has everything needed to implement them. When an event is implemented, add it to that table in the same change.

How these values were measured

  • Keys, order, types, units, defaults: each event was run in the reference application without a dialog on an RGB 8-bit document (with a selection, the clipboard or several layers where the step needs them), and the descriptor it returned was read back. That descriptor is what an action records. Settings were reset first, so the defaults are factory defaults. Steps that need a prepared document (a selection, the clipboard, several layers) were run with example values; their tables say so and show those values instead of defaults.
  • Ranges: every number was set far above and below its range. The application clamps instead of refusing, so the values it returned are the exact limits. "Out-of-range values are clamped" in a table means exactly that; implement the same clamping on import.
  • Enum values: every known enum value was tried; only values the application accepted and returned unchanged are listed. A value outside the list should keep the step as a kept step.
  • Names: keys are stored by their 4-character code. The string ID column is a label; where one code has two names in the application, the one that fits the setting is shown.
  • Filter Gallery effects: the "PhotoCraft today" column compares each value with PhotoCraft's own effect parameters (crates/algo/src/artistic.rs). All ranges and defaults already match; 26 parameters have a different name in PhotoCraft, given in that column.

What an implementation needs to do

  1. Import: actions.load maps the step to the command and params listed, using every key in the table; missing keys take the default from the table.
  2. Out-of-range values: clamped to the allowed range, as the reference application does. Enum values outside the allowed list keep the step as a kept step, never a silent default.
  3. Export: actions.save writes the same event with all keys in the order of the table, defaults included, with the units shown.
  4. Round trip: load, then save, gives identical descriptors, for a step with defaults and for one with every value changed.
  5. Tests: add the event to every_mapped_command_exports_and_imports_back and test the params that reach the command.

Each Filter Gallery effect is recorded as its own event (one per effect), carrying a GEfk key with the effect id plus the effect's settings. Today only Spatter (GEfk = Spt) is mapped (to filter.gallery.spatter); the other effects load as kept steps that stop at playback. PhotoCraft already has every effect (crates/algo/src/artistic.rs) behind filter.filterGallery; this issue only maps them. Where our own range or default differs from the measured one, fix ours to match (marked in each table).

Accented Edges

  • Event: AccE / accentedEdges
  • PhotoCraft command: filter.filterGallery effect "accentedEdges"
Key String ID Type Unit Default Allowed PhotoCraft today
EdgW edgeWidth integer 2 1 .. 14 (out-of-range values are clamped) same
EdgB edgeBrightness integer 38 0 .. 50 (out-of-range values are clamped) same
Smth smoothness integer 5 1 .. 15 (out-of-range values are clamped) same

Angled Strokes

  • Event: AngS / angledStrokes
  • PhotoCraft command: filter.filterGallery effect "angledStrokes"
Key String ID Type Unit Default Allowed PhotoCraft today
DrcB directionBalance integer 50 0 .. 100 (out-of-range values are clamped) same
StrL strokeLength integer 15 3 .. 50 (out-of-range values are clamped) same
Shrp sharpness integer 3 0 .. 10 (out-of-range values are clamped) maps to our sharpness (same range and default)

Bas Relief

  • Event: BsRl / basRelief
  • PhotoCraft command: filter.filterGallery effect "basRelief"
Key String ID Type Unit Default Allowed PhotoCraft today
Dtl detail integer 13 1 .. 15 (out-of-range values are clamped) same
Smth smoothness integer 3 1 .. 15 (out-of-range values are clamped) same
LghD lightDirection enumerated LDBt lightDirBottom LDBL lightDirBottomLeft, LDBR lightDirBottomRight, LDBt lightDirBottom, LDLf lightDirLeft, LDRg lightDirRight, LDTL lightDirTopLeft, LDTR lightDirTopRight, LDTp lightDirTop

Chalk Charcoal

  • Event: ChlC / chalkCharcoal
  • PhotoCraft command: filter.filterGallery effect "chalkCharcoal"
Key String ID Type Unit Default Allowed PhotoCraft today
ChrA charcoalArea integer 6 0 .. 20 (out-of-range values are clamped) same
ChlA chalkArea integer 6 0 .. 20 (out-of-range values are clamped) same
StrP strokePressure integer 1 0 .. 5 (out-of-range values are clamped) same

Charcoal

  • Event: Chrc / charcoal
  • PhotoCraft command: filter.filterGallery effect "charcoal"
Key String ID Type Unit Default Allowed PhotoCraft today
ChAm charcoalAmount integer 1 1 .. 7 (out-of-range values are clamped) maps to our charcoalThickness (same range and default)
Dtl detail integer 5 0 .. 5 (out-of-range values are clamped) same
LgDr lightDark integer 50 0 .. 100 (out-of-range values are clamped) maps to our lightDarkBalance (same range and default)

Chrome

  • Event: Chrm / chrome
  • PhotoCraft command: filter.filterGallery effect "chrome"
Key String ID Type Unit Default Allowed PhotoCraft today
Dtl detail integer 4 0 .. 10 (out-of-range values are clamped) same
Smth smoothness integer 7 0 .. 10 (out-of-range values are clamped) same

Colored Pencil

  • Event: ClrP / coloredPencil
  • PhotoCraft command: filter.filterGallery effect "coloredPencil"
Key String ID Type Unit Default Allowed PhotoCraft today
Pncl pencilWidth integer 4 1 .. 24 (out-of-range values are clamped) maps to our pencilWidth (same range and default)
StrP strokePressure integer 8 0 .. 15 (out-of-range values are clamped) same
PprB paperBrightness integer 25 0 .. 50 (out-of-range values are clamped) same

Conte Crayon

  • Event: CntC / conteCrayon
  • PhotoCraft command: filter.filterGallery effect "conteCrayon"
Key String ID Type Unit Default Allowed PhotoCraft today
FrgL foregroundLevel integer 11 1 .. 15 (out-of-range values are clamped) same
BckL backgroundLevel integer 7 1 .. 15 (out-of-range values are clamped) maps to our backgroundLevel (same range and default)
TxtT textureType enumerated TxCa texTypeCanvas TxBr texTypeBrick, TxBu texTypeBurlap, TxCa texTypeCanvas, TxSt texTypeSandstone
Scln scaling integer 100 50 .. 200 (out-of-range values are clamped) same
Rlf relief integer 4 0 .. 50 (out-of-range values are clamped) same
LghD lightDirection enumerated LDTp lightDirTop LDBL lightDirBottomLeft, LDBR lightDirBottomRight, LDBt lightDirBottom, LDLf lightDirLeft, LDRg lightDirRight, LDTL lightDirTopLeft, LDTR lightDirTopRight, LDTp lightDirTop
InvT invertTexture boolean false

Craquelure

  • Event: Crql / craquelure
  • PhotoCraft command: filter.filterGallery effect "craquelure"
Key String ID Type Unit Default Allowed PhotoCraft today
CrcS crackSpacing integer 15 2 .. 100 (out-of-range values are clamped) same
CrcD crackDepth integer 6 0 .. 10 (out-of-range values are clamped) same
CrcB crackBrightness integer 9 0 .. 10 (out-of-range values are clamped) same

Crosshatch

  • Event: Crsh / crosshatch
  • PhotoCraft command: filter.filterGallery effect "crosshatch"
Key String ID Type Unit Default Allowed PhotoCraft today
StrL strokeLength integer 9 3 .. 50 (out-of-range values are clamped) same
Shrp sharpness integer 6 0 .. 20 (out-of-range values are clamped) maps to our sharpness (same range and default)
Strg strength integer 1 1 .. 3 (out-of-range values are clamped) maps to our strength (same range and default)

Cutout

  • Event: Ct / cutout
  • PhotoCraft command: filter.filterGallery effect "cutout"
Key String ID Type Unit Default Allowed PhotoCraft today
NmbL numberOfLayers integer 4 2 .. 8 (out-of-range values are clamped) maps to our numberOfLevels (same range and default)
EdgS edgeSimplicity integer 4 0 .. 10 (out-of-range values are clamped) same
EdgF edgeFidelity integer 2 1 .. 3 (out-of-range values are clamped) same

Dark Strokes

  • Event: DrkS / darkStrokes
  • PhotoCraft command: filter.filterGallery effect "darkStrokes"
Key String ID Type Unit Default Allowed PhotoCraft today
Blnc balance integer 5 0 .. 10 (out-of-range values are clamped) same
BlcI blackIntensity integer 6 0 .. 10 (out-of-range values are clamped) same
WhtI whiteIntensity integer 2 0 .. 10 (out-of-range values are clamped) same

Diffuse Glow

  • Event: DfsG / diffuseGlow
  • PhotoCraft command: filter.filterGallery effect "diffuseGlow"
Key String ID Type Unit Default Allowed PhotoCraft today
Grns graininess integer 6 0 .. 10 (out-of-range values are clamped) same
GlwA glowAmount integer 10 0 .. 20 (out-of-range values are clamped) same
ClrA clearAmount integer 15 0 .. 20 (out-of-range values are clamped) same

Dry Brush

  • Event: DryB / dryBrush
  • PhotoCraft command: filter.filterGallery effect "dryBrush"
Key String ID Type Unit Default Allowed PhotoCraft today
BrsS brushSize integer 2 0 .. 10 (out-of-range values are clamped) same
BrsD brushDetail integer 8 0 .. 10 (out-of-range values are clamped) same
Txtr texture integer 1 1 .. 3 (out-of-range values are clamped) same

Film Grain

  • Event: FlmG / filmGrain
  • PhotoCraft command: filter.filterGallery effect "filmGrain"
Key String ID Type Unit Default Allowed PhotoCraft today
Grn grain integer 4 0 .. 20 (out-of-range values are clamped) same
HghA highlightArea integer 0 0 .. 20 (out-of-range values are clamped) same
Intn intensity integer 10 0 .. 10 (out-of-range values are clamped) same

Fresco

  • Event: Frsc / fresco
  • PhotoCraft command: filter.filterGallery effect "fresco"
Key String ID Type Unit Default Allowed PhotoCraft today
BrsS brushSize integer 2 0 .. 10 (out-of-range values are clamped) same
BrsD brushDetail integer 8 0 .. 10 (out-of-range values are clamped) same
Txtr texture integer 1 1 .. 3 (out-of-range values are clamped) same

Glass

  • Event: Gls / glass
  • PhotoCraft command: filter.filterGallery effect "glass"
Key String ID Type Unit Default Allowed PhotoCraft today
Dstr distortion integer 5 0 .. 20 (out-of-range values are clamped) maps to our distortion (same range and default)
Smth smoothness integer 3 1 .. 15 (out-of-range values are clamped) same
TxtT textureType enumerated TxFr texTypeFrosted TxBr texTypeBrick, TxBu texTypeBurlap, TxCa texTypeCanvas, TxSt texTypeSandstone
Scln scaling integer 100 50 .. 200 (out-of-range values are clamped) same
InvT invertTexture boolean false

Glowing Edges

  • Event: GlwE / glowingEdges
  • PhotoCraft command: filter.filterGallery effect "glowingEdges"
Key String ID Type Unit Default Allowed PhotoCraft today
EdgW edgeWidth integer 2 1 .. 14 (out-of-range values are clamped) same
EdgB edgeBrightness integer 6 0 .. 20 (out-of-range values are clamped) same
Smth smoothness integer 5 1 .. 15 (out-of-range values are clamped) same

Graphic Pen

  • Event: GraP / graphicPen
  • PhotoCraft command: filter.filterGallery effect "graphicPen"
Key String ID Type Unit Default Allowed PhotoCraft today
StrL strokeLength integer 15 1 .. 15 (out-of-range values are clamped) same
LgDr lightDark integer 50 0 .. 100 (out-of-range values are clamped) maps to our lightDarkBalance (same range and default)
SDir strokeDirection enumerated SDRD strokeDirRightDiag SDHz strokeDirHorizontal, SDLD strokeDirLeftDiag, SDRD strokeDirRightDiag, SDVt strokeDirVertical

Halftone Screen

  • Event: HlfS / halftoneScreen
  • PhotoCraft command: filter.filterGallery effect "halftonePattern"
Key String ID Type Unit Default Allowed PhotoCraft today
HlSz halftoneSize integer 1 1 .. 12 (out-of-range values are clamped) maps to our size (same range and default)
Cntr contrast integer 5 0 .. 50 (out-of-range values are clamped) maps to our contrast (same range and default)
ScrT screenType enumerated ScrD screenDot ScrC screenCircle, ScrD screenDot, ScrL screenLine

Ink Outlines

  • Event: InkO / inkOutlines
  • PhotoCraft command: filter.filterGallery effect "inkOutlines"
Key String ID Type Unit Default Allowed PhotoCraft today
StrL strokeLength integer 4 1 .. 50 (out-of-range values are clamped) same
DrkI darkIntensity integer 20 0 .. 50 (out-of-range values are clamped) same
LghI lightIntensity integer 10 0 .. 50 (out-of-range values are clamped) same

Mosaic Tiles

  • Event: MscT (no string ID)
  • PhotoCraft command: filter.filterGallery effect "mosaicTiles"
Key String ID Type Unit Default Allowed PhotoCraft today
TlSz tileSize integer 12 2 .. 100 (out-of-range values are clamped) same
GrtW groutWidth integer 3 1 .. 15 (out-of-range values are clamped) same
LghG lightenGrout integer 9 0 .. 10 (out-of-range values are clamped) same

Neon Glow

  • Event: NGlw / neonGlow
  • PhotoCraft command: filter.filterGallery effect "neonGlow"
Key String ID Type Unit Default Allowed PhotoCraft today
Sz size integer 5 -24 .. 24 (out-of-range values are clamped) maps to our glowSize (same range and default)
Brgh brightness integer 15 0 .. 50 (out-of-range values are clamped) maps to our glowBrightness (same range and default)
Clr color object obj 'RGBC' RGBColor

Nested values as recorded (defaults):

    'Rd  ' red : DOUBLETYPE = 0
    'Grn ' green : DOUBLETYPE = 0
    'Bl  ' blue : DOUBLETYPE = 255

Note Paper

  • Event: NtPr / notePaper
  • PhotoCraft command: filter.filterGallery effect "notePaper"
Key String ID Type Unit Default Allowed PhotoCraft today
ImgB imageBalance integer 25 0 .. 50 (out-of-range values are clamped) same
Grns graininess integer 10 0 .. 20 (out-of-range values are clamped) same
Rlf relief integer 11 0 .. 25 (out-of-range values are clamped) same

Ocean Ripple

  • Event: OcnR / oceanRipple
  • PhotoCraft command: filter.filterGallery effect "oceanRipple"
Key String ID Type Unit Default Allowed PhotoCraft today
RplS rippleSize integer 9 1 .. 15 (out-of-range values are clamped) same
RplM rippleMagnitude integer 9 0 .. 20 (out-of-range values are clamped) same

Paint Daubs

  • Event: PntD / paintDaubs
  • PhotoCraft command: filter.filterGallery effect "paintDaubs"
Key String ID Type Unit Default Allowed PhotoCraft today
Sz size integer 8 1 .. 50 (out-of-range values are clamped) maps to our brushSize (same range and default)
Shrp sharpness integer 7 0 .. 40 (out-of-range values are clamped) maps to our sharpness (same range and default)
BrsT brushType enumerated BrSm brushSimple BrDR brushDarkRough, BrSm brushSimple, BrSp brushSparkle, BrbW brushWideBlurry, BrsL brushLightRough, BrsW brushWideSharp

Palette Knife

  • Event: PltK / paletteKnife
  • PhotoCraft command: filter.filterGallery effect "paletteKnife"
Key String ID Type Unit Default Allowed PhotoCraft today
StrS strokeSize integer 25 1 .. 50 (out-of-range values are clamped) same
StDt strokeDetail integer 3 1 .. 3 (out-of-range values are clamped) same
Sftn softness integer 0 0 .. 10 (out-of-range values are clamped) same

Patchwork

  • Event: Ptch / patchwork
  • PhotoCraft command: filter.filterGallery effect "patchwork"
Key String ID Type Unit Default Allowed PhotoCraft today
SqrS squareSize integer 4 0 .. 10 (out-of-range values are clamped) same
Rlf relief integer 8 0 .. 25 (out-of-range values are clamped) same

Photocopy

  • Event: Phtc / photocopy
  • PhotoCraft command: filter.filterGallery effect "photocopy"
Key String ID Type Unit Default Allowed PhotoCraft today
Dtl detail integer 7 1 .. 24 (out-of-range values are clamped) same
Drkn darkness integer 8 1 .. 50 (out-of-range values are clamped) maps to our darkness (same range and default)

Plaster

  • Event: Plst / plaster
  • PhotoCraft command: filter.filterGallery effect "plaster"
Key String ID Type Unit Default Allowed PhotoCraft today
ImgB imageBalance integer 20 0 .. 50 (out-of-range values are clamped) same
Smth smoothness integer 2 1 .. 15 (out-of-range values are clamped) same
LghP lightPosition enumerated LPTp lightPosTop LPBL lightPosBottomLeft, LPBr lightPosBottomRight, LPBt lightPosBottom, LPLf lightPosLeft, LPRg lightPosRight, LPTL lightPosTopLeft, LPTR lightPosTopRight, LPTp lightPosTop

Plastic Wrap

  • Event: PlsW / plasticWrap
  • PhotoCraft command: filter.filterGallery effect "plasticWrap"
Key String ID Type Unit Default Allowed PhotoCraft today
HghS highlightStrength integer 15 0 .. 20 (out-of-range values are clamped) same
Dtl detail integer 9 1 .. 15 (out-of-range values are clamped) same
Smth smoothness integer 7 1 .. 15 (out-of-range values are clamped) same

Poster Edges

  • Event: PstE / posterEdges
  • PhotoCraft command: filter.filterGallery effect "posterEdges"
Key String ID Type Unit Default Allowed PhotoCraft today
EdgT edgeThickness integer 2 0 .. 10 (out-of-range values are clamped) same
EdgI edgeIntensity integer 1 0 .. 10 (out-of-range values are clamped) same
Pstr posterization integer 2 0 .. 6 (out-of-range values are clamped) same

Reticulation

  • Event: Rtcl / reticulation
  • PhotoCraft command: filter.filterGallery effect "reticulation"
Key String ID Type Unit Default Allowed PhotoCraft today
Dnst density integer 12 0 .. 50 (out-of-range values are clamped) same
BlcL blackLevel integer 40 0 .. 50 (out-of-range values are clamped) maps to our foregroundLevel (same range and default)
WhtL whiteLevel integer 5 0 .. 50 (out-of-range values are clamped) maps to our backgroundLevel (same range and default)

Rough Pastels

  • Event: RghP / roughPastels
  • PhotoCraft command: filter.filterGallery effect "roughPastels"
Key String ID Type Unit Default Allowed PhotoCraft today
StrL strokeLength integer 6 0 .. 40 (out-of-range values are clamped) same
StDt strokeDetail integer 4 1 .. 20 (out-of-range values are clamped) same
TxtT textureType enumerated TxCa texTypeCanvas TxBr texTypeBrick, TxBu texTypeBurlap, TxCa texTypeCanvas, TxSt texTypeSandstone
Scln scaling integer 100 50 .. 200 (out-of-range values are clamped) same
Rlf relief integer 20 0 .. 50 (out-of-range values are clamped) same
LghD lightDirection enumerated LDBt lightDirBottom LDBL lightDirBottomLeft, LDBR lightDirBottomRight, LDBt lightDirBottom, LDLf lightDirLeft, LDRg lightDirRight, LDTL lightDirTopLeft, LDTR lightDirTopRight, LDTp lightDirTop
InvT invertTexture boolean false

Smudge Stick

  • Event: SmdS / smudgeStick
  • PhotoCraft command: filter.filterGallery effect "smudgeStick"
Key String ID Type Unit Default Allowed PhotoCraft today
StrL strokeLength integer 2 0 .. 10 (out-of-range values are clamped) same
HghA highlightArea integer 0 0 .. 20 (out-of-range values are clamped) same
Intn intensity integer 10 0 .. 10 (out-of-range values are clamped) same

Spatter

  • Event: Spt / spatter
  • PhotoCraft command: filter.filterGallery effect "spatter"
Key String ID Type Unit Default Allowed PhotoCraft today
SprR sprayRadius integer 10 0 .. 25 (out-of-range values are clamped) same
Smth smoothness integer 5 1 .. 15 (out-of-range values are clamped) same

Sponge

  • Event: Spng / sponge
  • PhotoCraft command: filter.filterGallery effect "sponge"
Key String ID Type Unit Default Allowed PhotoCraft today
BrsS brushSize integer 2 0 .. 10 (out-of-range values are clamped) same
Dfnt definition integer 12 0 .. 25 (out-of-range values are clamped) same
Smth smoothness integer 5 1 .. 15 (out-of-range values are clamped) same

Sprayed Strokes

  • Event: SprS / sprayedStrokes
  • PhotoCraft command: filter.filterGallery effect "sprayedStrokes"
Key String ID Type Unit Default Allowed PhotoCraft today
StrL strokeLength integer 12 0 .. 20 (out-of-range values are clamped) same
SprR sprayRadius integer 7 0 .. 25 (out-of-range values are clamped) same
SDir strokeDirection enumerated SDRD strokeDirRightDiag SDHz strokeDirHorizontal, SDLD strokeDirLeftDiag, SDRD strokeDirRightDiag, SDVt strokeDirVertical

Stained Glass

  • Event: StnG / stainedGlass
  • PhotoCraft command: filter.filterGallery effect "stainedGlass"
Key String ID Type Unit Default Allowed PhotoCraft today
ClSz cellSize integer 10 2 .. 50 (out-of-range values are clamped) same
BrdT borderThickness integer 4 1 .. 20 (out-of-range values are clamped) same
LghI lightIntensity integer 3 0 .. 10 (out-of-range values are clamped) same

Stamp

  • Event: Stmp / stamp
  • PhotoCraft command: filter.filterGallery effect "stamp"
Key String ID Type Unit Default Allowed PhotoCraft today
LgDr lightDark integer 25 0 .. 50 (out-of-range values are clamped) maps to our lightDarkBalance (same range and default)
Smth smoothness integer 5 1 .. 50 (out-of-range values are clamped) same

Sumie

  • Event: Smie / sumie
  • PhotoCraft command: filter.filterGallery effect "sumiE"
Key String ID Type Unit Default Allowed PhotoCraft today
StrW strokeWidth integer 10 3 .. 15 (out-of-range values are clamped) same
StrP strokePressure integer 2 0 .. 15 (out-of-range values are clamped) same
Cntr contrast integer 16 0 .. 40 (out-of-range values are clamped) maps to our contrast (same range and default)

Texturizer

  • Event: Txtz / texturizer
  • PhotoCraft command: filter.filterGallery effect "texturizer"
Key String ID Type Unit Default Allowed PhotoCraft today
TxtT textureType enumerated TxCa texTypeCanvas TxBr texTypeBrick, TxBu texTypeBurlap, TxCa texTypeCanvas, TxSt texTypeSandstone
Scln scaling integer 100 50 .. 200 (out-of-range values are clamped) same
Rlf relief integer 4 0 .. 50 (out-of-range values are clamped) same
LghD lightDirection enumerated LDTp lightDirTop LDBL lightDirBottomLeft, LDBR lightDirBottomRight, LDBt lightDirBottom, LDLf lightDirLeft, LDRg lightDirRight, LDTL lightDirTopLeft, LDTR lightDirTopRight, LDTp lightDirTop
InvT invertTexture boolean false

Torn Edges

  • Event: TrnE / tornEdges
  • PhotoCraft command: filter.filterGallery effect "tornEdges"
Key String ID Type Unit Default Allowed PhotoCraft today
ImgB imageBalance integer 25 0 .. 50 (out-of-range values are clamped) same
Smth smoothness integer 11 1 .. 15 (out-of-range values are clamped) same
Cntr contrast integer 17 1 .. 25 (out-of-range values are clamped) maps to our contrast (same range and default)

Underpainting

  • Event: Undr / underpainting
  • PhotoCraft command: filter.filterGallery effect "underpainting"
Key String ID Type Unit Default Allowed PhotoCraft today
BrsS brushSize integer 6 0 .. 40 (out-of-range values are clamped) same
TxtC textureCoverage integer 16 0 .. 40 (out-of-range values are clamped) maps to our textureCoverage (same range and default)
TxtT textureType enumerated TxCa texTypeCanvas TxBr texTypeBrick, TxBu texTypeBurlap, TxCa texTypeCanvas, TxSt texTypeSandstone
Scln scaling integer 100 50 .. 200 (out-of-range values are clamped) same
Rlf relief integer 4 0 .. 50 (out-of-range values are clamped) same
LghD lightDirection enumerated LDTp lightDirTop LDBL lightDirBottomLeft, LDBR lightDirBottomRight, LDBt lightDirBottom, LDLf lightDirLeft, LDRg lightDirRight, LDTL lightDirTopLeft, LDTR lightDirTopRight, LDTp lightDirTop
InvT invertTexture boolean false

Water Paper

  • Event: WtrP / waterPaper
  • PhotoCraft command: filter.filterGallery effect "waterPaper"
Key String ID Type Unit Default Allowed PhotoCraft today
FbrL fiberLength integer 15 3 .. 50 (out-of-range values are clamped) same
Brgh brightness integer 60 0 .. 100 (out-of-range values are clamped) same
Cntr contrast integer 80 0 .. 100 (out-of-range values are clamped) maps to our contrast (same range and default)

Watercolor

  • Event: Wtrc / watercolor
  • PhotoCraft command: filter.filterGallery effect "watercolor"
Key String ID Type Unit Default Allowed PhotoCraft today
BrsD brushDetail integer 9 1 .. 14 (out-of-range values are clamped) same
ShdI shadingIntensity integer 1 0 .. 10 (out-of-range values are clamped) maps to our shadowIntensity (same range and default)
Txtr texture integer 1 1 .. 3 (out-of-range values are clamped) same

Grain

  • Event: Grn / grain
  • PhotoCraft command: filter.filterGallery effect "grain"
Key String ID Type Unit Default Allowed PhotoCraft today
Intn intensity integer 40 0 .. 100 (out-of-range values are clamped) same
Cntr contrast integer 50 0 .. 100 (out-of-range values are clamped) maps to our contrast (same range and default)
Grnt grainType enumerated GrnR grainRegular GrCn grainContrasty, GrSf grainSoft, GrSp grainSpeckle, GrSr grainSprinkles, GrSt grainStippled, GrnC grainClumped, GrnE grainEnlarged, GrnH grainHorizontal, GrnR grainRegular, GrnV grainVertical

Group B: The Render filters Clouds, Difference Clouds, Fibers and Lens Flare

All four commands exist in PhotoCraft; only the .atn mapping is missing. Lighting Effects is covered with the events that need a recorded step (its lights are only recorded through the dialog).

Clouds

  • Event: Clds / clouds
  • PhotoCraft command: filter.render.clouds
  • Uses the current foreground and background colours; the step itself carries no colours.

No parameters: the step carries an empty descriptor.

Difference Clouds

  • Event: DfrC / differenceClouds
  • PhotoCraft command: filter.render.differenceClouds
  • Same as Clouds, blended with Difference.

No parameters: the step carries an empty descriptor.

Fibers

  • Event: Fbrs (no string ID)
  • PhotoCraft command: filter.render.fibers
  • randomSeed makes playback reproduce the recorded result; keep it.
Key String ID Type Unit Default Allowed
Vrnc (none) integer 16 not clamped in the step (values are returned unchanged); limits pending, see "Events that need a step recorded through their dialog"
Strg strengthPlugin integer 4 not clamped in the step (values are returned unchanged); limits pending, see "Events that need a step recorded through their dialog"
RndS randomSeed integer random any 32-bit integer; a new random value per recording

Lens Flare

  • Event: LnsF / lensFlare
  • PhotoCraft command: filter.render.lensFlare
  • Lens types: Zm 50-300 mm Zoom, Nkn 35 mm Prime, Nkn1 105 mm Prime, PnVs Movie Prime.
Key String ID Type Unit Default Allowed
Brgh brightness integer 100 10 .. 300 (out-of-range values are clamped)
FlrC flareCenter object obj 'Pnt ' point Hrzn / Vrtc doubles, 0.4 / 0.4 by default; not clamped: (5, -5) is kept as given and plays
Lns lens enumerated Zm zoom Nkn nikon, Nkn1 nikon105, PnVs panaVision, Zm zoom

Nested values as recorded (defaults):

    'Hrzn' horizontal : DOUBLETYPE = 0.40000000596046
    'Vrtc' vertical : DOUBLETYPE = 0.40000000596046

Group C: The Distort filters (Pinch, Polar Coordinates, Shear, Spherize, Twirl, Wave, ZigZag)

All commands exist in PhotoCraft (filter.distort.*); only the .atn mapping is missing. Displace needs a displacement map file and is listed separately at the end.

Pinch

  • Event: Pnch / pinch
  • PhotoCraft command: filter.distort.pinch
Key String ID Type Unit Default Allowed
Amnt amount integer 50 -100 .. 100 (out-of-range values are clamped)

Polar Coordinates

  • Event: Plr / polar
  • PhotoCraft command: filter.distort.polarCoordinates
Key String ID Type Unit Default Allowed
Cnvr convert enumerated RctP rectToPolar PlrR polarToRect, RctP rectToPolar

Shear

  • Event: Shr / shear
  • PhotoCraft command: filter.distort.shear
  • shearPoints is a list of curve points; keep their order and count.
Key String ID Type Unit Default Allowed
ShrP shearPoints list list[2] list of Pnt points (Hrzn, Vrtc) from top to bottom; default two points (0, 1) and (0, 128). The dialog writes whole numbers: Hrzn -64..63 (dragging past the grid edge clamps), Vrtc 1..128 with the first point at 1 and the last at 128; dragging a point out of the grid deletes it. A script run accepts any value without clamping (e.g. Hrzn ±10000, fractions) and crashed on a first point with Vrtc < 1: clamp to the dialog ranges on import
UndA undefinedArea enumerated WrpA wrapAround RptE repeatEdgePixels, WrpA wrapAround
ShrS shearStart integer 0 index of the first curve point; the dialog always writes 0
ShrE shearEnd integer 1 index of the last curve point (point count - 1); the dialog writes it. Script runs with other values change the result, and far-off values (ShrE 100 or 1000, ShrS -1000) crashed the application: on import accept only ShrS 0 and ShrE = point count - 1, otherwise keep the step as a kept step

Nested values as recorded (defaults):

    [0] OBJECTTYPE = obj 'Pnt ' point
        'Hrzn' horizontal : DOUBLETYPE = 0
        'Vrtc' vertical : DOUBLETYPE = 1
    [1] OBJECTTYPE = obj 'Pnt ' point
        'Hrzn' horizontal : DOUBLETYPE = 0
        'Vrtc' vertical : DOUBLETYPE = 128

Spherize

  • Event: Sphr / spherize
  • PhotoCraft command: filter.distort.spherize
Key String ID Type Unit Default Allowed
Amnt amount integer 100 -100 .. 100 (out-of-range values are clamped)
SphM spherizeMode enumerated Nrml normal HrzO horizontalOnly, Nrml normal, VrtO verticalOnly

Twirl

  • Event: Twrl / twirl
  • PhotoCraft command: filter.distort.twirl
Key String ID Type Unit Default Allowed
Angl angle integer 50 -999 .. 999 (out-of-range values are clamped)

Wave

  • Event: Wave / wave
  • PhotoCraft command: filter.distort.wave
  • randomSeed: keep it so playback reproduces the recorded result.
Key String ID Type Unit Default Allowed
Wvtp waveType enumerated WvSn waveSine WvSn waveSine, WvSq waveSquare, WvTr waveTriangle
NmbG numberOfGenerators integer 5 1 .. 999 (out-of-range values are clamped)
WLMn wavelengthMin integer 10 1 .. 999 (out-of-range values are clamped)
WLMx wavelengthMax integer 120 1 .. 999 (out-of-range values are clamped)
AmMn amplitudeMin integer 5 1 .. 999 (out-of-range values are clamped)
AmMx amplitudeMax integer 35 1 .. 999 (out-of-range values are clamped)
SclH scaleHorizontal integer 100 1 .. 100 (out-of-range values are clamped)
SclV scaleVertical integer 100 1 .. 100 (out-of-range values are clamped)
UndA undefinedArea enumerated RptE repeatEdgePixels RptE repeatEdgePixels, WrpA wrapAround
RndS randomSeed integer random any 32-bit integer; a new random value per recording

ZigZag

  • Event: ZgZg / zigZag
  • PhotoCraft command: filter.distort.zigZag
Key String ID Type Unit Default Allowed
Amnt amount integer 10 -100 .. 100 (out-of-range values are clamped)
NmbR numberOfRipples integer 5 0 .. 20 (out-of-range values are clamped)
ZZTy zigZagType enumerated PndR pondRipples ArnC aroundCenter, OtFr outFromCenter, PndR pondRipples

Displace

Displace reads a displacement map from a file chosen in a dialog; record one step and add its keys (file path form) before implementing.

Group D: The Stylize and Pixelate filters

All commands exist in PhotoCraft (filter.stylize.*, filter.pixelate.*); only the .atn mapping is missing.

Extrude

  • Event: Extr / extrude
  • PhotoCraft command: filter.stylize.extrude
Key String ID Type Unit Default Allowed
ExtS extrudeSize integer 30 2 .. 255 (out-of-range values are clamped)
ExtD extrudeDepth integer 30 1 .. 255 (out-of-range values are clamped)
ExtF extrudeSolidFace boolean false
ExtM extrudeMaskIncomplete boolean false
ExtT extrudeType enumerated Blks blacks Blks blacks, Pyrm pyramids
ExtR extrudeRandom enumerated Rndm random LvlB levelBased, Rndm random

Find Edges

  • Event: FndE / findEdges
  • PhotoCraft command: filter.stylize.findEdges

No parameters: the step carries an empty descriptor.

Solarize

  • Event: Slrz / solarize
  • PhotoCraft command: filter.stylize.solarize

No parameters: the step carries an empty descriptor.

Trace Contour

  • Event: TrcC / traceContour
  • PhotoCraft command: filter.stylize.traceContour
Key String ID Type Unit Default Allowed
Lvl level integer 128 whole number 0..255 (the dialog clamps to the nearest value). A recorded step carries the real level (e.g. 77); only a script run echoes 128 back. Levels <= 0 and >= 255 give the same image.
Edg edge enumerated Upr upper CntE enum: Lwr lower, Upr upper; recorded as set in the dialog

Wind

  • Event: Wnd / wind
  • PhotoCraft command: filter.stylize.wind
Key String ID Type Unit Default Allowed
WndM windMethod enumerated Wnd wind Blst blast, Stgr stagger, Wnd wind
Drct direction enumerated Left left Left left, Rght right

Tiles

  • Event: Tls / tiles
  • PhotoCraft command: filter.stylize.tiles
Key String ID Type Unit Default Allowed
TlNm tileNumber integer 10 1 .. 99 (out-of-range values are clamped)
TlOf tileOffset integer 10 1 .. 99 (out-of-range values are clamped)
FlCl fillColor enumerated FlBc fillBack FlBc fillBack, FlFr fillFore, FlIn fillInverse, FlSm fillSame

Color Halftone

  • Event: ClrH / colorHalftone
  • PhotoCraft command: filter.pixelate.colorHalftone
Key String ID Type Unit Default Allowed
Rds radius integer 8 4 .. 127 (out-of-range values are clamped)
Ang1 angle1 integer 108 -10000 .. 10000 (out-of-range values are clamped)
Ang2 angle2 integer 162 -10000 .. 10000 (out-of-range values are clamped)
Ang3 angle3 integer 90 -10000 .. 10000 (out-of-range values are clamped)
Ang4 angle4 integer 45 -10000 .. 10000 (out-of-range values are clamped)

Facet

  • Event: Fct / facet
  • PhotoCraft command: filter.pixelate.facet

No parameters: the step carries an empty descriptor.

Fragment

  • Event: Frgm / fragment
  • PhotoCraft command: filter.pixelate.fragment

No parameters: the step carries an empty descriptor.

Mezzotint

  • Event: Mztn / mezzotint
  • PhotoCraft command: filter.pixelate.mezzotint
Key String ID Type Unit Default Allowed
MztT mezzotintType enumerated FnDt fineDots CrsD coarseDots, FnDt fineDots, GrnD grainyDots, LngL longLines, LngS longStrokes, MdmD mediumDots, MdmL mediumLines, MdmS mediumStrokes, ShSt shortStrokes, ShrL shortLines

Mosaic

  • Event: Msc / mosaic
  • PhotoCraft command: filter.pixelate.mosaic
Key String ID Type Unit Default Allowed
ClSz cellSize unitdouble 2 2 .. 200 pixels (out-of-range values are clamped). Write it as a unit double in #Pxl: the application accepts that and returns it unchanged. Read a value without a unit as pixels (the application returns its own default that way).

Pointillize

  • Event: Pntl / pointillize
  • PhotoCraft command: filter.pixelate.pointillize
Key String ID Type Unit Default Allowed
ClSz cellSize integer 5 3 .. 300 (out-of-range values are clamped)

Group E: Video, Other and matting filters and the direct Gradient Map / Replace Color adjustments

All commands exist in PhotoCraft; only the .atn mapping is missing. Gradient Map and Replace Color here are the direct adjustments (Image > Adjustments), not adjustment layers (those are already mapped).

De-Interlace

  • Event: Dntr / deInterlace
  • PhotoCraft command: filter.video.deInterlace
Key String ID Type Unit Default Allowed
IntE interlaceEliminateType enumerated ElmO eliminateOddFields ElmE eliminateEvenFields, ElmO eliminateOddFields
IntC interlaceCreateType enumerated CrtI createInterpolation CrtD createDroplet, CrtI createInterpolation

NTSC Colors

  • Event: NTSC (no string ID)
  • PhotoCraft command: filter.video.ntscColors

No parameters: the step carries an empty descriptor.

HSB/HSL

  • Event: HsbP (no string ID)
  • PhotoCraft command: filter.other.hsbHsl
Key String ID Type Unit Default Allowed
Inpt input enumerated RGBC RGBColor HSBl HSBColorEnum, HSLC HSLColor, RGBC RGBColor
Otpt output enumerated HSBl HSBColorEnum HSBl HSBColorEnum, HSLC HSLColor, RGBC RGBColor

Remove Black Matte

  • Event: RmvB / removeBlackMatte
  • PhotoCraft command: layer.matting.removeBlackMatte

No parameters: the step carries an empty descriptor.

Remove White Matte

  • Event: RmvW / removeWhiteMatte
  • PhotoCraft command: layer.matting.removeWhiteMatte

No parameters: the step carries an empty descriptor.

Gradient Map (direct)

  • Event: GrMp (no string ID)
  • PhotoCraft command: image.adjustments.gradientMap
  • The gradient object is the same gradient form the adjustment layer already maps; reuse that code.
Key String ID Type Unit Default Allowed
`` gradientsInterpolationMethod enumerated gradientInterpolationMethodType.'Gcls' classic
Grad gradient object obj 'Grdn' gradientClassEvent

Nested values as recorded (defaults):

    'Nm  ' name : STRINGTYPE = "Vorder- zu Hintergrundfarbe"
    'GrdF' gradientForm : ENUMERATEDTYPE = 'GrdF' gradientForm.'CstS' customStops
    'Intr' interfaceIconFrameDimmed : DOUBLETYPE = 4096
    'Clrs' colors : LISTTYPE = list[2]
        [0] OBJECTTYPE = obj 'Clrt' colorStop
            'Clr ' color : OBJECTTYPE = obj 'RGBC' RGBColor
                'Rd  ' red : DOUBLETYPE = 0
                'Grn ' green : DOUBLETYPE = 0
                'Bl  ' blue : DOUBLETYPE = 0
            'Type' type : ENUMERATEDTYPE = 'Clry' colorStopType.'UsrS' userStop
            'Lctn' location : INTEGERTYPE = 0
            'Mdpn' midpoint : INTEGERTYPE = 50
        [1] OBJECTTYPE = obj 'Clrt' colorStop
            'Clr ' color : OBJECTTYPE = obj 'RGBC' RGBColor
                'Rd  ' red : DOUBLETYPE = 255
                'Grn ' green : DOUBLETYPE = 255
                'Bl  ' blue : DOUBLETYPE = 255
            'Type' type : ENUMERATEDTYPE = 'Clry' colorStopType.'UsrS' userStop
            'Lctn' location : INTEGERTYPE = 4096
            'Mdpn' midpoint : INTEGERTYPE = 50
    'Trns' transparency : LISTTYPE = list[2]
        [0] OBJECTTYPE = obj 'TrnS' transferSpec
            'Opct' opacity : UNITDOUBLE = 100 '#Prc' percentUnit
            'Lctn' location : INTEGERTYPE = 0
            'Mdpn' midpoint : INTEGERTYPE = 50
        [1] OBJECTTYPE = obj 'TrnS' transferSpec
            'Opct' opacity : UNITDOUBLE = 100 '#Prc' percentUnit
            'Lctn' location : INTEGERTYPE = 4096
            'Mdpn' midpoint : INTEGERTYPE = 50

Average

  • Event: Avrg (no string ID)
  • PhotoCraft command: filter.blur.average
  • Measured with example values in a prepared document: the Value column shows what was sent and recorded, not a factory default (a step always carries the values the user set).

No parameters: the step carries an empty descriptor.

Custom

  • Event: Cstm / custom
  • PhotoCraft command: filter.other.custom
  • Measured with example values in a prepared document: the Value column shows what was sent and recorded, not a factory default (a step always carries the values the user set).
Key String ID Type Unit Example value Allowed
Scl scale integer 1 1 .. 9999 (measured in the dialog); applied also when played without the dialog (scale 2 halves the result)
Ofst offset integer 0 -9999 .. 9999 (measured in the dialog); applied also when played without the dialog (offset 50 adds 50)
Mtrx matrix list none: a step always carries all 25 cells exactly 25 integers (5 x 5, row by row), each -999 .. 999; a 3 x 3 list makes the application fail

Replace Color

  • Event: RplC / replaceColor
  • PhotoCraft command: image.adjustments.replaceColor
  • Measured with example values in a prepared document: the Value column shows what was sent and recorded, not a factory default (a step always carries the values the user set).
Key String ID Type Unit Example value Allowed
Fzns fuzziness integer 40 0 .. 200 (out-of-range values are clamped)
Mnm minimum object obj 'LbCl' labColor
Mxm maximum object obj 'LbCl' labColor
H hue integer 30 -180 .. 180 (out-of-range values are clamped)
Strt saturation integer 0 -100 .. 100 (out-of-range values are clamped)
Lght lightness integer 0 -100 .. 100 (out-of-range values are clamped)
`` colorModel integer 0

Nested values as recorded (example values):

    'Lmnc' luminance : DOUBLETYPE = 40
    'A   ' a : DOUBLETYPE = 30
    'B   ' b : DOUBLETYPE = 40
    'Lmnc' luminance : DOUBLETYPE = 40
    'A   ' a : DOUBLETYPE = 30
    'B   ' b : DOUBLETYPE = 40

Steps recorded in an ordinary editing session. The values below were measured in a document set up for each step (a selection, the clipboard, linked or several selected layers). Align, Copy/Paste Layer Style and Rename are already mapped under their current events and are not repeated here.

Add to Selection (rectangle)

  • Event: AddT / addTo
  • PhotoCraft command: select.rect {"mode":"add"}
  • Shift-drag with the Rectangular Marquee.
  • Measured with example values in a prepared document: the Value column shows what was sent and recorded, not a factory default (a step always carries the values the user set).
Key String ID Type Unit Example value Allowed
null null reference ref 'Chnl' channel prop 'fsel' selection
T to object obj 'Rctn' rectangle

Nested values as recorded (example values):

    'Top ' top : UNITDOUBLE = 30 '#Pxl' pixelsUnit
    'Left' left : UNITDOUBLE = 30 '#Pxl' pixelsUnit
    'Btom' bottom : UNITDOUBLE = 90 '#Pxl' pixelsUnit
    'Rght' right : UNITDOUBLE = 90 '#Pxl' pixelsUnit

Add to Selection (ellipse)

  • Event: AddT / addTo
  • PhotoCraft command: select.rect {"mode":"add","ellipse":true}
  • Same event with an Elps target and anti-aliasing.
  • Measured with example values in a prepared document: the Value column shows what was sent and recorded, not a factory default (a step always carries the values the user set).
Key String ID Type Unit Example value Allowed
null null reference ref 'Chnl' channel prop 'fsel' selection
T to object obj 'Elps' ellipse
AntA antiAlias boolean true

Nested values as recorded (example values):

    'Top ' top : UNITDOUBLE = 30 '#Pxl' pixelsUnit
    'Left' left : UNITDOUBLE = 30 '#Pxl' pixelsUnit
    'Btom' bottom : UNITDOUBLE = 90 '#Pxl' pixelsUnit
    'Rght' right : UNITDOUBLE = 90 '#Pxl' pixelsUnit

Subtract from Selection

  • Event: SbtF / subtractFrom
  • PhotoCraft command: select.rect {"mode":"subtract"}
  • Measured with example values in a prepared document: the Value column shows what was sent and recorded, not a factory default (a step always carries the values the user set).
Key String ID Type Unit Example value Allowed
null null reference ref 'Chnl' channel prop 'fsel' selection
T to object obj 'Rctn' rectangle

Nested values as recorded (example values):

    'Top ' top : UNITDOUBLE = 30 '#Pxl' pixelsUnit
    'Left' left : UNITDOUBLE = 30 '#Pxl' pixelsUnit
    'Btom' bottom : UNITDOUBLE = 60 '#Pxl' pixelsUnit
    'Rght' right : UNITDOUBLE = 60 '#Pxl' pixelsUnit

Intersect with Selection

  • Event: IntW / interfaceWhite
  • PhotoCraft command: select.rect {"mode":"intersect"}
  • Measured with example values in a prepared document: the Value column shows what was sent and recorded, not a factory default (a step always carries the values the user set).
Key String ID Type Unit Example value Allowed
null null reference ref 'Chnl' channel prop 'fsel' selection
T to object obj 'Rctn' rectangle

Nested values as recorded (example values):

    'Top ' top : UNITDOUBLE = 30 '#Pxl' pixelsUnit
    'Left' left : UNITDOUBLE = 30 '#Pxl' pixelsUnit
    'Btom' bottom : UNITDOUBLE = 120 '#Pxl' pixelsUnit
    'Rght' right : UNITDOUBLE = 120 '#Pxl' pixelsUnit

Paste Into

  • Event: PstI / pasteInto
  • PhotoCraft command: edit.pasteSpecial.pasteInto
  • Measured with example values in a prepared document: the Value column shows what was sent and recorded, not a factory default (a step always carries the values the user set).
Key String ID Type Unit Example value Allowed
AntA antiAlias enumerated Anno antiAliasNone not measured yet
As as class class 'Pxel' pixel

Paste Outside

  • Event: PstO / pasteOutside
  • PhotoCraft command: edit.pasteSpecial.pasteOutside
  • Measured with example values in a prepared document: the Value column shows what was sent and recorded, not a factory default (a step always carries the values the user set).
Key String ID Type Unit Example value Allowed
AntA antiAlias enumerated Anno antiAliasNone not measured yet
As as class class 'Pxel' pixel

Fade

  • Event: Fade / fade
  • PhotoCraft command: edit.fade
  • Recorded right after the step it fades.
  • Measured with example values in a prepared document: the Value column shows what was sent and recorded, not a factory default (a step always carries the values the user set).
Key String ID Type Unit Example value Allowed
Opct opacity unitdouble #Prc 50 0 .. 100 (out-of-range values are clamped)
Md mode enumerated Mltp multiply not measured yet
  • Event: `` / linkSelectedLayers
  • PhotoCraft command: layer.linkLayers
  • Measured with example values in a prepared document: the Value column shows what was sent and recorded, not a factory default (a step always carries the values the user set).
Key String ID Type Unit Example value Allowed
null null reference ref 'Lyr ' layer enum 'Ordn' ordinal.'Trgt' targetEnum

Distribute

  • Event: Dstr / distort
  • PhotoCraft command: layer.distribute.leftEdges (one command per edge)
  • Usng selects the edge or centre; one enum value per Distribute menu item.
  • Measured with example values in a prepared document: the Value column shows what was sent and recorded, not a factory default (a step always carries the values the user set).
Key String ID Type Unit Example value Allowed
null null reference ref 'Lyr ' layer enum 'Ordn' ordinal.'Trgt' targetEnum
Usng using enumerated AdLf ADSLefts not measured yet

Remove Layer Mask (older files)

  • Event: RmvL / removeLayerMask
  • PhotoCraft command: layer.layerMask.delete
  • The reference application asks "Apply mask before deleting?" when this step plays without the apply choice; see the table for the key it records.
  • Measured with example values in a prepared document: the Value column shows what was sent and recorded, not a factory default (a step always carries the values the user set).

No parameters: the step carries an empty descriptor.

Define Pattern

  • Event: DfnP / definePattern
  • PhotoCraft command: edit.definePattern

No parameters: the step carries an empty descriptor.

Merge Layers (older files)

  • Event: MrgL (no string ID)
  • PhotoCraft command: layer.mergeLayers

No parameters: the step carries an empty descriptor.

Group G: Split Channels, Merge Spot Channel, Trap and Match Color

Channel and colour steps. Trap was measured in a CMYK document (it only exists there).

Split Channels

  • Event: SplC / splitChannels
  • PhotoCraft command: channel.split
  • Measured with example values in a prepared document: the Value column shows what was sent and recorded, not a factory default (a step always carries the values the user set).
Key String ID Type Unit Example value Allowed
`` documentIDs list list[3]

Nested values as recorded (example values):

    [0] 182
    [1] 185
    [2] 188

Merge Spot Channel

  • Event: MSpt / mergeSpotChannel
  • PhotoCraft command: channel.mergeSpot
  • Measured with example values in a prepared document: the Value column shows what was sent and recorded, not a factory default (a step always carries the values the user set).

No parameters: the step carries an empty descriptor.

Trap

  • Event: Trap / trap
  • PhotoCraft command: image.trap
  • Measured with example values in a prepared document: the Value column shows what was sent and recorded, not a factory default (a step always carries the values the user set).
Key String ID Type Unit Example value Allowed
Wdth width unitdouble #Pxl 2 up to 32767 (clamped); the minimum was not measured (a huge negative value ran out of memory)

Match Color

  • Event: `` / matchColor
  • PhotoCraft command: image.adjustments.matchColor
Key String ID Type Unit Default Allowed
Lght lightness integer 100
ClrR colorRange integer 100
Fade fade integer 0
`` noReference boolean true

Group I: Newer features (Focus Area, Remove Background, Select Sky, Oil Paint, Smart Sharpen)

These events only have a string ID (no 4-character code). Steps recorded in newer versions use them.

Select > Focus Area

  • Event: `` / focusMask
  • PhotoCraft command: select.focusArea

No parameters: the step carries an empty descriptor.

Remove Background (quick action)

  • Event: `` / removeBackground
  • PhotoCraft command: layer.removeBackground

No parameters: the step carries an empty descriptor.

Select > Sky

  • Event: `` / selectSky
  • PhotoCraft command: select.sky
Key String ID Type Unit Default Allowed
`` sampleAllLayers boolean false

Filter > Stylize > Oil Paint

  • Event: `` / oilPaint
  • PhotoCraft command: filter.stylize.oilPaint
Key String ID Type Unit Default Allowed
`` lightingOn boolean true
`` stylization double 4
`` cleanliness double 2.29999995231628
`` brushScale double 0.80000001192093
`` microBrush double 10
LghD lightDirection integer -60
`` specularity double 1.29999995231628

Filter > Sharpen > Smart Sharpen

  • Event: `` / smartSharpen
  • PhotoCraft command: filter.sharpen.smartSharpen
Key String ID Type Unit Default Allowed
`` presetKind enumerated presetKindType. presetKindCustom
`` useLegacy boolean true
Amnt amount unitdouble #Prc 200
Rds radius unitdouble #Pxl 1
`` moreAccurate boolean false
blur blur enumerated blurType. lensBlur

Events that need a step recorded through their dialog

These carry settings that only exist once their dialog was used, so a dialog-less run returns no values or ignores the ones it was given. They are listed so nobody measures them again from scratch; their tables will be added once a recorded step was read.

Event Why
Generative Fill (syntheticFill) AI feature: in PhotoCraft this goes through the shared AI layer; until then such steps stay kept steps.

Recorded under another event

Some older events are no longer what the application records; PhotoCraft already maps the current one: Clear (recorded as Delete), Rasterize Type (rasterizeLayer), Convert to Profile (convertToProfile), Copy and Paste Layer Style (copyEffects, pasteEffects), Align (align), Rename Layer (Set of the layer's name), Deselect (Set of the selection to None). Steps recorded with Backlight, Fill Flash, Color Cast, Variations, Texture Fill and the old Snapshot events come only from very old versions and stay kept steps.