Образцы

Образец является последовательностью операций рисования, неоднократно красящейся к графическому контексту. Можно использовать образцы таким же образом, как Вы используете цвета. При рисовании использования образца Кварц делит страницу на ряд ячеек образца, с каждой ячейкой размер изображения образца, и рисует каждую ячейку с помощью обратного вызова, который Вы обеспечиваете. Рисунок 6-1 показывает образец, нарисованный контексту графики окна.

Рисунок 6-1  образец, нарисованный к окну
A pattern drawn to a window

Анатомия образца

Ячейка образца является основным компонентом образца. Ячейка образца для образца, показанного на рисунке 6-1, показана на рисунке 6-2. Черный прямоугольник не является частью образца; это нарисовано для показа, где заканчивается ячейка образца.

Рисунок 6-2  ячейка образца
A pattern cell

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

  Ячейки Образца рисунка 6-3 с черными прямоугольниками, нарисованными для показа границ каждой ячейки
Pattern cells with black rectangles drawn to show the bounds of each cell

Можно указать, как далеко независимо Кварц рисует запуск каждой ячейки образца от следующего в горизонтальных и вертикальных направлениях. Ячейки образца на рисунке 6-3 нарисованы так, чтобы запуск одной ячейки образца был точно шириной образца кроме следующей ячейки образца, приводящей к каждой ячейке образца, примыкающей к следующему. Ячейки образца на рисунке 6-4 имеют пространство, добавленное в обоих направлениях, горизонтали и вертикальный. Можно указать различные значения интервала для каждого направления. Если Вы делаете интервал меньше, чем ширина или высота ячейки образца, перекрытия ячеек образца.

  Интервал рисунка 6-4 между ячейками образца
Spacing between pattern cells

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

Если Вы не хотите, чтобы Кварц преобразовал ячейку образца, можно указать единичную матрицу. Однако можно достигнуть интересных эффектов путем предоставления матрицы преобразования. Рисунок 6-5 показывает эффект масштабирования ячейки образца, показанной на рисунке 6-2. Рисунок 6-6 демонстрирует вращение ячейки образца. Перевод ячейки образца является немного более тонким. Рисунок 6-7 показывает источник образца, с ячейкой образца, переведенной в обоих направлениях, горизонтали и вертикальный, так, чтобы образец больше не примыкал к окну, как это делает на рисунке 6-1.

Рисунок 6-5  масштабированный
A scaled pattern cell
образец cellFigure 6-6
  повернутый
A rotated pattern cell
образец cellFigure 6-7
  переведенная ячейка образца
A translated pattern cell

Окрашенные образцы и получают (бесцветные) образцы с помощью шаблона

Окрашенным образцам связали свойственные цвета с ними. Изменитесь окраска раньше создавала ячейку образца, и образец теряет свое значение. Шотландская клетчатая материя (такая как демонстрационная, показанная на рисунке 6-8), является примером цветного образца. Цвет в цветном образце указан как часть процесса создания ячейки образца, не как часть процесса рисования образца.

Рисунок 6-8  цветной образец имеет свойственный цвет
A colored pattern has inherent color

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

Рисунок 6-9  образец шаблона не имеет свойственного цвета
A stencil pattern does not have inherent color

Можно создать или вид образца — окрашенный или шаблон — в 2D Кварце.

Мозаичное размещение

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

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

Как работают образцы

Образцы работают так же к цветам, в которых Вы устанавливаете заливку или перечеркиваете образец и затем вызываете функцию рисования. Кварц использует образец, который Вы устанавливаете как «краска». Например, если Вы хотите нарисовать заполненный прямоугольник сплошным цветом, Вы сначала вызываете функцию, такой как CGContextSetFillColor, установить цвет заливки. Тогда Вы вызываете функцию CGContextFillRect для рисования заполненного прямоугольника цветом, Вы указываете. Для рисования образцом Вы сначала вызываете функцию CGContextSetFillPattern установить образец. Тогда Вы вызываете CGContextFillRect для фактического рисования заполненного прямоугольника образцом, Вы указываете. Различие между рисованием с цветами и с образцами - то, что необходимо определить образец. Вы предоставляете образец и информацию о цвете к функции CGContextSetFillPattern. Вы будете видеть, как создать, установить, и нарисовать образцы в Рисовании Цветных Образцов и Рисовании Образцов Шаблона.

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

  1. Сохраняет состояние графики.

  2. Переводит текущую матрицу преобразования в источник ячейки образца.

  3. Связывает CTM с матрицей образца.

  4. Клипы к ограничительному прямоугольнику ячейки образца.

  5. Вызывает Ваш обратный вызов получения для рисования ячейки образца.

  6. Восстанавливает состояние графики.

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

