System/Docu/ru/Ports.odc

Ports

DEFINITION Ports;

	IMPORT Fonts;

	CONST
		black = 00000000H; white = 00FFFFFFH;
		grey6 = 00F0F0F0H; grey12 = 00E0E0E0H; grey25 = 00C0C0C0H;
		grey50 = 00808080H; grey75 = 00404040H;
		red = 000000FFH; green = 0000FF00H; blue = 00FF0000H;
		defaultColor = 01000000H;
		mm = 36000; point = 12700; inch = 914400;
		fill = -1;
		openPoly = 0; closedPoly = 1; openBezier = 2; closedBezier = 3;
		invert = 0; hilite = 1; dim25 = 2; dim50 = 3; dim75 = 4;
		hide = FALSE; show = TRUE;
		arrowCursor = 0; textCursor = 1; graphicsCursor = 2; tableCursor = 3; bitmapCursor = 4; refCursor = 5;
		keepBuffer = FALSE; disposeBuffer = TRUE;

	TYPE
		Color = INTEGER;

		Point = RECORD
			x, y: INTEGER
		END;

		Port = POINTER TO ABSTRACT RECORD
			unit-: INTEGER;
			(p: Port) Init (unit: INTEGER; printerMode: BOOLEAN), NEW;
			(p: Port) GetSize (OUT w, h: INTEGER), NEW, ABSTRACT;
			(p: Port) SetSize (w, h: INTEGER), NEW, ABSTRACT;
			(p: Port) NewRider (): INTEGER, NEW, ABSTRACT;
			(p: Port) OpenBuffer (l, t, r, b: INTEGER), NEW, ABSTRACT;
			(p: Port) CloseBuffer, NEW, ABSTRACT
		END;

		Rider = POINTER TO ABSTRACT RECORD
			(rd: Rider) SetRect (l, t, r, b: INTEGER), NEW, ABSTRACT;
			(rd: Rider) GetRect (OUT l, t, r, b: INTEGER), NEW, ABSTRACT;
			(rd: Rider) Base (): Port, NEW, ABSTRACT;
			(rd: Rider) Move (dx, dy: INTEGER), NEW, ABSTRACT;
			(rd: Rider) SaveRect (l, t, r, b: INTEGER; OUT res: INTEGER), NEW, ABSTRACT;
			(rd: Rider) RestoreRect (l, t, r, b: INTEGER; dispose: BOOLEAN), NEW, ABSTRACT;
			(rd: Rider) DrawRect (l, t, r, b, s: INTEGER; col: Color), NEW, ABSTRACT;
			(rd: Rider) DrawOval (l, t, r, b, s: INTEGER; col: Color), NEW, ABSTRACT;
			(rd: Rider) DrawLine (x0, y0, x1, y1, s: INTEGER; col: Color), NEW, ABSTRACT;
			(rd: Rider) DrawPath (IN p: ARRAY OF Point; n, s: INTEGER; col: Color;
																		path: INTEGER), NEW, ABSTRACT;
			(rd: Rider) MarkRect (l, t, r, b, s: INTEGER; mode: INTEGER; show: BOOLEAN), NEW, ABSTRACT;
			(rd: Rider) Scroll (dx, dy: INTEGER), NEW, ABSTRACT;
			(rd: Rider) SetCursor (cursor: INTEGER), NEW, ABSTRACT;
			(rd: Rider) Input (OUT x, y: INTEGER; OUT modifiers: SET;
																		OUT isDown: BOOLEAN), NEW, ABSTRACT;
			(rd: Rider) DrawString (x, y: INTEGER; col: Color; IN s: ARRAY OF CHAR;
																		font: Fonts.Font), NEW, ABSTRACT;
			(rd: Rider) DrawSString (x, y: INTEGER; col: Color; IN s: ARRAY OF SHORTCHAR;
																		font: Fonts.Font), NEW, ABSTRACT;
			(rd: Rider) CharIndex (x, pos: INTEGER; IN s: ARRAY OF CHAR;
																		font: Fonts.Font): INTEGER, NEW, ABSTRACT;
			(rd: Rider) SCharIndex (x, pos: INTEGER; IN s: ARRAY OF SHORTCHAR;
																		font: Fonts.Font): INTEGER, NEW, ABSTRACT;
			(rd: Rider) CharPos (x, index: INTEGER; IN s: ARRAY OF CHAR;
																		font: Fonts.Font): INTEGER, NEW, ABSTRACT;
			(rd: Rider) SCharPos (x, index: INTEGER; IN s: ARRAY OF SHORTCHAR;
																		font: Fonts.Font): INTEGER, NEW, ABSTRACT
		END;

		Frame = POINTER TO ABSTRACT RECORD
			unit-: INTEGER;
			dot-: INTEGER;
			rider-: Rider;
			gx-, gy-: INTEGER;
			(f: Frame) ConnectTo (p: Port), NEW, EXTENSIBLE;
			(f: Frame) SetOffset (gx, gy: INTEGER), NEW, EXTENSIBLE;
			(f: Frame) SaveRect (l, t, r, b: INTEGER; OUT res: INTEGER), NEW;
			(f: Frame) RestoreRect (l, t, r, b: INTEGER; dispose: BOOLEAN), NEW;
			(f: Frame) DrawRect (l, t, r, b, s: INTEGER; col: Color), NEW;
			(f: Frame) DrawOval (l, t, r, b, s: INTEGER; col: Color), NEW;
			(f: Frame) DrawLine (x0, y0, x1, y1, s: INTEGER; col: Color), NEW;
			(f: Frame) DrawPath (IN p: ARRAY OF Point; n, s: INTEGER; col: Color; path: INTEGER), NEW;
			(f: Frame) MarkRect (l, t, r, b, s: INTEGER; mode: INTEGER; show: BOOLEAN), NEW;
			(f: Frame) Scroll (dx, dy: INTEGER), NEW;
			(f: Frame) SetCursor (cursor: INTEGER), NEW;
			(f: Frame) Input (OUT x, y: INTEGER; OUT modifiers: SET; OUT isDown: BOOLEAN), NEW;
			(f: Frame) DrawString (x, y: INTEGER; col: Color; IN s: ARRAY OF CHAR;
												font: Fonts.Font), NEW;
			(f: Frame) DrawSString (x, y: INTEGER; col: Color; IN s: ARRAY OF SHORTCHAR;
												font: Fonts.Font), NEW;
			(f: Frame) CharIndex (x, pos: INTEGER; IN s: ARRAY OF CHAR;
												font: Fonts.Font): INTEGER, NEW;
			(f: Frame) SCharIndex (x, pos: INTEGER; IN s: ARRAY OF SHORTCHAR;
												font: Fonts.Font): INTEGER, NEW;
			(f: Frame) CharPos (x, index: INTEGER; IN s: ARRAY OF CHAR;
												font: Fonts.Font): INTEGER, NEW;
			(f: Frame) SCharPos (x, index: INTEGER; IN s: ARRAY OF SHORTCHAR;
												font: Fonts.Font): INTEGER, NEW
		END;

	VAR background, dialogBackground: Color;

	PROCEDURE IsPrinterPort (p: Port): BOOLEAN;
	PROCEDURE RGBColor (red, green, blue: INTEGER): Color;

