// ClassicalSharp copyright 2014-2016 UnknownShadow200 | Licensed under MIT using System; using System.Drawing; using ClassicalSharp; namespace Launcher.Drawing { public unsafe static class Drawer2DExt { public static void Clear(FastBitmap bmp, Rectangle rect, FastColour col) { int x, y, width, height; if (!ClampCoords(bmp, rect, out x, out y, out width, out height)) return; int pixel = col.ToArgb(); for (int yy = 0; yy < height; yy++) { int* row = bmp.GetRowPtr(y + yy); for (int xx = 0; xx < width; xx++) row[x + xx] = pixel; } } public static bool ClampCoords(FastBitmap bmp, Rectangle rect, out int x, out int y, out int width, out int height) { width = rect.Width; height = rect.Height; x = rect.X; y = rect.Y; if (x >= bmp.Width || y >= bmp.Height) return false; if (x < 0) { width += x; x = 0; } if (y < 0) { height += y; y = 0; } width = Math.Min(x + width, bmp.Width) - x; height = Math.Min(y + height, bmp.Height) - y; return width > 0 && height > 0; } public static void DrawClippedText(ref DrawTextArgs args, IDrawer2D drawer, int x, int y, int maxWidth) { Size size = drawer.MeasureSize(ref args); // No clipping necessary if (size.Width <= maxWidth) { drawer.DrawText(ref args, x, y); return; } DrawTextArgs copy = args; copy.SkipPartsCheck = true; char[] chars = new char[args.Text.Length + 2]; for (int i = 0; i < args.Text.Length; i++) chars[i] = args.Text[i]; chars[args.Text.Length] = '.'; chars[args.Text.Length + 1] = '.'; for (int len = args.Text.Length; len > 0; len--) { chars[len] = '.'; if (chars[len - 1] == ' ') continue; copy.Text = new string(chars, 0, len + 2); size = drawer.MeasureSize(ref copy); if (size.Width > maxWidth) continue; drawer.DrawText(ref copy, x, y); return; } } } }