Графические контексты

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

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

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

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

Графические основы контекста

Основное задание любого графического объекта контекста должно поддержать информацию о текущем состоянии среды получения. В Кварце графический объект контекста связан с окном, битовым массивом, файлом PDF или другим устройством вывода и поддерживает информацию для того устройства. То же является истиной для контекста графики Какао, но потому что получение Какао основано на представлении, некоторые дополнительные изменения внесены в среду получения перед Вашим представлением drawRect: метод вызывают.

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

В то время как текущий контекст фокусируется на Вашем представлении, можно нарисовать пути, изображения, текст или любое другое содержание, которое Вы хотите. Можно также изменить атрибуты текущей среды получения для достижения появления, которое Вы хотите для своего содержания. В конечном счете, содержание Вы, которых получение отправляется Кварцевому Наборщику, где это объединено с содержанием от других представлений в окне и сброшено на экран или устройство вывода.

После Вашего drawRect: возвраты метода, Какао проходит через процесс сброса среды получения для следующего представления. Это возвращается любые изменения, которые Вы внесли в среду получения и устанавливаете координатное преобразование и область отсечения для следующего представления, давая ему его собственную нетронутую среду, в которой можно работать. Этот процесс тогда повторяет себя во время каждого цикла обновления в Вашем приложении.

Текущий контекст

Каждый поток в приложении Какао имеет свой собственный графический объект контекста для данного окна. Можно получить доступ к этому объекту от кода с помощью currentContext метод NSGraphicsContext, как показано в следующем примере:

NSGraphicsContext* aContext = [NSGraphicsContext currentContext];

currentContext метод всегда возвращает объект контекста графики Какао, который является подходящим для текущей среды получения. Этот объект отслеживает текущее состояние графики, позволяет Вам сохранить и восстановить информацию о состоянии графики, и позволяет Вам изменить много атрибутов состояния графики. Изменения, которые Вы вносите в состояние графики, влияют на все последующие вызовы получения. При изменении атрибута несколько раз только новая установка используется.

Для сохранения текущего состояния графики Вы используете saveGraphicsState метод NSGraphicsContext. Этот метод по существу продвигает копию текущего состояния на штабель, оставлять Вас освобождает для внесения изменений в текущее состояние. Когда Вы хотите вернуться назад к предыдущему состоянию, Вы просто вызываете restoreGraphicsState метод, чтобы вытолкать текущее состояние графики (включая все изменения начиная с последнего сохранения) прочь штабеля и восстановить предыдущее состояние.

Если Вы планируете изменить текущее состояние графики значительно, это - хорошая идея сохранить текущее состояние прежде, чем внести Ваши изменения. Изменение одного или двух атрибутов обычно может не заслуживать сохранение состояния графики, так как можно сбросить или изменить те отдельные атрибуты легко. Однако при изменении больше чем одного или двух атрибутов обычно проще сохранить и восстановить все состояние графики. Можно вызвать saveGraphicsState метод как часто по мере необходимости в Вашем коде для сохранения снимков текущего состояния графики но, несомненно, необходимо будет сбалансировать каждый вызов с соответствующего вызова к restoreGraphicsState.

Следующий пример показывает простое drawRect: метод, выполняющий итерации по массиву определенных разработчиками объектов, каждый из которых нарисован с различным набором атрибутов. Состояние графики сохраняется и восстанавливается во время каждой итерации цикла, гарантируя, что каждый объект запускается с того же состояния графики.

- (void)drawRect:(NSRect)rect
{
    NSGraphicsContext* theContext = [NSGraphicsContext currentContext];
 
    int i;
    int numObjects = [myObjectArray count];
 
    // Iterate over an array of objects
    // Set the attributes for each before drawing
    for (i = 0; i < numObjects; i++)
    {
        [theContext saveGraphicsState];
 
        // Set the drawing attributes
 
        // Draw the object
 
        [theContext restoreGraphicsState];
    }
}

Информация о состоянии графики