END Ports.


Порты - это носители растровых данных. Примерами могут служить порты экрана и принтера.

Курьеры - это каналы доступа к портам. Операции рисования, принадлежащие курьеру, выполняются в координатной системе с положительной осью x и отрицательной осью y, то есть, значения x увеличиваются слева направо, а значения y увеличиваются сверху вниз. Эта координатная система одинакова для каждого курьера порта и имеет свое начало в верхнем левом углу порта. Точки - это пары координат (в координатах устройства), которые задают верхний левый угол пикселя:



Рис. 1.  Графическая плоскость

Курьер занимает прямоугольник в пространстве порта. Каждый курьер действует как отсекающий прямоугольник, которым ограничены все операции рисования.

Кадры представляют собой проекторы портов (port mappers), которые предоставляют операции для вывода в порт и ввода от мыши и клавиатуры. Координаты кадра масштабируются и преобразуются, так что они не зависят от позиции кадра в порте не зависят от аппаратного разрешения порта. В этих целях все кадровые операции используют для координат универсальные единицы (см. Fonts) для координат, в то время как все операции порта и курьера используют точечные координаты.


CONST black, white, grey6, grey12, grey25, grey50, grey75, red, green, blue
RGB-значения для нескольких основных цветов.

CONST defaultColor
Это псевдоцвет, который соответствует текущему, установленному для рисования переднему цвету.

CONST mm, point, inch
Три необходимых единицы расстояния в универсальных единицах.

CONST fill
Это значение может быть передано в процедуры DrawRect, DrawOval, DrawPath и MarkRect параметром size, чтобы нарисовать закрашенную фигуру вместо одной лишь ее границы.

CONST openPoly, closedPoly, openBezier, closedBezier
Эти значения могут быть переданы в процедуру DrawPath параметром path. Они вызывают рисование ломаной, многоугольника, открытой кривой Безье или закрытой кривой Безье. Заметим, что для кривых Безье только каждая третья точка лежит на кривой.


