Системное программное обеспечение персональных ЭВМ


Пример 7



Пример 7

/*== ПРИМЕР 8.8 ==*/ /*========== Работа принтера в графическом режиме ========*/ #include <dos.h> #include <math.h> #include <stdio.h> #include <alloc.h> #define prt(x) putc(x,stdprn); union REGS rr; main() { int col=4; /* Цвет - красный */ paint(col); /* Построение картинки */ getch(); prtgraph(1,1,80,80,col); /* Вывод на принтер */ } /* Построение картинки (из окружностей) */ paint(int col) { int x,y,fy,fx,k; /* Установка графического режима */ rr.x.ax=0x0010; int86(0x10,&rr,&rr); /* Построение контуров */ for (x=-24; x<=24; x++) { y=(int)sqrt((double)(576-x*x)); point(x+32,32-y,col); point(x+32,32+y,col); } for (x=-12; x<=12; x++) { y=(int)sqrt((double)(144-x*x)); point(x+20,32+y,col); point(x+44,32-y,col); } for (x=-4; x<=4; x++) { y=(int)sqrt((double)(16-x*x)); point(x+20,32-y,col); point(x+20,32+y,col); point(x+44,32+y,col); point(x+44,32-y,col); } /* Закрашивание */ for (fx=-24; fx<=24; fx++) { fy=(int)sqrt((double)(576-fx*fx)); x=fx+32; for (k=0, y=32-fy; y<=32+fy; y++) { rr.x.dx=y; rr.x.cx=x; rr.h.bh=0; rr.h.ah=0x0d; int86(0x10,&rr,&rr); if ((rr.h.al==col)&&((y!=32)(x==32))) k=1-k; if (k) point(x,y,col); } } } /* Вывод одной графической точки */ point(int x, int y, int c) { rr.x.dx=y; rr.x.cx=x; rr.h.bh=0; rr.h.al=c; rr.h.ah=0x0c; int86(0x10,&rr,&rr); } /*----------------------------------------------------*/ /* Графическая копия экрана. (x1,y1),(x2,y2) - координаты окна, c - цвет */ prtgraph(int x1, int y1, int x2, int y2, int c) { char *str; /* Графический образ строки для печати */ char *s; int strsize; /* Размер образа */ char esc[] = /* Начало Esc-послед.графической печати */ { 27,42,0,0,0 }; int x,y; /* Экранные координаты */ int bit; /* Счетчик разрядов в образе */ int i; /* Инициализация принтера */ prt(27); prt(64); /* Установка расстояния между строк */ prt(27); prt(51); prt(25); /* Выделение памяти для образа */ strsize=x2-x1+1; str=malloc(strsize); for (s=str, i=0; i<strsize; i++, s++) *s=0; /* Запись размера образа в Esc-послед. */ esc[3]=strsize%256; esc[4]=strsize/256; /* Перебор строк */ for (bit=7, y=y1; y<=y2; y++) { /* Перебор точек в строке */ for (s=str, x=x1; x<=x2; x++, s++) { /* Чтение точки */ rr.x.dx=y; rr.x.cx=x; rr.h.bh=0; rr.h.ah=0x0d; int86(0x10,&rr,&rr); /* Если цвет точки совпадает - заносится 1 в соответствующий разряд образа */ if (rr.h.al==c) *s|=(1<<bit); } if (--bit<0) { /* Если сформированы 8 разрядов образа, то: выводится начало Esc-последовательности, */ for(i=0;i<5;i++) prt(esc[i]); /* выводится образ и обнуляется, */ for (i=0, s=str; i<strsize; i++,s++) { prt(*s); *s=0; } prt(10); /* перевод строки */ bit=7; } } /* Если не весь образ выведен - вывод остатка */ if (bit<7) { for (i=0; i<5; i++) prt(esc[i]); for (i=0, s=str; i<strsize; i++,s++) prt(*s); prt(10); } /* Инициализация принтера */ prt(27); prt(64); }




- Начало -  - Назад -  - Вперед -