CGColorRef
CGColorRef — это тип данных, используемый в графическом фреймворке Core Graphics (также известном как Quartz 2D) в операционных системах Apple (macOS, iOS, iPadOS, watchOS, tvOS). Он представляет собой непрозрачный (opaque) объект, который инкапсулирует информацию о цвете, включая его цветовое пространство (color space) и компоненты (например, значения красного, зелёного, синего и альфа-канала). CGColorRef является фундаментальным строительным блоком для операций рисования, заливки, обводки и работы с градиентами в Core Graphics.
Назначение и роль в Core Graphics
Core Graphics — это низкоуровневый 2D-движок рендеринга, предоставляющий API на языке C. Он отвечает за отрисовку векторной графики, изображений, текста и теней. CGColorRef служит для представления цвета в этом контексте. В отличие от высокоуровневых абстракций, таких как UIColor (в UIKit) или NSColor (в AppKit), CGColorRef является более фундаментальным и независимым от фреймворка пользовательского интерфейса объектом. Он используется непосредственно при работе с графическими контекстами (CGContextRef), где задаёт свойства для рисования, такие как цвет заливки (fill color) и цвет обводки (stroke color).
Основные функции, принимающие CGColorRef, включают CGContextSetFillColorWithColor, CGContextSetStrokeColorWithColor, CGContextSetShadowWithColor и другие. Без CGColorRef невозможно выполнить базовые операции раскрашивания в Core Graphics.
Структура и свойства
CGColorRef является непрозрачным типом, то есть его внутренняя структура не раскрывается напрямую в публичном API. Доступ к его свойствам осуществляется через специальные функции Core Graphics.
Цветовое пространство (Color Space)
Каждый объект CGColorRef ассоциирован с определённым цветовым пространством, представленным типом CGColorSpaceRef. Цветовое пространство определяет, как интерпретировать числовые значения компонентов цвета. Наиболее распространённые цветовые пространства:
- sRGB — стандартное цветовое пространство для веба и большинства дисплеев. Используется по умолчанию во многих API Apple.
- Generic RGB — универсальное RGB-пространство, не привязанное к конкретному устройству.
- Generic Gray — монохромное (оттенки серого) пространство.
- Generic CMYK — цветовое пространство для печати (Cyan, Magenta, Yellow, Black).
- Generic Lab — пространство CIE Lab, используемое для точной цветопередачи.
- Device-dependent spaces — пространства, привязанные к характеристикам конкретного устройства (например, DeviceRGB, DeviceGray, DeviceCMYK). Их использование менее предпочтительно, так как результат может различаться на разных устройствах.
Компоненты цвета
Компоненты цвета — это массив чисел с плавающей точкой (тип CGFloat), значения которых интерпретируются в контексте соответствующего цветового пространства. Для RGB-пространства типичный массив содержит четыре значения: красный (Red), зелёный (Green), синий (Blue) и альфа-канал (Alpha). Значения каждого компонента обычно находятся в диапазоне от 0.0 до 1.0. Для серого пространства массив состоит из двух значений: яркость (Gray) и альфа. Для CMYK — из пяти: Cyan, Magenta, Yellow, Black и альфа.
Альфа-канал
Альфа-канал (Alpha) определяет прозрачность цвета. Значение 1.0 соответствует полностью непрозрачному цвету, 0.0 — полностью прозрачному. Альфа-канал всегда присутствует в CGColorRef, даже если он не был явно указан при создании (в этом случае он обычно принимается равным 1.0).
Паттерны (Patterns)
CGColorRef может представлять не только сплошной цвет, но и цветовой паттерн (шаблон). Паттерн создаётся с помощью CGPatternRef и может содержать повторяющееся изображение или другой элемент. В этом случае цветовое пространство паттерна обычно является специальным пространством CGColorSpaceCreatePattern.
Создание и управление
Core Graphics предоставляет несколько функций для создания и управления объектами CGColorRef.
Создание из компонентов
Наиболее распространённый способ — создание цвета из массива компонентов и цветового пространства. Функция CGColorCreate принимает CGColorSpaceRef и массив CGFloat:
``c CGColorSpaceRef rgbSpace = CGColorSpaceCreateDeviceRGB(); CGFloat components[] = {1.0, 0.0, 0.0, 1.0}; // Красный, непрозрачный CGColorRef redColor = CGColorCreate(rgbSpace, components); CGColorSpaceRelease(rgbSpace); ``
Создание из системных цветов
Для часто используемых цветов существуют константы, такие как kCGColorWhite, kCGColorBlack, kCGColorClear (полностью прозрачный). Эти константы являются предопределёнными объектами CGColorRef.
Создание из UIColor / NSColor
В Objective-C и Swift объекты UIColor (iOS) и NSColor (macOS) имеют свойство CGColor, которое возвращает соответствующий объект CGColorRef. Однако следует помнить, что этот объект может быть не копией, а внутренним представлением, и его жизненный цикл связан с родительским объектом UIColor/NSColor.
Управление памятью
Core Graphics использует ручное управление памятью (Manual Retain-Release, MRR) для C-типов. При создании CGColorRef через CGColorCreate или получении его через функцию, возвращающую новый объект (например, CGColorCreateCopyWithAlpha), объект имеет retain count, равный 1. После использования его необходимо освободить с помощью CGColorRelease. Системные константы (например, kCGColorWhite) освобождать не требуется, так как они управляются системой.
Основные функции для работы с CGColorRef
CGColorCreate(CGColorSpaceRef space, const CGFloat components[])— создаёт новый цвет.CGColorCreateCopyWithAlpha(CGColorRef color, CGFloat alpha)— создаёт копию цвета с изменённым альфа-каналом.CGColorRetain(CGColorRef color)— увеличивает счётчик ссылок.CGColorRelease(CGColorRef color)— уменьшает счётчик ссылок и освобождает память, если счётчик достигает нуля.CGColorGetColorSpace(CGColorRef color)— возвращает цветовое пространство цвета.CGColorGetNumberOfComponents(CGColorRef color)— возвращает количество компонентов (включая альфа).CGColorGetComponents(CGColorRef color)— возвращает указатель на массив компонентов.CGColorGetAlpha(CGColorRef color)— возвращает значение альфа-канала.CGColorEqualToColor(CGColorRef color1, CGColorRef color2)— сравнивает два цвета на равенство (с учётом цветового пространства и компонентов).
Пример использования
Ниже приведён пример на языке C, демонстрирующий создание красного цвета и его использование для заливки прямоугольника в графическом контексте:
```c
include <CoreGraphics/CoreGraphics.h>
void drawRedRectangle(CGContextRef context, CGRect rect) { // Создание цветового пространства sRGB (рекомендуется) CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB);
// Компоненты: R=1.0, G=0.0, B=0.0, A=1.0 CGFloat components[] = {1.0, 0.0, 0.0, 1.0}; CGColorRef red = CGColorCreate(colorSpace, components);
// Установка цвета заливки в контексте CGContextSetFillColorWithColor(context, red);
// Рисование залитого прямоугольника CGContextFillRect(context, rect);
// Освобождение ресурсов CGColorRelease(red); CGColorSpaceRelease(colorSpace); } ```
Взаимодействие с другими API Apple
CGColorRef тесно интегрирован с другими фреймворками Apple:
- UIKit (iOS): UIColor содержит свойство
CGColorи методinitWithCGColor:. При работе с Core Graphics в iOS часто используется преобразованиеsomeUIColor.CGColor. - AppKit (macOS): NSColor также предоставляет свойство
CGColorи методinitWithCGColor:. - Core Animation: CALayer имеет свойства
backgroundColor,borderColor,shadowColor, которые принимаютCGColorRef(в Objective-C) илиCGColor(в Swift). - Metal и SceneKit: В некоторых контекстах для задания цветовых констант также используются CGColorRef или его производные.
- SwiftUI: Хотя SwiftUI использует собственный тип
Color, он может быть преобразован вCGColorчерез методыcgColorилиresolve(in:).
Ограничения и особенности
- Непрозрачность: Поскольку CGColorRef является непрозрачным типом, его нельзя напрямую наследовать или изменять после создания. Все изменения (например, изменение альфа-канала) приводят к созданию нового объекта.
- Сравнение цветов: Функция
CGColorEqualToColorучитывает как компоненты, так и цветовое пространство. Два цвета с одинаковыми компонентами, но разными цветовыми пространствами (например, sRGB и DeviceRGB) будут считаться разными. - Производительность: Создание и освобождение большого количества объектов CGColorRef может быть затратным. Для повторяющихся операций рекомендуется кэшировать часто используемые цвета.
- Цветовые пространства: Использование пространств, зависящих от устройства (DeviceRGB, DeviceGray, DeviceCMYK), считается устаревшей практикой. Apple рекомендует использовать пространства, не зависящие от устройства, такие как sRGB или Generic RGB.
Источники
- Apple Inc. Core Graphics Framework Reference. Developer Documentation Archive.
- Apple Inc. Quartz 2D Programming Guide. Developer Documentation Archive.
- Apple Inc. CGColorRef Reference. Developer Documentation (Xcode, macOS, iOS).
- Apple Inc. WWDC Sessions: "Modernizing Graphics and Color" (2016, 2017).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →