/// <summary>
        /// Looks up the composite image for the given trigger name
        /// </summary>
        /// <param name="triggerName">The image layout trigger name</param>
        /// <returns>The composite image</returns>
        public CompositeImage CompositeImageForTrigger(string triggerName)
        {
            // See if the description is already loaded
            if (compositeImageCache.TryGetValue(triggerName, out var wref))
            {
                var ret = (CompositeImage)wref.Target;
                if (null != ret)
                {
                    return(ret);
                }
            }


            // look up name for the file
            var layoutPath = ImageLayoutFullPathForTrigger(triggerName);

            if (null == layoutPath)
            {
                return(null);
            }
            // Get the full path for the map
            var mapPath = ImageMapFullPathForTrigger(triggerName);

            // Create the object
            var image = new CompositeImage(layoutPath, mapPath);

            // Add an item to the cache
            compositeImageCache[triggerName] = new WeakReference(image);

            // return it
            return(image);
        }
 /// <summary>
 /// Analyzes the composite image structure
 /// </summary>
 /// <param name="errs">The errors found within the animation clip</param>
 /// <param name="errKey">The label to help identify which animation clip this
 /// error is referring to</param>
 /// <param name="compositeImage">The composite image to check</param>
 public void Analyze(StringBuilder errs, string errKey, CompositeImage compositeImage)
 {
     foreach (var layout in compositeImage.layouts)
     {
         Analyze(errs, $"{errKey}:{layout.layerName}", layout);
     }
 }