Каждый объект контекста графики Какао поддерживает информацию о текущем состоянии среды получения. Эта информация колеблется от глобальных настроек рендеринга до атрибутов, используемых для рендеринга текущего пути, и является той же информацией состояния, сохраненной Кварцем. Каждый раз, когда Вы сохраняете текущее состояние графики, Вы сохраняете копию настроек, перечисленных в Таблице 2-1.

Табличная 2-1  информация о Состоянии графики

Атрибут

Описание

Текущая матрица преобразования (CTM)

Карты указывают в системе координат представления на точки в системе координат устройства назначения. Какао изменяет CTM прежде, чем вызвать Ваше представление drawRect: метод. Можно использовать NSAffineTransform объект изменить CTM далее для изменения источника получения масштабируйте холст или поверните систему координат. Для получения дополнительной информации посмотрите Системы координат, и Преобразовывает.

Область Clipping

Указывает область холста, который может быть нарисован путем рисования вызовов. Какао изменяет область отсечения к видимой области Вашего представления прежде, чем вызвать drawRect: метод. Можно использовать NSBezierPath возразите для дальнейшего отсечения видимой области. Для получения дополнительной информации посмотрите Установку Области Отсечения.

Ширина строки

Указывает ширину путей. Ширина строки по умолчанию 1.0 но можно изменить это значение с помощью NSBezierPath объект. Для получения дополнительной информации посмотрите Ширину Строки.

Стиль соединения строки

Указывает, как объединены две связанных строки. Стиль соединения по умолчанию NSMiterLineJoinStyle но можно изменить это значение с помощью NSBezierPath объект. Для получения дополнительной информации посмотрите Стили соединения Строки.

Стиль окончания линии

Указывает появление открытой точки на пути. Стиль окончания линии по умолчанию NSButtLineCapStyle но можно изменить это значение с помощью NSBezierPath объект. Для получения дополнительной информации посмотрите Стили Окончания линии.

Стиль тире строки

Определяет поврежденный образец для строк, включая начальную фазу для стиля. Нет никакого стиля тире по умолчанию, приводящего к сплошным линиям. Вы изменяете стили тире для пути с помощью NSBezierPath объект. Для получения дополнительной информации посмотрите Атрибуты Пути Установки.

Предельный угол стыка строки

Когда к строкам нужно присоединиться со скосом вместо среза, определяет. Применяется только, когда стиль соединения строки установлен в NSMiterLineJoinStyle. Длина среза разделена на ширину строки. Если получающееся значение больше, чем предельный угол стыка, скос используется. Значение по умолчанию 10.0 но можно изменить это значение с помощью NSBezierPath объект. Для получения дополнительной информации посмотрите Предельные углы стыка.

Значение плоскости

Указывает точность, с которой представляются кривые. (Это - также допуск максимальной погрешности, измеренный в пикселях.) Меньшие числа приводят к более гладким кривым за счет большего количества вычислений. Интерпретация этого значения может варьироваться немного на различных устройствах рендеринга. Значение по умолчанию 0.6 но можно изменить это значение с помощью NSBezierPath объект. Для получения дополнительной информации посмотрите Плоскость Строки.

Цвет обводки

Указывает цвет, используемый для рендеринга путей. Этот цвет применяется только к самой строке пути, не области, которую охватывает путь. Можно указать цвета с помощью любого из поддерживаемых системой цветовых пространств. Это значение включает информацию об альфе. Информацией о цвете управляют NSColor класс. Для получения дополнительной информации посмотрите Выбирающие Цвета и Образцы.

Цвет заливки

Указывает, что цвет раньше заполнял область, включенную путем. Можно указать цвета с помощью любого из поддерживаемых системой цветовых пространств. Это значение включает информацию об альфе. Информацией о цвете управляют NSColor класс. Для получения дополнительной информации посмотрите Выбирающие Цвета и Образцы.

Тень

Указывает теневые атрибуты для применения к представленному содержанию. Вы устанавливаете тени с помощью NSShadow класс. Для получения дополнительной информации посмотрите Добавляющие Тени к Нарисованным Путям.

