TURBO PASCAL |
Новости
|
1.3.1. Используемые шрифты и координатыПрежде чем описывать подпрограммы модуля, следует подробнее рассмотреть используемый в них способ создания изображений символов. Подпрограммы получают адрес загруженного в память массива, содержащего поточечные образы каждого из 256 возможных символов. При необходимости вывода на экран соответствующая процедура отыскивает образ нужного символа и, руководствуясь им, последовательно, точка за точкой, рисует его на экране. Таким образом, непременным условием использования текстовых возможностей модуля является предварительная загрузка в память нужного шрифта. Техника разработки матричных шрифтов здесь не рассматривается, однако не пугайтесь: если Вас устраивает вывод, реализуемый в текстовом режиме на Вашем ПК, Вам не придется самостоятельно разрабатывать шрифт. Для его создания можно использовать следующую простую программу. ^————__———_——————————————————+ I Эта программа предназначена для создания \ ¦ поточечного шрифта, который может затем ¦ I использоваться в модуле F GrText \ +——————_————————————————————+; Uses Graph,DOS,CRT; type ab = array [O..MaxInt] of Byte; var D,R,E: Integer; P: "ab; k,X,Y,B,H: Byte; XO,YO: Integer; F: File; S: String; Reg: registers; begin {Инициируем графический режим} D := Detect; InitGraph(D,R,'') ; E := GraphResult; if EogrOk then begin WriteLn(GraphErrorMsg(E)); Halt end; {Проверяем драйвер и назначаем высоту шрифта} case D of CGA: H := 8; EGA: H := 14; VGA: H := 16; else H := 8; end; fРезервируем нужную динамическую память и открываем файл с именем "BxH.fnt", где H - высота шрифта} GetMem(P,256*H) ; Str(H,S); s := '8x4-s+' .fnt'; Assign(F,S) ; Rewrite(F,1) ; {Определяем начальные координаты для эхо-повтора} ХО := 0; YO := 20; {Направляем текстовый вывод в верхний левый угол} GotoXY(l,l) ; {Основной цикл создания побитовых образов символов} for k := 0 to 255 do begin {Выводим очередной символ средствами прерывания $10, функция $А (вывод символа без атрибутов)} with Reg do begin ah := $A; al := k; bh := 0; ex : = 1 ; Intr($lO,Reg) end; {Сканируем созданное изображение слева-направо-сверху-вниз} for Y :» 0 to H-1 do begin В := 0; {Начальное значение очередного байта} for Х := 0 to 7 do if GetPixel(X,Y)<>GetBkColor then begin {Формируем байт шрифта} В := В or (128 shr X) ; {Гасим символ в левом верхнем углу экрана} PutPixel(X,Y,GetBkColor) ; {И повторяем его ниже} PutPixel(XO+X,YO+Y,White) end; P'"[k*H+Y] := В {Запоминаем байт} end; (Сдвигаем место эхо-повтора символов} inc(XO,10) , if XO>GetMaxX then begin XO := 0; inc(YO,20) end end; {Записываем шрифт в файл и завершаем программу} BlockWrite(F,Р^,256*Н) ; Close(F) ; CloseGraph end. В этой программе один из ключевых параметров — высота шрифта (переменная Н) определяется на основе анализа типа загруженного драйвера. В адаптерах CGA, EGA и VGA реализуется одинаковое разрешение по горизонтали в графическом режиме — 640 пиксел. Это определяет ширину поточечного образа каждого символа в 640/80 = 8 пиксел (для максимальной длины текстовой строки в 80 символов). Высота графического экрана, а следовательно, и высота образа символа различна: 200 строк развертки для CGA дают высоту символа в 200/25 = 8 пиксел для 25 текстовых строк, в то время как для EGA имеем 350/25 =14 пиксел, а для VGA — 480/25 = 19 пиксел. Адаптер VGA в текстовом режиме обеспечивает разрешение 720х400 пиксел, поэтому в нем используется шрифт размером 9х16. Однако поточечный образ каждого символа определяется матрицей 8х16 бит, так как в этом случае дополнительный 9—и пиксел по горизонтали автоматически выводится справа от символа цветом фона и служит для разделения символов друг от друга в строке. После прогона приведенной выше программы в текущем каталоге будет сформирован двоичный файл, содержащий поточечные образы всех 256 символов. Эти образы используются при выводе сообщений в текстовом режиме, а значит Вы можете загрузить этот файл в память, чтобы рисовать символы графическими средствами. Замечу, что для УСА—адаптера стандартный шрифт 8х16 обеспечивает 480/16 = 30 текстовых строк, т.е. вывод на экран этим шрифтом будет чуть мельче, чем в текстовом режиме. Если Вы хотите получить более точную имитацию текстового режима на VGA—адаптере, можно преобразовать создаваемый программой файл 8х16. fnt в файл 8x.l9.fnt. Увеличение высоты каждого образа до 19 пиксел обеспечит почти полную имитацию текстового вывода. Такое преобразование реализует следующая программа. ^——————————————————————————+ 1 Эта программа служит для преобразования \ \ файла 8х16.fnt в файл 8х19. fnt I +---__------_------------------------------+^ Uses Graph; type tl6 = array [0..15] of Byte; tl9 = array [O..18] of Byte; tl6_l = array [0..7,0..15,0..18] of Byte; tl9_l = array [0..7,0..18,0..15] of Byte; var F16 File of tl6; F19 File of tl9; C16 tl6; C19 tl9; A16 tl6_l; A19 tl9__l absolute al6; X,Y,k,B,S: Byte; D,R,E,XO,YO: Integer; begin {Инициируем графику} D := Detect; InitGraph(D,R,' ') ; E := GraphResult; if EogrOk then begin WriteLn(GraphErrorMsg(E)) ; Halt end; {Задаем начальные координаты эхоповтора} ХО := 0; YO := 0; {Открываем файлы} Assign(F16,'8xl6.fnt') ; Reset(F16) ; Assign (F19,'8xl9.fnt') ; Rewrite(F19) ; {Основной цикл преобразования} while not EOF(F16) do begin Read(F16,C16); (Читаем очередной образ 8х16} {Сканируем его слева-направо-сверху-вниз в виде матрицы 8х16} for Y := 0 to 15 do for X := 0 to 7 do begin {Выделяем нужный бит} B:=ord((C16[Y] and (128 shr X))<>0); if BOO then PutPixel(XO+X,YO+Y,White) ; {Формируем 19 единиц или нулей} for k := 0 to 18 do A16[X,Y,k] := В end; {Создаем изображение 8х19} for Y := 0 to 18 do begin в := о; for X := 0 to 7 do begin S := 0; {Начальное значение суммы} for k := 0 to 15 do S:=S+A19[X,Y,k]; {Суммируем веса} {Проверяем сумму} if (S>9) then begin {Большинство клеток закрашено - помещаем единицу и выводим пиксел} В := В or (128 shr X) ; PutPixel(XO+9+X,YO+Y,White) end end; C19[Y] := В end; {Записываем сформированный образ в файл 8х19} Write(F19,C19) ; {Сдвигаем эхо-повтор} inc(XO,20) ; if X0>640 then begin XO := 0; inc(YO,20) end end; {Завершаем программу} CloseGraph; Close(F16) ; Close(F19) end. Программа считывает каждый образ шрифта 8х16 в переменную С 16, затем анализирует этот образ и формирует шрифт 8х19 в переменной С 19. Преобразование шрифта осуществляется методом весовых коэффициентов. Суть метода состоит в том, что каждый пиксел шрифта 8х16 разбивается в вертикальном направлении на 19 частей (переменная А16). Эти части заполняются единицами, если пиксел светится, или нулями — если не светится. После этого переменная А16 рассматривается как матрица 8х19, каждый элемент которой в вертикальном направлении разбит на 16 частей (переменная А19). Для этой переменной находится сумма всех элементов каждого пиксела (переменная 5). Если эта сумма больше 9, значит большая часть пиксела в шрифте 8х19 должна быть засвечена, и этот пиксел объявляется светящимся, если меньше — не светящимся. Рис. 1.4 иллюстрирует сказанное.
Рас. 1.4. Пример преобразования символа шрифта 8х16 в шрифт 8х19 Как показывает практика, программа обеспечивает вполне приемлемое качество генерируемого шрифта 8х19. Подпрограммы модуля F_GrText, имитирующие средства модуля CRT, имеют одинаковый с ними интерфейс. Важным отличием является то, что используемая в них координатная сетка текстового вывода определяется загруженным шрифтом. В связи с этим процедуры проверяют факт за— грузки шрифта и игнорируют вызов в том случае, если шрифт не загружен. Для загрузки шрифта программа пользователя должна разместить в памяти поточечные образы символов и вызвать процедуру регистрации шрифта SetFont. После выполнения этой процедуры координаты текстового ввода/вывода могут изменяться в диапазоне от 1 до MaxChar для горизонтальной оси и от 1 до MaxLine — для вертикальной. Параметры MaxChar и MaxLine определяются следующим образом: MaxChar = (GetMaxX+1) div X MaxLine = (GetMaxY+1) div Y где X — ширина, У — высота поточечных образов символов. Например, для VGA—адаптера при загрузке шрифта 8х8 параметр MaxLine получит значение 60, а для шрифта 8х19 — 25; в обоих случаях параметр MaxChar имеет значение 80. Это означает, что в первом случае программа работает с текстовым экраном 80х60 символов, а во втором — 80х25 символов. Левый верхний угол экрана имеет координаты (1,1). С графическим экраном отождествляется текстовый курсор подобно тому, как такой курсор определяет место вывода данных в текстовом режиме. Текстовый курсор становится виден на графическом экране только при обращении к процедурам Read/ReadLn и сразу исчезает после окончания ввода. Текстовый курсор никак не связан с графическим курсором. Он изменяет свое положение после вывода очередного символа процедурами Write/ WriteLn или при исполнении процедуры GotoXY.
|
(с)Все права защищены По всем интересующим вопросам прошу писать на электронный адрес |