Зарисовка - QuickDraw

Зарисовка это 2D графика библиотека и связанные Интерфейс прикладного программирования (API) который является основной частью классическая Mac OS Операционная система. Первоначально он был написан Билл Аткинсон и Энди Херцфельд. QuickDraw все еще существовал как часть библиотек Mac OS X, но были в значительной степени вытеснены более современными Кварцевый графическая система. В Mac OS X v10.4, QuickDraw официально устарел. В Mac OS X v10.5 приложения, использующие QuickDraw, не могут использовать добавленную 64-разрядную поддержку. В Mac OS X v10.8, Из операционной системы была удалена поддержка заголовков QuickDraw. Приложения, использующие QuickDraw, по-прежнему будут работать под OS X 10.8–10.13; однако текущие версии Xcode и macOS SDK не содержат файлов заголовков для компиляции таких программ.[1]

Принципы QuickDraw

QuickDraw был основан на Яблочная Лиза LisaGraf начала 1980-х годов и была разработана, чтобы хорошо сочетаться с Паскаль интерфейсы и среды разработки ранних яблоко системы. Кроме того, QuickDraw был растровая графика система, которая определяет пиксель в качестве основной единицы графической информации. Это в отличие от векторная графика системы, в которых графические примитивы определены в математических терминах и растрированы в соответствии с требованиями разрешения дисплея. Однако растровая система требует гораздо меньшей вычислительной мощности, и это была преобладающая парадигма во время разработки QuickDraw.

QuickDraw определил ключевую структуру данных, графику порт, или GrafPort. Это была логическая область рисования, где можно было рисовать графику. Наиболее очевидным "объектом" на экране, соответствующим GrafPort, был окно, но весь рабочий стол может быть GrafPort, а порты вне экрана также могут существовать.

GrafPort определил система координат. В QuickDraw разрешение было 16. биты, давая 65 536 уникальных вертикальных и горизонтальных местоположений. Они пронумерованы от -32 767 в крайнем левом (или верхнем) углу до +32 767 в крайнем правом (или нижнем) углу. Окно обычно настраивалось так, чтобы верхний левый угол его области содержимого располагался на 0,0 в соответствующем GrafPort. Область содержимого окна не включала рамку окна, падающая тень или заголовок (если есть).

Координаты QuickDraw относятся к бесконечно тонким линиям между пиксель локации. Фактический пиксель был нарисован в пространстве непосредственно справа и под координатой. Это помогло программистам избежать графических сбоев, вызванных отдельные ошибки.

На Macintosh пиксели были квадратными, а GrafPort имел разрешение по умолчанию 72 пикселя на дюйм, выбранное в соответствии с принятыми в полиграфической промышленности соглашениями о 72 пикселях на дюйм. точки на дюйм.

QuickDraw также содержит ряд функций масштабирования и отображения.

QuickDraw поддерживает ряд глобальные переменные на процесс, главным из которых является текущий порт. Первоначально это упростило API, поскольку все операции относились к «текущему порту», ​​но по мере развития ОС такое использование глобального состояния также сделало QuickDraw намного сложнее для интеграции с современными подходами к проектированию, такими как многопоточность и упреждающая многозадачность. Для решения этих проблем Углерод API (мост между Mac OS 9 и Mac OS X) добавил дополнительные параметры к некоторым подпрограммам, разрешив (непрозрачное) хранение информации о потоках и новую (не опрашиваемую) структуру событий.

Графические примитивы

Все, что видно на классическом экране Mac OS, отрисовывается QuickDraw, но сама библиотека довольно низкого уровня. Он может рисовать следующие примитивные объекты:

  • Линии
  • Прямоугольники
  • Закругленные (и овальные) прямоугольники с углами
  • Овалы (включая круги и эллипсы)
  • Дуги (и клинья) круглые и овальные
  • Многоугольники (произвольные замкнутые формы, построенные из списка точек, соединенных линиями)
  • Регионы (произвольные наборы пикселей - см. Ниже)
  • Растровые изображения и Пиксельные карты
  • Текст