Рендеринг намерения

Указывает, что метод раньше отображал цвета в палитре на палитру пространства текущего цвета. Какао не поддерживает установку этого атрибута непосредственно. Вместо этого необходимо использовать Кварц. Для получения дополнительной информации посмотрите Отображающиеся Физические цвета к Цветовому пространству.

Имя шрифта

Указывает шрифт для использования при рисовании текста. Вы изменяете информацию о шрифтах с помощью NSFont класс. Для получения дополнительной информации о рисовании текста посмотрите текстовые Атрибуты.

Размер шрифта

Указывает размер шрифта для использования при рисовании текста. Вы изменяете информацию о шрифтах с помощью NSFont класс. Для получения дополнительной информации о рисовании текста посмотрите текстовые Атрибуты.

Межсимвольный интервал шрифта

Указывает межсимвольный интервал для использования при рисовании текста. (Этот атрибут поддерживается только косвенно Какао.) Для получения дополнительной информации о рисовании текста, посмотрите текстовые Атрибуты.

Текстовый режим получения

Указывает, как представить текст. (Этот атрибут поддерживается только косвенно Какао.) Для получения дополнительной информации о рисовании текста, посмотрите текстовые Атрибуты.

Качество интерполяции изображения

Указывает, что процесс раньше интерполировал изображения во время рендеринга. Вы используете NSGraphicsContext класс для изменения этих настроек. Для получения дополнительной информации посмотрите Размер изображения и Разрешение

Операция Compositing

Указывает, что процесс раньше составлял источник и целевой материал вместе. (Составляющие композит операции, поддерживаемые Какао, связаны с Кварцевыми режимами смешивания, но отличаются по их использованию и поведению.) Вы используете NSGraphicsContext класс для установки значения по умолчанию для этой установки. Некоторые методы рендеринга и функции могут позволить Вам указать различную опцию. Для получения дополнительной информации посмотрите, что Установка Составляет Опции.

Глобальная альфа

Указывает глобальную альфу (прозрачность) значение для применения в дополнение к альфа-значению для данного цвета. Какао не поддерживает этот атрибут непосредственно. Если Вы хотите установить его, необходимо использовать CGContextSetAlpha функция в Кварце.

Настройка сглаживания

Указывает, ли искажение использования путей к ровным линиям, поскольку они пересекают границы пикселей. Вы используете NSGraphicsContext класс для изменения этих настроек. Для получения дополнительной информации посмотрите Установку параметров сглаживания.

Экранные холсты и холсты печати

В широком смысле объекты контекста графики Какао служат двум типам холстов: основанные на экране холсты и основанные на печати холсты. Основанный на экране графический контекст представляет содержание к окну, представлению или изображению с результатами, обычно появляющимися на экране. Основанный на печати графический контекст используется для рендеринга содержания к буферному файлу принтера, файлу PDF, файлу PostScript, файлу EPS или другому носителю, обычно связываемому с системой печати.

Для почти всего основанного на экране и основанного на печати получения Какао обеспечивает надлежащий графический объект контекста автоматически. Какао обеспечивает графический объект контекста во время всех обновлений представления и в ответ на пользователя, распечатывающего документ. Существуют ситуации, однако, где необходимо создать графический объект контекста вручную, включая следующее:

  • Используя команды OpenGL для рендеринга содержания представления

  • Рисование к внеэкранному битовому массиву

  • Создание PDF или данных EPS

  • Инициирование задания печати программно

Используя методы класса NSGraphicsContext, можно создать графические объекты контекста для рисования к основанным на экране холстам. Вы не можете использовать эти методы для основанного на печати холста, как бы то ни было. Какао направляет все операции печати через систему печати Какао, обрабатывающую задачу установки графического объекта контекста для Вас. Это означает, что, если Вы хотите генерировать данные PDF, данные EPS или печать к принтеру, необходимо использовать методы NSPrintOperation класс для создавания рабочего места печати для цели. Это также означает, что Ваши представления должны предоставить некоторую минимальную поддержку печати, если Вы хотите произвести хорошо-отформатированный-вывод для основанных на печати холстов.

