Esempio n. 1
0
        internal static Avalonia.Media.Imaging.WriteableBitmap GetHB(double S)
        {
            Avalonia.Media.Imaging.WriteableBitmap bmp = new Avalonia.Media.Imaging.WriteableBitmap(new PixelSize(256, 256), new Vector(96, 96), Avalonia.Platform.PixelFormat.Rgba8888, Avalonia.Platform.AlphaFormat.Unpremul);

            using (var fb = bmp.Lock())
            {
                unsafe
                {
                    byte *rgbaValues = (byte *)fb.Address;
                    for (int x = 0; x < 256; x++)
                    {
                        for (int y = 0; y < 256; y++)
                        {
                            HSVToRGB(x / 255.0, S, 1 - y / 255.0,
                                     out rgbaValues[x * 4 + y * 256 * 4],
                                     out rgbaValues[x * 4 + y * 256 * 4 + 1],
                                     out rgbaValues[x * 4 + y * 256 * 4 + 2]
                                     );

                            rgbaValues[x * 4 + y * 256 * 4 + 3] = 255;
                        }
                    }
                }
            }
            return(bmp);
        }
Esempio n. 2
0
 public void DisposeAll()
 {
     if (AvaloniaBitmap != null)
     {
         AvaloniaBitmap.Dispose();
         AvaloniaBitmap = null;
     }
     for (int i = 0; i < SystemBitmaps.Length; ++i)
     {
         if (SystemBitmaps[i] != null)
         {
             SystemBitmaps[i].Dispose();
             SystemBitmaps[i] = null;
         }
     }
 }
Esempio n. 3
0
        public static Avalonia.Media.Imaging.WriteableBitmap GetG(byte R, byte B)
        {
            Avalonia.Media.Imaging.WriteableBitmap bmp = new Avalonia.Media.Imaging.WriteableBitmap(new PixelSize(1, 256), new Vector(96, 96), Avalonia.Platform.PixelFormat.Rgba8888, Avalonia.Platform.AlphaFormat.Unpremul);

            using (var fb = bmp.Lock())
            {
                unsafe
                {
                    byte *rgbaValues = (byte *)fb.Address;
                    for (int y = 0; y < 256; y++)
                    {
                        rgbaValues[y * 4]     = R;
                        rgbaValues[y * 4 + 1] = (byte)(255 - y);
                        rgbaValues[y * 4 + 2] = B;

                        rgbaValues[y * 4 + 3] = 255;
                    }
                }
            }
            return(bmp);
        }
Esempio n. 4
0
        public static bool EnsureBitmapSize(ref AI.WriteableBitmap avaloniaBitmap, PixelSize size)
        {
            bool invalid = avaloniaBitmap != null && avaloniaBitmap.PixelSize != size;
            bool create  = avaloniaBitmap == null || invalid;

            if (invalid)
            {
                avaloniaBitmap.Dispose();
                avaloniaBitmap = null;
            }
            if (create)
            {
                avaloniaBitmap = new AI.WriteableBitmap(
                    size,
                    new Vector(1, 1),                      // DPI scale ?
                    //Avalonia.Platform.PixelFormat.Rgba8888
                    Avalonia.Platform.PixelFormat.Bgra8888 // seems faster for me! // like System.Drawing.Imaging.PixelFormat.Format32bppArgb
                    );
            }
            return(create);
        }