Рис. 2.  Примеры различных линий

CONST invert, hilite, dim25, dim50, dim75
Эти значения могут быть переданы параметром mode в процедуру MarkRect. Они выделяют помеченный прямоугольник обращением цветов, подсветкой или затемнением. Точная трактовка этих режимов зависит от платформы.
В простейшем случае все три режима реализованы одинаковым образом, а именно - инвертированием каждого бита в значении цвета точки. В идеале hilite должна менять цвет фона области на выбранный пользователем цвет подсветки, и наоборот. Три режима затемнения, применяемые к белому фону, дают светлый, средний и темно-серый цвет соответственно.

CONST hide, show
Эти значения могут быть переданы параметром show в процедуру MarkRect. hide значит, что существующую пометку следует удалить, а show значит, что метка должна быть нарисована. В некоторых реализациях операция может быть идентичной для hide и show, но это не гарантируется.


CONST arrowCursor
Форма курсора по умолчанию.

CONST textCursor, graphicsCursor, tableCursor, bitmapCursor
Формы курсора, которые соответствуют типу данных, с которыми ведется работа: последовательные, большие фигуры, регулярно упорядоченные объекты, малые фигуры.

CONST refCursor
Форма курсора для показа ссылок, таких как гиперссылки.

CONST keepBuffer, disposeBuffer
Эти константы могут быть переданы параметрами dispose в процедуры Rider.RestoreRect и Frame.RestoreRect.


TYPE Color = INTEGER
Цвет - это четырехбайтовое значение, где младший значащий байт (интерпретируемый, как беззнаковое целое) задает интенсивность красной составляющей в триаде RGB. Следующий байт задает интенсивность зеленой, третий байт - синей составляющей. Старший значащий байт устанавливается в нуль.  


TYPE Point
Этот тип используется для создания путей для процедуры DrawPath. Путь состоит из массива точек, где точки являются парами координат.
Точки используются в программах рисования, которые вызывают DrawPath.

x, y: INTEGER
Пара координат.


TYPE Port
ABSTRACT
Носитель для растровых данных.
Порты размещаются и используются внутри модуля.
Порты реализованы внутри модуля.

unit-: INTEGER	unit > 0
Размер точки растра в универсальных единицах.

PROCEDURE (p: Port) Init (unit: INTEGER; printerMode: BOOLEAN)
Устанавливает разрешение (в универсальных единицах на точку растра). Параметр printerMode задает, когда порт действует как печатающий объект.

Предусловие
p.unit = 0  OR p.unit = unit	20
unit > 0	21

Постусловие
p.unit = unit

PROCEDURE (p: Port) GetSize (OUT w, h: INTEGER)
NEW, ABSTRACT
Возвращает текущий размер порта (в точках).

Постусловие
w >= 0
h >= 0

PROCEDURE (p: Port) SetSize (w, h: INTEGER)
NEW, ABSTRACT
Устанавливает размер порта (в точках).

Предусловие
w >= 0	20
h >= 0	21

PROCEDURE (p: Port) NewRider (): Rider
NEW, ABSTRACT
Возвращает курьер, который имеет подходящий тип для данной реализации порта.

PROCEDURE (p: Port) OpenBuffer (l, t, r, b: INTEGER)
NEW, ABSTRACT
Открывает внеэкранный буфер для порта p. Буфер инициализируется содержимым прямоугольника (l, t, r, b) порта p. OpenBuffer должно сопровождаться последующим вызовом CloseBuffer. Вызовы OpenBuffer не должны быть вложенными.
Используется внутри системы, для восстановления окна без мерцания фона. Не используется в других целях.

PROCEDURE (p: Port) CloseBuffer
NEW, ABSTRACT
Копирует обратно содержимое внеэкранного буфера порта и освобождает буфер. До этого должна быть вызвана процедура OpenBuffer.
Используется внутри системы, для восстановления окна без мерцания фона. Не используется в других целях.


TYPE Rider
ABSTRACT
Канал доступа к порту (например, к растровому носителю). Курьер использует ту же координатную систему, что и порт, с началом координат в верхнем левом углу порта. Все координаты, используемые курьером, представлены в координатах устройства, то есть, в точках. Курьеры также содержат отсекающий прямоугольник. Обычно он управляется средой автоматически, но при особых обстоятельствах он может быть полезен также для программирования отображений.
Курьеры размещаются портами.
Курьеры используются внутри модуля (кадрами, см. ниже) и реализованы внутри модуля.

