示例#1
0
        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);
        }
示例#2
0
        // 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));
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }