/// <summary> /// Updates the properties of a supplied native layer. /// </summary> /// <remarks> /// <para>The implementation calculates the difference between this <see cref="LayerInfo" /> /// and the previous one (<paramref name="previous" />), and updates only the changed /// portion of the native layer properties.</para> /// <para>The following layer properties are not affected by this method:</para> /// <list type="bullet"> /// <item><term> /// <see cref="INgsPFLayer.Mask" /> /// </term></item> /// <item><term> /// <see cref="INgsPFLayer.Child" /> /// </term></item> /// </list> /// </remarks> /// <param name="layer">The native layer whose properties are being updated.</param> /// <param name="previous">The <see cref="LayerInfo" /> that was previously used to set /// <paramref name="layer" />'s properties. Can be <c>null</c>. If not <c>null</c>, it must /// have the same dynamic type as <c>this</c>.</param> public virtual void UpdateLayer(INgsPFLayer layer, LayerInfo previous) { if (previous == null) { layer.Bounds = Bounds; layer.Opacity = Opacity; if (Transform != Matrix4.Identity) { layer.Transform = Transform; } layer.Flags = Flags; } else { if (Bounds != previous.Bounds) { layer.Bounds = Bounds; } if (Opacity != previous.Opacity) { layer.Opacity = Opacity; } if (Transform != previous.Transform) { layer.Transform = Transform; } if (Flags != previous.Flags) { layer.Flags = Flags; } } }
/// <summary> /// Overrides <see cref="LayerInfo.UpdateLayer(INgsPFLayer, LayerInfo)" />. /// </summary> public override void UpdateLayer(INgsPFLayer layer, LayerInfo previous) { if (previous is SolidColorLayerInfo p) { if (FillColor != p.FillColor) { layer.SetContentsSolidColor(FillColor); } } else { layer.SetContentsSolidColor(FillColor); } base.UpdateLayer(layer, previous); }
public void Enter(LayerInfo info) { if (info != null) { if (this.info != null && this.info.GetType() != info.GetType()) { // The dynamic type has changed - invalidate the layer this.pfLayer = null; this.info = null; } if (this.pfLayer == null) { this.pfLayer = emitter.context.CreateLayer(); } info.UpdateLayer(this.pfLayer, this.info); } else { // Creation of the corresponding node is deferred until the call to `Leave`. this.pfLayer = null; } this.info = info; this.newChildrenRaw.Clear(); // Clear all "visited" flags this.nextIndex = 0; if (keywordChildDefs != null) { foreach (var child in keywordChildDefs) { child.Value.visited = false; } } if (this.mask != null) { this.mask.visited = false; } }
/// <summary> /// Overrides <see cref="LayerInfo.UpdateLayer(INgsPFLayer, LayerInfo)" />. /// </summary> public override void UpdateLayer(INgsPFLayer layer, LayerInfo previous) { if (previous is ImageLayerInfo p) { if (Image == p.Image && Source == p.Source && WrapMode == p.WrapMode) { goto skip; } } if (Image != null) { layer.SetContentsImage(Image.NativeImage, Source, WrapMode); } else { layer.SetContentsEmpty(); } skip: base.UpdateLayer(layer, previous); }