PROCEDURE (rd: Rider) SetRect (l, t, r, b: INTEGER)
NEW, ABSTRACT
Устанавливает отсекающий прямоугольник курьера на порт (в точках). Обычно этот метод вызывается только средой. Если вы используете его явно, вам следует восстановить прежний отсекающий прямоугольник после окончания операций. Среда устанавливает отсекающий прямоугольник перед вызовом метода Restore отображения (см. Views.Restore). Это гарантирует, что рисунок никогда не выйдет за область рисования, которая принадлежит отображению, до тех пор пока отсекающий прямоугольник не будет изменен отображением.
Отсекающий прямоугольник никогда не должен становиться больше размера, установленного средой, он может становиться только меньше. Иначе результаты могут быть непредсказуемыми.

Предусловие
0 <= l <= r  &  0 <= t <= b	20

PROCEDURE (rd: Rider) GetRect (OUT l, t, r, b: INTEGER)
NEW, ABSTRACT
Возвращает отсекающий прямоугольник порта (в точках).

Постусловие
0 <= l <= r  &  0 <= t <= b

PROCEDURE (rd: Rider) Base (): Port
NEW, ABSTRACT
Возвращает порт, с которым связан курьер rd.

Постусловие
result # NIL

PROCEDURE (rd: Rider) Move (dx, dy: INTEGER)
NEW, ABSTRACT
Для внутреннего использования.

PROCEDURE (rd: Rider) SaveRect (l, t, r, b: INTEGER; OUT res: INTEGER)
NEW, ABSTRACT
Сохраняет прямоугольник (параллельный осям координат) шириной r - l и высотой b - t в фоновом буфере, откуда он может быть восстановлен позже процедурой RestoreRect. Вызов SaveRect должен быть уравновешен вызовом RestoreRect(l, t, r, b, disposeBuffer). Все координаты задаются в точках.
Вызовы SaveRect должны быть вложенными, и они не могут происходить во время восстановления отображения (см. Views.View.Restore). Целью SaveRect/RestoreRect является обеспечение временной буферизации при перетаскивании мышью (см. Views.View.HandleCtrlMsg).
 res = 0 означает, что вызов прошел успешно, в противном случае RestoreRect вызывать не надо.

Предусловие
(l <= r) & (t <= b)	20

PROCEDURE (rd: Rider) RestoreRect (l, t, r, b: INTEGER; dispose: BOOLEAN)
NEW, ABSTRACT
После успешного вызова SaveRect тот же прямоугольник, то есть, его содержимое в том виде, в каком оно было сохранено, может быть восстановлен вызовом RestoreRect. Все координаты задаются в точках. RestoreRect может успешно вызываться несколько раз; последний раз с dispose = disposeBuffer и все остальные разы с dispose = keepBuffer.

Предусловие
(l <= r) & (t <= b)	20

PROCEDURE (rd: Rider) DrawRect (l, t, r, b, s: INTEGER; col: Color)
NEW, ABSTRACT
Рисует прямоугольник (параллельный осям координат) ширины r - l и высоты b - t. Все координаты задаются в точках. Если s < 0, прямоугольник заполняется цветом col. Иначе прямоугольник рисуется как рамка толщины s. Рамка рисуется внутри прямоугольника. Если s = 0, используется очень тонкая рамка (волосяная линия).

Предусловие
(l <= r) & (t <= b)	20
(s >= 0) OR (s = fill)	21

PROCEDURE (rd: Rider) DrawOval (l, t, r, b, s: INTEGER; col: Color)
NEW, ABSTRACT
Рисует эллипс (параллельный осям координат) ширины r - l и высоты b - t. Все координаты задаются в точках. Если s < 0, эллипс заполняется цветом col. Иначе эллипс рисуется как рамка толщины s. Рамка рисуется внутри прямоугольника. Если s = 0, используется очень тонкая рамка (волосяная линия).

Предусловие
(l <= r) & (t <= b)	20
(s >= 0) OR (s = fill)	21

PROCEDURE (rd: Rider) DrawLine (x0, y0, x1, y1, s: INTEGER; col: Color)
NEW, ABSTRACT
Рисует линию из точки (x0, y0) в точку (x1, y1) толщиной s цветом col. Все координаты задаются в пикселах.
Заметим, что если вам необходимо нарисовать строго горизонтальную или вертикальную линию, вы можете использовать DrawRect с fill вместо DrawLine. Преимущество DrawRect в том, что понятнее, какие точки будут на самом деле нарисованы, - это точки, которые находятся строго внутри ограничивающего прямоугольника.




Рис. 3:  Линия


Если s = 0, используется очень тонкая (волосяная) линия.

Предусловие
s >= 0	20