Можно определить тип холста, являющегося управляемым текущим графическим контекстом с помощью isDrawingToScreen метод экземпляра или currentContextDrawingToScreen метод класса NSGraphicsContext. Для основанных на печати холстов можно использовать attributes метод для получения дополнительной информации о холсте, такой как, используется ли это для генерации файла EPS или PDF.

Для получения дополнительной информации о получении контекстов и для основанных на экране и для основанных на печати холстов, посмотрите Создающие Графические Контексты.

Графические контексты и кварц

NSGraphicsContext класс в Какао является оберткой для Кварцевого контекста графики (CGContextRef тип данных). Оба типа управляют той же основной информацией, и фактически, много методов NSGraphicsContext просто вызовите их Кварцевые эквиваленты. Это отношение упрощает выполнять любое Связанное с кварцем получение в Вашем приложении. Это также означает, что любое время у Вас есть контекст графики Какао (экземпляр NSGraphicsContext класс), у Вас есть Кварцевый контекст графики также.

Для получения информации о том, как использовать контексты графики Какао, чтобы вызвать Кварцевые функции, видеть Используя Кварц в Вашем Приложении.

Изменение текущего состояния графики

В Вашем представлении drawRect: метод, одна из первых вещей, которые можно хотеть сделать, изменяют текущую среду получения. Например, Вы могли бы хотеть сконфигурировать текущие цвета получения, изменение области отсечения, преобразовать систему координат, и т.д. Много атрибутов могут быть установлены непосредственно с помощью методов NSGraphicsContext но некоторые требуют использования других объектов. Следующие разделы перечисляют доступные атрибуты получения и как Вы изменяете их.

Выбирание цветов и образцов

Какао предоставляет поддержку для, раскрашивает множество различных цветовых пространств. NSColor класс поддерживает RGB, CMYK и полутоновые цветовые пространства по умолчанию, но может также поддерживать пробелы пользовательского цвета, определенные профилями ColorSync и ICC. Цвета, которые Вы указываете, включают цветовые каналы, подходящие для цветового пространства и дополнительного альфа-компонента для определения прозрачности цвета.

Для установки текущего штриха или атрибутов заливки создайте NSColor возразите и отправьте ему a set, setStroke, или setFill сообщение. Штрих и атрибуты заливки определяют цвет или образец для путей и областей, которые они включают. Текущие цвета обводки и цвета заливки влияют на все нарисованное содержание кроме текста, требующего приложения текстовых атрибутов; посмотрите Применение Цвета к тексту.

Для получения дополнительной информации о цветах и как создать их, посмотрите Цвет и Прозрачность.

Установка атрибутов пути

Для изменения значения атрибутов пути Вы используете NSBezierPath класс. Используя методы этого класса, можно установить ширину строки, стиль соединения строки, стиль тире строки, стиль окончания линии, предельный угол стыка, плоскость, и проветривающий атрибуты правила. Все эти атрибуты влияют на способ, которым пути представляются Какао.

Атрибуты пути прибывают в две разновидности: глобальная переменная и специфичный для пути. Когда Вы используете методы класса в NSBezierPath для установки значения «по умолчанию» для атрибута Вы устанавливаете глобальный атрибут. Глобальные атрибуты являются глобальной переменной к объектам контуров (в противоположность состоянию графики), таким образом устанавливание глобального атрибута влияет на все пути, Вы представляете использование NSBezierPath класс, но не влияет на Основанные на кварце пути. Для переопределения глобального атрибута для объекта отдельного тракта необходимо установить специфичное для пути значение. Например, для установки глобальной ширины строки Вы используете setDefaultLineWidth: метод класса NSBezierPath. Установить ширину строки для определенного NSBezierPath объект, Вы используете setLineWidth: метод экземпляра.

Для получения информации о том, как установить и значение по умолчанию и специфичные для пути атрибуты, и видеть получающееся появление представленного содержания, посмотрите Атрибуты Пути.

