Открыть сервис

CGContextRef

CGContextRef — это непрозрачный тип данных (opaque type) в среде разработки Apple, используемый для представления графического контекста в фреймворке Core Graphics (также известном как Quartz 2D). CGContextRef служит основным объектом, через который выполняются все операции двумерного векторного и растрового рисования, включая отрисовку линий, фигур, текста, изображений, градиентов и теней. Он является центральным элементом графического стека в операционных системах macOS, iOS, iPadOS, tvOS и watchOS.

История

Core Graphics, частью которого является CGContextRef, был разработан компанием Apple Inc. как преемник более ранних графических систем, таких как QuickDraw для классической Mac OS. Первая версия Core Graphics была представлена в 2000 году вместе с операционной системой Mac OS X 10.0 (Cheetah). CGContextRef был введён как универсальный интерфейс для работы с графическим контекстом, заменив устаревшие процедуры QuickDraw. В 2007 году, с выходом iPhone OS 1 (позднее переименованной в iOS), Core Graphics и CGContextRef были портированы на мобильные устройства, став основой для рендеринга пользовательских интерфейсов и графики в приложениях. С тех пор тип данных остаётся стабильным и обратно совместимым, хотя в более высокоуровневых фреймворках, таких как UIKit и SwiftUI, его использование стало менее прямым.

Определение и сущность

CGContextRef является указателем на структуру CGContext, которая хранит состояние графического контекста. Это состояние включает в себя:

  • Текущее преобразование (матрица аффинного преобразования, CTM).
  • Текущий путь (набор линий и кривых для последующей заливки или обводки).
  • Текущие цвета для заливки и обводки.
  • Текущий шрифт и его параметры.
  • Текущие параметры сглаживания, прозрачности и композиции.
  • Текущую область отсечения (clipping area).

Контекст может быть связан с различными целевыми поверхностями: растровым изображением (bitmap context), окном (window context), PDF-файлом (PDF context) или принтером (printer context). CGContextRef не является потокобезопасным: большинство операций с ним должны выполняться из одного потока, если не указано иное в документации.

Создание и управление

CGContextRef создаётся с помощью специальных функций Core Graphics, в зависимости от целевой поверхности. Наиболее распространённые способы:

  • CGBitmapContextCreate — создаёт контекст для рисования в растровое изображение (массив пикселей в памяти). Требует указания ширины, высоты, количества бит на компонент, количества бит на пиксель, количества байт на строку, цветового пространства и флагов битовой информации.
  • UIGraphicsGetCurrentContext (в iOS/iPadOS) — возвращает текущий контекст, установленный фреймворком UIKit при вызове метода drawRect: у UIView.
  • CGContextRetain / CGContextRelease — управление временем жизни объекта через подсчёт ссылок (Core Foundation memory management). В современных проектах на Swift с использованием автоматического подсчёта ссылок (ARC) эти функции обычно не вызываются напрямую.

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

Основные операции

CGContextRef предоставляет широкий набор функций для рисования. Ключевые группы операций:

Работа с путями

  • CGContextBeginPath — начинает новый путь.
  • CGContextMoveToPoint — перемещает текущую точку пути.
  • CGContextAddLineToPoint — добавляет отрезок прямой.
  • CGContextAddCurveToPoint — добавляет кубическую кривую Безье.
  • CGContextAddArc — добавляет дугу окружности.
  • CGContextClosePath — замыкает текущий подпуть.
  • CGContextStrokePath — обводит текущий путь.
  • CGContextFillPath — заливает текущий путь.

Цвет и заливка

  • CGContextSetFillColorWithColor — устанавливает цвет заливки.
  • CGContextSetStrokeColorWithColor — устанавливает цвет обводки.
  • CGContextSetAlpha — задаёт уровень прозрачности.
  • CGContextSetBlendMode — устанавливает режим смешивания (например, нормальный, умножение, экран).

Текст

  • CGContextSetFont — задаёт шрифт.
  • CGContextSetFontSize — задаёт размер шрифта.
  • CGContextShowTextAtPoint — выводит текст в заданной точке (устаревшая функция, рекомендуется использовать Core Text).

Изображения

  • CGContextDrawImage — рисует изображение (CGImageRef) в заданном прямоугольнике.
  • CGContextDrawTiledImage — рисует изображение с повторением (тайлинг).

