ОПИСАНИЕ

Тип Image определяет прямоугольное изображение и методы для отрисовки; это также строительный блок
для высокоуровневых объектов, таких как окна и шрифты. В особенности окна, они представлены как Image,
и для рисования ни них не нужны никакие специальные операторы.

r Координаты прямоугольника в плоскости, где Image имеет определённые значение пикселей.
Они не должны мсодифицироватся после создания изображения.
clipr Выделенная область: операции чтения или записи будут невозможны за пределами clipr.
Часто clipr совпадает с r, но они могут и отличатся; (в часности см. repl).Выделенную область можно динамически изменять используя replclipr (q.v.).
chan Дескриптор формата пиксельного канала, описанный в image(6).Он не должны мсодифицироватся после создания изображения.
depth Число бит в пикселе (глубина цвета в картинке) идентично chantodepth(chan) [см. graphics(2)] и представлен для удобства. Значение не должно мсодифицироватся после создания изображения.
repl Логическая переменная которая определяет мозаичный ли рисунок покрывающий плоскость при использывании рисунка как источника для рисования.
Если repl == 0; операции ограничены пересечением r и clipr.
Если repl установлена, r определяет секцию которая будет дублирована сверху
  clipr определяет размеры покрываемой плоскости.
другими словами r дублируется закрывая clipr; в таком случае r и clipr независимы друг от друга.
Для примера: перекрываемая картинка для которой r установлена в ((0, 0), (1, 1)) а clipr установлена в ((0, 0), (100, 100)),
  при помощи 1го синего пикселя r имеет синий цвет, и выглядет идентично изображению для которого
обе переменные r и clipr установлены в ((0, 0), (100, 100)) и все пиксели синего цвета.
Тем немение первый рисунок требует значительно меньше памяти.
Дублирующий флаг можно динамически изменять используя replclipr (q.v.).

Большинство графических функций находятся в 2х формах: в основной и расширенной, которые взяты как
дополнительная Drawop определённая Porter–Duff составным оператором для использования.
Базовая форма принемает оператор SoverD, что достаточно для большенство приложений.
Расширенная форма образуется добовлением суффикса –op к базовой форме.
Ниже перечислены только базовые формы.

draw(dst, r, src, mask, p)

Draw стандартная графическая функция. Только пиксели находящиеся в пределах пересечения dst–>r и dst–>clipr будут использованы.
Draw игнорирует dst–>repl.
Суть в следующем (это описание поведения а не реалезации)

1. Если repl установлен в src или mask, то копировать его содержимое для заполнения выделенного прямоугольника.
2. Перевести src и mask так чтобы p выровнелось с r.min .
3. Привести r к соединению r и dst–>r.
4. Соединить r с src–>clipr. Если src–>repl ложь также соединить r с src–>r.
5. Соединить r с mask–>clipr. Если mask–>repl ложь также соединить r с mask–>r.
6. Для каждой позиции в r объеденить dst pixel с src pixel используя alpha значение для соответствующего mask pixel.
Если mask является alpha-каналом то alpha значение для соответствующего mask pixel это пиксель alpha-канала.
Иначе alpha значение берется по NTSC greyscale эквивалентно цветовому значению,
с белым непрозрачныи и чёрным прозрачным значениями. В терминах Porter–Duff составной алгебры,
draw заменяет dst pixels с (src в mask) через dst. (В расширенной форме , ``через'' заменяется на -op).
При совмещении различных пиксельных каналов идентичность форматов не обязательна. Если совмещенные каналы меньше 8–bits,
они будут продвигаться перед вычислением, повторяя существующие биты; после вычисления лишние биты будут отсечены
до соответствующего размера.

gendraw(dst, r, src, p0, mask, p1)

Gendraw аналогичен draw за исключением того что gendraw выравнивает source и mask иначе:
src выравнивает p0 так чтобы соотвецтвовать r.min и mask выравнивает p1 так чтобы соотвецтвовать r.min.
Для большенства целей простой маски и исходной картинки достаточно для вычерчивания, но gendraw это общий оператор
и все другие графические примитивы сформированы на нем.

drawreplxy(min,max,x)

Отсекает x в полуоткрытом интервале [min, max) к суммированию или вычетанию кратным max–min .

drawrepl(r,p)

Отсекает указатель p в пределах прямоугольника r переводя указатель целому,
кратно ширене прямоугольника и вертикально кратно высоты.

Отсекает указатель p в пределах прямоугольника r через перевод горизонтального указателя целочисленно кратного ширине прямоугольника
и целочисленно кратного высоты.

Определяет точку p в пределах прямоугольника r через преведение горизонтального указателя к целочисленному виду кратного ширине
прямоугольника и целочисленно кратного высоты.

Clips the point p to be within the rectangle r by translating the point horizontally by an integer multiple of rectangle width and vertically by the height.


replclipr(i,repl,clipr)

Поскольку само изображение хранится на сервере, то локальное изменение структуры Image будет безполезна.
Repclipr меняет локальные поля repl и clipr структуры Image, и уведомляет об этом сервер.

line(dst, p0, p1, end0, end1, thick, src, sp)

Line чертит в dst линию толщеной 1+2*thick пикселей соеденяя точки p0 и p1.
Линия чертится используя пиксели из src рисунка выравнивая так чтоб sp источник соотвецтвовал p0 назначению.
Линия прикасается к обеем p0 и p1 точкам, и end0, end1 определяют как заканчивать вычерчивание линии.
Квадратное окончание завершает линию перпендикулярно к направлению линии; толстая линия с квадратным окончанием
на оба конца станут прямоуголником.
Круглое окончание завершает линию диском диаметра 1+2*thick с центром в конечных точках.
Треугольное окончание завершает линию стреловидным окончанием чеё окончание косается конечных точек.
Макрос ARROW даёт явный контроль над формой стрелок. Если все 3и параметра нулевые, по умолчанию будет треугольное окончание.
Line и другие геометрические функции аналогичны вызову gendraw использующею маску производимой геометрической процедурой.

