diff --git a/exeinfogui/BeOS/PanelBeIcon.xeto b/exeinfogui/BeOS/PanelBeIcon.xeto new file mode 100644 index 0000000..ac9bf66 --- /dev/null +++ b/exeinfogui/BeOS/PanelBeIcon.xeto @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/exeinfogui/BeOS/PanelBeIcon.xeto.cs b/exeinfogui/BeOS/PanelBeIcon.xeto.cs new file mode 100644 index 0000000..bc6a1bf --- /dev/null +++ b/exeinfogui/BeOS/PanelBeIcon.xeto.cs @@ -0,0 +1,73 @@ +using System.Collections.Generic; +using System.Linq; +using Eto.Drawing; +using Eto.Forms; +using Eto.Serialization.Xaml; +using libexeinfo.BeOS; + +namespace exeinfogui.BeOS +{ + public class PanelBeIcon : Panel + { + ImageView imgIcon; + Label lblSize; + PanelHexDump panelHexDump; + Panel pnlPanel; + TextBox txtSize; + + public PanelBeIcon() + { + XamlReader.Load(this); + panelHexDump = new PanelHexDump(); + pnlPanel.Content = panelHexDump; + } + + public void Update(byte[] data, string type) + { + bool recognized = type == Consts.B_LARGE_ICON_TYPE || type == Consts.B_MINI_ICON_TYPE || + type == Consts.B_PNG_FORMAT; + + if(type == Consts.B_PNG_FORMAT) + { + Bitmap png = new Bitmap(data); + if(png.Width == 0 || png.Height == 0) + { + txtSize.Text = $"{png.Width}x{png.Height} pixels"; + imgIcon.Image = png; + + lblSize.Text = "Size"; + lblSize.Visible = true; + txtSize.Visible = true; + pnlPanel.Visible = false; + return; + } + + recognized = false; + } + + if(data == null || !recognized) + { + imgIcon.Image = null; + lblSize.Text = "No data"; + lblSize.Visible = false; + txtSize.Visible = false; + pnlPanel.Visible = false; + panelHexDump.Update(data); + return; + } + + int width = type == Consts.B_LARGE_ICON_TYPE ? 32 : 16; + int height = width; + + List pixels = data.Select(p => (int)Consts.ArgbSystemPalette[p]).ToList(); + + txtSize.Text = $"{width}x{height} pixels"; + imgIcon.Image = new Bitmap(width, height, PixelFormat.Format32bppRgba, pixels); + + lblSize.Text = "Size"; + lblSize.Visible = true; + txtSize.Visible = true; + pnlPanel.Visible = false; + } + } +} \ No newline at end of file diff --git a/exeinfogui/BeOS/TabBeResources.xeto.cs b/exeinfogui/BeOS/TabBeResources.xeto.cs index e9606cb..a53d723 100644 --- a/exeinfogui/BeOS/TabBeResources.xeto.cs +++ b/exeinfogui/BeOS/TabBeResources.xeto.cs @@ -40,6 +40,7 @@ namespace exeinfogui.BeOS PanelText panelText; Panel pnlResource; TreeGridView treeResources; + PanelBeIcon panelBeIcon; public TabBeResources() { @@ -54,6 +55,7 @@ namespace exeinfogui.BeOS panelHexDump = new PanelHexDump(); panelText = new PanelText(); + panelBeIcon = new PanelBeIcon(); } public void Update(IEnumerable resources) @@ -99,7 +101,12 @@ namespace exeinfogui.BeOS { case Consts.B_MIME_STRING_TYPE: pnlResource.Content = panelText; - panelText.Update(data, Encoding.UTF8); + panelText.Update(data, Encoding.ASCII); + break; + case Consts.B_LARGE_ICON_TYPE: + case Consts.B_MINI_ICON_TYPE: + pnlResource.Content = panelBeIcon; + panelBeIcon.Update(data, type); break; default: pnlResource.Content = panelHexDump;