Шаг 16 - Графика на лету это просто

Не буду продолжать рассказ о классе CGIApp, потому что считаю там должно быть все ясно. У него конечно еще много недочетов, и вероятно будут проявляться глюки, но всеже это лучше чем раньше. Единственное, что там еще надо доработать это разбор данных из строки QUERY_STRING при обращении методом POST, а то получается, что данные просто хранятся в переменной класса и не разобраны в приемлимый вид. Так что работайте...

Сейчас думаю многим будет интересна возможность создания графики на "лету". Наверняка тысячи раз видели графики на сайтах, диаграммы, таблички и т.д. Все это не рисуют бедные вебмастера каждый час или даже минуту :-)

Вывод графики интересная скажу вам штука... Особенно когда эта операция должна выполняться быстро. Пару лет назад я крепко этим занимался и целыми днями сидел за оптимизацией ассемблерного кода. Иногда уменьшив размер процедуры на пару байт (например, заменив add ax,1 на inc ax) скорость возрастала на 50 и больше процентов. Странно было, но очень приятно... Сейчас уже никто не думает о скоростях и оптимизации, пишут на 500Мб то, что можно "упаковать" в 100 :-)) Вобщем хватит философии, приступим...

При создании картинки монитора может и не быть под рукой, мало того в компьютере может попросту не быть видео адаптера... Так, что все операции надо проводить в памяти на так называемом "виртуальном экране".

Чтобы зря не тратить память лучше при инициализации приложения выделить память под виртуальный экран ровно столько, сколько потребуется для создания картинки. Для начала опишем "болванку" класса, который потом будем постоянно наращивать.

class CGIScreen {
protected:
	int width, height;
	char *scr;
public:

	CGIScreen(int w,int h);
	~CGIScreen();
};

Переменные width и height хранят размеры виртуального экрана, которые необходимы для процедур вывода, чтобы отрезать все ненужные или по другому не видимые пикселы.

Указатель scr это и есть тот самый экран. Теперь конструктор и деструктор:

CGIScreen::CGIScreen(int w,int h)
{
	if (w*h<=64000)
		scr=(char *)malloc(w*h);
	else {
		scr=NULL;
		return;
	}
	width=w;
	height=h;
};

CGIScreen::~CGIScreen()
{
	if (scr!=NULL) free(scr);
};

В конструкторе я не стал выделять много памяти. Во-первых, 64000=320*200 чего вполне хватит, чтобы создать картинку немеренного размера (в байтах :-) и разозлить посетителя :-). Во-вторых, я не могу предугадать в каких системах будет использоваться этот код. В ДОСе максимальный блок памяти 64Кб, ну а если у Вас возможно хранить больше, то меняйте код сами :-)

Следующей думаю будет процедура заполнения "экрана" одним цветом. Догадались как это можно быстро сделать ?

int CGIScreen::FillScreen(char color)
{
	if (scr!=NULL) setmem((void *)scr,width*height,color);
};

Теперь не забудьте вставить заголовок процедуры в описание класса и можно начинать работать :-) Будете получать виртуальные экранчики заполненные одним цветом. Помоему не плохо для начала... Подойдет для создания фонов :-)


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Кузин Андрей - 06.05.2000