Каждый из этих объектов (кроме текста) может быть нарисован с помощью «пера», которое может иметь любые прямоугольные размеры, узор или цвет. Обратите внимание: поскольку перо имеет прямоугольную форму и выровнено по оси, диагональные линии будут толще, чем горизонтальные или вертикальные. Фигуры можно рисовать с заливкой или рамкой, используя любой узор или цвет. Закрашенная дуга образует клин. Текст может быть нарисован любым установленным шрифтом, в различных стилистических вариациях, любого размера и цвета. В зависимости от того, как хранится выбранный шрифт, текст можно масштабировать различными способами: TrueType шрифты будут плавно масштабироваться до любого размера, тогда как растровые шрифты обычно плохо масштабируются.

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

Набор атрибутов пера и рисования текста связан с GrafPort.

Регионы являются ключевой структурой данных в QuickDraw. Они определяют произвольный набор пикселей, скорее как растровое изображение, но в сжатом виде, которым можно очень быстро управлять сложными способами. Регионы можно объединять (объединять), вычитать (разница) и XORed для формирования других регионов. Их можно использовать в GrafPort для вырезка, или нарисованные с заливкой или рамкой, как любая другая форма. Ряд фигур в рамке и связанных линий можно объединить в область. Область не обязательно должна состоять из непрерывного набора пикселей - отдельные области возможны и обычны. Хотя области могут допускать мощные графические манипуляции, они ограничены текущей реализацией, которая ограничивает максимальный размер хранения данных области шестнадцатиразрядным значением, и поэтому они не практичны в качестве универсального инструмента композиции для рисования, а практическое использование с высоким разрешением также ограничено. Регионы лежат в основе остальной части QuickDraw, позволяя вырезать произвольные формы, что важно для реализации нескольких перекрывающихся окон. Изобретенные Биллом Аткинсоном, регионы были запатентованы Apple как отдельное изобретение.[1]

Регион указывается (после первоначального создания) открытие области, рисование различных фигур QuickDraw и закрытие область. Скрытые подпрограммы создают область по мере выполнения команд QuickDraw. Растровые изображения также могут быть преобразованы в области, а растровые изображения могут быть созданы из областей путем «закрашивания» или «заполнения» области в графическом порту.

Внутренняя структура области, за исключением длины хранилища и ограничивающего его прямоугольника, непрозрачна - опубликованных Apple документов нет, хотя механизм описан в патенте. Регионы реализованы как по вертикали, так и по горизонтали. сжатие. Область сохраняется в виде серии горизонтальных линий развертки ("растры "), каждая из которых содержит вертикальную координату, за которой следует список координат горизонтальной инверсии. Каждую точку инверсии можно рассматривать как переключение включения в регион для всех точек после нее: первая точка включает регион, вторая - его выключить и т. д. Дальнейшее сжатие достигается за счет сохранения каждой строки по-разному: каждая строка содержит только отличия от предыдущей строки, а не полный набор точек инверсии. Наконец, идентичные соседние строки развертки эффективно кодируются путем простого их пропуска. Таким образом, часто используемая область, прямоугольник с закругленными углами, эффективно кодируется, и сложные операции, такие как композиция области и обрезка изображения, могут выполняться без необходимости в длительных циклах процессора или больших объемов памяти (исходные системы, выполняющие код QuickDraw использованные процессоры, работающие с тактовой частотой 8 мегагерц, и системы имели только 128 килобайт записываемой памяти.)

Поскольку области привязаны к определенной ориентации, поворот области на девяносто градусов потребует как подробных обратный инжиниринг структуры и обширного кодирования. Обычное вращение непрактично по сравнению с вращением исходного описания границы источника и простым созданием новой области. Однако API включает процедуры преобразования в растровые изображения и обратно. (Растровые изображения также можно вращать, используя хорошо известные методы, но с различной степенью ухудшения качества изображения в зависимости от выбранного угла, доступных для операции циклов памяти и процессора, а также сложности алгоритма.)

Apple недавно (в Углеродный API ) определяли регионы как непрозрачную структуру при некоторых вариантах компиляции программы.

Операции более высокого уровня

