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

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 →