Inferno Programmer's Guide / Руководство программиста по ОС Inferno: Chapter 3 - Limbo Programming
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Взаимодействие с внешними функциями j1m 30.04.09 в 10:48 |
|
|
Следующий пример состоит из трех файлов. Главная программа пороождает новый поток с внешней функцией (из загруженного модуля) и испольует механизм каналов для взаимодействия в потоками. j1m 30.04.09 в 11:04 |
||
|
chanx2a.b:
j1m 30.04.09 в 11:05 |
||
|
chanx2b.m (интерфейс модуля для chanx2b.b): j1m 30.04.09 в 11:07 |
||
|
1 chanx: module { j1m 30.04.09 в 11:07 |
||
|
chanx2b.b j1m 30.04.09 в 11:07 |
||
|
1 implement chanx; j1m 30.04.09 в 11:07 |
||
|
Пример событийного пользовательского интерфейса rapidfx 14.05.09 в 04:28 |
||
|
Выполнение оператора alt начинается со строки 50. Там происходит выбор между двумя каналами: menubut и cmd. Канал menubut ипользуется для уведомления приложения о событиях связанных с заголовком окна (titlebar), таких как перемещение и закрытие. Канал cmd уведомляет приложение о событиях от других виджетов, таких как кнопки расположенные внизу, Кнопка 1, Кнопка 2, и Выход. rapidfx 14.05.09 в 04:36 |
||
|
Графика j1m 30.04.09 в 10:49 |
||
|
Средства работы с графикой не встроены в язык Limbo, вместо этого они вынесены в специальные модули: Draw, Prefab и Limbo/Tk. j1m 30.04.09 в 17:44 |
||
|
В этом разделе мы рассмотрим эти модули, а так же примеры прсотых программ, использующих их функции. Все примеры основаны на консольной программе Greet, рассмотренной во второй главе. j1m 01.05.09 в 11:51 |
||
|
Модуль Draw j1m 30.04.09 в 10:50 |
||
|
Модуль Draw предоставляет базовые графические средства, определяет графические контексты, изображения, шрифты и операции прямоугольной геометрии. j1m 01.05.09 в 12:13 |
||
|
Концепция и Терминология j1m 30.04.09 в 10:50 |
||
|
Мдуль Draw предоставляет низкоуровневые средства работы с графикой, поэтому его функции и данные находятся на более низком уровне, чем в большинтсве графических API. Поэтому он имеет несколько концепций и терминов, с которыми лучше познакомиться сразу. j1m 01.05.09 в 12:18 |
||
|
Графический контекст (Context) j1m 30.04.09 в 10:51 |
||
|
Как мы уже говорили в этой главе, графический контекст (Context), который захватывает программа через аргумент функции init(), определен в модуле Draw. Аргумент Context содержит ссылку на грфические ресурсы.
j1m 01.05.09 в 13:12 |
||
|
Display j1m 30.04.09 в 10:51 |
||
|
Объект display типа Draw->Display представляет физический экран, соответствующий одиночному подключению к устройству draw (/dev/draw).
j1m 01.05.09 в 13:33 |
||
|
Screen j1m 30.04.09 в 10:51 |
||
|
Объект screen типа Draw->Screen используется для управления набором окон в изображении. Screens, and hence windows, may be built recursively upon windows for subwindowing or even on off-screen images.
j1m 01.05.09 в 13:49 Объект screen типа Draw->Screen используется для управления набором окон в изображении, и обычно не т необходимости в его отображении. Screen'ы и следовательно и окна, могут создаваться рекурсивно в окнах для для дочерних окон/под-окон , или даже для закадровых изображений. rapidfx 14.05.09 в 09:23 |
||
|
Пиксели j1m 30.04.09 в 10:52 |
||
|
Изображения представляют собой прямоугольный регион в целочисленной плоскости с элементом изображения (пиксель) на каждой точке сетки. Значение пикселя - это целое число, длиной 1, 2, 4 или 8 бит на пиксель. Все пиксели одного изображения имеют одинаковый размер (или глубину). Некторые операции позволяют объединить изображения с разной глубиной, например для выполнения маскирования (masking).
j1m 02.05.09 в 09:28 |
||
|
Point j1m 30.04.09 в 10:52 |
||
|
Тип Point определяет координаты. Графическая плоскость определена на целочисленной решетке, каждая (x, y) координата которой идентифицирует верхний левый угол соответствующего пикселя. Начало плоскости, (0,0) находится в верхнем левом углу экрана; координаты x и y возрастают в право и вниз. j1m 04.05.09 в 19:33 |
||
|
Rect j1m 30.04.09 в 10:52 |
||
|
Тип Rect определяет прямоугольный регион плоскости. Он содержит два поля типа Point (min и max) и указывает на регион, определенный пикселями с координатами большими или равными min и меньшими чем max, как x, так и y. Это полу-открытое свойство позволяет прямоугольникам, совместно использующим край, иметь одинаковые координаты на краю. j1m 05.05.09 в 07:57 |
||
|
Image j1m 30.04.09 в 10:52 |
||
|
Тип Image предоставляет базовые действия над группами пикселей. Через несколько простых действий тип Image предоставляет строительные блоки для Display, Screen и Font. j1m 05.05.09 в 08:09 |
||
|
Глубина пикселей в Image записана как логарифм, записанный в Image. 1 depth (???). Пиксели, глубиной 1, 2, 4 или 8 бит соответствуют значениям 1 depth 0, 1, 2 или 3.
j1m 08.05.09 в 06:07 |
||
|
Font j1m 30.04.09 в 10:52 |
||
|
Тип Font определяет соответствие графических изображений символов и их кодов. Не смотря на то, что все операции отрисовки символов в конечном счете используют примитивы типа Draw, тип Font предлагает удобное и эффективное управление отображаемым текстом. j1m 13.05.09 в 10:41 |
||
|
Pointer j1m 30.04.09 в 10:52 |
||
|
Тип Pointer сообщает информацию о состоянии устройств-указателей, таких как мыши и трекболы. j1m 01.05.09 в 13:56 |
||
|
Возвращаемые значения j1m 30.04.09 в 10:53 |
||
|
Многие операции по отрисовке работают асинхронно и не возвращают никакого значения.
j1m 01.05.09 в 14:09 |
||
|
Освобождение графических объектов j1m 30.04.09 в 10:53 |
||
|
Не существует функций для освобождения русурсов от графических объектов. Вместо этого сборщик мусора Inferno освобождает их автоматически. Из Limbo ссылка может быть уничтожена путем присвоения значенения nil ссылочной переменной, возвращения из функции, которая содержит локальные пременные, хранищие ссылки, и т.д. j1m 01.05.09 в 14:14 |
||
|
Пример j1m 30.04.09 в 10:53 |
||
|
Далее приведен исходный код версии программы Greet, которая иллюстрирует использования модуля Draw: j1m 01.05.09 в 14:15 |
||
|
drawgreet.b: j1m 30.04.09 в 17:49 |
||
|
Седьмая строка объявляет хэндл к модулю Draw, а строка 8 импортирует структуры данных Draw в текущее пространство имен. В частности это типы Display, Image и Font. j1m 13.05.09 в 10:51 |
||
|
Тип Image предоставляет базовые операции над группами пикселей и строительные блоки для более высокоуровневых объектов вроде изображний (графические файлы), окон и шрифтов. Строка 22 присваивает видимое содержимое (холст Draw) переменной disp. Строка 37 открывает файл изображения logon.bit, расположенный в каталоге /icons и присваивает его переменной img. j1m 13.05.09 в 11:01 |
||
|
Тип Font определяет внешний вид символов, отображаемых с помощью функции Image.font(). Шрифты считываются из файлов, которые описывают их размер, стиль и часть Unicode-символов, которые они содержат. Строка 27 открывает файл шрифта unicode.9x24.font, расположенный в каталоге /fonts/lucidasans, и присваивает его переменной font. j1m 13.05.09 в 11:06 |
||
|
Строка 23 обновляет экран используя рекомендованную технику порождения отдельного потока для локальной функции refresh() (строки 49-51), которая вызывает функцию Display.startrefresh() модуля Draw. j1m 13.05.09 в 11:08 |
||
|
Строка 42 заполняет область экрана (прямоугольник, определенный в disp.r) белым цветом. Строка 43 отрисовывает изображение img на экране. Строка 44 рисует текст str используя шрифт font. Строка 45 делает паузу перед тем как экран будет очищен в строке 46. j1m 13.05.09 в 11:11 |
||
|
После компиляции этой программы, вы можете запустить ее из консоли Inferno (не из графического окна командного инерпретатора): j1m 13.05.09 в 11:13 |
||
|
//Тут рисунок со страницы 121 j1m 30.04.09 в 10:53 |
||
|
Модуль Prefab j1m 30.04.09 в 10:53 |