Любую серию графических вызовов QuickDraw можно записать в структуру, называемую Картина. Затем его можно сохранить в памяти и «воспроизвести» в любое время, воспроизводя графическую последовательность. Во время воспроизведения изображение может быть помещено в новые координаты или масштабировано. Картинка может быть сохранена на диске в том виде, в каком она определяет Apple ИЗОБРАЖЕНИЕ формат.

Весь BitMap (или PixMap, когда речь идет о цветных изображениях) может быть скопирован из одного GrafPort в другой с масштабированием и обрезкой. Известный как болтовня, или CopyBitsпосле имени функции эта операция является основой большинства анимационных и спрайтовых эффектов на Mac.

QuickDraw предоставляет аналогичную функцию копирования, которая предназначена для реализации прокрутки в GrafPort - изображение в порту может быть перемещено в новое место без масштабирования (но с обрезкой, если это необходимо).

Каждая операция графического примитива осуществляется через StdProcs, серию указатели на функции хранится в GrafPort. Это ограниченное полиморфизм позволяет переопределить отдельные операции или заменить их пользовательскими функциями, что позволяет принтер драйверы для перехвата графических команд и преобразования их в подходящие операции принтера. Таким образом, QuickDraw можно визуализировать с помощью PostScript, факт, который позволил Macintosh практически изобрести настольная издательская система.

Похоже на подкласс структура данных Window начиналась со связанного с ним GrafPort, что, по сути, делало окна взаимозаменяемыми с любым GrafPort. Хотя это удобно, это может быть источником ошибок программирования.

История

QuickDraw начала свою жизнь как Лиза Граф как часть Яблочная Лиза развитие. Для Macintosh он был сначала упрощен, но позже расширен. Первоначально QuickDraw GrafPorts поддерживал только битовую глубину 1, то есть один бит на пиксель, или черно-белое изображение. Это подходило для встроенного экрана раннего Macintosh с фиксированным размером 512 × 342 пикселей. Ограниченный цвет был поддержан с использованием необработанного планарный модель, позволяющая QuickDraw управлять некоторыми типами матричный принтер которые использовали разноцветные ленты, но очень немногие приложения поддерживали эту функцию.

В 1987 г. Macintosh II был разработан и запущен, который был спроектирован как более обычная конструкция с тремя коробками - Компьютер, монитор и клавиатура все отдельно. Поскольку монитор был отдельным и больше оригинального Mac, видео архитектуру пришлось обязательно изменить. Кроме того, Mac II перевел Macintosh с черно-белого на полноцветный. Apple также решила в это время впервые в отрасли поддержать единый рабочий стол, охватывающий несколько мониторов. Таким образом был создан Color QuickDraw, значительное расширение оригинального QuickDraw. В исходной архитектуре не хватало возможностей для расширения, но использовался ряд хаки, разработчикам Apple удалось сделать добавление цвета и новую архитектуру видео практически незаметными как для разработчиков, так и для конечных пользователей.

Color QuickDraw представила новые структуры данных, в том числе GDevices для представления каждой подключенной видеокарты / монитора и новую структуру Color GrafPort (CGrafPort) для обработки цвета, а также PixMaps вместо BitMaps для изображений с несколькими битами на пиксель. Один из использованных здесь уловок совместимости заключался в том, что новая структура имела точно такой же размер, как и старая, с большинством элементов данных в том же месте, но с дополнительными дескрипторами и указателями на структуры цвета вместо полей BitMap. Два верхних бита rowBytes использовались в качестве флагов, чтобы отличить GrafPort от CGrafPort (они всегда были равны нулю на GrafPorts старого стиля, потому что BitMap никогда не мог быть настолько широким, чтобы когда-либо устанавливать эти биты). Использование этих двух старших битов вернется к QuickDraw позже, поскольку оно установило максимальную ширину строки всего 4095 на 32-битных пиксельных картах, что стало проблематичным для работы с графикой высокого разрешения. Более поздняя разработка (Carbon) устранила это ограничение, но не была полностью обратно совместима. В Color QuickDraw был также добавлен диспетчер палитры, который управлял арбитражем цветов на индексированных видеоустройствах. Большинство операций с графическими примитивами остались либо без изменений (но работали в цвете), либо были добавлены новые цветовые версии черно-белых API.