PROCEDURE (rd: Rider) DrawPath (IN p: ARRAY OF Point; n, s: INTEGER; col: Color;
																path: INTEGER)
NEW, ABSTRACT
Рисует путь, состоящий из точек p[0] .. p[n - 1] цветом col. Вид пути задается параметром path. Это может быть ломаная, многоугольник, открытая кривая Безье или закрытая кривая Безье. Ломаная дает тот же результат, что и последовательность вызовов DrawLine. Для многоугольника n точек определяют математический регион, который может быть очерчен или закрашен. Открытый путь с n точками состоит из n - 1 кусочков, закрытый путь с n точками состоит из n кусочков. Все координаты в массиве задаются в точках растра.

Предусловие
n >= 0	20
n <= LEN(p)	21
(s = fill)  =>  (path = closedPoly) OR (path = closedBezier)	22
(s >= 0) OR (s = fill)	23
path IN {closedPoly, openPoly, closedBezier, openBezier}	25
path = openPoly
	n >= 2	20
path = closedPoly
	n >= 2	20
path = openBezier
	n >= 4	20
	n MOD 3 = 1	24
path = closedBezier
	n >= 3	20
	n MOD 3 = 0	24

PROCEDURE (rd: Rider) MarkRect (l, t, r, b, s: INTEGER; mode: INTEGER; show: BOOLEAN)
NEW, ABSTRACT
Помечает прямоугольник (праллельный осям координат) шириной r - l и высотой b - t. Все координаты задаются в точках. Если s < 0, прямоугольник заполняется некоторым образом, зависящим от параметра mode. Иначе прямоугольник рисуется как линия толщиной s. Рамка рисуется внутри прямоугольника. Если s = 0, используется очень тонкая рамка (волосяная линия).
Смысл mode зависит от реализации, но это дожно изменять помеченную область видимым образом. show указывает, когда пометка рисуется или убирается. Вызов MarkRect с show и сразу после этого с hide (с теми же параметрами) должна восстанавливать точное состояние, которое было до первого вызова.

Предусловие
(l <= r) & (l <= t)	20
s >= 0	21
mode IN {invert, hilite, dim25, dim50, dim75}	22

PROCEDURE (rd: Rider) Scroll (dx, dy: INTEGER)
NEW, ABSTRACT
Смещает содержимое курьера на вектор (dx, dy). Вектор переноса задается в точках. Смещение происходит полностью внутри прямоугольника курьера, то есть, точки за его пределами никогда не записываются и не считываются. Содержимое части прямоугольника, которая оказывается открытой, неопределено.
Назначение Scroll - ускорить операции прокрутки путем использования существующих растровых данных вместо полной перерисовки.
Однако при особых обстоятельствах эта процедура может не копировать растровые данные, а вместо этого принуждать приложение восстанавливать часть прямоугольника.
Внимание: эта операция может быть использована только для интерактивных портов, в целях обновления экрана монитора после действий пользователя.


Рис. 4.  Эффект операции Scroll

PROCEDURE (rd: Rider) SetCursor (cursor: INTEGER)
NEW, ABSTRACT
Установка курсора по переданному значению.

Предусловие
cursor IN {arrowCursor..refCursor}	20

PROCEDURE (rd: Rider) Input (OUT x, y: INTEGER; OUT modifiers: SET; OUT isDown: BOOLEAN)
NEW, ABSTRACT
Запрашивает текущую позицию мыши и то, какие кнопки в настоящий момент нажаты. Все координаты задаются в точках. В modifiers возвращаются нажатые в настоящий момент клавиши модификации, например, Controller.doubleClick, Controllers.modify, и, возможно, дополнительные модификаторы, специфичные для платформы.

PROCEDURE (rd: Rider) DrawString (x, y: INTEGER; col: Color; IN s: ARRAY OF CHAR;
																	font: Fonts.Font)
NEW, ABSTRACT
Рисует сроку s цветом col и шрифтом font на основной линии y. Все координаты задаются в точках.

Предусловие
font # NIL	20

PROCEDURE (rd: Rider) DrawSString (x, y: INTEGER; col: Color; IN s: ARRAY OF SHORTCHAR;
																	font: Fonts.Font)
NEW, ABSTRACT
Рисует строку из однобайтовых символов цветом col и шрифтом font на основной линии y. Все координаты задаются в точках.

Предусловие
font # NIL	20

PROCEDURE (rd: Rider) CharIndex (x, pos: INTEGER; IN s: ARRAY OF CHAR;
																	font: Fonts.Font): INTEGER