Установка текстовых атрибутов

Для большей части основанного на операция со строками получения в Какао Вы применяете текстовые атрибуты непосредственно к строкам, вместо того, чтобы полагаться на глобальные параметры шрифта. Строковые объекты Какао и текстовая система Какао оба поддерживают использование атрибутов для изменения появления строки. Для NSAttributedString объекты, Вы применяете атрибуты непосредственно к диапазонам символов в строке. Для постоянного клиента NSString объекты, Вы применяете атрибуты ко всей строке при рисовании ее.

Если Вы хотите установить глобальные параметры шрифта, сохраненные в состоянии графики, возможно для рисования строк с помощью Кварца, можно использовать NSFont возразите для установки семейства шрифтов и размера. После создания объекта шрифта Вы используете его метод установки применить информацию о шрифтах к текущему состоянию графики.

Для получения дополнительной информации о рисовании опций для текста, см. текст. Для получения дополнительной информации о текстовой системе Какао, посмотрите текстовое Руководство по архитектуре Какао.

Установка составляющих композит опций

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

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

Опции составления композита Какао отличаются от режимов смешивания, используемых в Кварце, несмотря на то, что эти два выполняют в основном ту же задачу. Опции Cocoa наследованы от среды NextStep, тогда как Кварцевые режимы смешивания являются частью более новой ОСНОВАННОЙ НА PDF модели рендеринга. Несмотря на их историческое наследство, опции Cocoa являются все еще очень мощным способом составить содержание и могут даже быть немного проще понять, чем их Кварцевые дубликаты.

Рисунок 2-1 показывает варианты составления композита Какао и как они влияют на представленное содержание. Наверху числа источник и целевое представляемое содержание. В то время как остальная часть листа непрозрачна, вены листа абсолютно прозрачны. В конечном изображении цвет представляется в частичной непрозрачности. Ниже этого результаты для каждой из поддерживаемых операций составления композита.

  Операции Составления композита рисунка 2-1 в Какао
Compositing operations in Cocoa

Таблица 2-2 перечисляет математические уравнения, используемые для вычислений пиксельных цветов во время составляющих композит операций. В каждом уравнении, R получающийся (предварительно умноженный) цвет, S исходный цвет, D целевой цвет, Sa альфа-значение исходного цвета, и Da альфа-значение целевого цвета. Все значения компонента цвета и альфа-значения находятся в диапазоне от 0 до 1 для этих вычислений.

Табличные 2-2  Математические уравнения для составления композита цветов

Параграф

Параграф

NSCompositeClear

R = 0

NSCompositeCopy

R = S

NSCompositeSourceOver

R = S + D*(1 - Sa)

NSCompositeSourceIn

R = S*Da

NSCompositeSourceOut

R = S*(1 - Da)

NSCompositeSourceAtop

R = S*Da + D*(1 - Sa)

NSCompositeDestinationOver

R = S*(1 - Da) + D

NSCompositeDestinationIn

R = D*Sa

NSCompositeDestinationOut

R = D*(1 - Sa)

NSCompositeDestinationAtop

R = S*(1 - Da) + D*Sa

NSCompositeXOR

R = S*(1 - Da) + D*(1 - Sa)

NSCompositePlusDarker

R = MAX(0, (1 - D) + (1 - S))

NSCompositePlusLighter

R = MIN(1, S + D)

Для установки текущей работы составления композита Вы используете setCompositingOperation: метод NSGraphicsContext. Если никакой другой оператор не указан, это устанавливает глобальную опцию составления композита использовать. Опция составления композита значения по умолчанию NSCompositeSourceOver.

Установка области отсечения

Область отсечения является полезным способом ограничить получение определенной частью Вашего представления. Вместо того, чтобы создать сложную графику вне экрана и затем составить их точно в Вашем представлении, можно использовать область отсечения для каширования частей представления, которое Вы не хотите измененный. Например, Вы могли бы использовать область отсечения, чтобы препятствовать тому, чтобы команды рисования дистиллировали, некоторые уже представили содержание. Точно так же Вы могли бы использовать область отсечения для включения определенных частей изображения, которое Вы хотите представить.

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

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

