/// <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); }
/// <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; } }
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; } }