NEW, ABSTRACT
Беря строку s на позиции x, CharIndex определяет номер символа, который попадает на позицию pos. Все координаты задаются в точках. Result = 0 означает, что pos совпадает или находится левее первого символа s, result = n - 1, где n - это количество символов в строке s, означает, pos совпадает или находится правее последнего символа s.

Предусловие
font # NIL	20

PROCEDURE (rd: Rider) SCharIndex (x, pos: INTEGER; IN s: ARRAY OF SHORTCHAR;
																	font: Fonts.Font): INTEGER
NEW, ABSTRACT
Беря строку s на позиции x, CharIndex определяет номер символа, который попадает на позицию pos. Все координаты задаются в точках. Result = 0 означает, что pos совпадает или находится левее первого символа s, result = n - 1, где n - это количество символов в строке s, означает, pos совпадает или находится правее последнего символа s.

Предусловие
font # NIL	20

PROCEDURE (rd: Rider) CharPos (x, index: INTEGER; IN s: ARRAY OF CHAR;
																	font: Fonts.Font): INTEGER
NEW, ABSTRACT
Беря строку s на позиции x, CharPos определяет позицию символа index в s. Все координаты задаются в точках. Возвращается позиция левое границы символа.

Предусловие
font # NIL	20

PROCEDURE (rd: Rider) SCharPos (x, index: INTEGER; IN s: ARRAY OF SHORTCHAR;
																	font: Fonts.Font): INTEGER
NEW, ABSTRACT
Беря строку s на позиции x, CharPos определяет позицию символа index в s. Все координаты задаются в точках. Возвращается позиция левое границы символа.

Предусловие
font # NIL	20


TYPE Frame
ABSTRACT
Кадр представляет собой проектор порта (port mapper). Каждый кадр имеет свою координатную систему.  Все координаты, используемые кадрами, задаются в универсальных единицах. Большинство кадровых операций пересылаются курьеру кадра, то есть, они вызывают соответствующие процедуры курьера кадра, выполняя при этом необходимые преобразования координат (масштабирование между универсальными единицами и точками и преобразования относительно начала координат кадра).
Кадр f делает перевод из локальных универсальных координат в глобальные растровые координаты, используя следующие преобразования:
		x := (f.gx + x) DIV f.unit; y := (f.gy + y) DIV f.unit;	(* координаты кадра -> координаты курьера *)
Противоположное преобразование таково:
		x := x * f.unit - f.gx; y := y * f.unit - f.gy;	(* координаты курьера -> координаты кадра *)
Отсекающий прямоугольник курьера всегда устанавливается так, что рисунок не может выйти за кадр, то есть за пределы рисуемого отображения. Будьте осторожны при изменении отсекающего прямоугольника курьера (используя метод курьера SetRect), поскольку это приводит к нестабильному состоянию, которым следует управлять.
Кадры размещаются отображениями.
Кадры используются отображениями, для рисования и работы с мышью.
Кадры расширяются внутри системы (Views.Frame).

unit-: INTEGER	unit > 0
Размер точки растра в универсальных единицах.

dot-: INTEGER	dot = point - point MOD unit
Это значение можно использовать как приближение point, округленное до точки растра. Используя dot вместо point можно избежать уродливых ошибок округления. Например, если вы используете point как толщину линии, и точка растра немного больше, чем point, линия может совсем исчезнуть. Более того, вы можете пожелать использовать на экране очень тонкую линию (порядка одной точки растра) как волосяную линию, но не сделаете ее столь же маленькой на лазерном принтере (где unit кадра намного меньше, чем на экране). В этом случае dot оказывается удобным.

rider-: Ports.Rider
Курьер, который связывает кадр с портом.

gx-, gy-: INTEGER	[units]
Начало координат кадра в глобальной системе координат (то есть, относительно верхнего левого угла порта), но в единицах вместо точек. Это исключение из того правила, что курьеры используют точки, в то время как кадры используют единицы.

PROCEDURE (f: Frame) ConnectTo (p: Port)
NEW, EXTENSIBLE
Подключает кадр к порту. Все остальные кадровые процедуры выполняются на подключенном кадре, то есть, rider # NIL. Это предусловие не проверяется явно.
ConnectTo используется внутри системы.

Постусловие
p = NIL
	f.unit = 0
	f.rider = NIL
p # NIL
	f.unit = p.unit
	f.rider # NIL  &  f.rider.Base() = p
	f.dot = point - point MOD p.unit

PROCEDURE (f: Frame) SetOffset (gx, gy: INTEGER)
NEW, EXTENSIBLE
Устанавливает начало координат для кадра, в глобальных координатах (то есть, относительно верхнего левого угла порта), но в единицах вместо точек. Все локальные координаты задаются относительно этого начала координат. Это метод предназначен только для внутреннего использования средой.
SetOffset используется внутри системы.

