Хрестоматия по программированию на Си в Unix



         

Экранные библиотеки и работа с видеопамятью. Хрестоматия по программированию на Си в Unix - стр. 2


Пользуясь прямым доступом в видеопамять, напишите функции для спасения прямоугольной области экрана в массив и обратно. Вот функция для спасения в массив:

typedef struct { short xlen, ylen; char *save; } Pict; extern void *malloc(unsigned); Pict *gettext (int x, int y, int xlen, int ylen){ Pict *n = (Pict *) malloc(sizeof *n); register char *s; register i, j; n->xlen = xlen; n->ylen = ylen; s = n->save = (char *) malloc( 2 * xlen * ylen ); for(i=y; i < y+ylen; i++) for(j=x; j < x+xlen; j++){ *s++ = SCR(j,i).chr ; *s++ = SCR(j,i).attr; } return n; }

Добавьте проверки на корректность xlen, ylen (в пределах экрана). Напишите функцию puttext для вывода спасенной области обратно; функцию free(buf) лучше в нее не вставлять.

void puttext (Pict *n, int x, int y){ register char *s = n->save; register i, j; for(i=y; i < y + n->ylen; i++) for(j=x; j < x + n->xlen; j++){ SCR(j,i).chr = *s++; SCR(j,i).attr = *s++; } } /* очистка памяти текстового буфера */ void deltext(Pict *n){ free(n->save); free(n); }

Приведем еще одну полезную функцию, которая может вам пригодиться - это аналог printf

при прямой работе с видеопамятью.

#include <stdarg.h>

/* текущий цвет: белый по синему */ static char currentColor = 0x1F; int videoprintf (int x, int y, char *fmt, ...){ char buf[512], *s; va_list var; /* clipping (отсечение по границам экрана) */ if( y < 0 y >= LINES ) return x; va_start(var, fmt); vsprintf(buf, fmt, var); va_end(var); for(s=buf; *s; s++, x++){ /* отсечение */ if(x < 0 ) continue; if(x >= COLS) break; SCR(x,y).chr = *s; SCR(x,y).attr = currentColor; } return x; } void setcolor (int col){ currentColor = col; }

Пользуясь написанными функциями, реализуйте функции для "выскакивающих" окон (pop-up window):

Pict *save; save = gettext (x,y,xlen,ylen); // ... рисуем цветными пробелами прямоугольник с // углами (x,y) вверху-слева и (x+xlen-1,y+ylen-1) // внизу-справа... // ...рисуем некие таблицы, меню, текст в этой зоне... // стираем нарисованное окно, восстановив то изображение, // поверх которого оно "всплыло". puttext (save,x,y); deltext (save);




Содержание  Назад  Вперед