Первое, что бросается в глаза - неоптимальность в циклах. Обычно это основная причина замедления. Нужно проверить, что во внутреннем цикле не происходит вычисления каждый раз величины, которая не меняется.
Вот, есть у Вас цикл.
Код:
for (j=min(X1,X2); j<=max(X1,X2); ++j)
Как я понял, внутри цикла величины X1 и X2 не меняются. Однако каждый раз после выполнения тела цикла происходит вызов функции max для проверки условия выхода. Нужно вычислить это значение заранее и сохранить в локальной переменной. Функции min и max, кстати, хорошо бы сделать inline, если их приходится вызывать часто, так как вызов функции - операция, в общем-то, накладная.
Или другой пример с двойным циклом
Код:
for (i=Y1; i<=Y2; ++i)
for (j=X1; j<=X2; ++j)
a[j][i]=C;
Внутри тела цикла происходит умножение индекса j на 300, затем прибавление к этому значению i, затем сдвиг на полученную величину от адреса a. Как минимум стоит вести внешний цикл по j, а внутренний по i, и перед вызовом внутреннего цикла запомнить адрес, начиная с которого заполняется память. Внутренний цикл тогда, кстати, можно заменить на функцию memset.
Короче, нужно посмотреть, какой фрагмент кода запускается чаще всего, обращая особое внимание на двойные циклы. Может быть, можно ускорить и сам алгоритм, но я его не смотрел.