Предусловие
f.rider # NIL	20

Постусловие
f.gx = gx  &  f.gy = gy

PROCEDURE (f: Frame) SaveRect (l, t, r, b: INTEGER; OUT res: INTEGER)
NEW
Сохраняет прямоугольник (параллельный осям координат) шириной r - l и высотой b - t в фоновом буфере, откуда он может быть восстановлен позже процедурой RestoreRect. Вызов SaveRect должен быть уравновешен вызовом RestoreRect(l, t, r, b, disposeBuffer).
Вызовы SaveRect должны быть вложенными, и они не могут происходить во время восстановления отображения (см. Views.View.Restore). Целью SaveRect/RestoreRect является обеспечение временной буферизации при перетаскивании мышью (см. Views.View.HandleCtrlMsg).
 res = 0 означает, что вызов прошел успешно, в противном случае RestoreRect вызывать не надо.

Предусловие
(l <= r) & (t <= b)	20

PROCEDURE (f: Frame) RestoreRect (l, t, r, b: INTEGER; dispose: BOOLEAN)
NEW
После успешного вызова SaveRect тот же прямоугольник, то есть, его содержимое в том виде, в каком оно было сохранено, может быть восстановлен вызовом RestoreRect. RestoreRect может успешно вызываться несколько раз; последний раз с dispose = disposeBuffer и все остальные разы с dispose = keepBuffer.

Предусловие
(l <= r) & (t <= b)	20

PROCEDURE (f: Frame) DrawRect (l, t, r, b, s: INTEGER; col: Color)
NEW
Рисует прямоугольник (параллельный осям координат) ширины r - l и высоты b - t. Если s < 0, прямоугольник заполняется цветом col. Иначе прямоугольник рисуется как рамка толщины s. Рамка рисуется внутри прямоугольника. Если s = 0, используется очень тонкая рамка (волосяная линия).

Предусловие
(l <= r) & (t <= b)	20
(s >= 0) OR (s = fill)	21

PROCEDURE (f: Frame) DrawOval (l, t, r, b, s: INTEGER; col: Color)
NEW
Рисует эллипс (параллельный осям координат) ширины r - l и высоты b - t. Если s < 0, эллипс заполняется цветом col. Иначе эллипс рисуется как рамка толщины s. Рамка рисуется внутри прямоугольника. Если s = 0, используется очень тонкая рамка (волосяная линия).

Предусловие
(l <= r) & (t <= b)	20
(s >= 0) OR (s = fill)	21

PROCEDURE (f: Frame) DrawLine (x0, y0, x1, y1, s: INTEGER; col: Color)
NEW
Рисует линию из точки (x0, y0) в точку (x1, y1) толщиной s цветом col.


Рис. 5.  Линия

Если s = 0, используется очень тонкая (волосяная) линия.

Предусловие
s >= 0	20

PROCEDURE (f: Frame) DrawPath (IN p: ARRAY OF Point; n, s: INTEGER; col: Color;
																path: INTEGER)
NEW
Рисует путь, состоящий из точек p[0] .. p[n - 1] цветом col. Вид пути задается параметром path. Это может быть ломаная, многоугольник, открытая кривая Безье или закрытая кривая Безье. Ломаная дает тот же результат, что и последовательность вызовов DrawLine. Для многоугольника n точек определяют математический регион, который может быть очерчен или закрашен. Открытый путь с n точками состоит из n - 1 кусочков, закрытый путь с n точками состоит из n кусочков.

Предусловие
n >= 0	20
n <= LEN(p)	21
(s = fill)  =>  (path = closedPoly) OR (path = closedBezier)	22
(s >= 0) OR (s = fill)	23
path IN {closedPoly, openPoly, closedBezier, openBezier}	25
path = openPoly
	n >= 2	20
path = closedPoly
	n >= 2	20
path = openBezier
	n >= 4	20
	n MOD 3 = 1	24
path = closedBezier
	n >= 3	20
	n MOD 3 = 0	24

PROCEDURE (f: Frame) MarkRect (l, t, r, b, s: INTEGER; mode: INTEGER; show: BOOLEAN)
NEW
Помечает прямоугольник (праллельный осям координат) шириной r - l и высотой b - t. Если s < 0, прямоугольник заполняется некоторым образом, зависящим от параметра mode. Иначе прямоугольник рисуется как линия толщиной s. Рамка рисуется внутри прямоугольника. Если s = 0, используется очень тонкая рамка (волосяная линия).
Смысл mode зависит от реализации, но это дожно изменять помеченную область видимым образом. show указывает, когда пометка рисуется или убирается. Вызов MarkRect с show и сразу после этого с hide (с теми же параметрами) должна восстанавливать точное состояние, которое было до первого вызова.

