/// <summary>
        /// Deserializes the specified overlay activation module.
        /// </summary>
        /// <remarks>
        /// This method must be called after <see cref="DeserializeOverlayPlane">the overlay planes have been deserialized</see>.
        /// </remarks>
        /// <param name="overlayActivationModule"></param>
        /// <param name="image"></param>
        protected void DeserializeOverlayActivation(OverlayActivationModuleIod overlayActivationModule, T image)
        {
            if (!_overlayPlanesDeserialized)
            {
                throw new InvalidOperationException("Overlay planes must be deserialized first.");
            }

            DicomGraphicsPlane dicomGraphicsPlane = DicomGraphicsPlane.GetDicomGraphicsPlane(image, true);

            for (int n = 0; n < 16; n++)
            {
                if (overlayActivationModule.HasOverlayActivationLayer(n))
                {
                    string targetLayer = overlayActivationModule[n].OverlayActivationLayer ?? string.Empty;
                    if (dicomGraphicsPlane.PresentationOverlays.Contains(n))
                    {
                        if (string.IsNullOrEmpty(targetLayer))
                        {
                            dicomGraphicsPlane.PresentationOverlays.Deactivate(n);
                        }
                        else
                        {
                            dicomGraphicsPlane.PresentationOverlays.ActivateAsLayer(n, targetLayer);
                        }
                        dicomGraphicsPlane.ImageOverlays.Deactivate(n);
                    }
                    else if (dicomGraphicsPlane.ImageOverlays.Contains(n))
                    {
                        if (string.IsNullOrEmpty(targetLayer))
                        {
                            dicomGraphicsPlane.ImageOverlays.Deactivate(n);
                        }
                        else
                        {
                            dicomGraphicsPlane.ImageOverlays.ActivateAsLayer(n, targetLayer);
                        }
                    }
                }
                else
                {
                    // if the module is missing entirely, then the presentation state is poorly encoded.
                    // for patient safety reasons, we override the DICOM stipulation that only one of
                    // these two should be shown and show both instead.
                    dicomGraphicsPlane.PresentationOverlays.ActivateAsLayer(n, "OVERLAY");
                    dicomGraphicsPlane.ImageOverlays.ActivateAsLayer(n, "OVERLAY");
                }
            }
        }
 protected void SerializeOverlayActivation(OverlayActivationModuleIod overlayActivationModule, IOverlayMapping overlayMapping, DicomPresentationImageCollection <T> images)
 {
     // Doesn't support multiframe or whatever case it is when we get more than one image serialized to one state
     for (int n = 0; n < 16; n++)
     {
         OverlayPlaneGraphic overlay = overlayMapping[n];
         if (overlay != null)
         {
             if (overlay.ParentGraphic is ILayer)
             {
                 overlayActivationModule[n].OverlayActivationLayer = ((ILayer)overlay.ParentGraphic).Id;
             }
             else
             {
                 overlayActivationModule.Delete(n);
             }
         }
     }
 }