diff --git a/Applications/UniversalEditor.Compiler/Program.cs b/Applications/UniversalEditor.Compiler/Program.cs new file mode 100644 index 00000000..f83a9d56 --- /dev/null +++ b/Applications/UniversalEditor.Compiler/Program.cs @@ -0,0 +1,87 @@ +// +// Program.cs - the main entry point for the Universal Editor Extension Compiler +// +// Author: +// Michael Becker +// +// Copyright (c) 2020 Mike Becker's Software +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +using System; +using System.Collections.Generic; +using UniversalEditor; +using UniversalEditor.Accessors; +using UniversalEditor.DataFormats.Package.OpenDocument; +using UniversalEditor.DataFormats.UEPackage; +using UniversalEditor.DataFormats.UEPackage.Binary; +using UniversalEditor.ObjectModels.Package; +using UniversalEditor.ObjectModels.UEPackage; + +namespace UniversalEditor.Compiler +{ + public class Program + { + public static void Main(string[] args) + { + Console.Error.WriteLine("uex started..."); + List listFileNames = new List(); + + string outputFileName = "output.uex"; + bool foundFileName = false; + for (int i = 0; i < args.Length; i++) + { + if (args[i].StartsWith("/") && !foundFileName) + { + if (args[i].StartsWith("/out:")) + { + outputFileName = args[i].Substring(5); + } + } + else + { + // is file name + foundFileName = true; + + listFileNames.Add(args[i]); + } + } + + PackageObjectModel ue = new PackageObjectModel(); + OpenDocumentDataFormat odf = new OpenDocumentDataFormat(); + + System.Text.StringBuilder sb = new System.Text.StringBuilder(); + int totalInstances = 0; + + string exefilename = System.Environment.GetCommandLineArgs()[0]; + string workingdir = System.IO.Path.GetDirectoryName(exefilename); + + for (int i = 0; i < listFileNames.Count; i++) + { + string relpath = listFileNames[i]; + if (relpath.StartsWith(workingdir)) + { + relpath = relpath.Substring(workingdir.Length); + } + relpath = "Content/" + relpath; + + byte[] filedata = System.IO.File.ReadAllBytes(listFileNames[i]); + ue.FileSystem.AddFile(relpath, filedata); + } + + FileAccessor faout = new FileAccessor(outputFileName, true, true); + Document.Save(ue, odf, faout); + Console.Error.WriteLine("uex written to {0}!", outputFileName); + } + } +} diff --git a/Applications/UniversalEditor.Compiler/Properties/AssemblyInfo.cs b/Applications/UniversalEditor.Compiler/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..81603d90 --- /dev/null +++ b/Applications/UniversalEditor.Compiler/Properties/AssemblyInfo.cs @@ -0,0 +1,46 @@ +// +// AssemblyInfo.cs +// +// Author: +// Michael Becker +// +// Copyright (c) 2020 Mike Becker's Software +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +using System.Reflection; +using System.Runtime.CompilerServices; + +// Information about this assembly is defined by the following attributes. +// Change them to the values specific to your project. + +[assembly: AssemblyTitle("Mocha.Compiler")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Mike Becker's Software")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("Mike Becker's Software")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". +// The form "{Major}.{Minor}.*" will automatically update the build and revision, +// and "{Major}.{Minor}.{Build}.*" will update just the revision. + +[assembly: AssemblyVersion("1.0.*")] + +// The following attributes are used to specify the signing key for the assembly, +// if desired. See the Mono documentation for more information about signing. + +//[assembly: AssemblyDelaySign(false)] +//[assembly: AssemblyKeyFile("")] diff --git a/Applications/UniversalEditor.Compiler/UniversalEditor.Compiler.csproj b/Applications/UniversalEditor.Compiler/UniversalEditor.Compiler.csproj new file mode 100644 index 00000000..ba1587ea --- /dev/null +++ b/Applications/UniversalEditor.Compiler/UniversalEditor.Compiler.csproj @@ -0,0 +1,47 @@ + + + + Debug + AnyCPU + {5E639F63-97B0-4B34-8928-29A5A3C661F4} + Exe + UniversalEditor.Compiler + uecc + 4.0.2019.12 + + + true + full + false + ..\..\Output\Debug + DEBUG; + prompt + 4 + false + + + true + ..\..\Output\Release + prompt + 4 + false + + + + + + + + + + + {2D4737E6-6D95-408A-90DB-8DFF38147E85} + UniversalEditor.Core + + + {30467E5C-05BC-4856-AADC-13906EF4CADD} + UniversalEditor.Essential + + + + diff --git a/Content/UniversalEditor.Content.PlatformIndependent/Editors/Database/Views/ScriptView.glade b/Content/UniversalEditor.Content.PlatformIndependent/Editors/Database/Views/ScriptView.glade index b729d0a3..bf6d84ec 100644 --- a/Content/UniversalEditor.Content.PlatformIndependent/Editors/Database/Views/ScriptView.glade +++ b/Content/UniversalEditor.Content.PlatformIndependent/Editors/Database/Views/ScriptView.glade @@ -1,35 +1,32 @@ - + - False - - - + False True - False + False vertical True - True + True vertical 240 - True - True + True + True True - False + False vertical - MBS.Framework.UserInterface.Controls.SyntaxTextBox + MBS.Framework.UserInterface.Controls.SyntaxTextBox.SyntaxTextBoxControl True - False + False True @@ -46,26 +43,26 @@ True - False + False vertical True - True + True True - False + False vertical True - True - in + True + in True - True + True @@ -83,23 +80,23 @@ True - False + False Results - False + False True - False + False vertical MBS.Framework.UserInterface.Controls.Label True - False + False True @@ -115,12 +112,12 @@ True - False + False Spatial Results 1 - False + False diff --git a/Content/UniversalEditor.Content.PlatformIndependent/Editors/FileSystem/FileSystemEditor.glade b/Content/UniversalEditor.Content.PlatformIndependent/Editors/FileSystem/FileSystemEditor.glade index 10526e60..a9518a3f 100644 --- a/Content/UniversalEditor.Content.PlatformIndependent/Editors/FileSystem/FileSystemEditor.glade +++ b/Content/UniversalEditor.Content.PlatformIndependent/Editors/FileSystem/FileSystemEditor.glade @@ -2,6 +2,20 @@ + + + + + + + + + + + + + + False @@ -45,6 +59,12 @@ Name True True + + + + 4 + + @@ -107,16 +127,4 @@ - - - - - - - - - - - - diff --git a/Libraries/UniversalEditor.UserInterface/Controls/GenericBrowserButton.cs b/Libraries/UniversalEditor.UserInterface/Controls/GenericBrowserButton.cs index 23b13c8c..1b32dc43 100644 --- a/Libraries/UniversalEditor.UserInterface/Controls/GenericBrowserButton.cs +++ b/Libraries/UniversalEditor.UserInterface/Controls/GenericBrowserButton.cs @@ -94,8 +94,8 @@ namespace UniversalEditor.UserInterface.Controls lv = new ListViewControl(); lv.Model = tm; - lv.Columns.Add (new ListViewColumnText (lv.Model.Columns [0], "Name")); - lv.Columns.Add (new ListViewColumnText (lv.Model.Columns [1], "Description")); + lv.Columns.Add(new ListViewColumn("Name", new CellRenderer[] { new CellRendererText(lv.Model.Columns[0]) })); + lv.Columns.Add(new ListViewColumn("Description", new CellRenderer[] { new CellRendererText(lv.Model.Columns[1]) })); lv.HeaderStyle = ColumnHeaderStyle.None; ctObjectModel.Controls.Add (lv, new BoxLayout.Constraints (true, true)); diff --git a/Libraries/UniversalEditor.UserInterface/Dialogs/DocumentPropertiesDialog.cs b/Libraries/UniversalEditor.UserInterface/Dialogs/DocumentPropertiesDialog.cs index f6e2507b..6fb169cc 100644 --- a/Libraries/UniversalEditor.UserInterface/Dialogs/DocumentPropertiesDialog.cs +++ b/Libraries/UniversalEditor.UserInterface/Dialogs/DocumentPropertiesDialog.cs @@ -87,16 +87,19 @@ namespace UniversalEditor.UserInterface.Dialogs private ObjectModel mvarObjectModel = null; public ObjectModel ObjectModel { get { return mvarObjectModel; } set { mvarObjectModel = value; mvarInitialObjectModel = value; } } + public bool ObjectModelSelectionEnabled { get; set; } = true; private DataFormat mvarInitialDataFormat = null; private DataFormat mvarDataFormat = null; public DataFormat DataFormat { get { return mvarDataFormat; } set { mvarDataFormat = value; mvarInitialDataFormat = value; } } + public bool DataFormatSelectionEnabled { get; set; } = true; private Accessor mvarInitialAccesor = null; private Accessor mvarAccessor = null; public Accessor Accessor { get { return mvarAccessor; } set { mvarAccessor = value; mvarInitialAccesor = value; } } + public bool AccessorSelectionEnabled { get; set; } = true; [EventHandler(nameof(cmdObjectModel), "Click")] private void cmdObjectModel_Click(object sender, EventArgs e) @@ -198,6 +201,15 @@ namespace UniversalEditor.UserInterface.Dialogs break; } } + + cmdObjectModel.Enabled = cmdObjectModel.Enabled && ObjectModelSelectionEnabled; + txtObjectModel.Enabled = txtObjectModel.Enabled && ObjectModelSelectionEnabled; + + cmdDataFormat.Enabled = cmdDataFormat.Enabled && DataFormatSelectionEnabled; + txtDataFormat.Enabled = txtDataFormat.Enabled && DataFormatSelectionEnabled; + + cmdAccessor.Enabled = cmdAccessor.Enabled && AccessorSelectionEnabled; + txtAccessor.Enabled = txtAccessor.Enabled && AccessorSelectionEnabled; } private string DataFormatReferenceToString(DataFormatReference dfr) diff --git a/Libraries/UniversalEditor.UserInterface/Editors/Database/Views/ScriptView.cs b/Libraries/UniversalEditor.UserInterface/Editors/Database/Views/ScriptView.cs index 70dc57db..2da24655 100644 --- a/Libraries/UniversalEditor.UserInterface/Editors/Database/Views/ScriptView.cs +++ b/Libraries/UniversalEditor.UserInterface/Editors/Database/Views/ScriptView.cs @@ -353,7 +353,7 @@ namespace UniversalEditor.UserInterface.Editors.Database.Views DefaultTreeModel tmResults = new DefaultTreeModel(list.ToArray()); for (int i = 0; i < db.Tables[0].Fields.Count; i++) { - lvResults.Columns.Add(new ListViewColumnText(tmResults.Columns[i], db.Tables[0].Fields[i].Name)); + lvResults.Columns.Add(new ListViewColumn(db.Tables[0].Fields[i].Name, new CellRenderer[] { new CellRendererText(tmResults.Columns[i]) })); } foreach (DatabaseRecord rec in db.Tables[0].Records) { diff --git a/Libraries/UniversalEditor.UserInterface/Editors/FileSystem/FileSystemEditor.cs b/Libraries/UniversalEditor.UserInterface/Editors/FileSystem/FileSystemEditor.cs index 06defd6a..e9aa7fed 100644 --- a/Libraries/UniversalEditor.UserInterface/Editors/FileSystem/FileSystemEditor.cs +++ b/Libraries/UniversalEditor.UserInterface/Editors/FileSystem/FileSystemEditor.cs @@ -38,6 +38,7 @@ using MBS.Framework; using MBS.Framework.UserInterface.Controls; using System.Text; using System.Diagnostics.Contracts; +using MBS.Framework.UserInterface.Drawing; namespace UniversalEditor.Editors.FileSystem { @@ -48,6 +49,8 @@ namespace UniversalEditor.Editors.FileSystem private DefaultTreeModel tm = null; private TextBox txtPath; + private const int DELIVERED_COLUMNS_COUNT = 5; + [EventHandler(nameof(txtPath), "KeyDown")] private void txtPath_KeyDown(object sender, KeyEventArgs e) { @@ -337,7 +340,8 @@ namespace UniversalEditor.Editors.FileSystem new TreeModelRowColumn(tm.Columns[0], f.Name), new TreeModelRowColumn(tm.Columns[1], String.Format("{0} items", (f.Files.Count + f.Folders.Count))), new TreeModelRowColumn(tm.Columns[2], "Folder"), - new TreeModelRowColumn(tm.Columns[3], now.ToString()) + new TreeModelRowColumn(tm.Columns[3], now.ToString()), + new TreeModelRowColumn(tm.Columns[4], Image.FromStock(StockType.Folder, 16)) }); row.RowColumns[1].RawValue = (f.Folders.Count + f.Files.Count); row.RowColumns[3].RawValue = now.ToBinary(); @@ -606,7 +610,8 @@ namespace UniversalEditor.Editors.FileSystem new TreeModelRowColumn(tm.Columns[0], f.Name), new TreeModelRowColumn(tm.Columns[1], (f.Folders.Count + f.Files.Count).ToString() + " items"), new TreeModelRowColumn(tm.Columns[2], "Folder"), - new TreeModelRowColumn(tm.Columns[3], "") + new TreeModelRowColumn(tm.Columns[3], ""), + new TreeModelRowColumn(tm.Columns[4], Image.FromStock(StockType.Folder, 16)) }); r.RowColumns[1].RawValue = (long)(f.Folders.Count + f.Files.Count); r.RowColumns[3].RawValue = (long)0; @@ -633,14 +638,15 @@ namespace UniversalEditor.Editors.FileSystem new TreeModelRowColumn(tm.Columns[0], f.Name), new TreeModelRowColumn(tm.Columns[1], UserInterface.Common.FileInfo.FormatSize(f.Size)), new TreeModelRowColumn(tm.Columns[2], "File"), - new TreeModelRowColumn(tm.Columns[3], f.ModificationTimestamp.ToString()) + new TreeModelRowColumn(tm.Columns[3], f.ModificationTimestamp.ToString()), + new TreeModelRowColumn(tm.Columns[4], Image.FromStock(StockType.File, 16)) }); r.RowColumns[1].RawValue = f.Size; r.RowColumns[3].RawValue = f.ModificationTimestamp.ToBinary(); for (int i = 0; i < fsom.AdditionalDetails.Count; i++) { - r.RowColumns.Add(new TreeModelRowColumn(tm.Columns[4 + i], f.GetAdditionalDetail(fsom.AdditionalDetails[i].Name))); + r.RowColumns.Add(new TreeModelRowColumn(tm.Columns[DELIVERED_COLUMNS_COUNT + i], f.GetAdditionalDetail(fsom.AdditionalDetails[i].Name))); } } r.SetExtraData("item", fso); @@ -769,14 +775,14 @@ namespace UniversalEditor.Editors.FileSystem FileSystemObjectModel fsom = (ObjectModel as FileSystemObjectModel); if (fsom == null) return; - for (int i = 4; i < tv.Columns.Count; i++) + for (int i = DELIVERED_COLUMNS_COUNT; i < tv.Columns.Count; i++) { tv.Columns.Remove(tv.Columns[i]); } for (int i = 0; i < fsom.AdditionalDetails.Count; i++) { tm.Columns.Add(new TreeModelColumn(typeof(string))); - tv.Columns.Add(new ListViewColumnText(tm.Columns[tm.Columns.Count - 1], fsom.AdditionalDetails[i].Title)); + tv.Columns.Add(new ListViewColumn(fsom.AdditionalDetails[i].Title, new CellRenderer[] { new CellRendererText(tm.Columns[tm.Columns.Count - 1]) })); } tv.Model = tm; @@ -917,7 +923,7 @@ namespace UniversalEditor.Editors.FileSystem if (!IsCreated) return; - for (int i = 4; i < tm.Columns.Count; i++) + for (int i = DELIVERED_COLUMNS_COUNT; i < tm.Columns.Count; i++) { tm.Columns.RemoveAt(i); } diff --git a/Libraries/UniversalEditor.UserInterface/MainWindow.cs b/Libraries/UniversalEditor.UserInterface/MainWindow.cs index c2f043b9..6ef66f61 100644 --- a/Libraries/UniversalEditor.UserInterface/MainWindow.cs +++ b/Libraries/UniversalEditor.UserInterface/MainWindow.cs @@ -196,6 +196,7 @@ namespace UniversalEditor.UserInterface { Layout = new BoxLayout(Orientation.Vertical); this.IconName = "universal-editor"; + LogoutInhibitor = new Inhibitor(InhibitorType.SystemLogout, "There are unsaved documents", this); this.CommandDisplayMode = CommandDisplayMode.CommandBar; @@ -215,7 +216,7 @@ namespace UniversalEditor.UserInterface ListViewControl lvToolbox = new ListViewControl(); lvToolbox.RowActivated += LvToolbox_RowActivated; lvToolbox.Model = tmToolbox; - lvToolbox.Columns.Add(new ListViewColumnText(tmToolbox.Columns[0], "Item")); + lvToolbox.Columns.Add(new ListViewColumn("Item", new CellRenderer[] { new CellRendererText(tmToolbox.Columns[0]) })); lvToolbox.HeaderStyle = ColumnHeaderStyle.None; AddPanel("Toolbox", DockingItemPlacement.Left, lvToolbox); @@ -1041,6 +1042,9 @@ namespace UniversalEditor.UserInterface OpenFile(documents); } + private Inhibitor LogoutInhibitor = null; + private int logoutInhibitorI = 0; + public void OpenFile(params Document[] documents) { foreach (Document doc in documents) @@ -1049,6 +1053,15 @@ namespace UniversalEditor.UserInterface { InitEditorPage(doc); + if (logoutInhibitorI == 0) + { + (Application.Instance as UIApplication).Inhibitors.Add(LogoutInhibitor); + } + logoutInhibitorI++; + + if (doc == null) + continue; + if (doc.Accessor is FileAccessor) { // FIXME: support Accessors other than FileAccessor @@ -1171,8 +1184,12 @@ namespace UniversalEditor.UserInterface { if (document.IsSaved) { + bool inputClosed = false; if (document.InputAccessor != null && document.InputAccessor.IsOpen) + { + inputClosed = true; document.InputAccessor.Close(); + } if (document.OutputAccessor is FileAccessor) { @@ -1180,9 +1197,33 @@ namespace UniversalEditor.UserInterface (document.OutputAccessor as FileAccessor).AllowWrite = true; (document.OutputAccessor as FileAccessor).ForceOverwrite = true; } - document.OutputAccessor.Open(); - document.Save(); - document.OutputAccessor.Close(); + + try + { + document.OutputAccessor.Open(); + document.Save(); + document.OutputAccessor.Close(); + } + catch (UnauthorizedAccessException ex) + { + if (inputClosed) + { + if (document.InputAccessor is FileAccessor) + { + // FIXME: ewww + (document.InputAccessor as FileAccessor).AllowWrite = false; + (document.InputAccessor as FileAccessor).ForceOverwrite = false; + } + document.InputAccessor.Open(); + } + + switch (HandleUnauthorizedAccessException(document, ex)) + { + case MultipleDocumentErrorHandling.CancelAll: return false; + case MultipleDocumentErrorHandling.CancelOne: return true; + case MultipleDocumentErrorHandling.Ignore: break; + } + } DockingWindow di = dckContainer.Items[GetCurrentEditorPage()] as DockingWindow; if (di != null) @@ -1271,7 +1312,20 @@ namespace UniversalEditor.UserInterface page.Document.DataFormat = df; page.Document.Accessor = accessor; } - page.Document.Save(); + + try + { + page.Document.Save(); + } + catch (UnauthorizedAccessException ex) + { + switch (HandleUnauthorizedAccessException(page.Document, ex)) + { + case MultipleDocumentErrorHandling.CancelAll: return false; + case MultipleDocumentErrorHandling.CancelOne: return true; + case MultipleDocumentErrorHandling.Ignore: break; + } + } GetCurrentEditor().Document = page.Document; DockingWindow di = dckContainer.Items[page] as DockingWindow; @@ -1282,6 +1336,25 @@ namespace UniversalEditor.UserInterface } return true; } + + private MultipleDocumentErrorHandling HandleUnauthorizedAccessException(Document document, UnauthorizedAccessException ex) + { + DialogResult dr = MessageDialog.ShowDialog(String.Format("Cannot save the file in its current location. Would you like to choose another location?\r\n\r\n{0}", ex.Message), "Unauthorized", MessageDialogButtons.YesNoCancel, MessageDialogIcon.Warning); + if (dr == DialogResult.Yes) + { + SaveFileAs(document); + } + else if (dr == DialogResult.No) + { + return MultipleDocumentErrorHandling.CancelOne; + } + else if (dr == DialogResult.Cancel) + { + return MultipleDocumentErrorHandling.CancelAll; + } + return MultipleDocumentErrorHandling.Ignore; + } + public bool SaveFileAs(Accessor accessor, DataFormat df) { return SaveFileAs(accessor, df, GetCurrentEditor()?.ObjectModel); @@ -1376,6 +1449,12 @@ namespace UniversalEditor.UserInterface dckContainer.Items.Remove(dw); documentWindowCount--; + logoutInhibitorI--; + if (logoutInhibitorI == 0) + { + (Application.Instance as UIApplication).Inhibitors.Remove(LogoutInhibitor); + } + if (documentWindowCount == 0) { CloseWindow (); diff --git a/Libraries/UniversalEditor.UserInterface/MultipleDocumentErrorHandling.cs b/Libraries/UniversalEditor.UserInterface/MultipleDocumentErrorHandling.cs new file mode 100644 index 00000000..87998802 --- /dev/null +++ b/Libraries/UniversalEditor.UserInterface/MultipleDocumentErrorHandling.cs @@ -0,0 +1,46 @@ +// +// MultipleDocumentErrorHandling.cs +// +// Author: +// Michael Becker +// +// Copyright (c) 2021 Mike Becker's Software +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +using System; +namespace UniversalEditor.UserInterface +{ + /// + /// Describes the way in which to handle an when + /// there are additional s to be processed afterward. + /// + public enum MultipleDocumentErrorHandling + { + /// + /// Ignore the error for the current and proceed + /// to processing the next . + /// + Ignore, + /// + /// Cancels the operation for a single . Other + /// s will continue to be processed. + /// + CancelOne, + /// + /// Cancels the entire operation, including any s + /// that still have yet to be processed. + /// + CancelAll + } +} diff --git a/Libraries/UniversalEditor.UserInterface/Panels/DocumentExplorerPanel.cs b/Libraries/UniversalEditor.UserInterface/Panels/DocumentExplorerPanel.cs index 9709b922..ef594bc6 100644 --- a/Libraries/UniversalEditor.UserInterface/Panels/DocumentExplorerPanel.cs +++ b/Libraries/UniversalEditor.UserInterface/Panels/DocumentExplorerPanel.cs @@ -23,7 +23,7 @@ namespace UniversalEditor.UserInterface.Panels tm = new DefaultTreeModel(new Type[] { typeof(string) }); lv.Model = tm; lv.HeaderStyle = ColumnHeaderStyle.None; - lv.Columns.Add(new ListViewColumnText(tm.Columns[0], "Item")); + lv.Columns.Add(new ListViewColumn("Item", new CellRenderer[] { new CellRendererText(tm.Columns[0]) })); Controls.Add(lv, new BoxLayout.Constraints(true, true)); } diff --git a/Libraries/UniversalEditor.UserInterface/Panels/ErrorListPanel.cs b/Libraries/UniversalEditor.UserInterface/Panels/ErrorListPanel.cs index d81f3780..8b969c14 100644 --- a/Libraries/UniversalEditor.UserInterface/Panels/ErrorListPanel.cs +++ b/Libraries/UniversalEditor.UserInterface/Panels/ErrorListPanel.cs @@ -53,12 +53,12 @@ namespace UniversalEditor.UserInterface.Panels tvErrorList.Model = tm; - tvErrorList.Columns.Add(new ListViewColumnText(tm.Columns[0], "Line")); - tvErrorList.Columns.Add(new ListViewColumnText(tm.Columns[1], "Description")); - tvErrorList.Columns.Add(new ListViewColumnText(tm.Columns[2], "File")); - tvErrorList.Columns.Add(new ListViewColumnText(tm.Columns[3], "Project")); - tvErrorList.Columns.Add(new ListViewColumnText(tm.Columns[4], "Path")); - tvErrorList.Columns.Add(new ListViewColumnText(tm.Columns[5], "Category")); + tvErrorList.Columns.Add(new ListViewColumn("Line", new CellRenderer[] { new CellRendererText(tm.Columns[0]) })); + tvErrorList.Columns.Add(new ListViewColumn("Description", new CellRenderer[] { new CellRendererText(tm.Columns[1]) } )); + tvErrorList.Columns.Add(new ListViewColumn("File", new CellRenderer[] { new CellRendererText(tm.Columns[2]) } )); + tvErrorList.Columns.Add(new ListViewColumn("Project", new CellRenderer[] { new CellRendererText(tm.Columns[3]) } )); + tvErrorList.Columns.Add(new ListViewColumn("Path", new CellRenderer[] { new CellRendererText(tm.Columns[4]) } )); + tvErrorList.Columns.Add(new ListViewColumn("Category", new CellRenderer[] { new CellRendererText(tm.Columns[5]) })); (Application.Instance as IHostApplication).Messages.MessageAdded += (sender, e) => { diff --git a/Libraries/UniversalEditor.UserInterface/Panels/SolutionExplorerPanel.cs b/Libraries/UniversalEditor.UserInterface/Panels/SolutionExplorerPanel.cs index 69749477..8e4f8c9f 100644 --- a/Libraries/UniversalEditor.UserInterface/Panels/SolutionExplorerPanel.cs +++ b/Libraries/UniversalEditor.UserInterface/Panels/SolutionExplorerPanel.cs @@ -184,7 +184,7 @@ namespace UniversalEditor.UserInterface.Panels tvSolutionExplorer.RowActivated += tvSolutionExplorer_RowActivated; // (UniversalEditor.exe:24867): Gtk-CRITICAL **: 21:28:56.913: gtk_tree_store_set_value: assertion 'G_IS_VALUE (value)' failed - tvSolutionExplorer.Columns.Add(new ListViewColumnText(tmSolutionExplorer.Columns[0], "File Name")); + tvSolutionExplorer.Columns.Add(new ListViewColumn("File name", new CellRenderer[] { new CellRendererText(tmSolutionExplorer.Columns[0]) })); this.Controls.Add(tvSolutionExplorer, new BoxLayout.Constraints(true, true)); diff --git a/Libraries/UniversalEditor.UserInterface/UniversalEditor.UserInterface.csproj b/Libraries/UniversalEditor.UserInterface/UniversalEditor.UserInterface.csproj index 8a13d3a6..439da3a0 100644 --- a/Libraries/UniversalEditor.UserInterface/UniversalEditor.UserInterface.csproj +++ b/Libraries/UniversalEditor.UserInterface/UniversalEditor.UserInterface.csproj @@ -136,6 +136,7 @@ + diff --git a/Plugins.UserInterface/UniversalEditor.Plugins.AddressBook.UserInterface/Editors/Contact/ContactEditor.cs b/Plugins.UserInterface/UniversalEditor.Plugins.AddressBook.UserInterface/Editors/Contact/ContactEditor.cs index 7d2fc6ee..786ec907 100644 --- a/Plugins.UserInterface/UniversalEditor.Plugins.AddressBook.UserInterface/Editors/Contact/ContactEditor.cs +++ b/Plugins.UserInterface/UniversalEditor.Plugins.AddressBook.UserInterface/Editors/Contact/ContactEditor.cs @@ -148,7 +148,7 @@ namespace UniversalEditor.Editors.Contact tmAddresses = new DefaultTreeModel(new Type[] { typeof(string) }); lvPhysicalAddresses = new ListViewControl(); - lvPhysicalAddresses.Columns.Add(new ListViewColumnText(tmAddresses.Columns[0], "Address")); + lvPhysicalAddresses.Columns.Add(new ListViewColumn("Address", new CellRenderer[] { new CellRendererText(tmAddresses.Columns[0]) })); lvPhysicalAddresses.Model = tmAddresses; ct.Controls.Add(lvPhysicalAddresses, new BoxLayout.Constraints(true, true)); @@ -167,7 +167,7 @@ namespace UniversalEditor.Editors.Contact tmAddresses = new DefaultTreeModel(new Type[] { typeof(string) }); ListViewControl lvAddresses = new ListViewControl(); - lvAddresses.Columns.Add(new ListViewColumnText(tmAddresses.Columns[0], "Address")); + lvAddresses.Columns.Add(new ListViewColumn("Address", new CellRenderer[] { new CellRendererText(tmAddresses.Columns[0]) })); ct.Controls.Add(lvAddresses, new BoxLayout.Constraints(true, true)); StackSidebarPanel panel = new StackSidebarPanel(); @@ -185,7 +185,7 @@ namespace UniversalEditor.Editors.Contact tmAddresses = new DefaultTreeModel(new Type[] { typeof(string) }); ListViewControl lvAddresses = new ListViewControl(); - lvAddresses.Columns.Add(new ListViewColumnText(tmAddresses.Columns[0], "Address")); + lvAddresses.Columns.Add(new ListViewColumn("Address", new CellRenderer[] { new CellRendererText(tmAddresses.Columns[0]) })); ct.Controls.Add(lvAddresses, new BoxLayout.Constraints(true, true)); StackSidebarPanel panel = new StackSidebarPanel(); diff --git a/Plugins.UserInterface/UniversalEditor.Plugins.Executable.UserInterface/Editors/Executable/NonLayout/ExecutableEditor.cs b/Plugins.UserInterface/UniversalEditor.Plugins.Executable.UserInterface/Editors/Executable/NonLayout/ExecutableEditor.cs index 058b1d69..b5bad4f0 100644 --- a/Plugins.UserInterface/UniversalEditor.Plugins.Executable.UserInterface/Editors/Executable/NonLayout/ExecutableEditor.cs +++ b/Plugins.UserInterface/UniversalEditor.Plugins.Executable.UserInterface/Editors/Executable/NonLayout/ExecutableEditor.cs @@ -76,10 +76,10 @@ namespace UniversalEditor.Plugins.Executable.UserInterface.Editors.Executable tvSections = new ListViewControl(); tvSections.Model = tmSections; - tvSections.Columns.Add(new ListViewColumnText(tmSections.Columns[0], "Name")); - tvSections.Columns.Add(new ListViewColumnText(tmSections.Columns[1], "Physical address")); - tvSections.Columns.Add(new ListViewColumnText(tmSections.Columns[2], "Virtual address")); - tvSections.Columns.Add(new ListViewColumnText(tmSections.Columns[3], "Size")); + tvSections.Columns.Add(new ListViewColumn("Name", new CellRenderer[] { new CellRendererText(tmSections.Columns[0]) })); + tvSections.Columns.Add(new ListViewColumn("Physical address", new CellRenderer[] { new CellRendererText(tmSections.Columns[1]) })); + tvSections.Columns.Add(new ListViewColumn("Virtual address", new CellRenderer[] { new CellRendererText(tmSections.Columns[2]) })); + tvSections.Columns.Add(new ListViewColumn("Size", new CellRenderer[] { new CellRendererText(tmSections.Columns[3]) })); tvSections.BeforeContextMenu += tvSections_BeforeContextMenu; tbs = new TabContainer(); @@ -125,8 +125,8 @@ namespace UniversalEditor.Plugins.Executable.UserInterface.Editors.Executable ListViewControl lvOtherInformation = new ListViewControl(); lvOtherInformation.Model = tmOtherInformation; - lvOtherInformation.Columns.Add(new ListViewColumnText(tmOtherInformation.Columns[0], "Name")); - lvOtherInformation.Columns.Add(new ListViewColumnText(tmOtherInformation.Columns[1], "Value")); + lvOtherInformation.Columns.Add(new ListViewColumn("Name", new CellRenderer[] { new CellRendererText(tmOtherInformation.Columns[0]) })); + lvOtherInformation.Columns.Add(new ListViewColumn("Value", new CellRenderer[] { new CellRendererText(tmOtherInformation.Columns[1]) })); tabVersion.Controls.Add(lvOtherInformation, new GridLayout.Constraints(4, 0, 1, 2, ExpandMode.Both)); tbs.TabPages.Add(tabVersion); diff --git a/Plugins.UserInterface/UniversalEditor.Plugins.Executable.UserInterface/Editors/Executable/NonLayout/ManagedAssemblyPanel.cs b/Plugins.UserInterface/UniversalEditor.Plugins.Executable.UserInterface/Editors/Executable/NonLayout/ManagedAssemblyPanel.cs index 0ad528a2..f110ac15 100644 --- a/Plugins.UserInterface/UniversalEditor.Plugins.Executable.UserInterface/Editors/Executable/NonLayout/ManagedAssemblyPanel.cs +++ b/Plugins.UserInterface/UniversalEditor.Plugins.Executable.UserInterface/Editors/Executable/NonLayout/ManagedAssemblyPanel.cs @@ -260,8 +260,8 @@ namespace UniversalEditor.Plugins.Executable.UserInterface.Editors.Executable tmTypes = new DefaultTreeModel(new Type[] { typeof(string), typeof(string) }); tvTypes.Model = tmTypes; - tvTypes.Columns.Add(new ListViewColumnText(tmTypes.Columns[0], "Name")); - tvTypes.Columns.Add(new ListViewColumnText(tmTypes.Columns[1], "Type")); + tvTypes.Columns.Add(new ListViewColumn("Name", new CellRenderer[] { new CellRendererText(tmTypes.Columns[0]) })); + tvTypes.Columns.Add(new ListViewColumn("Type", new CellRenderer[] { new CellRendererText(tmTypes.Columns[1]) })); scLeftRight.Panel1.Controls.Add(tvTypes, new BoxLayout.Constraints(true, true)); scLeftRight.Panel2.Layout = new BoxLayout(Orientation.Vertical); diff --git a/Plugins.UserInterface/UniversalEditor.Plugins.Multimedia.UserInterface/Editors/Multimedia/Audio/Voicebank/VoicebankEditor.cs b/Plugins.UserInterface/UniversalEditor.Plugins.Multimedia.UserInterface/Editors/Multimedia/Audio/Voicebank/VoicebankEditor.cs index d57e818b..b005602b 100644 --- a/Plugins.UserInterface/UniversalEditor.Plugins.Multimedia.UserInterface/Editors/Multimedia/Audio/Voicebank/VoicebankEditor.cs +++ b/Plugins.UserInterface/UniversalEditor.Plugins.Multimedia.UserInterface/Editors/Multimedia/Audio/Voicebank/VoicebankEditor.cs @@ -47,10 +47,10 @@ namespace UniversalEditor.Plugins.Multimedia.UserInterface.Editors.Multimedia.Au lvSamples = new ListViewControl(); lvSamples.SelectionMode = SelectionMode.Multiple; lvSamples.BeforeContextMenu += lvSamples_BeforeContextMenu; - lvSamples.Columns.Add(new ListViewColumnText(tmSamples.Columns[0], "Name")); - lvSamples.Columns.Add(new ListViewColumnText(tmSamples.Columns[1], "Frequency")); - lvSamples.Columns.Add(new ListViewColumnText(tmSamples.Columns[2], "Channels")); - lvSamples.Columns.Add(new ListViewColumnText(tmSamples.Columns[3], "Size")); + lvSamples.Columns.Add(new ListViewColumn("Name", new CellRenderer[] { new CellRendererText(tmSamples.Columns[0]) })); + lvSamples.Columns.Add(new ListViewColumn("Frequency", new CellRenderer[] { new CellRendererText(tmSamples.Columns[1]) })); + lvSamples.Columns.Add(new ListViewColumn("Channels", new CellRenderer[] { new CellRendererText(tmSamples.Columns[2]) })); + lvSamples.Columns.Add(new ListViewColumn("Size", new CellRenderer[] { new CellRendererText(tmSamples.Columns[3]) })); lvSamples.Model = tmSamples; Controls.Add(lvSamples, new BoxLayout.Constraints(true, true)); diff --git a/Plugins.UserInterface/UniversalEditor.Plugins.Multimedia.UserInterface/Editors/Multimedia/PictureCollection/PictureCollectionEditor.cs b/Plugins.UserInterface/UniversalEditor.Plugins.Multimedia.UserInterface/Editors/Multimedia/PictureCollection/PictureCollectionEditor.cs index a9cf9b42..2e6f102b 100644 --- a/Plugins.UserInterface/UniversalEditor.Plugins.Multimedia.UserInterface/Editors/Multimedia/PictureCollection/PictureCollectionEditor.cs +++ b/Plugins.UserInterface/UniversalEditor.Plugins.Multimedia.UserInterface/Editors/Multimedia/PictureCollection/PictureCollectionEditor.cs @@ -256,6 +256,16 @@ namespace UniversalEditor.Plugins.Multimedia.UserInterface.Editors.Multimedia.Pi cmdSave.Enabled = coll.Pictures.Count > 0; cmdSaveAll.Enabled = coll.Pictures.Count > 0; + txtQuickAnimateStartFrame.Minimum = 0; + txtQuickAnimateStartFrame.Maximum = coll.Pictures.Count - 1; + txtQuickAnimateStartFrame.Value = 0; + + txtQuickAnimateEndFrame.Minimum = 0; + txtQuickAnimateEndFrame.Maximum = coll.Pictures.Count - 1; + txtQuickAnimateEndFrame.Value = coll.Pictures.Count - 1; + + txtQuickAnimateFrameDuration.Value = 500; + if (coll.Pictures.Count > 0) picFrame.ObjectModel = coll.Pictures[0]; } @@ -279,24 +289,27 @@ namespace UniversalEditor.Plugins.Multimedia.UserInterface.Editors.Multimedia.Pi private UniversalEditor.Editors.Multimedia.Picture.PictureEditor picFrame = null; [EventHandler(nameof(cmdSave), "Click")] - void CmdSave_Click(object sender, EventArgs e) + private void cmdSave_Click(object sender, EventArgs e) { PictureCollectionObjectModel coll = ObjectModel as PictureCollectionObjectModel; if (SelectedFrameIndex < 0 || SelectedFrameIndex >= coll.Pictures.Count) return; - FileDialog dlg = new FileDialog(); - dlg.Mode = FileDialogMode.Save; + UniversalEditor.UserInterface.Dialogs.DocumentPropertiesDialog dlg = new UniversalEditor.UserInterface.Dialogs.DocumentPropertiesDialog(); + dlg.ObjectModel = coll.Pictures[SelectedFrameIndex]; + dlg.DataFormat = new BitmapDataFormat(); + dlg.ObjectModelSelectionEnabled = false; + dlg.Mode = UniversalEditor.UserInterface.Dialogs.DocumentPropertiesDialogMode.Save; + if (dlg.ShowDialog() == DialogResult.OK) { - PictureObjectModel pic = coll.Pictures[SelectedFrameIndex]; - BitmapDataFormat bmp = new BitmapDataFormat(); - - FileAccessor fa = new FileAccessor(dlg.SelectedFileNames[dlg.SelectedFileNames.Count - 1]); - fa.AllowWrite = true; - fa.ForceOverwrite = true; - fa.Open(); - Document.Save(pic, bmp, fa, true); + if (dlg.Accessor is FileAccessor) + { + // FIXME: this should not be necessary + (dlg.Accessor as FileAccessor).AllowWrite = true; + (dlg.Accessor as FileAccessor).ForceOverwrite = true; + } + Document.Save(dlg.ObjectModel, dlg.DataFormat, dlg.Accessor, true); } } [EventHandler(nameof(cmdSaveAll), "Click")] diff --git a/Plugins.UserInterface/UniversalEditor.Plugins.Scientific.UserInterface/Editors/DataSetCollection/DataSetCollectionEditor.cs b/Plugins.UserInterface/UniversalEditor.Plugins.Scientific.UserInterface/Editors/DataSetCollection/DataSetCollectionEditor.cs index 6b9b162e..22301ce8 100644 --- a/Plugins.UserInterface/UniversalEditor.Plugins.Scientific.UserInterface/Editors/DataSetCollection/DataSetCollectionEditor.cs +++ b/Plugins.UserInterface/UniversalEditor.Plugins.Scientific.UserInterface/Editors/DataSetCollection/DataSetCollectionEditor.cs @@ -99,7 +99,7 @@ namespace UniversalEditor.Plugins.Scientific.UserInterface.Editors.DataSetCollec for (int i = 0; i < ds.Dimensions; i++) { - tv.Columns.Add(new ListViewColumnText(tm.Columns[i], i.ToString())); + tv.Columns.Add(new ListViewColumn(i.ToString(), new CellRenderer[] { new CellRendererText(tm.Columns[i]) })); for (int j = 0; j < ds.Sizes[i]; j++) { diff --git a/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaExtensionArea.cs b/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaExtensionArea.cs index 32e59246..7bf1d5bc 100644 --- a/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaExtensionArea.cs +++ b/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaExtensionArea.cs @@ -45,5 +45,9 @@ namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa public List ScanLineTable { get; } = new List(); public List ColorCorrectionTable { get; } = new List(); public int AttributesType { get; set; } = 0; + + public string AuthorName { get; set; } = null; + public string AuthorComments { get; set; } = null; + public string JobName { get; set; } = null; } } diff --git a/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaFormatVersion.cs b/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaFormatVersion.cs new file mode 100644 index 00000000..d21f7cc9 --- /dev/null +++ b/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TargaFormatVersion.cs @@ -0,0 +1,29 @@ +// +// TargaFormatVersion.cs +// +// Author: +// Michael Becker +// +// Copyright (c) 2021 Mike Becker's Software +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +using System; +namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa +{ + public enum TargaFormatVersion + { + Original = 100, + TrueVisionXFile = 200 + } +} diff --git a/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TrueVisionTGADataFormat.cs b/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TrueVisionTGADataFormat.cs index d3ee05c2..a8e431c0 100644 --- a/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TrueVisionTGADataFormat.cs +++ b/Plugins/UniversalEditor.Plugins.Multimedia/DataFormats/Multimedia/Picture/Targa/TrueVisionTGADataFormat.cs @@ -45,16 +45,45 @@ namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa private const int EXTENSION_AREA_COLOR_CORRECTION_TABLE_VALUE_LENGTH = 41; public TargaExtensionArea ExtensionArea { get; } = new TargaExtensionArea(); + public TargaFirstPixelDestination PixelOrigin { get; } = TargaFirstPixelDestination.TopLeft; + public TargaFormatVersion FormatVersion { get; set; } = TargaFormatVersion.Original; protected override DataFormatReference MakeReferenceInternal() { DataFormatReference dfr = base.MakeReferenceInternal(); dfr.Capabilities.Add(typeof(PictureObjectModel), DataFormatCapabilities.All); + dfr.ExportOptions.Add(new CustomOptionChoice(nameof(ImageType), "Image _type", true, new CustomOptionFieldChoice[] + { + new CustomOptionFieldChoice("Compressed grayscale", TargaImageType.CompressedGrayscale), + new CustomOptionFieldChoice("Compressed indexed", TargaImageType.CompressedIndexed), + new CustomOptionFieldChoice("Compressed true color", TargaImageType.CompressedTrueColor), + new CustomOptionFieldChoice("Uncompressed grayscale", TargaImageType.UncompressedGrayscale), + new CustomOptionFieldChoice("Uncompressed indexed", TargaImageType.UncompressedIndexed), + new CustomOptionFieldChoice("Uncompressed true color", TargaImageType.UncompressedTrueColor) + })); + dfr.ExportOptions.Add(new CustomOptionChoice(nameof(PixelDepth), "Pixel _depth", true, new CustomOptionFieldChoice[] + { + new CustomOptionFieldChoice("8bpp", (byte)8), + new CustomOptionFieldChoice("16bpp", (byte)16), + new CustomOptionFieldChoice("24bpp", (byte)24), + new CustomOptionFieldChoice("32bpp", (byte)32) + })); + dfr.ExportOptions.Add(new CustomOptionChoice(nameof(PixelOrigin), "Pixel o_rigin", true, new CustomOptionFieldChoice[] + { + new CustomOptionFieldChoice("Bottom-left", TargaFirstPixelDestination.BottomLeft), + new CustomOptionFieldChoice("Bottom-right", TargaFirstPixelDestination.BottomRight), + new CustomOptionFieldChoice("Top-left", TargaFirstPixelDestination.TopLeft), + new CustomOptionFieldChoice("Top-right", TargaFirstPixelDestination.TopRight) + })); + dfr.ExportOptions.Add(new CustomOptionChoice(nameof(FormatVersion), "Format _version", true, new CustomOptionFieldChoice[] + { + new CustomOptionFieldChoice("Original (100)", TargaFormatVersion.Original), + new CustomOptionFieldChoice("TrueVision-XFile (200)", TargaFormatVersion.TrueVisionXFile) + })); dfr.ContentTypes.Add("image/x-targa"); dfr.ContentTypes.Add("image/x-tga"); return dfr; } - public int FormatVersion { get; set; } = 100; // ORIGINAL_TGA private int GetImageDataOffset(int colorMapLength, byte imageIDLength, byte colorMapEntrySize) { @@ -110,9 +139,8 @@ namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa } } - - private int mvarPadding = 0; public TargaImageType ImageType { get; set; } = TargaImageType.None; + public string ImageID { get; set; } = null; protected override void LoadInternal(ref ObjectModel objectModel) { @@ -141,7 +169,7 @@ namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa if (Signature == "TRUEVISION-XFILE") { // this is a NEW targa file. - FormatVersion = 200; + FormatVersion = TargaFormatVersion.TrueVisionXFile; // set cursor to beginning of footer info br.Accessor.Seek((-1 * FOOTER_BYTE_LENGTH), SeekOrigin.End); @@ -164,7 +192,7 @@ namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa else { // this is not an ORIGINAL targa file. - FormatVersion = 100; + FormatVersion = TargaFormatVersion.Original; } } #endregion @@ -216,7 +244,7 @@ namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa // load ImageID value if any if (imageIDLength > 0) { - string ImageID = br.ReadNullTerminatedString(imageIDLength); + ImageID = br.ReadNullTerminatedString(imageIDLength); } imageDataOffset = GetImageDataOffset(colorMapLength, imageIDLength, colorMapEntrySize); @@ -234,52 +262,7 @@ namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa { for (int i = 0; i < colorMapLength; i++) { - int a = 0; - int r = 0; - int g = 0; - int b = 0; - - // load each color map entry based on the ColorMapEntrySize value - switch (colorMapEntrySize) - { - case 15: - { - byte[] color15 = br.ReadBytes(2); - // remember that the bytes are stored in reverse order - pic.ColorMap.Add(GetColorFrom2Bytes(color15[1], color15[0])); - break; - } - case 16: - { - byte[] color16 = br.ReadBytes(2); - // remember that the bytes are stored in reverse order - pic.ColorMap.Add(GetColorFrom2Bytes(color16[1], color16[0])); - break; - } - case 24: - { - b = Convert.ToInt32(br.ReadByte()); - g = Convert.ToInt32(br.ReadByte()); - r = Convert.ToInt32(br.ReadByte()); - pic.ColorMap.Add(Color.FromRGBAInt32(r, g, b)); - break; - } - case 32: - { - a = Convert.ToInt32(br.ReadByte()); - b = Convert.ToInt32(br.ReadByte()); - g = Convert.ToInt32(br.ReadByte()); - r = Convert.ToInt32(br.ReadByte()); - pic.ColorMap.Add(Color.FromRGBAInt32(a, r, g, b)); - break; - } - default: - { - throw new ArgumentOutOfRangeException("TargaImage only supports ColorMap Entry Sizes of 15, 16, 24 or 32 bits."); - } - } - - + pic.ColorMap.Add(DecodeColor(br, colorMapEntrySize)); } } else @@ -287,8 +270,6 @@ namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa throw new InvalidOperationException("Image Type requires a Color Map and Color Map Length is zero."); } } - - } else { @@ -416,7 +397,7 @@ namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa // calculate the padding, in bytes, of the image // number of bytes to add to make each row a 32bit aligned row // padding in bytes - mvarPadding = intStride - ((((int)imageWidth * (int)PixelDepth) + 7) / 8); + int paddingLength = intStride - ((((int)imageWidth * (int)PixelDepth) + 7) / 8); // get the image data bytes byte[] bimagedata = null; @@ -431,7 +412,7 @@ namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa byte[] data = null; // padding bytes - byte[] padding = new byte[mvarPadding]; + byte[] padding = new byte[paddingLength]; System.IO.MemoryStream msData = null; // seek to the beginning of the image data using the ImageDataOffset value @@ -616,34 +597,34 @@ namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa // get the image byte array data = msData.ToArray(); + } - int x = 0, y = 0; - for (int z = 0; z < data.Length; z += 3) + int x = 0, y = 0; + for (int z = 0; z < data.Length; z += 3) + { + int r = data[z + 2]; + int g = data[z + 1]; + int b = data[z]; + int a = 255; + + if (PixelDepth == 32) { - int r = data[z + 2]; - int g = data[z + 1]; - int b = data[z]; - int a = 255; + a = data[z + 3]; + z++; + } - if (PixelDepth == 32) + Color color = Color.FromRGBAInt32(r, g, b, a); + pic.SetPixel(color, x, y); + + x++; + if (x == imageWidth) + { + x = 0; + y++; + + if (y == imageHeight) { - a = data[z + 3]; - z++; - } - - Color color = Color.FromRGBAInt32(r, g, b, a); - pic.SetPixel(color, x, y); - - x++; - if (x == imageWidth) - { - x = 0; - y++; - - if (y == imageHeight) - { - break; - } + break; } } } @@ -653,6 +634,42 @@ namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa #endregion } + private Color DecodeColor(Reader br, byte colorMapEntrySize) + { + // load each color map entry based on the ColorMapEntrySize value + switch (colorMapEntrySize) + { + case 15: + { + byte[] color15 = br.ReadBytes(2); + // remember that the bytes are stored in reverse order + return GetColorFrom2Bytes(color15[1], color15[0]); + } + case 16: + { + byte[] color16 = br.ReadBytes(2); + // remember that the bytes are stored in reverse order + return GetColorFrom2Bytes(color16[1], color16[0]); + } + case 24: + { + int b = Convert.ToInt32(br.ReadByte()); + int g = Convert.ToInt32(br.ReadByte()); + int r = Convert.ToInt32(br.ReadByte()); + return Color.FromRGBAInt32(r, g, b); + } + case 32: + { + int a = Convert.ToInt32(br.ReadByte()); + int b = Convert.ToInt32(br.ReadByte()); + int g = Convert.ToInt32(br.ReadByte()); + int r = Convert.ToInt32(br.ReadByte()); + return Color.FromRGBAInt32(a, r, g, b); + } + } + throw new ArgumentOutOfRangeException(nameof(colorMapEntrySize), "TargaImage only supports ColorMap Entry Sizes of 15, 16, 24 or 32 bits."); + } + private TargaFirstPixelDestination GetFirstPixelDestination(TargaVerticalTransferOrder verticalTransferOrder, TargaHorizontalTransferOrder horizontalTransferOrder) { if (verticalTransferOrder == TargaVerticalTransferOrder.Unknown || horizontalTransferOrder == TargaHorizontalTransferOrder.Unknown) @@ -715,61 +732,80 @@ namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa // return the resulting Color return Color.FromRGBAInt32(r, g, b, a); } + private static byte[] EncodeR5G5B5A1(Color color) + { + // FIXME: not implemented + ushort u = 0; + + byte b1 = 0, b2 = 0; + b1 |= color.GetRedByte(); + b1 <<= 5; + b1 |= color.GetGreenByte(); + + return new byte[] { b1, b2 }; + } protected override void SaveInternal(ObjectModel objectModel) { IO.Writer bw = base.Accessor.Writer; PictureObjectModel pic = (objectModel as PictureObjectModel); - /* #region Targa Header { - // set the cursor at the beginning of the file. - br.Accessor.Seek(0, SeekOrigin.Begin); - // read the header properties from the file - byte imageIDLength = br.ReadByte(); - bool colorMapEnabled = br.ReadBoolean(); - mvarImageType = (TargaImageType)br.ReadByte(); - - short colorMapFirstEntryIndex = br.ReadInt16(); - short colorMapLength = br.ReadInt16(); - byte colorMapEntrySize = br.ReadByte(); - - short originX = br.ReadInt16(); - short originY = br.ReadInt16(); - imageWidth = br.ReadInt16(); - imageHeight = br.ReadInt16(); - - pic.Width = imageWidth; - pic.Height = imageHeight; - - mvarPixelDepth = br.ReadByte(); - switch (mvarPixelDepth) + if (ImageID != null) + { + bw.WriteByte((byte)ImageID.Length); + } + else + { + bw.WriteByte(0); + } + + bool colorMapEnabled = true; + bw.WriteBoolean(colorMapEnabled); + bw.WriteByte((byte)ImageType); + + short colorMapFirstEntryIndex = 0; + bw.WriteInt16(colorMapFirstEntryIndex); + + short colorMapLength = 0; + bw.WriteInt16(colorMapLength); + + byte colorMapEntrySize = 0; + bw.WriteByte(colorMapEntrySize); + + short originX = 0; + bw.WriteInt16(originX); + + short originY = 0; + bw.WriteInt16(originY); + + bw.WriteInt16((short)pic.Width); + bw.WriteInt16((short)pic.Height); + + if (!(PixelDepth == 8 || PixelDepth == 16 || PixelDepth == 24 || PixelDepth == 32)) { - case 8: - case 16: - case 24: - case 32: - break; - default: throw new InvalidOperationException("Targa image file format only supports 8, 16, 24, or 32 bit pixel depths"); } + bw.WriteByte(PixelDepth); + byte ImageDescriptor = GetImageDescriptor(0, PixelOrigin); + bw.WriteByte(ImageDescriptor); + // int attributeBits = ImageDescriptor.GetBits(0, 4); - byte ImageDescriptor = br.ReadByte(); - int attributeBits = ImageDescriptor.GetBits(0, 4); - - verticalTransferOrder = (TargaVerticalTransferOrder)ImageDescriptor.GetBits(5, 1); - horizontalTransferOrder = (TargaHorizontalTransferOrder)ImageDescriptor.GetBits(4, 1); + // verticalTransferOrder = (TargaVerticalTransferOrder)ImageDescriptor.GetBits(5, 1); + // horizontalTransferOrder = (TargaHorizontalTransferOrder)ImageDescriptor.GetBits(4, 1); // load ImageID value if any - if (imageIDLength > 0) + if (ImageID != null) { - string ImageID = br.ReadNullTerminatedString(imageIDLength); + bw.WriteNullTerminatedString(ImageID); + } + else + { + bw.WriteNullTerminatedString(String.Empty); } - - imageDataOffset = GetImageDataOffset(colorMapLength, imageIDLength, colorMapEntrySize); #region Load Colormap { @@ -778,71 +814,61 @@ namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa // image types. If color map is included for other file types we can ignore it. if (colorMapEnabled) { - if (mvarImageType == TargaImageType.UncompressedIndexed || mvarImageType == TargaImageType.CompressedIndexed) + if (ImageType == TargaImageType.UncompressedIndexed || ImageType == TargaImageType.CompressedIndexed) { - if (colorMapLength > 0) + for (int i = 0; i < pic.ColorMap.Count; i++) { - for (int i = 0; i < colorMapLength; i++) + // load each color map entry based on the ColorMapEntrySize value + switch (colorMapEntrySize) { - int a = 0; - int r = 0; - int g = 0; - int b = 0; - - // load each color map entry based on the ColorMapEntrySize value - switch (colorMapEntrySize) + case 15: { - case 15: - { - byte[] color15 = br.ReadBytes(2); - // remember that the bytes are stored in reverse order - pic.ColorMap.Add(GetColorFrom2Bytes(color15[1], color15[0])); - break; - } - case 16: - { - byte[] color16 = br.ReadBytes(2); - // remember that the bytes are stored in reverse order - pic.ColorMap.Add(GetColorFrom2Bytes(color16[1], color16[0])); - break; - } - case 24: - { - b = Convert.ToInt32(br.ReadByte()); - g = Convert.ToInt32(br.ReadByte()); - r = Convert.ToInt32(br.ReadByte()); - pic.ColorMap.Add(Color.FromRGBA(r, g, b)); - break; - } - case 32: - { - a = Convert.ToInt32(br.ReadByte()); - b = Convert.ToInt32(br.ReadByte()); - g = Convert.ToInt32(br.ReadByte()); - r = Convert.ToInt32(br.ReadByte()); - pic.ColorMap.Add(Color.FromRGBA(a, r, g, b)); - break; - } - default: - { - throw new ArgumentOutOfRangeException("TargaImage only supports ColorMap Entry Sizes of 15, 16, 24 or 32 bits."); - } + Console.Error.WriteLine("ERROR: TGA R5G5B5A1 not supported yet"); + // byte[] color15 = EncodeR5G5B5A1(pic.ColorMap[i]); + // remember that the bytes are stored in reverse order + // bw.WriteBytes(new byte[] { color15[1], color15[0] }); + bw.WriteBytes(new byte[] { 0, 0 }); + break; + } + case 16: + { + Console.Error.WriteLine("ERROR: TGA R5G6B5 not supported yet"); + // byte[] color16 = EncodeR5G6B5(pic.ColorMap[i]); + // remember that the bytes are stored in reverse order + // bw.WriteBytes(new byte[] { color15[1], color15[0] }); + bw.WriteBytes(new byte[] { 0, 0 }); + break; + } + case 24: + { + bw.WriteByte(pic.ColorMap[i].GetBlueByte()); + bw.WriteByte(pic.ColorMap[i].GetGreenByte()); + bw.WriteByte(pic.ColorMap[i].GetRedByte()); + break; + } + case 32: + { + bw.WriteByte(pic.ColorMap[i].GetAlphaByte()); + bw.WriteByte(pic.ColorMap[i].GetBlueByte()); + bw.WriteByte(pic.ColorMap[i].GetGreenByte()); + bw.WriteByte(pic.ColorMap[i].GetRedByte()); + break; + } + default: + { + throw new ArgumentOutOfRangeException("TargaImage only supports ColorMap Entry Sizes of 15, 16, 24 or 32 bits."); } - - } } - else - { - throw new InvalidOperationException("Image Type requires a Color Map and Color Map Length is zero."); - } } - - + else + { + throw new InvalidOperationException("Image Type requires a Color Map and Color Map Length is zero."); + } } else { - if (mvarImageType == TargaImageType.UncompressedIndexed || mvarImageType == TargaImageType.CompressedIndexed) + if (ImageType == TargaImageType.UncompressedIndexed || ImageType == TargaImageType.CompressedIndexed) { throw new InvalidOperationException("Indexed image type requires a colormap and there was not a colormap included in the file."); } @@ -860,19 +886,15 @@ namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa // In your loop, you copy the pixels one scanline at a time and take into // consideration the amount of padding that occurs due to memory alignment. // calculate the stride, in bytes, of the image (32bit aligned width of each image row) - int intStride = (((int)pic.Width * (int)mvarPixelDepth + 31) & ~31) >> 3; // width in bytes + int intStride = (((int)pic.Width * (int)PixelDepth + 31) & ~31) >> 3; // width in bytes // calculate the padding, in bytes, of the image // number of bytes to add to make each row a 32bit aligned row // padding in bytes - mvarPadding = intStride - ((((int)pic.Width * (int)mvarPixelDepth) + 7) / 8); - - // get the image data bytes - byte[] bimagedata = null; + int paddingLength = intStride - ((((int)pic.Width * (int)PixelDepth) + 7) / 8); #region Image Data Bytes { - // read the image data into a byte array // take into account stride has to be a multiple of 4 // use padding to make sure multiple of 4 @@ -880,7 +902,7 @@ namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa byte[] data = null; // padding bytes - byte[] padding = new byte[mvarPadding]; + byte[] padding = new byte[paddingLength]; System.IO.MemoryStream msData = null; // get the size in bytes of each row in the image @@ -893,8 +915,10 @@ namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa // is this a RLE compressed image type #region COMPRESSED - if (mvarImageType == TargaImageType.CompressedGrayscale || mvarImageType == TargaImageType.CompressedIndexed || mvarImageType == TargaImageType.CompressedTrueColor) + if (ImageType == TargaImageType.CompressedGrayscale || ImageType == TargaImageType.CompressedIndexed || ImageType == TargaImageType.CompressedTrueColor) { + Console.Error.WriteLine("ERROR: TGA RLE compression not implemented yet"); + /* // RLE Packet info byte bRLEPacket = 0; int intRLEPacketType = -1; @@ -970,26 +994,26 @@ namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa } } } + */ } #endregion #region NON-COMPRESSED else { - // loop through each row in the image for (int i = 0; i < (int)pic.Height; i++) { - // create a new row - System.Collections.Generic.List row = new System.Collections.Generic.List(); - + List row = new List(); // loop through each byte in the row - for (int j = 0; j < intImageRowByteSize; j++) + for (int j = 0; j < (int)pic.Width; j++) { // add the byte to the row - row.Add(br.ReadByte()); - } + Color color = pic.GetPixel(j, i); - // add row to the list of rows + row.Add(color.GetRedByte()); + row.Add(color.GetGreenByte()); + row.Add(color.GetBlueByte()); + } rows.Add(row); } } @@ -1003,7 +1027,7 @@ namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa // use FirstPixelDestination to determine the alignment of the // image data byte - switch (GetFirstPixelDestination(verticalTransferOrder, horizontalTransferOrder)) + switch (PixelOrigin) { case TargaFirstPixelDestination.TopLeft: { @@ -1061,36 +1085,7 @@ namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa // get the image byte array data = msData.ToArray(); - - int x = 0, y = 0; - for (int z = 0; z < data.Length; z += 3) - { - int r = data[z + 2]; - int g = data[z + 1]; - int b = data[z]; - int a = 255; - - if (mvarPixelDepth == 32) - { - a = data[z + 3]; - z++; - } - - Color color = Color.FromRGBA(a, r, g, b); - pic.SetPixel(color, x, y); - - x++; - if (x == pic.Width) - { - x = 0; - y++; - - if (y == pic.Height) - { - break; - } - } - } + bw.WriteBytes(data); } } #endregion @@ -1099,60 +1094,61 @@ namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa #region Targa extension area { // is there an Extension Area in file - if (mvarExtensionArea.Enabled) + if (ExtensionArea.Enabled) { short extensionAreaSize = 164; - bw.Write(extensionAreaSize); + bw.WriteInt16(extensionAreaSize); - bw.WriteFixedLengthString(mvarExtensionArea.AuthorName, EXTENSION_AREA_AUTHOR_NAME_LENGTH); - bw.WriteFixedLengthString(mvarExtensionArea.AuthorComments, EXTENSION_AREA_AUTHOR_NAME_LENGTH); + bw.WriteFixedLengthString(ExtensionArea.AuthorName, EXTENSION_AREA_AUTHOR_NAME_LENGTH); + bw.WriteFixedLengthString(ExtensionArea.AuthorComments, EXTENSION_AREA_AUTHOR_NAME_LENGTH); - bw.Write((short)mvarExtensionArea.DateCreated.Month); - bw.Write((short)mvarExtensionArea.DateCreated.Day); - bw.Write((short)mvarExtensionArea.DateCreated.Year); - bw.Write((short)mvarExtensionArea.DateCreated.Hour); - bw.Write((short)mvarExtensionArea.DateCreated.Minute); - bw.Write((short)mvarExtensionArea.DateCreated.Second); + bw.WriteInt16((short)ExtensionArea.DateCreated.Month); + bw.WriteInt16((short)ExtensionArea.DateCreated.Day); + bw.WriteInt16((short)ExtensionArea.DateCreated.Year); + bw.WriteInt16((short)ExtensionArea.DateCreated.Hour); + bw.WriteInt16((short)ExtensionArea.DateCreated.Minute); + bw.WriteInt16((short)ExtensionArea.DateCreated.Second); - bw.WriteFixedLengthString(mvarExtensionArea.JobName, EXTENSION_AREA_JOB_NAME_LENGTH); + bw.WriteFixedLengthString(ExtensionArea.JobName, EXTENSION_AREA_JOB_NAME_LENGTH); - bw.Write((short)mvarExtensionArea.JobTime.Hours); - bw.Write((short)mvarExtensionArea.JobTime.Minutes); - bw.Write((short)mvarExtensionArea.JobTime.Seconds); + bw.WriteInt16((short)ExtensionArea.JobTime.Hours); + bw.WriteInt16((short)ExtensionArea.JobTime.Minutes); + bw.WriteInt16((short)ExtensionArea.JobTime.Seconds); - bw.WriteFixedLengthString(mvarExtensionArea.SoftwareID, EXTENSION_AREA_SOFTWARE_ID_LENGTH); + bw.WriteFixedLengthString(ExtensionArea.SoftwareID, EXTENSION_AREA_SOFTWARE_ID_LENGTH); // get the version number and letter from file float iVersionNumber = 1.0f; short sVersionNumber = (short)(iVersionNumber * 100.0F); - bw.Write(sVersionNumber); - bw.Write((char)'A'); + bw.WriteInt16(sVersionNumber); + bw.WriteChar((char)'A'); // bw.WriteFixedLengthString(mvarExtensionArea.VersionString.Substring(mvarExtensionArea.VersionString.Length - 1, 1)); // mvarExtensionArea.VersionString = (iVersionNumber.ToString(@"F2") + strVersionLetter); // get the color key of the file - bw.Write((byte)(mvarExtensionArea.ColorKey.Alpha * 255)); - bw.Write((byte)(mvarExtensionArea.ColorKey.Red * 255)); - bw.Write((byte)(mvarExtensionArea.ColorKey.Blue * 255)); - bw.Write((byte)(mvarExtensionArea.ColorKey.Green * 255)); + bw.WriteByte((byte)(ExtensionArea.ColorKey.A * 255)); + bw.WriteByte((byte)(ExtensionArea.ColorKey.R * 255)); + bw.WriteByte((byte)(ExtensionArea.ColorKey.B * 255)); + bw.WriteByte((byte)(ExtensionArea.ColorKey.G * 255)); - bw.Write((short)mvarExtensionArea.PixelAspectRatioNumerator); - bw.Write((short)mvarExtensionArea.PixelAspectRatioDenominator); - bw.Write((short)mvarExtensionArea.GammaNumerator); - bw.Write((short)mvarExtensionArea.GammaDenominator); + bw.WriteInt16((short)ExtensionArea.PixelAspectRatioNumerator); + bw.WriteInt16((short)ExtensionArea.PixelAspectRatioDenominator); + bw.WriteInt16((short)ExtensionArea.GammaNumerator); + bw.WriteInt16((short)ExtensionArea.GammaDenominator); int extensionAreaColorCorrectionOffset = 0; - bw.Write(extensionAreaColorCorrectionOffset); + bw.WriteInt32(extensionAreaColorCorrectionOffset); int extensionAreaPostageStampOffset = 0; - bw.Write(extensionAreaPostageStampOffset); + bw.WriteInt32(extensionAreaPostageStampOffset); int extensionAreaScanLineOffset = 0; - bw.Write(extensionAreaScanLineOffset); - bw.Write((byte)mvarExtensionArea.AttributesType); + bw.WriteInt32(extensionAreaScanLineOffset); + bw.WriteByte((byte)ExtensionArea.AttributesType); // load Scan Line Table from file if any + /* if (extensionAreaScanLineOffset > 0) { br.Accessor.Seek(extensionAreaScanLineOffset, SeekOrigin.Begin); @@ -1176,26 +1172,67 @@ namespace UniversalEditor.DataFormats.Multimedia.Picture.Targa mvarExtensionArea.ColorCorrectionTable.Add(Color.FromRGBA(a, r, g, b)); } } + */ } } #endregion #region Targa Footer { - if (mvarFormatVersion == 200) + if (FormatVersion == TargaFormatVersion.TrueVisionXFile) { int extensionAreaOffset = 0; - bw.Write(extensionAreaOffset); + bw.WriteInt32(extensionAreaOffset); int developerDirectoryOffset = 0; - bw.Write(developerDirectoryOffset); + bw.WriteInt32(developerDirectoryOffset); bw.WriteFixedLengthString("TRUEVISION-XFILE"); } } #endregion bw.Flush(); - */ + throw new NotImplementedException(); } + + private byte GetImageDescriptor(byte alphaChannelDepth, TargaFirstPixelDestination pixelOrigin) + { + TargaVerticalTransferOrder verticalTransferOrder = TargaVerticalTransferOrder.Unknown; + TargaHorizontalTransferOrder horizontalTransferOrder = TargaHorizontalTransferOrder.Unknown; + switch (PixelOrigin) + { + case TargaFirstPixelDestination.TopLeft: + { + verticalTransferOrder = TargaVerticalTransferOrder.TopToBottom; + horizontalTransferOrder = TargaHorizontalTransferOrder.LeftToRight; + break; + } + case TargaFirstPixelDestination.TopRight: + { + verticalTransferOrder = TargaVerticalTransferOrder.TopToBottom; + horizontalTransferOrder = TargaHorizontalTransferOrder.RightToLeft; + break; + } + case TargaFirstPixelDestination.BottomLeft: + { + verticalTransferOrder = TargaVerticalTransferOrder.BottomToTop; + horizontalTransferOrder = TargaHorizontalTransferOrder.LeftToRight; + break; + } + case TargaFirstPixelDestination.BottomRight: + { + verticalTransferOrder = TargaVerticalTransferOrder.BottomToTop; + horizontalTransferOrder = TargaHorizontalTransferOrder.RightToLeft; + break; + } + } + return GetImageDescriptor(alphaChannelDepth, verticalTransferOrder, horizontalTransferOrder); + } + private byte GetImageDescriptor(byte alphaChannelDepth, TargaVerticalTransferOrder verticalTransferOrder, TargaHorizontalTransferOrder horizontalTransferOrder) + { + byte ImageDescriptor = 0; + + return ImageDescriptor; + } } } diff --git a/Plugins/UniversalEditor.Plugins.Multimedia/UniversalEditor.Plugins.Multimedia.csproj b/Plugins/UniversalEditor.Plugins.Multimedia/UniversalEditor.Plugins.Multimedia.csproj index ff6965df..0b4d3d5a 100644 --- a/Plugins/UniversalEditor.Plugins.Multimedia/UniversalEditor.Plugins.Multimedia.csproj +++ b/Plugins/UniversalEditor.Plugins.Multimedia/UniversalEditor.Plugins.Multimedia.csproj @@ -340,6 +340,7 @@ + diff --git a/UniversalEditor.sln b/UniversalEditor.sln index 615efe89..2b5e1af1 100644 --- a/UniversalEditor.sln +++ b/UniversalEditor.sln @@ -207,6 +207,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UniversalEditor.Plugins.Blo EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UniversalEditor.Plugins.AutoSave", "Plugins\UniversalEditor.Plugins.AutoSave\UniversalEditor.Plugins.AutoSave.csproj", "{385AB5A6-3EB6-4DF6-A7BF-DF9FFE43F192}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UniversalEditor.Compiler", "Applications\UniversalEditor.Compiler\UniversalEditor.Compiler.csproj", "{5E639F63-97B0-4B34-8928-29A5A3C661F4}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -599,6 +601,10 @@ Global {385AB5A6-3EB6-4DF6-A7BF-DF9FFE43F192}.Debug|Any CPU.Build.0 = Debug|Any CPU {385AB5A6-3EB6-4DF6-A7BF-DF9FFE43F192}.Release|Any CPU.ActiveCfg = Release|Any CPU {385AB5A6-3EB6-4DF6-A7BF-DF9FFE43F192}.Release|Any CPU.Build.0 = Release|Any CPU + {5E639F63-97B0-4B34-8928-29A5A3C661F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5E639F63-97B0-4B34-8928-29A5A3C661F4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5E639F63-97B0-4B34-8928-29A5A3C661F4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5E639F63-97B0-4B34-8928-29A5A3C661F4}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution {6F0AB1AF-E1A1-4D19-B19C-05BBB15C94B2} = {05D15661-E684-4EC9-8FBD-C014BA433CC5} @@ -697,6 +703,7 @@ Global {C54F6BCD-60CD-4603-B0C9-CD0864455CB1} = {2ED32D16-6C06-4450-909A-40D32DA67FB4} {B6E600F5-E5BC-4DC2-8B41-7B11EB0A11B3} = {7B535D74-5496-4802-B809-89ED88274A91} {385AB5A6-3EB6-4DF6-A7BF-DF9FFE43F192} = {2ED32D16-6C06-4450-909A-40D32DA67FB4} + {5E639F63-97B0-4B34-8928-29A5A3C661F4} = {05D15661-E684-4EC9-8FBD-C014BA433CC5} EndGlobalSection GlobalSection(MonoDevelopProperties) = preSolution Policies = $0