Предусловие
(l <= r) & (t <= b)	20
s >= 0	21
mode IN {invert, hilite, dim25, dim50, dim75}	22

PROCEDURE (f: Frame) Scroll (dx, dy: INTEGER)
NEW
Смещает содержимое курьера на вектор (dx, dy). Смещение происходит полностью внутри прямоугольника курьера, то есть, точки за его пределами никогда не записываются и не считываются. Содержимое части прямоугольника, которая оказывается открытой, неопределено.
Назначение Scroll - ускорить операции прокрутки путем использования существующих растровых данных вместо полной перерисовки.
Однако при особых обстоятельствах эта процедура может не копировать растровые данные, а вместо этого принуждать приложение восстанавливать часть прямоугольника.
Внимание: эта операция может быть использована только для интерактивных портов, в целях обновления экрана монитора после действий пользователя.


Рис. 6. Эффект операции Scroll

PROCEDURE (f: Frame) SetCursor (cursor: INTEGER)
NEW
Установка курсора по переданному значению.
SetCursor используется для в циклах обработки перетаскивания мышью.

Предусловие
cursor IN {arrowCursor..refCursor}	20

PROCEDURE (f: Frame) Input (OUT x, y: INTEGER; OUT modifiers: SET; OUT isDown: BOOLEAN)
NEW
Запрашивает текущую позицию мыши и то, какие кнопки в настоящий момент нажаты.
В modifiers возвращаются нажатые в настоящий момент клавиши модификации, например, Controller.doubleClick, Controllers.modify, и, возможно, дополнительные модификаторы, специфичные для платформы.

PROCEDURE (f: Frame) DrawString (x, y: INTEGER; col: Color; IN s: ARRAY OF CHAR;
																	font: Fonts.Font)
NEW
Рисует строку из однобайтовых символов цветом col и шрифтом font на основной линии y.

Предусловие
font # NIL	20

PROCEDURE (f: Frame) DrawSString (x, y: INTEGER; col: Color; IN s: ARRAY OF SHORTCHAR;
																	font: Fonts.Font)
NEW
Рисует строку из однобайтовых символов цветом col и шрифтом font на основной линии y.

Предусловие
font # NIL	20

PROCEDURE (f: Frame) CharIndex (x, pos: INTEGER; IN s: ARRAY OF CHAR;
																	font: Fonts.Font): INTEGER
NEW
Беря строку s на позиции x, CharIndex определяет номер символа, который попадает на позицию pos. Result = 0 означает, что pos совпадает или находится левее первого символа s, result = n - 1, где n - это количество символов в строке s, означает, pos совпадает или находится правее последнего символа s.

Предусловие
font # NIL	20

PROCEDURE (f: Frame) SCharIndex (x, pos: INTEGER; IN s: ARRAY OF SHORTCHAR;
																	font: Fonts.Font): INTEGER
Беря строку s на позиции x, CharIndex определяет номер символа, который попадает на позицию pos. Result = 0 означает, что pos совпадает или находится левее первого символа s, result = n - 1, где n - это количество символов в строке s, означает, pos совпадает или находится правее последнего символа s.

Предусловие
font # NIL	20

PROCEDURE (f: Frame) CharPos (x, index: INTEGER; IN s: ARRAY OF CHAR;
																	font: Fonts.Font): INTEGER
Беря строку s на позиции x, CharPos определяет позицию символа index в s. Возвращается позиция левое границы символа.

Предусловие
font # NIL	20

PROCEDURE (f: Frame) SCharPos (x, index: INTEGER; IN s: ARRAY OF SHORTCHAR;
																	font: Fonts.Font): INTEGER
Беря строку s на позиции x, CharPos определяет позицию символа index в s. Возвращается позиция левое границы символа.

Предусловие
font # NIL	20


VAR background: Color	background >= 0
Эта переменная задает цвет, который используется для фона окна.

VAR dialogBackground: Color	dialogBackground >= 0
Это переменная задает цвет, который используется для фона диалога.


PROCEDURE IsPrinterPort (p: Port): BOOLEAN
Определяет, когда порт представляет собой принтер.

PROCEDURE RGBColor (red, green, blue: INTEGER): Color
Создает Color из красного, зеленого и синего компонентов.

Предусловие
0 <= red < 256	20
0 <= green < 256	21
0 <= blue < 256	22

Постусловие
result = blue * 65536  +  green * 256  + red