Изначально Color QuickDraw могла работать только с 1, 2, 4 и 8-битными видеокартами, которые были всем, что было доступно в то время. Вскоре, однако, появились 24-битные видеокарты (так называемый истинный цвет), и QuickDraw был снова обновлен, чтобы поддерживать до 32 бит на пиксель (в действительности, 24 бит, с 8 неиспользованными) данных цвета («32-битный Зарисовка"). Однако архитектура всегда позволяла это, поэтому новые API не требовались. Сами структуры данных цвета допускали глубину цвета 1, 2, 4, 8, 15 и 24 бита, давая 2, 4, 16, 256, 32 768 и 16 777 216 цветов соответственно или 4, 16 и 256 шкал серого. QuickDraw позаботился об управлении передискретизацией цветов в соответствии с доступной глубиной цвета фактического видеооборудования или передачей между закадровыми буферами изображения, включая опционально дизеринг изображения на более низкую глубину для улучшения качества изображения. Также был добавлен набор утилит выборки цвета, чтобы программисты могли создавать оптимальные цветовые палитры для использования с индексированными видеоустройствами.

Архитектура QuickDraw всегда позволяла создавать GrafPorts и связанные с ними BitMaps или PixMaps «за кадром», где графика могла быть скомпонована в памяти, не будучи видимой сразу на экране. Пиксели могут передаваться между этими закадровыми портами и экраном с помощью QuickDraw. болтовня функция CopyBits. Такой закадровый композитинг - это рабочая лошадка для игр и приложений с интенсивной графикой. Однако до появления 32-битного QuickDraw такие закадровые миры должны были создаваться и настраиваться вручную программистом в его приложении и включать три или более отдельных и довольно сложных структур данных (CGrafPort, PixMap и GDevice , а для проиндексированных устройств таблица поиска цветов и ее обратная) может быть подвержена ошибкам. В 32-битном QuickDraw была добавлена ​​поддержка ОС для обработки этого с помощью «Offscreen Graphics World» или GWorld. Видеобуфер (PixMap) GWorld может храниться в основной памяти или, если он доступен, в неиспользуемых частях видеопамяти, где копирование на экран может быть оптимизировано по скорости, избегая необходимости передавать большой объем пиксельных данных по основной шина памяти.

С появлением QuickTime, QuickDraw получил возможность работать со сжатыми растровыми данными, такими как JPEG. Менеджер сжатия изображений QuickTime тесно интегрирован с QuickDraw: в частности, вызовы распаковки изображений были полноценными вызовами рисования QuickDraw, а если изображение записывалось, сжатый данные будут сохраняться как часть изображения для отображения при последующем отрисовке изображения. Диспетчер сжатия изображений также добавил интеграцию с ColorSync подбор цвета.

После этого, помимо изменений в серверной части для оптимизации для новых архитектур процессоров (PowerPC ), QuickDraw оставался практически неизменным на протяжении всего остального периода существования классической Mac OS. QuickDraw GX и QuickDraw 3D разделяли имя QuickDraw и могли взаимодействовать с QuickDraw PixMap и структурами данных изображений, но в остальном были полностью разделены по функциональности.

В Mac OS X QuickDraw стал частью Углерод API. В 2005 году с выпуском Mac OS X 10.4 QuickDraw официально устарела.

В 2010 г. MacPaint 1,3-х исходный код выпуск через Музей истории компьютеров,[2] также стала доступна историческая версия исходного кода QuickDraw.[3]

Смотрите также

использованная литература

  1. ^ «Проблема 18098: сбой сборки« Build Applet.app »в OS X 10.8 - трекер Python». bugs.python.org.
  2. ^ «Исходный код MacPaint и QuickDraw». Музей истории компьютеров. 20 июля 2010 г.
  3. ^ Хессельдаль, Эрик (20.07.2010). «Apple передает исходный код MacPaint Музею истории компьютеров». businessweek.com. Архивировано из оригинал на 2012-02-09. Получено 2014-08-23.

внешние ссылки