0.18.0.0¶
This release brings a number of updates to GafferImage, including user-editable Formats, bug fixes to Resize and Crop, and a new Offset node. It also fixes a few bugs todo with Expressions, Switches, and UI crashes.
Core¶
Node::userPlug()is now a Plug instead of a CompoundPlug.- Preventing unwanted child connection tracking on userPlug().
 - Changed scriptNode() to return 
thiswhen node is a ScriptNode. - Support indirect connections to Switch index
- Emitting Node::plugInputChangedSignal() for all downstream connections.
 
 - Expressions don’t let 
__inplug track child inputs. - Added top level plug argument to 
Expression::Engine::apply(). - PythonExpressionEngine drives 
apply()by plug type not data type. - PythonExpressionEngine supports arbitrary compound plugs types.
 - Improved PythonExpressionEngine::defaultExpression().
 - Fixed a bug in plugs/nodesWithMetadata.
 - Fixed errors when serialising parent metadata only.
 - Reference/Box no longer export user plugs (#801).
 
UI¶
- Skipping intermediate dots in tooltips.
 - Fixed crash in the GraphGadget when a non-nodule plug was removed from a node.
 - Improved UI robustness for errors on enabledPlug() expressions.
 - Fixed potential connection lifetime bugs in the Viewer.
 
Image¶
- Added AtomicFormatPlug and replaced all non-user facing FormatPlugs with this.
- This plug does not perform default format substitutions.
 - This plug does not serialise registered Formats.
 
 - Changed FormatPlug to be a user-editable Format specification
- Using FormatPlug in all user facing scenarios (e.g. Constant, Resize, etc).
 
 - Deprecated Reformat. Use Resize instead.
 - Moved default Format mechanism onto FormatPlug.
 - Fixed default Format issues inside boxes (#888).
 - Fixed nodes which were unusable if no default format was specified in the context (#888).
- We now fall back to a default default format in that case.
 
 - The default format was not getting transferred to the script context after loading (#888).
 - Rationalised and simplified the Format registry.
- Fixed registerFormat() so that a second registration overrides the first.
 - Requiring name when registering a format.
 - Names should no longer include the numeric values.
 - Renamed removeFormat() to deregisterFormat().
 - Removed unused signals and not-so-useful methods.
 - Separated registered names and ostream output.
- The ostream output just uses numeric values, keeping it in line with the Imath classes.
 - Querying the registered name for a format returns an empty string if it hasn’t been registered. Previously it returned a generated name, making it hard to tell if it had actually been registered or not.
 
 
 - FormatPlugValueWidget supports manual entry of custom formats.
- This widget only supports FormatPlugs, not AtomicFormatPlugs.
 
 - ImageStats now uses a postCreate to set plug values via the UI only.
 - Renamed CropUI.postCreateCrop to CropUI.postCreate.
 - Fixed Resize disabling.
 - Add Offset node.
 - Fixed bug in Crop::affects().
 - Added Crop “resetOrigin” plug.
- This resets the origin of the format back to [0,0], which is intuitively what is expected.
 
 
Incompatibilities¶
- Changed type of Node::userPlug()
 - Moved default Format API from Format class onto FormatPlug class.
 - Changed Format registry API.
 - Crop now resets the display window origin to 0,0. Turn off the “resetOrigin” plug for the old behaviour.
 - Renamed CropUI.postCreateCrop to CropUI.postCreate.