| File: System\Drawing\IIconExtensions.cs | Web Access |
| Project: src\winforms\src\System.Private.Windows.GdiPlus\System.Private.Windows.GdiPlus.csproj (System.Private.Windows.GdiPlus) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Runtime.InteropServices; using Windows.Win32; using Windows.Win32.System.Ole; namespace System.Drawing; public static unsafe class IIconExtensions { internal static unsafe PICTDESC CreatePICTDESC(this IIcon icon, bool copy) { PICTDESC desc = new() { picType = PICTYPE.PICTYPE_ICON }; Size size = icon.Size; desc.Anonymous.icon.hicon = copy ? (HICON)PInvokeCore.CopyImage( (HANDLE)icon.Handle, GDI_IMAGE_TYPE.IMAGE_ICON, size.Width, size.Height, IMAGE_FLAGS.LR_DEFAULTCOLOR).Value : icon.Handle; GC.KeepAlive(icon); return desc; } internal static object CreateIPictureRCW(this IIcon icon, bool copy) { // GetObjectForIUnknown increments the ref count so we need to dispose. using ComScope<IPicture> picture = icon.CreateIPicture(copy); return Marshal.GetObjectForIUnknown(picture); } internal static ComScope<IPicture> CreateIPicture(this IIcon icon, bool copy) { PICTDESC desc = icon.CreatePICTDESC(copy); ComScope<IPicture> picture = new(null); PInvokeCore.OleCreatePictureIndirect(&desc, IID.Get<IPicture>(), fOwn: copy, picture).ThrowOnFailure(); return picture; } }