Рисование цветных образцов

Пять шагов, которые необходимо выполнить для рисования цветного образца, описаны в следующих разделах:

  1. Запишите функцию обратного вызова, рисующую цветную ячейку образца

  2. Установите цветное цветовое пространство образца

  3. Установите анатомию цветного образца

  4. Укажите цветной образец как заливку или перечеркните образец

  5. Нарисуйте с цветным образцом

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

Запишите функцию обратного вызова, рисующую цветную ячейку образца

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

Ваша функция рисования ячейки образца является обратным вызовом, следующим за этой формой:

typedef void (*CGPatternDrawPatternCallback) (
                        void *info,
                        CGContextRef context
    );

Можно назвать обратный вызов вообще, Вам нравится. Тот в Перечислении 6-1 называют MyDrawColoredPattern. Обратный вызов берет два параметра:

  • info, универсальный указатель на частные данные связался с образцом. Этот параметр является дополнительным; можно передать NULL. Данные, переданные Вашему обратному вызову, являются теми же данными, которыми Вы снабжаете позже при создании образца.

  • context, графический контекст для рисования ячейки образца.

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

  • Размер образца объявляется. Необходимо помнить размер образца, поскольку Вы пишете свой код для прорисовки. Здесь, размер объявляется как глобальная переменная. Функция получения в частности не относится к размеру, кроме комментария. Позже, Вы указываете размер образца к 2D Кварцу. Посмотрите Установленный Анатомия Цветного Образца.

  • Функция получения следует за прототипом, определенным CGPatternDrawPatternCallback определение типа обратного вызова.

  • Получение выполнило в цветах кодовых наборов, который делает это цветным образцом.

Перечисление 6-1  обратный вызов получения, рисующий цветную ячейку образца

#define H_PATTERN_SIZE 16
#define V_PATTERN_SIZE 18
 
void MyDrawColoredPattern (void *info, CGContextRef myContext)
{
    CGFloat subunit = 5; // the pattern cell itself is 16 by 18
 
    CGRect  myRect1 = {{0,0}, {subunit, subunit}},
            myRect2 = {{subunit, subunit}, {subunit, subunit}},
            myRect3 = {{0,subunit}, {subunit, subunit}},
            myRect4 = {{subunit,0}, {subunit, subunit}};
 
    CGContextSetRGBFillColor (myContext, 0, 0, 1, 0.5);
    CGContextFillRect (myContext, myRect1);
    CGContextSetRGBFillColor (myContext, 1, 0, 0, 0.5);
    CGContextFillRect (myContext, myRect2);
    CGContextSetRGBFillColor (myContext, 0, 1, 0, 0.5);
    CGContextFillRect (myContext, myRect3);
    CGContextSetRGBFillColor (myContext, .5, 0, .5, 0.5);
    CGContextFillRect (myContext, myRect4);
}

Установите цветное цветовое пространство образца

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

Перечисление 6-2  , Создающее основное цветовое пространство образца

CGColorSpaceRef patternSpace;
 
patternSpace = CGColorSpaceCreatePattern (NULL);// 1
CGContextSetFillColorSpace (myContext, patternSpace);// 2
CGColorSpaceRelease (patternSpace);// 3

Вот то, что делает код:

  1. Создает цветовое пространство образца, подходящее для цветного образца путем вызывания функции CGColorSpaceCreatePattern, передача NULL как пространство основного цвета.

  2. Устанавливает пространство цвета заливки в цветовое пространство образца. При перечеркивании образца вызвать CGContextSetStrokeColorSpace.

  3. Освобождает цветовое пространство образца.

Установите анатомию цветного образца

Информация об анатомии образца хранится в объекте CGPattern. Вы создаете объект CGPattern путем вызывания функции CGPatternCreate, чей прототип показан в Перечислении 6-3.

Перечисление 6-3  прототип функции CGPatternCreate

CGPatternRef CGPatternCreate (  void *info,
                                CGRect bounds,
                                CGAffineTransform matrix,
                                CGFloat xStep,
                                CGFloat yStep,
                                CGPatternTiling tiling,
                                bool isColored,
                                const CGPatternCallbacks *callbacks );

info параметр является указателем на данные, которые Вы хотите передать Вашему обратному вызову получения. Это - тот же указатель, обсужденный в Записи Функция обратного вызова, Рисующая Цветную Ячейку Образца.

