// конструктор класса public anEngine(int size_x, int size_y, int screen_w, int screen_h) { // создание кисти по умолчанию standartBrush = new anBrush(3, false); // при инициализации экземпляра класса сохраним настройки // размеров элементов и изображения в локальных переменных picture_size_x = size_x; picture_size_y = size_y; screen_width = screen_w; screen_height = screen_h; // полосы прокрутки у нас пока отсутствуют, поэтому просто обнулим значение переменных scroll_x = 0; scroll_y = 0; // добавим новый слой для работы, пока что он будет единственным Layers.Add(new anLayer(picture_size_x, picture_size_y)); // номер активного слоя - 0 ActiveLayerNom = 0; // и создадим стандартную кисть standartBrush = new anBrush(1, false); //standartBrush = new anBrush(); }
// установка кисти из файла public void SetBrushFromFile(string FileName) { standartBrush = new anBrush(FileName); }
// функция установки специальной кисти public void SetSpecialBrush(int Nom) { standartBrush = new anBrush(Nom, true); }
// функция установки стандартной кисти, предается только размер public void SetStandartBrush(int SizeB) { standartBrush = new anBrush(SizeB, false); }
// функция рисования // получает в качестве параметров кисть для рисования и координаты, // где сейчас необходимо перерисовать пиксели заданной кистью public void Draw(anBrush BR, int x, int y) { // определяем начальную позицию рисования int real_pos_draw_start_x = x - BR.myBrush.Width / 2; int real_pos_draw_start_y = y - BR.myBrush.Height / 2; // корректируем ее для невыхода за границы массива // проверка на отрицательные значения (граница "слова") if (real_pos_draw_start_x < 0) { real_pos_draw_start_x = 0; } if (real_pos_draw_start_y < 0) { real_pos_draw_start_y = 0; } // проверки на выход за границу "справа" int boundary_x = real_pos_draw_start_x + BR.myBrush.Width; int boundary_y = real_pos_draw_start_y + BR.myBrush.Height; if (boundary_x > Width) { boundary_x = Width; } if (boundary_y > Heigth) { boundary_y = Heigth; } // счетчик пройденных строк и столбцов массива, прдстваляющего собой маску кисти int count_x = 0, count_y = 0; // цикл по области с учетом смещения кисти и коорекции для невыхода за границы массива for (int ax = real_pos_draw_start_x; ax < boundary_x; ax++, count_x++) { count_y = 0; for (int bx = real_pos_draw_start_y; bx < boundary_y; bx++, count_y++) { // проверяем, не является ли данная кисть ластиком if (BR.IsBrushErase()) { // данная кисть - ластик // помечаем данный пиксель как незакрашенный // получаем текущий цвет пикселя маски Color ret = BR.myBrush.GetPixel(count_x, count_y); // цвет не красный if (!(ret.R == 255 && ret.G == 0 && ret.B == 0)) { // заполняем данный пиксель активным цветом из маски DrawPlace[ax, bx, 3] = 1; } } else { // получаем текущий цвет пикселя маски Color ret = BR.myBrush.GetPixel(count_x, count_y); // цвет не красный if (!(ret.R == 255 && ret.G == 0 && ret.B == 0)) { // заполняем данный пиксель активным цветом из маски DrawPlace[ax, bx, 0] = ActiveColor.R; DrawPlace[ax, bx, 1] = ActiveColor.G; DrawPlace[ax, bx, 2] = ActiveColor.B; DrawPlace[ax, bx, 3] = 0; } } } } }