Added a failing test case to GafferImageTest.ImageTransformTest that highlights a bug that has
been introduced since the node was first written.
Fixed bug in ImageTransform.

This was caused by ImageTransform::hashChannelData() not correctly including the tile origin in the hash. For transforms where two output tiles share the exact same set of input tiles affecting them, we were computing exactly the same hash for both output tiles, even though they each would filter the pixels in the input tiles totally differently.

This bug was introduced in 78b8739f1867ecd3b660838d384cdd6083734d92, where I refactored the hash computation for images. Specifically, in that commit it became the responsibility of derived classes to hash in the tile origin where necessary whereas before the SceneProcessor _always_ hashed in the tile origin whether it was necessary or not. The old code resulted in unnecessary computation for networks like Constant->Grade, where although all the tiles have the same hash in the Constant, they would have different hashes in the Grade. The new way of doing things is for sure better, provided you're not a numpty like I was and fail to hash in the tile origin where relevant.

Also renamed the test case, so it actually makes sense now we've fixed things - in any case we should have used @GafferTest.expectedFailure to decorate it in the first place so we could still give it a meaningful name.
Simplified ImageTransform::channelDataHash() and removed todo.

Using the less verbose method of hashing all the children of a CompoundPlug.

The comment in the todo was inaccurate - ImageProcessor no longer does any hashing of the tile origin. We also won't be changing the coordinate space that tile origin is specified in - tile origin, display window, and data window are all specified relative to the same origin for good reasons - sanity and ease of understanding. There's no reason the described optimisation couldn't work with the origin we have, but it seems best to implement in a node which specifically does axis-aligned integer shifts in the image without any filtering.
Merge branch 'goddardl-ImageTransformBug'
Removed collapsible container from ImageTransform transform plug.

It was annoying having to pop it open every time.
Added image file filter to ImageReader and ImageWriter dialogues.
Bumped version to 0.94.0 and updated Changes file.
Added a test case demonstrating issue #837.
Moved GafferScene Options bindings to separate file.

We need to continue to thin down GafferSceneModule.cpp because it has massive compile times.
Added a GafferScene::Set node.

This will be used to allow users to manage sets of named locations as part of their graph flow.
Typedefed PathMatcherData into GafferScene namespace.

It was always meant to be defined there, but wasn't because of problems using the Cortex macros in another namespace. The new typedef matches what we do for GafferImage::FormatData, and means we can tidy up the code referring to PathMatcherData.
Fixed InteractiveRenderManRenderTest for slower machines.
Replaced forwardDeclarations with a private set for lights.

The "gaffer:forwardDeclarations" global entry was our slightly ad-hoc way of tracking the location of lights in the scene. It is now replaced with a private set called "__lights", and all the old code for keeping forward declarations accurate when the hierarchy changes has been replaced with more general purpose code for keeping sets in sync with the hierarchy. This both makes sets more useable and pleasingly tidies up one of the more untidy corners of Gaffer.
Improved GafferScene::Set documentation.

It implied that sets only held locations which referenced objects, whereas actually they are happy to reference any location at all.
Fixed PathMatcherData references for GCC 4.1.2.
Optimised PathMatcher.

Added new methods for adding and removing paths as vector<InternedString> - this avoids all the overhead of tokenization for cases where the path already exists in tokenized form.

Changed internal representation to use InternedString rather than std::string. This is much more compact than the old representation, since most strings we put into a PathMatcher will already have an InternedString representation somewhere (from the SceneNodes or from IndexedIO).

PathMatcherTest.testLookupScaling() shows a 67% reduction in time to build the PathMatcher, a 78% reduction in time to perform the lookups, and a 70% reduction in memory usage.
Interleaved hash/compute methods in SceneReader.cpp.

It's much easier to verify that the implementations correspond appropriately when they're adjacent in the source code. We should do things this way as a matter of course in all the code.
Implemented loading of tags as sets in SceneReader.
Adjusted SceneProceduralTest for new SceneReader behaviour.

For the test, we need a node which will throw during procedural expansion. The SceneReader no longer fits that bill now that it implements computeGlobals(), as it will now throw during construction of the SceneProcedural. Using the Text node with an invalid font gives us an exception at the right time.
Improved SceneReader UI.

- Moved to a separate file. We should do this for all UIs as we go through and add metadata for each node type.
- Added Metadata.
- Added right click menu for toggling tags on and off in the tags and sets plugs.