Вы указываете размер ячейки образца в bounds параметр. matrix параметр - то, где Вы указываете матрицу образца, отображающую систему координат образца на систему координат по умолчанию графического контекста. Используйте единичную матрицу, если Вы хотите нарисовать образец с помощью той же системы координат в качестве графического контекста. xStep и yStep параметры указывают пространство по горизонтали и пространство по вертикали между ячейками в системе координат образца. Посмотрите Анатомию Образца для рассмотрения информации о границах, матрице образца и интервале.

tiling параметр может быть одним из трех значений:

Посмотрите Мозаичное размещение для рассмотрения информации о мозаичном размещении.

isColored параметр указывает, является ли ячейка образца цветным образцом (true) или образец шаблона (false). Если Вы передаете true здесь, Ваш обратный вызов образца получения указывает цвет образца, и необходимо установить цветовое пространство образца в цветное цветовое пространство образца (см. Установленный Цветное Цветовое пространство Образца).

Последний параметр Вы передаете функции CGPatternCreate указатель на a CGPatternCallbacks структура данных. Эта структура имеет три поля:

struct CGPatternCallbacks
{
    unsigned int version;
    CGPatternDrawPatternCallback drawPattern;
    CGPatternReleaseInfoCallback releaseInfo;
};

Вы устанавливаете version поле к 0. drawPattern поле является указателем на Ваш обратный вызов получения. releaseInfo поле является указателем на обратный вызов, это вызывается, когда объект CGPattern выпущен, для выпуска хранения для info параметр Вы передали своему обратному вызову получения. Если Вы не передавали данных в этом параметре, Вы устанавливаете это поле в NULL.

Укажите цветной образец как заливку или перечеркните образец

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

Эти функции каждый берет три параметра:

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

  • CGPattern возражают, что Вы создали ранее

  • Массив компонентов цвета

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

CGFloat alpha = 1;
 
CGContextSetFillPattern (myContext, myPattern, &alpha);

Нарисуйте с цветным образцом

После завершения предыдущих шагов можно вызвать любой Кварц красящая 2D функция. Ваш образец используется в качестве «краски». Например, можно вызвать CGContextStrokePath, CGContextFillPath, CGContextFillRect, или любая другая красящая функция.

Полная цветная функция рисования образца

Код в Перечислении 6-4 содержит функцию, красящую цветной образец. Функция включает все шаги, обсужденные ранее. Подробное объяснение каждой пронумерованной строки кода следует за перечислением.

Перечисление 6-4  функция, красящая цветной образец

void MyColoredPatternPainting (CGContextRef myContext,
                 CGRect rect)
{
    CGPatternRef    pattern;// 1
    CGColorSpaceRef patternSpace;// 2
    CGFloat         alpha = 1,// 3
                    width, height;// 4
    static const    CGPatternCallbacks callbacks = {0, // 5
                                        &MyDrawPattern,
                                        NULL};
 
    CGContextSaveGState (myContext);
    patternSpace = CGColorSpaceCreatePattern (NULL);// 6
    CGContextSetFillColorSpace (myContext, patternSpace);// 7
    CGColorSpaceRelease (patternSpace);// 8
 
    pattern = CGPatternCreate (NULL, // 9
                    CGRectMake (0, 0, H_PSIZE, V_PSIZE),// 10
                    CGAffineTransformMake (1, 0, 0, 1, 0, 0),// 11
                    H_PATTERN_SIZE, // 12
                    V_PATTERN_SIZE, // 13
                    kCGPatternTilingConstantSpacing,// 14
                    true, // 15
                    &callbacks);// 16
 
    CGContextSetFillPattern (myContext, pattern, &alpha);// 17
    CGPatternRelease (pattern);// 18
    CGContextFillRect (myContext, rect);// 19
    CGContextRestoreGState (myContext);
}