Градиенты и тени

  • CGContextDrawLinearGradient — рисует линейный градиент.
  • CGContextDrawRadialGradient — рисует радиальный градиент.
  • CGContextSetShadow — устанавливает тень для последующих операций.

Преобразования

  • CGContextTranslateCTM — смещает систему координат.
  • CGContextScaleCTM — масштабирует систему координат.
  • CGContextRotateCTM — поворачивает систему координат.
  • CGContextConcatCTM — применяет произвольное аффинное преобразование.

Область отсечения

  • CGContextClip — обрезает область рисования по текущему пути.
  • CGContextClipToRect — обрезает область рисования по прямоугольнику.

Применение

CGContextRef используется в различных сценариях разработки под платформы Apple:

  • Кастомное рисование в UIView — переопределение метода drawRect: для создания пользовательских элементов интерфейса, таких как графики, диаграммы, анимации.
  • Создание и редактирование изображений — генерация растровых изображений программно, например, для создания иконок, текстур или скриншотов.
  • Рендеринг PDF — создание PDF-документов с помощью CGPDFContext (подкласс CGContextRef) или отрисовка страниц существующего PDF.
  • Печать — подготовка данных для печати через контекст принтера.
  • Обработка изображений — низкоуровневая манипуляция пикселями, наложение фильтров и эффектов.
  • Разработка игр и графических приложений — в сочетании с OpenGL или Metal для отрисовки 2D-элементов.

Пример использования

Ниже приведён упрощённый пример на языке C, демонстрирующий создание растрового контекста и рисование красного круга:

```c

include <CoreGraphics/CoreGraphics.h>

CGContextRef createBitmapContext(size_t width, size_t height) { CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, 0, colorSpace, kCGImageAlphaPremultipliedFirst); CGColorSpaceRelease(colorSpace); return context; }

void drawRedCircle(CGContextRef context, CGFloat x, CGFloat y, CGFloat radius) { CGContextSetRGBFillColor(context, 1.0, 0.0, 0.0, 1.0); // Красный цвет CGContextBeginPath(context); CGContextAddArc(context, x, y, radius, 0, 2 * M_PI, 0); CGContextClosePath(context); CGContextFillPath(context); }

int main() { CGContextRef ctx = createBitmapContext(200, 200); drawRedCircle(ctx, 100, 100, 50); CGImageRef image = CGBitmapContextCreateImage(ctx); // Далее image можно использовать, например, для отображения в UIImageView CGImageRelease(image); CGContextRelease(ctx); return 0; } ```

Особенности и ограничения

  • Производительность — Core Graphics использует аппаратное ускорение на современных устройствах, но частые вызовы функций CGContextRef в цикле могут снизить производительность. Для высокопроизводительной графики рекомендуется использовать Metal или SpriteKit.
  • Координатная система — в macOS и iOS используются разные системы координат по умолчанию: в macOS ось Y направлена вверх, в iOS — вниз. Для корректного отображения может потребоваться трансформация.
  • Управление памятью — все объекты Core Graphics, включая CGContextRef, управляются через механизм Core Foundation (CFRetain/CFRelease). В Swift при использовании Core Graphics напрямую необходимо явно управлять памятью или использовать обёртки.
  • Обратная совместимость — CGContextRef поддерживается на всех версиях macOS начиная с 10.0 и iOS начиная с 2.0, однако некоторые функции (например, работа с цветовыми пространствами) могут быть устаревшими или заменёнными.

Связь с другими фреймворками

CGContextRef является низкоуровневым API. На практике разработчики чаще используют более высокоуровневые обёртки:

  • UIKit (iOS/iPadOS) — класс UIGraphicsImageRenderer и методы drawRect:.
  • AppKit (macOS) — класс NSGraphicsContext и методы drawRect:.
  • SwiftUI — протокол Shape и модификаторы drawingGroup.
  • Core Image — для фильтров и обработки изображений.
  • Core Animation — для анимации слоёв (CALayer), которые могут использовать CGContextRef для отрисовки своего содержимого.

Источники

  • Apple Inc. Core Graphics Programming Guide (документация разработчика).
  • Apple Inc. CGContext Reference (официальная документация по API).
  • Apple Inc. Quartz 2D Programming Guide.
  • Книга: Mark Dalrymple, Scott Knaster. Learn Objective-C on the Mac (раздел по Core Graphics).
  • Статья: «Core Graphics Tutorial: Getting Started» на сайте Ray Wenderlich (Kodeco).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →