using System; using System.Runtime.InteropServices; namespace MAME.Core.AxiBitmap { [StructLayout(LayoutKind.Explicit)] public struct AxiColor { [FieldOffset(0)] public int sdColor; [FieldOffset(0)] public byte r; [FieldOffset(1)] public byte g; [FieldOffset(2)] public byte b; [FieldOffset(3)] public byte a; public AxiColor(byte _r, byte _g, byte _b) { r = g = b = a = 0; sdColor = 0; r = _r; g = _g; b = _b; a = byte.MaxValue; } public AxiColor(byte _r, byte _g, byte _b, byte _a) { r = g = b = a = 0; sdColor = 0; r = _r; g = _g; b = _b; a = _a; } public static AxiColor FromArgb(int argb) { return new AxiColor { sdColor = argb }; } public override string ToString() { return String.Format("{0:X8}", sdColor); } public static int ToArgb(AxiColor color) { return color.sdColor; } #region 颜色定义 public static AxiColor Transparent => new AxiColor(0, 0, 0, 0); public static AxiColor AliceBlue => new AxiColor(240, 248, 255); public static AxiColor AntiqueWhite => new AxiColor(250, 235, 215); public static AxiColor Aqua => new AxiColor(0, 255, 255); public static AxiColor Aquamarine => new AxiColor(127, 255, 212); public static AxiColor Azure => new AxiColor(240, 255, 255); public static AxiColor Beige => new AxiColor(245, 245, 220); public static AxiColor Bisque => new AxiColor(255, 228, 196); public static AxiColor Black => new AxiColor(0, 0, 0); public static AxiColor BlanchedAlmond => new AxiColor(255, 235, 205); public static AxiColor Blue => new AxiColor(0, 0, 255); public static AxiColor BlueViolet => new AxiColor(138, 43, 226); public static AxiColor Brown => new AxiColor(165, 42, 42); public static AxiColor BurlyWood => new AxiColor(222, 184, 135); public static AxiColor CadetBlue => new AxiColor(95, 158, 160); public static AxiColor Chartreuse => new AxiColor(127, 255, 0); public static AxiColor Chocolate => new AxiColor(210, 105, 30); public static AxiColor Coral => new AxiColor(255, 127, 80); public static AxiColor CornflowerBlue => new AxiColor(100, 149, 237); public static AxiColor Cornsilk => new AxiColor(255, 248, 220); public static AxiColor Crimson => new AxiColor(220, 20, 60); public static AxiColor Cyan => new AxiColor(0, 255, 255); public static AxiColor DarkBlue => new AxiColor(0, 0, 139); public static AxiColor DarkCyan => new AxiColor(0, 139, 139); public static AxiColor DarkGoldenrod => new AxiColor(184, 134, 11); public static AxiColor DarkGray => new AxiColor(169, 169, 169); public static AxiColor DarkGreen => new AxiColor(0, 100, 0); public static AxiColor DarkKhaki => new AxiColor(189, 183, 107); public static AxiColor DarkMagenta => new AxiColor(139, 0, 139); public static AxiColor DarkOliveGreen => new AxiColor(85, 107, 47); public static AxiColor DarkOrange => new AxiColor(255, 140, 0); public static AxiColor DarkOrchid => new AxiColor(153, 50, 204); public static AxiColor DarkRed => new AxiColor(139, 0, 0); public static AxiColor DarkSalmon => new AxiColor(233, 150, 122); public static AxiColor DarkSeaGreen => new AxiColor(143, 188, 143); public static AxiColor DarkSlateBlue => new AxiColor(72, 61, 139); public static AxiColor DarkSlateGray => new AxiColor(47, 79, 79); public static AxiColor DarkViolet => new AxiColor(148, 0, 211); public static AxiColor DeepPink => new AxiColor(255, 20, 147); public static AxiColor DeepSkyBlue => new AxiColor(0, 191, 255); public static AxiColor DimGray => new AxiColor(105, 105, 105); public static AxiColor DodgerBlue => new AxiColor(30, 144, 255); public static AxiColor FireBrick => new AxiColor(178, 34, 34); public static AxiColor FloralWhite => new AxiColor(255, 250, 240); public static AxiColor ForestGreen => new AxiColor(34, 139, 34); public static AxiColor Fuchsia => new AxiColor(255, 0, 255); public static AxiColor Gainsboro => new AxiColor(220, 220, 220); public static AxiColor GhostWhite => new AxiColor(248, 248, 255); public static AxiColor Gold => new AxiColor(255, 215, 0); public static AxiColor Goldenrod => new AxiColor(218, 165, 32); public static AxiColor Gray => new AxiColor(128, 128, 128); public static AxiColor Green => new AxiColor(0, 128, 0); public static AxiColor GreenYellow => new AxiColor(173, 255, 47); public static AxiColor Honeydew => new AxiColor(240, 255, 240); public static AxiColor HotPink => new AxiColor(255, 105, 180); public static AxiColor IndianRed => new AxiColor(205, 92, 92); public static AxiColor Indigo => new AxiColor(75, 0, 130); public static AxiColor Ivory => new AxiColor(255, 255, 240); public static AxiColor Khaki => new AxiColor(240, 230, 140); public static AxiColor Lavender => new AxiColor(230, 230, 250); public static AxiColor LavenderBlush => new AxiColor(255, 240, 245); public static AxiColor LawnGreen => new AxiColor(124, 252, 0); public static AxiColor LemonChiffon => new AxiColor(255, 250, 205); public static AxiColor LightBlue => new AxiColor(173, 216, 230); public static AxiColor LightCoral => new AxiColor(240, 128, 128); public static AxiColor LightCyan => new AxiColor(224, 255, 255); public static AxiColor LightGoldenrodYellow => new AxiColor(250, 250, 210); public static AxiColor LightGray => new AxiColor(211, 211, 211); public static AxiColor LightGreen => new AxiColor(144, 238, 144); public static AxiColor LightPink => new AxiColor(255, 182, 193); public static AxiColor LightSalmon => new AxiColor(255, 160, 122); public static AxiColor LightSeaGreen => new AxiColor(32, 178, 170); public static AxiColor LightSkyBlue => new AxiColor(135, 206, 250); public static AxiColor LightSlateGray => new AxiColor(119, 136, 153); public static AxiColor LightYellow => new AxiColor(255, 255, 224); public static AxiColor Lime => new AxiColor(0, 255, 0); public static AxiColor LimeGreen => new AxiColor(50, 205, 50); public static AxiColor Linen => new AxiColor(250, 240, 230); public static AxiColor Magenta => new AxiColor(255, 0, 255); public static AxiColor Maroon => new AxiColor(176, 48, 96); public static AxiColor MediumAquamarine => new AxiColor(102, 205, 170); public static AxiColor MediumBlue => new AxiColor(0, 0, 205); public static AxiColor MediumOrchid => new AxiColor(186, 85, 211); public static AxiColor MediumPurple => new AxiColor(147, 112, 219); public static AxiColor MediumSeaGreen => new AxiColor(60, 179, 113); public static AxiColor MediumSlateBlue => new AxiColor(123, 104, 238); public static AxiColor MediumSpringGreen => new AxiColor(0, 250, 154); public static AxiColor MediumTurquoise => new AxiColor(72, 209, 204); public static AxiColor MediumVioletRed => new AxiColor(199, 21, 133); public static AxiColor MidnightBlue => new AxiColor(25, 25, 112); public static AxiColor MintCream => new AxiColor(245, 255, 250); public static AxiColor MistyRose => new AxiColor(255, 228, 225); public static AxiColor Moccasin => new AxiColor(255, 228, 181); public static AxiColor NavajoWhite => new AxiColor(255, 222, 173); public static AxiColor Navy => new AxiColor(0, 0, 128); public static AxiColor OldLace => new AxiColor(253, 245, 230); public static AxiColor Olive => new AxiColor(128, 128, 0); public static AxiColor OliveDrab => new AxiColor(107, 142, 35); public static AxiColor Orange => new AxiColor(255, 165, 0); public static AxiColor OrangeRed => new AxiColor(255, 69, 0); public static AxiColor Orchid => new AxiColor(218, 112, 214); public static AxiColor PaleGoldenrod => new AxiColor(238, 232, 170); public static AxiColor PaleGreen => new AxiColor(152, 251, 152); public static AxiColor PaleTurquoise => new AxiColor(175, 238, 238); public static AxiColor PaleVioletRed => new AxiColor(219, 112, 147); public static AxiColor PapayaWhip => new AxiColor(255, 239, 213); public static AxiColor PeachPuff => new AxiColor(255, 218, 185); public static AxiColor Peru => new AxiColor(205, 133, 63); public static AxiColor Pink => new AxiColor(255, 192, 203); public static AxiColor Plum => new AxiColor(221, 160, 221); public static AxiColor PowderBlue => new AxiColor(176, 224, 230); public static AxiColor Purple => new AxiColor(160, 32, 240); public static AxiColor Red => new AxiColor(255, 0, 0); public static AxiColor RosyBrown => new AxiColor(188, 143, 143); public static AxiColor RoyalBlue => new AxiColor(65, 105, 225); public static AxiColor SaddleBrown => new AxiColor(139, 69, 19); public static AxiColor Salmon => new AxiColor(250, 128, 114); public static AxiColor SandyBrown => new AxiColor(244, 164, 96); public static AxiColor SeaGreen => new AxiColor(46, 139, 87); public static AxiColor SeaShell => new AxiColor(255, 245, 238); public static AxiColor Sienna => new AxiColor(160, 82, 45); public static AxiColor Silver => new AxiColor(192, 192, 192); public static AxiColor SkyBlue => new AxiColor(135, 206, 235); public static AxiColor SlateBlue => new AxiColor(106, 90, 205); public static AxiColor SlateGray => new AxiColor(112, 128, 144); public static AxiColor Snow => new AxiColor(255, 250, 250); public static AxiColor SpringGreen => new AxiColor(0, 255, 127); public static AxiColor SteelBlue => new AxiColor(70, 130, 180); public static AxiColor Tan => new AxiColor(210, 180, 140); public static AxiColor Teal => new AxiColor(0, 128, 128); public static AxiColor Thistle => new AxiColor(216, 191, 216); public static AxiColor Tomato => new AxiColor(255, 99, 71); public static AxiColor Turquoise => new AxiColor(64, 224, 208); public static AxiColor Violet => new AxiColor(238, 130, 238); public static AxiColor Wheat => new AxiColor(245, 222, 179); public static AxiColor White => new AxiColor(255, 255, 255); public static AxiColor WhiteSmoke => new AxiColor(245, 245, 245); public static AxiColor Yellow => new AxiColor(255, 255, 0); public static AxiColor YellowGreen => new AxiColor(154, 205, 50); #endregion } public static class AxiBitmapEx { public static int ToArgb(this AxiColor color) { return (color.a << 24) | (color.r << 16) | (color.g << 8) | color.b; } //public static void CloneIntColorArr(int[] baseBitmap, int[] targetBitmap, int baseWidth, int baseHeight, Rectangle rect) //{ // // 检查矩形是否超出位图边界 // if (rect.X < 0 || rect.X + rect.Width > baseWidth || rect.Y < 0 || rect.Y + rect.Height > baseHeight) // { // throw new ArgumentException("Rectangle is out of bitmap bounds."); // } // int baseStartIndex = rect.Y * baseWidth + rect.X; // int targetStartIndex = rect.Y * rect.Width; // for (int y = 0; y < rect.Height; y++) // { // // 注意这里使用了rect.Width作为要拷贝的元素数量,而不是baseWidth // Buffer.BlockCopy(baseBitmap, baseStartIndex + y * baseWidth, targetBitmap, targetStartIndex + y * rect.Width, rect.Width * sizeof(int)); // // 或者使用Array.Copy,但要注意类型的大小(在这里是int) // // Array.Copy(baseBitmap, baseStartIndex + y * baseWidth, targetBitmap, targetStartIndex + y * rect.Width, rect.Width); // } //} public static void CloneIntColorArr(int[] baseBitmap, int[] targetBitmap, int Width, int Height, Rectangle rect) { // 检查矩形是否超出位图边界 if (rect.X < 0 || rect.Right > Width || rect.Y < 0 || rect.Bottom > Height) { throw new ArgumentException("out of"); } int srcStartIndex = rect.Y * Width + rect.X; for (int y = 0; y < rect.Height; y++) { Array.Copy(baseBitmap, srcStartIndex + y * Width, targetBitmap, y * rect.Width, rect.Width); } } public struct Rectangle { public int X; public int Y; public int Width; public int Height; public Rectangle(int x, int y, int width, int height) { X = x; Y = y; Width = width; Height = height; } public int Right => X + Width; public int Bottom => Y + Height; public int Area { get { return Width * Height; } } public bool Contains(int pointX, int pointY) { return pointX >= X && pointX < X + Width && pointY >= Y && pointY < Y + Height; } } } }