Вот то, что делает код:

  1. Объявляет хранение для объекта CGPattern, создающегося позже.

  2. Объявляет хранение для цветового пространства образца, создающегося позже.

  3. Объявляет переменную для альфы и устанавливает его в 1, который указывает непрозрачность образца как абсолютно непрозрачную.

  4. Объявляет, что переменная содержит высоту и ширину окна. В этом примере образец красится по области окна.

  5. Объявляет и заполняет структуру обратных вызовов, передавая 0 как версия и указатель на функцию обратного вызова получения. Этот пример не обеспечивает информационный обратный вызов выпуска, так, чтобы поле было установлено в NULL.

  6. Создает объект цветового пространства образца, устанавливая пространство основного цвета образца в NULL. Когда Вы красите цветной образец, предоставления образца, его собственные раскрашивают обратный вызов получения, который является, почему Вы устанавливаете цветовое пространство в NULL.

  7. Устанавливает пространство цвета заливки в объект цветового пространства образца, который что Вы просто создали.

  8. Выпускает объект цветового пространства образца.

  9. Передачи NULL потому что образцу не нужна никакая дополнительная информация, переданная обратному вызову получения.

  10. Передает объект CGRect, указывающий границы ячейки образца.

  11. Передает матрицу CGAffineTransform, указывающую, как перевести пространство образца в пространство пользователя по умолчанию контекста, в котором используется образец. Этот пример передает единичную матрицу.

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

  13. Передает размер ДНА в вертикальной плоскости как вертикальное смещение между запуском каждой ячейки.

  14. Передает константу kCGPatternTilingConstantSpacing указать, как Кварц должен представить образец. Для получения дополнительной информации посмотрите Мозаичное размещение.

  15. Передачи true для isColored параметр, чтобы указать, что образец является цветным образцом.

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

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

  18. Выпускает объект CGPattern.

  19. Заполняет прямоугольник, который является размером окна, переданного MyColoredPatternPainting подпрограмма. Кварц заполняет прямоугольник с помощью образца, который Вы просто устанавливаете.

Рисование образцов шаблона

Пять шагов, которые необходимо выполнить для рисования образца шаблона, описаны в следующих разделах:

  1. Запишите функцию обратного вызова, рисующую ячейку образца шаблона

  2. Установите цветовое пространство образца шаблона

  3. Установите анатомию образца шаблона

  4. Укажите образец шаблона как заливку или перечеркните образец

  5. Рисование с образцом шаблона

Это фактически те же шаги, которые Вы используете для рисования цветного образца. Различие между этими двумя - то, как Вы устанавливаете информацию о цвете. Вы видите, как все шаги совмещаются в Полной Функции Рисования Образца Шаблона.

Запишите функцию обратного вызова, рисующую ячейку образца шаблона

Обратный вызов, который Вы пишете для рисования образца шаблона, следует за той же формой как описанный для цветной ячейки образца. Посмотрите Запись Функция обратного вызова, Рисующая Цветную Ячейку Образца. Единственная разница - то, что Ваш обратный вызов получения не указывает цвета. Ячейка образца, показанная на рисунке 6-10, не получает свой цвет от обратного вызова получения. Цвет выбран вне получения, раскрашивают цветовое пространство образца.

Рисунок 6-10  ячейка образца шаблона
A stencil pattern cell

Смотрите на код в Перечислении 6-5, рисующем ячейку образца, показанную на рисунке 6-10. Заметьте, что код просто создает путь и заполняет путь. Код не выбирает цвет.

Перечисление 6-5  обратный вызов получения, рисующий ячейку образца шаблона

#define PSIZE 16    // size of the pattern cell
 
static void MyDrawStencilStar (void *info, CGContextRef myContext)
{
    int k;
    double r, theta;
 
    r = 0.8 * PSIZE / 2;
    theta = 2 * M_PI * (2.0 / 5.0); // 144 degrees
 
    CGContextTranslateCTM (myContext, PSIZE/2, PSIZE/2);
 
    CGContextMoveToPoint(myContext, 0, r);
    for (k = 1; k < 5; k++) {
        CGContextAddLineToPoint (myContext,
                    r * sin(k * theta),
                    r * cos(k * theta));
    }
    CGContextClosePath(myContext);
    CGContextFillPath(myContext);
}

Установите цветовое пространство образца шаблона

Образцы шаблона требуют, чтобы Вы установили цветовое пространство образца для Кварца для рисования, как показано в Перечислении 6-6. Подробное объяснение каждой пронумерованной строки кода следует за перечислением.

  Код перечисления 6-6, создающий цветовое пространство образца для образца шаблона

CGPatternRef pattern;
CGColorSpaceRef baseSpace;
CGColorSpaceRef patternSpace;
 
baseSpace = CGColorSpaceCreateWithName (kCGColorSpaceGenericRGB);// 1
patternSpace = CGColorSpaceCreatePattern (baseSpace);// 2
CGContextSetFillColorSpace (myContext, patternSpace);// 3
CGColorSpaceRelease(patternSpace);// 4
CGColorSpaceRelease(baseSpace);// 5

Вот то, что делает код:

  1. Эта функция создает универсальное пространство RGB. Универсальные цветовые пространства оставляют согласование цветов системе. Для получения дополнительной информации посмотрите Создающие Универсальные Цветовые пространства.

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

  3. Устанавливает цветовое пространство для использования при заполнении образца. Можно установить пространство цвета обводки путем вызывания функции CGContextSetStrokeColorSpace.

  4. Выпускает объект цветового пространства образца.

  5. Выпускает объект пространства основного цвета.