poly(dst, p, np, end0, end1, thick, src, sp)

Poly чертит основной многоугольник (polygon); в принципе это эквивалентно серии вызовов line соедененных смежными точками
в масиве Points p, с np элементами. Окончание многоугольника определяется также как и в функции line; внутреннии линии заканчиваются
с помощью Enddisc, для гладкого соединения. Источник выравнин таким образом чтобы sp соответствовал p[0].

fillpoly(dst, p, np, wind, src, sp)

Fillpoly похож на poly но он предназначен для заливки многоугольника очерченого контуром.
Источник выравнин таким образом чтобы sp соответствовал p[0]. Параметр wind решает неоднозначность о том что заполнять
если многоугольник самопересикается.
Если wind ~0, тогда пиксель внутри многоугольника если число wind около не нулевой точки.
Если wind 1, тогда пиксель внутри если число wind нечётное. Дополнительные переменные (0 или ~1) выбераеются за пределами заполненых пикселей.
Значение остальных переменных не определены. Многоугольник при необходимости закрывается line.

bezier(dst, a, b, c, d, end0, end1, thick, src, sp)

Bezier чертит кубические кривые Безье (http://ru.wikipedia.org/wiki/Кривые_Безье) определяя по точкам a, b, c, и d.
Окончания берутся из end0 и end1; толщина кривой 1+2*thick. Источник выравнин таким образом чтобы sp в src соответствовал dst.

bezspline(dst, p, end0, end1, thick, src, sp)(для сопряжения фрагментов изображения)

Bezspline имеет теже аргументы чтои poly но чертит квадратный Би-сплайн (несмотря на имя лучше чем многоугольник).
Если первая и последняя точки в p равны, сплайн имеет переодическое условия окончания.

bezsplinepts(pt, npt, pp)

Bezsplinepts возвращает в pp список точек созданным открытым многоугольником чтобы bezspline начертил.
Вызывающая функция отвецтвенна за освобождение *pp.

fillbezier(dst, a, b, c, d, wind, src, sp)

Fillbezier тоже для bezier что и fillpoly для poly.

fillbezspline(dst, p, wind, src, sp)

Fillbezspline похож на fillpoly но заполняет квадратный Би-сплайн вместо многоугольника, начертившего контур p.
Сплайн дочерчивается линеей если это необходимо.

ellipse(dst, c, a, b, thick, src, sp)

Ellipse чертит в dst эллипс с центром в c и с горизонтальными и вертикальными директрисами a и b.
Источник выравнин таким образом чтобы sp в src соответствовал с в dst. Эллипс вытянут с толщеной 1+2*thick.

fillellipse(dst, c, a, b, src, sp)

Fillellipse похож на эллипс но он предназначен для заливки эллипса очерченого контуром.

arc(dst, c, a, b, thick, src, sp, alpha, phi)

Arc похож на эллипс но чертится только часть эллипса начинающегося при угле Альфа и расширяющеяся через угол Фи.
Углы измеряются в градусах против часовой стрелки от положительной оси x .

fillarc(dst, c, a, b, src, sp, alpha, phi)

Fillarc похож на arc, но заполняет сектор исходным цветом.

icossin(deg, cosp, sinp)

Icossin хронит в *cosp и *sinp косинус и синус угла deg представленные целыми скалярами, в градусах.
Переменные представленны так что cos(0) есть 1024.

icossin2(x, y, cosp, sinp)

Icossin2 аналогична icossin, но угол представлен неявным образом, точкой (x,y). Это icossin с atan2 равным atan (см. sin(2)).

border(dst, r, i, color, sp)

Border очерчивает прямоугольник r заданным цветом; ширеной i; есле возможно бордюр идет внутри прямоугольника; иначе снаружи.
Источник выравнин таким образом чтобы sp соответствовал r.min.

string(dst, p, src, sp, font, s)

String чертит в dst символы определенные в строке s и font; это эквивалентно серии вызовов gendraw используя src как источник и маску определённую
формой символа. Позиция текста устанавликается слева от первого символа на p.x и сверху от линии текста на p.y. Источник установлен таким образом
чтобы sp в src соответствовал p в dst. String возвращает структуру Point которая указывает на следующий символ который должен быть напечатан еслибы
строка былабы длиннее. Для символов у которых нет изображения в соответствующем шрифте будет начерчен 0 (NUL).
Поведение остальных строковых базовых функции можно узнать по их именам.
имена содержащие rune, предназначены для UTF–encoded bytes.
имена оканчивающиеся на n, принемают аргумент n который определяет число символов для печати, применим для NUL–terminated string.
имена содержащие bg заливают фон позади символов, цвет (bg) выравнивание (bgp); обычно текст оставляет фон нетронутым.
имена оканчивающиеся на _string собирают все эти свойства в одном операторе.
Длинну стороки всегда определяет len независимо от того UTF string или Rune string. Если bg не ноль, то значение bg используется как цвет фона.
Аргумент clipr разрешает дополнительное управление прикреплением во время прорисовки строки. имеет смысл при управлении ограниченной
протяженности текста.

drawsetdebug(on)

Включает или выключает debugging output (обычно это последовательность строк)