Для простых прямоугольных форм самый простой способ отсечь использует NSRectClip функция. Для указания многократных прямоугольных областей используйте NSRectClipList функция вместо этого. Для отсечения представления к непрямоугольной области необходимо использовать NSBezierPath объект. Путь, который Вы создаете, может быть произвольно сложным и включать многократные прямоугольные и непрямоугольные области. Как только у Вас есть путь, Вы хотите, используете объект addClip метод для добавления получающейся формы к текущей области отсечения. (Для получения информации о том, как создать пути, посмотрите Фундаментальные Формы Получения.)

Рисунок 2-2 показывает эффекты применения траектории отсечения к изображению. Главные изображения показывают изображение, которое будет отсечено и путь для использования для формы клипа, в этом случае состоящей из двух форм в сингле NSBezierPath объект. Несмотря на то, что форма клипа является тем же в обоих случаях, получающаяся область клипа отличается. Это вызвано тем, что отсечение принимает во внимание правило токовой обмотки при вычислении области отсечения.

  Траектории отсечения рисунка 2-2 и вьющиеся правила
Clipping paths and winding rules

Следующий пример показывает Вам, как создать область клипа, показанную на рисунке 2-2. Область клипа составлена из перекрывающегося квадрата и круга, таким образом, Вы просто добавляете прямоугольник и овальный с надлежащими размерами к объекту контуров Безье и вызываете addClip метод.

// If you plan to do more drawing later, it's a good idea
// to save the graphics state before clipping.
[NSGraphicsContext saveGraphicsState];
 
// Create the path and add the shapes
NSBezierPath* clipPath = [NSBezierPath bezierPath];
[clipPath appendBezierPathWithRect:NSMakeRect(0.0, 0.0, 100.0, 100.0)];
[clipPath appendBezierPathWithOvalInRect:NSMakeRect(50.0, 50.0, 100.0,  100.0)];
 
// Add the path to the clip shape.
[clipPath addClip];
 
// Draw the image.
 
[NSGraphicsContext restoreGraphicsState];

Установка параметров сглаживания

Поддержка контекстов графики какао, сглаживающаяся таким же образом, который делают их Кварцевые дубликаты. Сглаживание является процессом искусственного исправления зубчатого (или искаженный) граничный сопроводительный текст или формы в растровых изображениях. Эти зубчатые края происходят прежде всего в битовых массивах более низкого разрешения, где проще видеть отдельные пиксели. Для удаления зубчатых краев Какао использует различные цвета для пикселей, окружающих схему формы. Цвета, которые это использует, являются смешением исходного пиксельного цвета и цвета схемы формы. Путем смешивания цветов таким образом, края формы кажутся намного более гладкими. Рисунок 2-3 показывает то же изображение, искаженное и сглаженное.

Рисунок 2-3  сравнение искаженного и сглаженного содержания
A comparison of aliased and anti-aliased content

Чтобы включить или отключить сглаживание, используйте setShouldAntialias: метод NSGraphicsContext. Даже со сглаживанием отключенного, это может все еще появляться, как будто Какао рисует довольный искажение использования. При рисовании содержания на неграницах пикселей Какао может решить разделить строку по многократным пикселям, которые могут произвести впечатление искажения. Для получения дополнительной информации о том, как избежать этой ситуации, посмотрите Выполнение Точного пикселем Получения.

Создание графических контекстов

Тип привлечения Вас делает в Вашем приложении, определит, необходимо ли создать какие-либо графические объекты контекста явно или просто использовать одно Какао, предоставляет Вам. Если все, что Вы делаете, является получением в Ваших представлениях, можно, вероятно, просто использовать Предоставленный какао контекст. Это - истина и для основанного на экране и основанного на печати получения. Если Ваше приложение выполняет какой-либо другой тип получения, однако, Вы, возможно, должны создать графический контекст сами.

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

