internal static Color_ FromBGR(int bgr) { Color_ result = Color_.FromArgb(0xFF, (bgr & 0xFF), ((bgr >> 8) & 0xFF), ((bgr >> 16) & 0xFF)); Color_ known = KnownColors.FindColorMatch(result); return((known.IsEmpty) ? result : known); }
// methods public Color_ GetPixel(int x, int y) { int argb; Status s = GDIPlus.GdipBitmapGetPixel(nativeObject, x, y, out argb); GDIPlus.CheckStatus(s); return(Color_.FromArgb(argb)); }
internal Bitmap BuildBitmapOnWin32() { Bitmap bmp; if (imageData == null) { return(new Bitmap(32, 32)); } IconImage ii = (IconImage)imageData [id]; BitmapInfoHeader bih = ii.iconHeader; int biHeight = bih.biHeight / 2; int ncolors = (int)bih.biClrUsed; if ((ncolors == 0) && (bih.biBitCount < 24)) { ncolors = (int)(1 << bih.biBitCount); } switch (bih.biBitCount) { case 1: bmp = new Bitmap(bih.biWidth, biHeight, PixelFormat.Format1bppIndexed); break; case 4: bmp = new Bitmap(bih.biWidth, biHeight, PixelFormat.Format4bppIndexed); break; case 8: bmp = new Bitmap(bih.biWidth, biHeight, PixelFormat.Format8bppIndexed); break; case 24: bmp = new Bitmap(bih.biWidth, biHeight, PixelFormat.Format24bppRgb); break; case 32: bmp = new Bitmap(bih.biWidth, biHeight, PixelFormat.Format32bppArgb); break; default: string msg = Locale.GetText("Unexpected number of bits: {0}", bih.biBitCount); throw new Exception(msg); } if (bih.biBitCount < 24) { ColorPalette pal = bmp.Palette; // Managed palette for (int i = 0; i < ii.iconColors.Length; i++) { pal.Entries[i] = Color_.FromArgb((int)ii.iconColors[i] | unchecked ((int)0xff000000)); } bmp.Palette = pal; } int bytesPerLine = (int)((((bih.biWidth * bih.biBitCount) + 31) & ~31) >> 3); BitmapData bits = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, bmp.PixelFormat); for (int y = 0; y < biHeight; y++) { Marshal.Copy(ii.iconXOR, bytesPerLine * y, (IntPtr)(bits.Scan0.ToInt64() + bits.Stride * (biHeight - 1 - y)), bytesPerLine); } bmp.UnlockBits(bits); bmp = new Bitmap(bmp); // This makes a 32bpp image out of an indexed one // Apply the mask to make properly transparent bytesPerLine = (int)((((bih.biWidth) + 31) & ~31) >> 3); for (int y = 0; y < biHeight; y++) { for (int x = 0; x < bih.biWidth / 8; x++) { for (int bit = 7; bit >= 0; bit--) { if (((ii.iconAND[y * bytesPerLine + x] >> bit) & 1) != 0) { bmp.SetPixel(x * 8 + 7 - bit, biHeight - y - 1, Color_.Transparent); } } } } return(bmp); }
internal static Color_ StaticConvertFromString(ITypeDescriptorContext context, string s, CultureInfo culture) { if (culture == null) { culture = CultureInfo.InvariantCulture; } s = s.Trim(); if (s.Length == 0) { return(Color_.Empty); } // Try to process both NamedColor and SystemColors from the KnownColor enumeration if (Char.IsLetter(s [0])) { KnownColor kc; try { kc = (KnownColor)Enum.Parse(typeof(KnownColor), s, true); } catch (Exception e) { // whatever happens MS throws an basic Exception string msg = Locale.GetText("Invalid color name '{0}'.", s); throw new Exception(msg, new FormatException(msg, e)); } return(KnownColors.FromKnownColor(kc)); } String numSeparator = culture.TextInfo.ListSeparator; Color_ result = Color_.Empty; if (s.IndexOf(numSeparator) == -1) { bool sharp = (s[0] == '#'); int start = sharp ? 1 : 0; bool hex = false; // deal with #hex, 0xhex and #0xhex if ((s.Length > start + 1) && (s[start] == '0')) { hex = ((s[start + 1] == 'x') || (s[start + 1] == 'X')); if (hex) { start += 2; } } if (sharp || hex) { s = s.Substring(start); int argb; try { argb = Int32.Parse(s, NumberStyles.HexNumber); } catch (Exception e) { // whatever happens MS throws an basic Exception string msg = Locale.GetText("Invalid Int32 value '{0}'.", s); throw new Exception(msg, e); } // note that the default alpha value for a 6 hex digit (i.e. when none are present) is // 0xFF while shorter string defaults to 0xFF - unless both # an 0x are specified if ((s.Length < 6) || ((s.Length == 6) && sharp && hex)) { argb &= 0x00FFFFFF; } else if ((argb >> 24) == 0) { argb |= unchecked ((int)0xFF000000); } result = Color_.FromArgb(argb); } } if (result.IsEmpty) { Int32Converter converter = new Int32Converter(); String [] components = s.Split(numSeparator.ToCharArray()); // MS seems to convert the indivual component to int before // checking the number of components int[] numComponents = new int[components.Length]; for (int i = 0; i < numComponents.Length; i++) { numComponents[i] = (int)converter.ConvertFrom(context, culture, components[i]); } switch (components.Length) { case 1: result = Color_.FromArgb(numComponents[0]); break; case 3: result = Color_.FromArgb(numComponents[0], numComponents[1], numComponents[2]); break; case 4: result = Color_.FromArgb(numComponents[0], numComponents[1], numComponents[2], numComponents[3]); break; default: throw new ArgumentException(s + " is not a valid color value."); } } if (!result.IsEmpty) { // Look for a named or system color with those values Color_ known = KnownColors.FindColorMatch(result); if (!known.IsEmpty) { return(known); } } return(result); }