internal static GlowBitmap Create(GlowDrawingContext drawingContext, GlowBitmapPart bitmapPart, Color color) { var orCreateAlphaMask = GetOrCreateAlphaMask(bitmapPart); var glowBitmap = new GlowBitmap( drawingContext.ScreenDC, orCreateAlphaMask.Width, orCreateAlphaMask.Height); for (var i = 0; i < orCreateAlphaMask.DIBits.Length; i += BytesPerPixelBgra32) { var b = orCreateAlphaMask.DIBits[i + 3]; var val = PremultiplyAlpha(color.R, b); var val2 = PremultiplyAlpha(color.G, b); var val3 = PremultiplyAlpha(color.B, b); Marshal.WriteByte(glowBitmap.DIBits, i, val3); Marshal.WriteByte(glowBitmap.DIBits, i + 1, val2); Marshal.WriteByte(glowBitmap.DIBits, i + 2, val); Marshal.WriteByte(glowBitmap.DIBits, i + 3, b); } return(glowBitmap); }
internal GlowDrawingContext(int width, int height) { ScreenDC = InteropMethods.GetDC(IntPtr.Zero); if (ScreenDC == IntPtr.Zero) { return; } WindowDC = InteropMethods.CreateCompatibleDC(ScreenDC); if (WindowDC == IntPtr.Zero) { return; } BackgroundDC = InteropMethods.CreateCompatibleDC(ScreenDC); if (BackgroundDC == IntPtr.Zero) { return; } Blend.BlendOp = 0; Blend.BlendFlags = 0; Blend.SourceConstantAlpha = 255; Blend.AlphaFormat = 1; _windowBitmap = new GlowBitmap(ScreenDC, width, height); InteropMethods.SelectObject(WindowDC, _windowBitmap.Handle); }