Esempio n. 5
0
        internal static Avalonia.Media.Imaging.WriteableBitmap GetHS(double B)
        {
            Avalonia.Media.Imaging.WriteableBitmap bmp = new Avalonia.Media.Imaging.WriteableBitmap(new PixelSize(256, 256), new Vector(96, 96), Avalonia.Platform.PixelFormat.Rgba8888, Avalonia.Platform.AlphaFormat.Unpremul);

            using (var fb = bmp.Lock())
            {
                unsafe
                {
                    byte *rgbaValues = (byte *)fb.Address;
                    for (int x = 0; x < 256; x++)
                    {
                        for (int y = 0; y < 256; y++)
                        {
                            double r = Math.Sqrt((x - 128) * (x - 128) + (y - 128) * (y - 128));

                            if (r <= 130)
                            {
                                double theta = Math.Atan2(y - 128, x - 128) / Math.PI;

                                HSVToRGB(theta * 0.5, Math.Min(1, r / 128.0), B,
                                         out rgbaValues[x * 4 + y * 256 * 4],
                                         out rgbaValues[x * 4 + y * 256 * 4 + 1],
                                         out rgbaValues[x * 4 + y * 256 * 4 + 2]
                                         );

                                if (r >= 126)
                                {
                                    rgbaValues[x * 4 + y * 256 * 4 + 3] = (byte)Math.Max(0, Math.Min(255, 32640 - 255 * r));
                                }
                                else
                                {
                                    rgbaValues[x * 4 + y * 256 * 4 + 3] = 255;
                                }
                            }
                        }
                    }
                }
            }
            return(bmp);
        }
Esempio n. 6
0
        internal static WriteableBitmap GetShiftedS(WriteableBitmap originalS, double vRadius, bool front)
        {
            int delta = (int)Math.Round(vRadius * 256 / 56);

            int[] shifts = new int[128];

            for (int i = 0; i < 128; i++)
            {
                double cos = (63.5 - i) / 63.5;
                shifts[i] = (int)Math.Round(Math.Sqrt(1 - cos * cos) * delta);
            }

            Avalonia.Media.Imaging.WriteableBitmap bmp = new Avalonia.Media.Imaging.WriteableBitmap(new PixelSize(128, 256 + delta), new Vector(96, 96), Avalonia.Platform.PixelFormat.Rgba8888, Avalonia.Platform.AlphaFormat.Unpremul);

            if (front)
            {
                using (var fb = bmp.Lock())
                {
                    using (var fb2 = originalS.Lock())
                    {
                        unsafe
                        {
                            byte *rgbaValues     = (byte *)fb.Address;
                            byte *rgbaValuesOrig = (byte *)fb2.Address;
                            for (int x = 0; x < 128; x++)
                            {
                                for (int y = shifts[x]; y < 256 + shifts[x]; y++)
                                {
                                    rgbaValues[x * 4 + y * 128 * 4]     = rgbaValuesOrig[(127 - x) * 4 + (y - shifts[x]) * 256 * 4];
                                    rgbaValues[x * 4 + y * 128 * 4 + 1] = rgbaValuesOrig[(127 - x) * 4 + (y - shifts[x]) * 256 * 4 + 1];
                                    rgbaValues[x * 4 + y * 128 * 4 + 2] = rgbaValuesOrig[(127 - x) * 4 + (y - shifts[x]) * 256 * 4 + 2];
                                    rgbaValues[x * 4 + y * 128 * 4 + 3] = 255;
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                using (var fb = bmp.Lock())
                {
                    using (var fb2 = originalS.Lock())
                    {
                        unsafe
                        {
                            byte *rgbaValues     = (byte *)fb.Address;
                            byte *rgbaValuesOrig = (byte *)fb2.Address;
                            for (int x = 0; x < 128; x++)
                            {
                                for (int y = delta - shifts[x]; y < 256 + delta - shifts[x]; y++)
                                {
                                    rgbaValues[x * 4 + y * 128 * 4]     = rgbaValuesOrig[(128 + x) * 4 + (y - delta + shifts[x]) * 256 * 4];
                                    rgbaValues[x * 4 + y * 128 * 4 + 1] = rgbaValuesOrig[(128 + x) * 4 + (y - delta + shifts[x]) * 256 * 4 + 1];
                                    rgbaValues[x * 4 + y * 128 * 4 + 2] = rgbaValuesOrig[(128 + x) * 4 + (y - delta + shifts[x]) * 256 * 4 + 2];
                                    rgbaValues[x * 4 + y * 128 * 4 + 3] = 255;
                                }
                            }
                        }
                    }
                }
            }

            return(bmp);
        }