Пример #1
0
 /// <summary>
 /// Finds a plugin that provides the named visualization generator.
 /// </summary>
 /// <param name="plugins">List of plugins, from project ScriptManager.</param>
 /// <param name="visGenIdent">Visualization generator identifier.</param>
 /// <returns>A plugin that matches, or null if none found.</returns>
 private static IPlugin_Visualizer FindPluginByVisGenIdent(
     Dictionary <string, IPlugin> plugins, string visGenIdent, out VisDescr visDescr)
 {
     foreach (IPlugin chkPlug in plugins.Values)
     {
         if (!(chkPlug is IPlugin_Visualizer))
         {
             continue;
         }
         IPlugin_Visualizer vplug = (IPlugin_Visualizer)chkPlug;
         foreach (VisDescr descr in vplug.GetVisGenDescrs())
         {
             if (descr.Ident == visGenIdent)
             {
                 visDescr = descr;
                 return(vplug);
             }
         }
     }
     visDescr = null;
     return(null);
 }
Пример #2
0
        /// <summary>
        /// Attempts to refresh broken thumbnails across all visualization sets in the project.
        /// </summary>
        /// <param name="project">Project reference.</param>
        public static void RefreshAllThumbnails(DisasmProject project)
        {
            ScriptSupport iapp = null;
            Dictionary <string, IPlugin> plugins = null;

            SortedList <int, VisualizationSet> visSets = project.VisualizationSets;

            foreach (KeyValuePair <int, VisualizationSet> kvp in visSets)
            {
                VisualizationSet visSet = kvp.Value;
                foreach (Visualization vis in visSet)
                {
                    if (vis.HasImage)
                    {
                        continue;
                    }
                    //Debug.WriteLine("Vis needs refresh: " + vis.Tag);

                    if (vis is VisualizationAnimation)
                    {
                        continue;
                    }

                    if (iapp == null)
                    {
                        // Prep the plugins on first need.
                        iapp = new ScriptSupport();
                        project.PrepareScripts(iapp);
                    }

                    if (plugins == null)
                    {
                        plugins = project.GetActivePlugins();
                    }
                    IPlugin_Visualizer vplug = FindPluginByVisGenIdent(plugins,
                                                                       vis.VisGenIdent, out VisDescr visDescr);
                    if (vplug == null)
                    {
                        Debug.WriteLine("Unable to refresh " + vis.Tag + ": plugin not found");
                        continue;
                    }

                    IVisualization2d vis2d;
                    try {
                        vis2d = vplug.Generate2d(visDescr,
                                                 new ReadOnlyDictionary <string, object>(vis.VisGenParams));
                        if (vis2d == null)
                        {
                            Debug.WriteLine("Vis generator returned null");
                        }
                    } catch (Exception ex) {
                        Debug.WriteLine("Vis generation failed: " + ex);
                        vis2d = null;
                    }
                    if (vis2d != null)
                    {
                        //Debug.WriteLine(" Rendered thumbnail: " + vis.Tag);
                        vis.SetThumbnail(vis2d);
                    }
                }
            }

            if (iapp != null)
            {
                project.UnprepareScripts();
            }

            // Now that we've generated images for the Visualizations, update any
            // VisualizationAnimation thumbnails that may have been affected.
            foreach (KeyValuePair <int, VisualizationSet> kvp in visSets)
            {
                VisualizationSet visSet = kvp.Value;
                foreach (Visualization vis in visSet)
                {
                    if (!(vis is VisualizationAnimation))
                    {
                        continue;
                    }
                    VisualizationAnimation visAnim = (VisualizationAnimation)vis;
                    visAnim.GenerateImage(visSets);
                }
            }
        }
        /// <summary>
        /// Constructor.
        /// </summary>
        /// <param name="owner">Owner window.</param>
        /// <param name="proj">Project reference.</param>
        /// <param name="formatter">Text formatter.</param>
        /// <param name="vis">Visualization to edit, or null if this is new.</param>
        public EditVisualization(Window owner, DisasmProject proj, Formatter formatter,
                                 int setOffset, SortedList <int, VisualizationSet> editedList, Visualization vis)
        {
            InitializeComponent();
            Owner       = owner;
            DataContext = this;

            mProject    = proj;
            mFormatter  = formatter;
            mSetOffset  = setOffset;
            mEditedList = editedList;
            mOrigVis    = vis;

            mScriptSupport = new ScriptSupport(this);
            mProject.PrepareScripts(mScriptSupport);

            // this will initialize mTagLabelBrush
            if (vis != null)
            {
                TagString = vis.Tag;
            }
            else
            {
                // Could make this unique, but probably not worth the bother.
                TagString = "vis" + mSetOffset.ToString("x6");
            }

            int visSelection = -1;

            VisualizationList = new List <VisualizationItem>();
            Dictionary <string, IPlugin> plugins = proj.GetActivePlugins();

            foreach (KeyValuePair <string, IPlugin> kvp in plugins)
            {
                if (!(kvp.Value is IPlugin_Visualizer))
                {
                    continue;
                }
                IPlugin_Visualizer vplug = (IPlugin_Visualizer)kvp.Value;
                foreach (VisDescr descr in vplug.GetVisGenDescrs())
                {
                    if (vis != null && vis.VisGenIdent == descr.Ident)
                    {
                        // found matching descriptor, set selection to this
                        visSelection = VisualizationList.Count;
                    }
                    else if (visSelection < 0 && descr.Ident == sLastVisIdent)
                    {
                        // we used this one last time, use it if nothing better comes along
                        visSelection = VisualizationList.Count;
                    }
                    VisualizationList.Add(new VisualizationItem(kvp.Key, descr));
                }
            }

            // Set the selection.  This should cause the sel change event to fire.
            if (visSelection < 0)
            {
                visSelection = 0;
            }
            visComboBox.SelectedIndex = visSelection;
        }
        private void UpdateControls()
        {
            IsValid = true;

            foreach (ParameterValue pv in ParameterList)
            {
                pv.ForegroundBrush = mDefaultLabelColor;
                if (pv.Descr.CsType == typeof(bool))
                {
                    // always fine
                    continue;
                }
                else if (pv.Descr.CsType == typeof(int))
                {
                    // integer, possibly Offset special
                    bool ok = ParseIntObj(pv.Value, pv.Descr.Special, out int intVal);
                    if (ok && (intVal < (int)pv.Descr.Min || intVal > (int)pv.Descr.Max))
                    {
                        // TODO(someday): make the range text red instead of the label
                        ok = false;
                    }
                    if (!ok)
                    {
                        pv.ForegroundBrush = mErrorLabelColor;
                        IsValid            = false;
                    }
                }
                else if (pv.Descr.CsType == typeof(float))
                {
                    // float
                    bool ok = ParseFloatObj(pv.Value, out float floatVal);
                    if (ok && (floatVal < (float)pv.Descr.Min || floatVal > (float)pv.Descr.Max))
                    {
                        ok = false;
                    }
                    if (!ok)
                    {
                        pv.ForegroundBrush = mErrorLabelColor;
                        IsValid            = false;
                    }
                }
                else
                {
                    // unexpected
                    Debug.Assert(false);
                }
            }

            VisualizationItem item = (VisualizationItem)visComboBox.SelectedItem;

            BitmapDimensions = "?";
            if (!IsValid || item == null)
            {
                previewImage.Source = sBadParamsImage;
            }
            else
            {
                // Invoke the plugin.
                PluginErrMessage = string.Empty;

                IVisualization2d vis2d;
                try {
                    IPlugin_Visualizer plugin =
                        (IPlugin_Visualizer)mProject.GetPlugin(item.ScriptIdent);
                    vis2d = plugin.Generate2d(item.VisDescriptor, CreateVisGenParams());
                    if (vis2d == null)
                    {
                        Debug.WriteLine("Vis generator returned null");
                    }
                } catch (Exception ex) {
                    Debug.WriteLine("Vis generation failed: " + ex);
                    vis2d = null;
                    if (string.IsNullOrEmpty(LastPluginMessage))
                    {
                        LastPluginMessage = ex.Message;
                    }
                }
                if (vis2d == null)
                {
                    previewImage.Source = sBadParamsImage;
                    if (!string.IsNullOrEmpty(LastPluginMessage))
                    {
                        // Report the last message we got as an error.
                        PluginErrMessage = LastPluginMessage;
                    }
                    else
                    {
                        PluginErrMessage = (string)FindResource("str_VisGenFailed");
                    }
                    IsValid = false;
                }
                else
                {
                    previewImage.Source = Visualization.ConvertToBitmapSource(vis2d);
                    BitmapDimensions    = string.Format("{0}x{1}",
                                                        previewImage.Source.Width, previewImage.Source.Height);
                }
            }

            string        trimTag = Visualization.TrimAndValidateTag(TagString, out bool tagOk);
            Visualization match   =
                EditVisualizationSet.FindVisualizationByTag(mEditedList, trimTag);

            if (match != null && (mOrigVis == null || trimTag != mOrigVis.Tag))
            {
                // Another vis already has this tag.  We're checking the edited list, so we'll
                // be current with edits to this or other Visualizations in the same set.
                tagOk = false;
            }
            if (!tagOk)
            {
                TagLabelBrush = mErrorLabelColor;
                IsValid       = false;
            }
            else
            {
                TagLabelBrush = mDefaultLabelColor;
            }
        }
