public void Set_Icon_Small__Next(ContentControl control) { if (tool.Orientation != Orientation.Horizontal) { Output.Write("Can only cycle through icons when Tool is in a Horizontal orientation."); return; } currentSmallIcon = tool.Icon == null ? IconImage.SilkAccept : currentSmallIcon.NextValue<IconImage>(); tool.Icon = currentSmallIcon.ToImage(); }
/// <summary>Retrieves the path to the specified icon.</summary> /// <param name="helper">The HTML helper to extend.</param> /// <param name="icon">The icon.</param> /// <param name="greyscale">Flag indicating if the greyscale version should be retrieved.</param> public static string IconUrl(this HtmlHelper helper, IconImage icon, bool greyscale = false) { // Retrieve the folder. var iconName = icon.ToString(); string subPath = null; if (iconName.StartsWith("Silk")) { string greyscalePath = greyscale ? "/Greyscale" : null; subPath = string.Format("Silk{0}/{1}.png", greyscalePath, iconName); } if (subPath == null) throw new NotFoundException(string.Format("Cannot resolve URL to the icon '{0}'.", iconName)); // Create the complete URL. return string.Format("/{0}/Icons/{1}", Assets.AreaRegistration.Name, subPath); }
public unsafe override void Read(Stream stream, int resourceSize) { // Buffer a PNG image byte[] buffer = new byte[resourceSize]; stream.Read(buffer, 0, buffer.Length); MemoryStream ms = new MemoryStream(buffer); Bitmap pngBitmap = new Bitmap(ms); // Set XOR and AND Image IconImage iconImage = new IconImage(); iconImage.Set(pngBitmap, null, Color.Transparent); pngBitmap.Dispose(); //Transfer the data from the BMPEncoder to the PNGEncoder CopyFrom(iconImage.Encoder); }
/// <summary>Adds a button tool to the toolbar.</summary> /// <param name="toolbar">The toolbar to add to.</param> /// <param name="id">The unique identifier of the tool.</param> /// <param name="icon">The icon.</param> /// <param name="text">The text label.</param> /// <param name="orientation">The orientation of the label relative to the icon.</param> /// <param name="showDefaultBackground">Flag indicating whether the default background is rendered when the mouse is not over the tool.</param> /// <param name="toolTip">The tooltip</param> /// <param name="minWidth">The minimum width of the tool.</param> /// <param name="column">The index of the column the tool is in (0-based, zero by default).</param> /// <param name="row">The index of the row the tool is in (0-based, zero by default).</param> /// <param name="columnSpan">The number of rows the tool spans (1-based, one by default. Must be 1 or greater).</param> /// <param name="rowSpan">The number of columns the tool spans (1-based, one by default. Must be 1 or greater).</param> public static IButtonTool AddButton( this IToolBar toolbar, object id = null, IconImage icon = IconImage.SilkAccept, String text = null, Orientation orientation = Orientation.Horizontal, bool showDefaultBackground = false, string toolTip = null, int minWidth = 0, int? column = null, int? row = null, int? columnSpan = 1, int? rowSpan = 1) { return toolbar.AddButton( id, icon.ToImage(), text, orientation, showDefaultBackground, toolTip, minWidth, column, row, columnSpan, rowSpan); }
private void InitFromStreamWithSize (Stream stream, int width, int height) { //read the icon header if (stream == null || stream.Length == 0) throw new System.ArgumentException ("The argument 'stream' must be a picture that can be used as a Icon", "stream"); BinaryReader reader = new BinaryReader (stream); //iconDir = new IconDir (); iconDir.idReserved = reader.ReadUInt16(); if (iconDir.idReserved != 0) //must be 0 throw new System.ArgumentException ("Invalid Argument", "stream"); iconDir.idType = reader.ReadUInt16(); if (iconDir.idType != 1) //must be 1 throw new System.ArgumentException ("Invalid Argument", "stream"); ushort dirEntryCount = reader.ReadUInt16(); ArrayList entries = new ArrayList (dirEntryCount); bool sizeObtained = false; // now read in the IconDirEntry structures for (int i = 0; i < dirEntryCount; i++) { IconDirEntry ide; ide.width = reader.ReadByte (); ide.height = reader.ReadByte (); ide.colorCount = reader.ReadByte (); ide.reserved = reader.ReadByte (); ide.planes = reader.ReadUInt16 (); ide.bitCount = reader.ReadUInt16 (); ide.bytesInRes = reader.ReadUInt32 (); ide.imageOffset = reader.ReadUInt32 (); #if false Console.WriteLine ("Entry: {0}", i); Console.WriteLine ("\tide.width: {0}", ide.width); Console.WriteLine ("\tide.height: {0}", ide.height); Console.WriteLine ("\tide.colorCount: {0}", ide.colorCount); Console.WriteLine ("\tide.reserved: {0}", ide.reserved); Console.WriteLine ("\tide.planes: {0}", ide.planes); Console.WriteLine ("\tide.bitCount: {0}", ide.bitCount); Console.WriteLine ("\tide.bytesInRes: {0}", ide.bytesInRes); Console.WriteLine ("\tide.imageOffset: {0}", ide.imageOffset); #endif // 256x256 icons are decoded as 0x0 (width and height are encoded as BYTE) // and we ignore them just like MS does (at least up to fx 2.0) if ((ide.width == 0) && (ide.height == 0)) continue; int index = entries.Add (ide); //is this is the best fit?? if (!sizeObtained) { if ((ide.height == height) || (ide.width == width)) { this.id = (ushort) index; sizeObtained = true; this.iconSize.Height = ide.height; this.iconSize.Width = ide.width; } } } // Vista 256x256 icons points directly to a PNG bitmap dirEntryCount = (ushort) entries.Count; if (dirEntryCount == 0) throw new Win32Exception (0, "No valid icon entry were found."); iconDir.idCount = dirEntryCount; imageData = new IconImage [dirEntryCount]; iconDir.idEntries = new IconDirEntry [dirEntryCount]; entries.CopyTo (iconDir.idEntries); //if we havent found the best match, return the one with the //largest size. Is this approach correct?? if (!sizeObtained){ uint largestSize = 0; for (int j=0; j<dirEntryCount; j++){ if (iconDir.idEntries [j].bytesInRes >= largestSize) { largestSize = iconDir.idEntries [j].bytesInRes; this.id = (ushort) j; this.iconSize.Height = iconDir.idEntries [j].height; this.iconSize.Width = iconDir.idEntries [j].width; } } } //now read in the icon data for (int j = 0; j<dirEntryCount; j++) { IconImage iidata = new IconImage(); BitmapInfoHeader bih = new BitmapInfoHeader(); stream.Seek (iconDir.idEntries [j].imageOffset, SeekOrigin.Begin); byte [] buffer = new byte [iconDir.idEntries [j].bytesInRes]; stream.Read (buffer, 0, buffer.Length); BinaryReader bihReader = new BinaryReader (new MemoryStream(buffer)); bih.biSize = bihReader.ReadUInt32 (); bih.biWidth = bihReader.ReadInt32 (); bih.biHeight = bihReader.ReadInt32 (); bih.biPlanes = bihReader.ReadUInt16 (); bih.biBitCount = bihReader.ReadUInt16 (); bih.biCompression = bihReader.ReadUInt32 (); bih.biSizeImage = bihReader.ReadUInt32 (); bih.biXPelsPerMeter = bihReader.ReadInt32 (); bih.biYPelsPerMeter = bihReader.ReadInt32 (); bih.biClrUsed = bihReader.ReadUInt32 (); bih.biClrImportant = bihReader.ReadUInt32 (); #if false Console.WriteLine ("Entry: {0}", j); Console.WriteLine ("\tbih.biSize: {0}", bih.biSize); Console.WriteLine ("\tbih.biWidth: {0}", bih.biWidth); Console.WriteLine ("\tbih.biHeight: {0}", bih.biHeight); Console.WriteLine ("\tbih.biPlanes: {0}", bih.biPlanes); Console.WriteLine ("\tbih.biBitCount: {0}", bih.biBitCount); Console.WriteLine ("\tbih.biCompression: {0}", bih.biCompression); Console.WriteLine ("\tbih.biSizeImage: {0}", bih.biSizeImage); Console.WriteLine ("\tbih.biXPelsPerMeter: {0}", bih.biXPelsPerMeter); Console.WriteLine ("\tbih.biYPelsPerMeter: {0}", bih.biYPelsPerMeter); Console.WriteLine ("\tbih.biClrUsed: {0}", bih.biClrUsed); Console.WriteLine ("\tbih.biClrImportant: {0}", bih.biClrImportant); #endif iidata.iconHeader = bih; //Read the number of colors used and corresponding memory occupied by //color table. Fill this memory chunk into rgbquad[] int numColors; switch (bih.biBitCount){ case 1: numColors = 2; break; case 4: numColors = 16; break; case 8: numColors = 256; break; default: numColors = 0; break; } iidata.iconColors = new uint [numColors]; for (int i=0; i<numColors; i++) iidata.iconColors [i] = bihReader.ReadUInt32 (); //XOR mask is immediately after ColorTable and its size is //icon height* no. of bytes per line //icon height is half of BITMAPINFOHEADER.biHeight, since it contains //both XOR as well as AND mask bytes int iconHeight = bih.biHeight/2; //bytes per line should should be uint aligned int numBytesPerLine = ((((bih.biWidth * bih.biPlanes * bih.biBitCount)+ 31)>>5)<<2); //Determine the XOR array Size int xorSize = numBytesPerLine * iconHeight; iidata.iconXOR = new byte [xorSize]; int nread = bihReader.Read (iidata.iconXOR, 0, xorSize); if (nread != xorSize) { string msg = Locale.GetText ("{0} data length expected {1}, read {2}", "XOR", xorSize, nread); throw new ArgumentException (msg, "stream"); } //Determine the AND array size numBytesPerLine = (int)((((bih.biWidth) + 31) & ~31) >> 3); int andSize = numBytesPerLine * iconHeight; iidata.iconAND = new byte [andSize]; nread = bihReader.Read (iidata.iconAND, 0, andSize); if (nread != andSize) { string msg = Locale.GetText ("{0} data length expected {1}, read {2}", "AND", andSize, nread); throw new ArgumentException (msg, "stream"); } imageData [j] = iidata; bihReader.Close(); } reader.Close(); }
private void SaveBitmapAsIcon (BinaryWriter writer) { writer.Write ((ushort)0); // idReserved must be 0 writer.Write ((ushort)1); // idType must be 1 writer.Write ((ushort)1); // only one icon // when transformed into a bitmap only a single image exists IconDirEntry ide = new IconDirEntry (); ide.width = (byte) bitmap.Width; ide.height = (byte) bitmap.Height; ide.colorCount = 0; // 32 bbp == 0, for palette size ide.reserved = 0; // always 0 ide.planes = 0; ide.bitCount = 32; ide.imageOffset = 22; // 22 is the first icon position (for single icon files) BitmapInfoHeader bih = new BitmapInfoHeader (); bih.biSize = (uint) Marshal.SizeOf (typeof (BitmapInfoHeader)); bih.biWidth = bitmap.Width; bih.biHeight = 2 * bitmap.Height; // include both XOR and AND images bih.biPlanes = 1; bih.biBitCount = 32; bih.biCompression = 0; bih.biSizeImage = 0; bih.biXPelsPerMeter = 0; bih.biYPelsPerMeter = 0; bih.biClrUsed = 0; bih.biClrImportant = 0; IconImage ii = new IconImage (); ii.iconHeader = bih; ii.iconColors = new uint [0]; // no palette int xor_size = (((bih.biBitCount * bitmap.Width + 31) & ~31) >> 3) * bitmap.Height; ii.iconXOR = new byte [xor_size]; int p = 0; for (int y = bitmap.Height - 1; y >=0; y--) { for (int x = 0; x < bitmap.Width; x++) { Color c = bitmap.GetPixel (x, y); ii.iconXOR [p++] = c.B; ii.iconXOR [p++] = c.G; ii.iconXOR [p++] = c.R; ii.iconXOR [p++] = c.A; } } int and_line_size = (((Width + 31) & ~31) >> 3); // must be a multiple of 4 bytes int and_size = and_line_size * bitmap.Height; ii.iconAND = new byte [and_size]; ide.bytesInRes = (uint) (bih.biSize + xor_size + and_size); SaveIconDirEntry (writer, ide, UInt32.MaxValue); SaveIconImage (writer, ii); }
private void SaveIconImage (BinaryWriter writer, IconImage ii) { BitmapInfoHeader bih = ii.iconHeader; writer.Write (bih.biSize); writer.Write (bih.biWidth); writer.Write (bih.biHeight); writer.Write (bih.biPlanes); writer.Write (bih.biBitCount); writer.Write (bih.biCompression); writer.Write (bih.biSizeImage); writer.Write (bih.biXPelsPerMeter); writer.Write (bih.biYPelsPerMeter); writer.Write (bih.biClrUsed); writer.Write (bih.biClrImportant); //now write color table int colCount = ii.iconColors.Length; for (int j=0; j < colCount; j++) writer.Write (ii.iconColors [j]); //now write XOR Mask writer.Write (ii.iconXOR); //now write AND Mask writer.Write (ii.iconAND); }
public unsafe MultiIcon Load(Stream stream) { // LoadLibraryEx only can load files from File System, lets create a tmp file string tmpFile = null; IntPtr hLib = IntPtr.Zero; try { stream.Position = 0; // Find a tmp file where to dump the DLL stream, later we will remove this file tmpFile = Path.GetTempFileName(); FileStream fs = new FileStream(tmpFile, FileMode.Create, FileAccess.Write); byte[] buffer = new byte[stream.Length]; stream.Read(buffer, 0, buffer.Length); fs.Write(buffer, 0, buffer.Length); fs.Close(); hLib = Win32.LoadLibraryEx(tmpFile, IntPtr.Zero, LoadLibraryFlags.LOAD_LIBRARY_AS_DATAFILE); if (hLib == IntPtr.Zero) throw new InvalidFileException(); List<string> iconsIDs; lock (typeof(PEFormat)) { mIconsIDs = new List<string>(); bool bResult = Win32.EnumResourceNames(hLib, (IntPtr) ResourceType.RT_GROUP_ICON, new Win32.EnumResNameProc(EnumResNameProc), IntPtr.Zero); if (bResult == false) { // No Resources in this file } iconsIDs = new List<string>(mIconsIDs); } MultiIcon multiIcon = new MultiIcon(); for(int index=0; index<iconsIDs.Count; index++) { string id = iconsIDs[index]; IntPtr hRsrc = IntPtr.Zero; if (Win32.IS_INTRESOURCE(id)) hRsrc = Win32.FindResource(hLib, int.Parse(id), (IntPtr) ResourceType.RT_GROUP_ICON); else hRsrc = Win32.FindResource(hLib, id, (IntPtr) ResourceType.RT_GROUP_ICON); if (hRsrc == IntPtr.Zero) throw new InvalidFileException(); IntPtr hGlobal = Win32.LoadResource(hLib, hRsrc); if (hGlobal == IntPtr.Zero) throw new InvalidFileException(); MEMICONDIR* pDirectory = (MEMICONDIR*) Win32.LockResource(hGlobal); if (pDirectory->wCount != 0) { MEMICONDIRENTRY* pEntry = &(pDirectory->arEntries); SingleIcon singleIcon = new SingleIcon(id); for(int i=0;i<pDirectory->wCount; i++) { IntPtr hIconInfo = Win32.FindResource(hLib, (IntPtr) pEntry[i].wId, (IntPtr) ResourceType.RT_ICON); if (hIconInfo == IntPtr.Zero) throw new InvalidFileException(); IntPtr hIconRes = Win32.LoadResource(hLib, hIconInfo); if (hIconRes == IntPtr.Zero) throw new InvalidFileException(); IntPtr dibBits = Win32.LockResource(hIconRes); if (dibBits == IntPtr.Zero) throw new InvalidFileException(); buffer = new byte[Win32.SizeofResource(hLib, hIconInfo)]; Marshal.Copy(dibBits, buffer, 0, buffer.Length); MemoryStream ms = new MemoryStream(buffer); IconImage iconImage = new IconImage(ms, buffer.Length); singleIcon.Add(iconImage); } multiIcon.Add(singleIcon); } } // If everything went well then lets return the multiIcon. return multiIcon; } catch(Exception) { throw new InvalidFileException(); } finally { if (hLib != null) Win32.FreeLibrary(hLib); if (tmpFile != null) File.Delete(tmpFile); } }
private void InitFromStreamWithSize (Stream stream, int width, int height) { //read the icon header if (stream == null || stream.Length == 0) throw new System.ArgumentException ("The argument 'stream' must be a picture that can be used as a Icon", "stream"); BinaryReader reader = new BinaryReader (stream); //iconDir = new IconDir (); iconDir.idReserved = reader.ReadUInt16(); if (iconDir.idReserved != 0) //must be 0 throw new System.ArgumentException ("Invalid Argument", "stream"); iconDir.idType = reader.ReadUInt16(); if (iconDir.idType != 1) //must be 1 throw new System.ArgumentException ("Invalid Argument", "stream"); ushort dirEntryCount = reader.ReadUInt16(); iconDir.idCount = dirEntryCount; iconDir.idEntries = new IconDirEntry [dirEntryCount]; imageData = new IconImage [dirEntryCount]; bool sizeObtained = false; //now read in the IconDirEntry structures for (int i=0; i<dirEntryCount; i++){ IconDirEntry ide; ide.width = reader.ReadByte (); ide.height = reader.ReadByte (); ide.colorCount = reader.ReadByte (); ide.reserved = reader.ReadByte (); ide.planes = reader.ReadUInt16 (); ide.bitCount = reader.ReadUInt16 (); ide.bytesInRes = reader.ReadUInt32 (); ide.imageOffset = reader.ReadUInt32 (); iconDir.idEntries [i] = ide; //is this is the best fit?? if (!sizeObtained) if (ide.height==height && ide.width==width) { this.id = (ushort) i; sizeObtained = true; this.iconSize.Height = ide.height; this.iconSize.Width = ide.width; } } //if we havent found the best match, return the one with the //largest size. Is this approach correct?? if (!sizeObtained){ uint largestSize = 0; for (int j=0; j<dirEntryCount; j++){ if (iconDir.idEntries [j].bytesInRes >= largestSize) { largestSize = iconDir.idEntries [j].bytesInRes; this.id = (ushort) j; this.iconSize.Height = iconDir.idEntries [j].height; this.iconSize.Width = iconDir.idEntries [j].width; } } } //now read in the icon data for (int j = 0; j<dirEntryCount; j++) { IconImage iidata = new IconImage(); BitmapInfoHeader bih = new BitmapInfoHeader(); stream.Seek (iconDir.idEntries [j].imageOffset, SeekOrigin.Begin); byte [] buffer = new byte [iconDir.idEntries [j].bytesInRes]; stream.Read (buffer, 0, buffer.Length); BinaryReader bihReader = new BinaryReader (new MemoryStream(buffer)); bih.biSize = bihReader.ReadUInt32 (); bih.biWidth = bihReader.ReadInt32 (); bih.biHeight = bihReader.ReadInt32 (); bih.biPlanes = bihReader.ReadUInt16 (); bih.biBitCount = bihReader.ReadUInt16 (); bih.biCompression = bihReader.ReadUInt32 (); bih.biSizeImage = bihReader.ReadUInt32 (); bih.biXPelsPerMeter = bihReader.ReadInt32 (); bih.biYPelsPerMeter = bihReader.ReadInt32 (); bih.biClrUsed = bihReader.ReadUInt32 (); bih.biClrImportant = bihReader.ReadUInt32 (); iidata.iconHeader = bih; //Read the number of colors used and corresponding memory occupied by //color table. Fill this memory chunk into rgbquad[] int numColors; switch (bih.biBitCount){ case 1: numColors = 2; break; case 4: numColors = 16; break; case 8: numColors = 256; break; default: numColors = 0; break; } iidata.iconColors = new uint [numColors]; for (int i=0; i<numColors; i++) iidata.iconColors [i] = bihReader.ReadUInt32 (); //XOR mask is immediately after ColorTable and its size is //icon height* no. of bytes per line //icon height is half of BITMAPINFOHEADER.biHeight, since it contains //both XOR as well as AND mask bytes int iconHeight = bih.biHeight/2; //bytes per line should should be uint aligned int numBytesPerLine = ((((bih.biWidth * bih.biPlanes * bih.biBitCount)+ 31)>>5)<<2); //Determine the XOR array Size int xorSize = numBytesPerLine * iconHeight; iidata.iconXOR = new byte [xorSize]; for (int i=0; i<xorSize; i++) iidata.iconXOR[i] = bihReader.ReadByte(); //Determine the AND array size //For this i subtract the current position from the length. //ugly hack... int andSize = (int) (bihReader.BaseStream.Length - bihReader.BaseStream.Position); iidata.iconAND = new byte [andSize]; for (int i=0; i<andSize; i++) iidata.iconAND[i] = bihReader.ReadByte(); imageData [j] = iidata; bihReader.Close(); } reader.Close(); }