Установите анатомию образца шаблона

Вы указываете информацию об анатомии образца путем, Вы были бы для цветного образца — путем вызывания функции CGPatternCreate. Единственная разница - то, что Вы передаете false для isColored параметр. Посмотрите Установленный Анатомия Цветного Образца для получения дополнительной информации о параметрах, которые Вы предоставляете к CGPatternCreate функция.

Укажите образец шаблона как заливку или перечеркните образец

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

Эти функции каждый берет три параметра:

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

  • CGPattern возражают, что Вы создали ранее

  • Массив компонентов цвета

Образец шаблона не предоставляет цвет в обратном вызове получения, таким образом, необходимо передать цвет заливке или штриховым функциям для информирования Кварца что цвет использовать. Перечисление 6-7 показывает пример того, как выбрать цвет для образца шаблона. Значения в цветовой гамме интерпретируются Кварцем в цветовом пространстве, которое Вы устанавливаете ранее. Поскольку этот пример использует устройство RGB, цветовая гамма содержит значения для красных, зеленых, и синих компонентов. Четвертое значение указывает непрозрачность цвета.

  Код перечисления 6-7, устанавливающий непрозрачность для цветного образца

static const CGFloat color[4] = { 0, 1, 1, 0.5 }; //cyan, 50% transparent
 
CGContextSetFillPattern (myContext, myPattern, color);

Рисование с образцом шаблона

После завершения предыдущих шагов можно вызвать любой Кварц красящая 2D функция. Ваш образец используется в качестве «краски». Например, можно вызвать CGContextStrokePath, CGContextFillPath, CGContextFillRect, или любая другая красящая функция.

Полная функция рисования образца шаблона

Код в Перечислении 6-8 содержит функцию, красящую образец шаблона. Функция включает все шаги, обсужденные ранее. Подробное объяснение каждой пронумерованной строки кода следует за перечислением.

Перечисление 6-8  функция, красящая образец шаблона

#define PSIZE 16
 
void MyStencilPatternPainting (CGContextRef myContext,
                                const Rect *windowRect)
{
    CGPatternRef pattern;
    CGColorSpaceRef baseSpace;
    CGColorSpaceRef patternSpace;
    static const CGFloat color[4] = { 0, 1, 0, 1 };// 1
    static const CGPatternCallbacks callbacks = {0, &drawStar, NULL};// 2
 
    baseSpace = CGColorSpaceCreateDeviceRGB ();// 3
    patternSpace = CGColorSpaceCreatePattern (baseSpace);// 4
    CGContextSetFillColorSpace (myContext, patternSpace);// 5
    CGColorSpaceRelease (patternSpace);
    CGColorSpaceRelease (baseSpace);
    pattern = CGPatternCreate(NULL, CGRectMake(0, 0, PSIZE, PSIZE),// 6
                  CGAffineTransformIdentity, PSIZE, PSIZE,
                  kCGPatternTilingConstantSpacing,
                  false, &callbacks);
    CGContextSetFillPattern (myContext, pattern, color);// 7
    CGPatternRelease (pattern);// 8
    CGContextFillRect (myContext,CGRectMake (0,0,PSIZE*20,PSIZE*20));// 9
}

Вот то, что делает код:

  1. Объявляет, что массив содержит значение цвета, и устанавливает значение (который будет в цветовом пространстве RGB) к непрозрачному зеленому.

  2. Объявляет и заполняет структуру обратных вызовов, передавая 0 как версия и указатель на функцию обратного вызова получения. Этот пример не обеспечивает информационный обратный вызов выпуска, так, чтобы поле было установлено в NULL.

  3. Создает цветовое пространство устройства RGB. Если образец нарисован к дисплею, необходимо предоставить этот тип цветового пространства.

  4. Создает объект цветового пространства образца из цветового пространства устройства RGB.

  5. Устанавливает пространство цвета заливки в объект цветового пространства образца, который что Вы просто создали.

  6. Создает объект образца. Обратите внимание на то, что предпоследний параметр — isColored параметр — false. Образцы шаблона не предоставляют цвет, таким образом, необходимо передать false для этого параметра. Все другие параметры подобны переданным для цветного примера образца. Посмотрите, что Полный Цветной Образец Красит Функцию.

  7. Устанавливает узор заливки, передавая цветовую гамму, объявленную ранее.

  8. Выпускает объект CGPattern.

  9. Заполняет прямоугольник. Кварц заполняет прямоугольник с помощью образца, который Вы просто устанавливаете.