Создание основанного на экране контекста

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

Для рисования к окну можно использовать graphicsContextWithWindow: метод NSGraphicsContext. Контекст, который Вы возвращаете, инициализируется к самому окну, а не к определенному представлению. Фактически, если окно содержит много подпредставлений, Вы не можете хотеть использовать этот метод. Для рисования представлений должным образом, необходимо было бы обойти список подпредставлений вручную и сконфигурировать среду получения для каждого, который не рекомендуется. Вместо этого Вы использовали бы этот метод для рисования к внеэкранному буферу.

Для рисования к битовому массиву у Вас есть две опции. Если Ваш код работает в OS X v10.4 и позже, можно использовать graphicsContextWithBitmapImageRep: метод для создания объекта контекста фокусировался на NSBitmapImageRep объект. Получение, которое Вы делаете, тогда представляется непосредственно к битовому массиву. Если Ваш код должен работать на более ранних версиях OS X, необходимо или заблокировать внимание на представление или использовать внеэкранное окно и затем получить содержание представления или окна. Для получения информации и примеры того, как создать битовые массивы, посмотрите Создание Битового массива

Создание PDF или контекста PostScript

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

Самый простой способ создать PDF или файл EPS состоит в том, чтобы использовать dataWithPDFInsideRect: и dataWithEPSInsideRect: методы NSView. Эти методы конфигурируют задание печати автоматически и используют существующий код для прорисовки Вашего представления для генерации данных EPS или PDF. Для получения дополнительной информации и пример того, как использовать эти методы, посмотрите Создание Представление изображения EPS или PDF.

Для создавания рабочего места печати вручную Вы используете NSPrintOperation класс. Этот класс предлагает несколько методов класса для того, чтобы создать рабочие места печати для определенного представления и вывести задание к принтеру, файлу PDF или файлу EPS. Как только у Вас есть экземпляр NSPrintOperation класс, можно установить информацию о печати и использовать runOperation метод для запуска задания печати, в котором вступает во владение Какао точки.

Во время выполнения задания печати Какао вызывает несколько методов Вашего представления для обработки макета страницы и получения. Эти методы вызывают для всех путей печати, так реализация их для печати будет также поддерживать PDF и EPS. Для получения информации о том, как реализовать эти методы, см. Руководство по программированию Печати для Mac.

Поточная обработка и графические контексты

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

Во время нормального цикла обновления для окон все запросы получения отправлены к основному потоку Вашего приложения для обработки. Когда пользовательское событие инициировало изменение в Вашем пользовательском интерфейсе, нормальный цикл обновления происходит. В этой ситуации Вы вызвали бы setNeedsDisplay: или setNeedsDisplayInRect: метод (или display семья методов) от основного потока Вашего приложения для лишения законной силы частей представления, требующих перерисовки. Вы не должны вызывать эти методы ни от каких вторичных потоков.

Если Вы хотите обновить окно или представление от вторичного потока, необходимо вручную заблокировать внимание на окно или просмотреть и инициировать получение сами. Блокировка фокуса конфигурирует среду получения для графического контекста того окна. После того, как заблокированный, можно сконфигурировать среду получения, выпустить команды рисования, как обычно, и затем сбросить содержание графического контекста к буферу окна.

Для рисования регулярно на вторичном потоке, необходимо уведомить поток сами. Самый простой способ отправить регулярные уведомления использует NSTimer или NSAnimation объект. Для получения дополнительной информации о том, как анимировать содержание, посмотрите Усовершенствованные Методы Получения.

Создание битовых массивов на вторичных потоках является одним способом распараллелить Ваш код для прорисовки. Поскольку битовые массивы являются автономными объектами, они могут быть созданы безопасно на вторичных потоках. От Вашего потока необходимо было бы создать графический объект контекста явно (как описано в Создании Основанного на экране Контекста) и затем издать приказы получения для вовлечения растрового буфера. Для получения дополнительной информации о том, как создать битовые массивы, включая пример кода, посмотрите Создание Битового массива.