Пример #5
0
        private void UpdateControls()
        {
            IsValid = true;

            foreach (ParameterValue pv in ParameterList)
            {
                pv.ForegroundBrush = mDefaultLabelColor;
                if (pv.Descr.CsType == typeof(bool))
                {
                    // always fine
                    continue;
                }
                else if (pv.Descr.CsType == typeof(int))
                {
                    // integer, possibly Offset special
                    bool ok = ParseIntObj(pv.Value, pv.Descr.Special, out int intVal);
                    if (ok && (intVal < (int)pv.Descr.Min || intVal > (int)pv.Descr.Max))
                    {
                        // TODO(someday): make the range text red instead of the label
                        ok = false;
                    }
                    if (!ok)
                    {
                        pv.ForegroundBrush = mErrorLabelColor;
                        IsValid            = false;
                    }
                }
                else if (pv.Descr.CsType == typeof(float))
                {
                    // float
                    bool ok = ParseFloatObj(pv.Value, out float floatVal);
                    if (ok && (floatVal < (float)pv.Descr.Min || floatVal > (float)pv.Descr.Max))
                    {
                        ok = false;
                    }
                    if (!ok)
                    {
                        pv.ForegroundBrush = mErrorLabelColor;
                        IsValid            = false;
                    }
                }
                else
                {
                    // unexpected
                    Debug.Assert(false);
                }
            }

            VisualizationItem item = (VisualizationItem)visComboBox.SelectedItem;

            BitmapDimensions       = "?";
            previewGrid.Background = null;
            wireframePath.Data     = new GeometryGroup();
            if (!IsValid || item == null)
            {
                previewImage.Source = sBadParamsImage;
            }
            else
            {
                // Invoke the plugin.
                PluginErrMessage = string.Empty;

                IVisualization2d                    vis2d   = null;
                IVisualizationWireframe             visWire = null;
                ReadOnlyDictionary <string, object> parms   = null;
                try {
                    IPlugin_Visualizer plugin =
                        (IPlugin_Visualizer)mProject.GetPlugin(item.ScriptIdent);
                    if (item.VisDescriptor.VisualizationType == VisDescr.VisType.Bitmap)
                    {
                        parms = CreateVisGenParams(false);
                        vis2d = plugin.Generate2d(item.VisDescriptor, parms);
                        if (vis2d == null)
                        {
                            Debug.WriteLine("Vis2d generator returned null");
                        }
                    }
                    else if (item.VisDescriptor.VisualizationType == VisDescr.VisType.Wireframe)
                    {
                        parms = CreateVisGenParams(true);
                        IPlugin_Visualizer_v2 plugin2 = (IPlugin_Visualizer_v2)plugin;
                        visWire = plugin2.GenerateWireframe(item.VisDescriptor, parms);
                        if (visWire == null)
                        {
                            Debug.WriteLine("VisWire generator returned null");
                        }
                    }
                    else
                    {
                        Debug.Assert(false);
                    }
                } catch (Exception ex) {
                    Debug.WriteLine("Vis generation failed: " + ex);
                    if (string.IsNullOrEmpty(LastPluginMessage))
                    {
                        LastPluginMessage = ex.Message;
                    }
                }
                bool failed = false;
                if (vis2d == null && visWire == null)
                {
                    failed = true;
                }
                else if (vis2d != null)
                {
                    previewGrid.Background = null;
                    previewImage.Source    = Visualization.ConvertToBitmapSource(vis2d);
                    wireframePath.Data     = new GeometryGroup();
                    BitmapDimensions       = string.Format("{0}x{1}",
                                                           previewImage.Source.Width, previewImage.Source.Height);

                    mThumbnail = (BitmapSource)previewImage.Source;
                }
                else
                {
                    WireframeObject wireObj = WireframeObject.Create(visWire);
                    if (wireObj != null)
                    {
                        previewGrid.Background = Brushes.Black;
                        previewImage.Source    = Visualization.BLANK_IMAGE;
                        double dim = Math.Floor(
                            Math.Min(previewGrid.ActualWidth, previewGrid.ActualHeight));
                        wireframePath.Data =
                            Visualization.GenerateWireframePath(wireObj, dim, parms);
                        BitmapDimensions = "n/a";

                        mWireObj = wireObj;
                    }
                    else
                    {
                        failed = true;
                    }
                }
                if (failed)
                {
                    previewImage.Source = sBadParamsImage;
                    if (!string.IsNullOrEmpty(LastPluginMessage))
                    {
                        // Report the last message we got as an error.
                        PluginErrMessage = LastPluginMessage;
                    }
                    else
                    {
                        // Generic failure message.
                        PluginErrMessage = (string)FindResource("str_VisGenFailed");
                    }
                    IsValid = false;
                }
            }

            string        trimTag = Visualization.TrimAndValidateTag(TagString, out bool tagOk);
            Visualization match   =
                EditVisualizationSet.FindVisualizationByTag(mEditedList, trimTag);

            if (match != null && (mOrigVis == null || trimTag != mOrigVis.Tag))
            {
                // Another vis already has this tag.  We're checking the edited list, so we'll
                // be current with edits to this or other Visualizations in the same set.
                tagOk = false;
            }
            if (!tagOk)
            {
                TagLabelBrush = mErrorLabelColor;
                IsValid       = false;
            }
            else
            {
                TagLabelBrush = mDefaultLabelColor;
            }
        }