В Objective-C (OS X) это координатное пространство глобального отображения, используемое Quartz Display Services так же, как и Cocoa "экранное" пространство координат?

Я пытаюсь создать изображение "loupe" для моего приложения, которое можно использовать для проверки изображений с разными уровнями увеличения, и я столкнулся с проблемой дорожного удара. Я использую Quartz для создания моментального снимка CGImageRef выбранной части экрана, на котором находится мое окно приложения. Проблема в том, что номенклатура, используемая всеми различными технологиями OS X, меня действительно смутила.

Функция, которую я использую, CGDisplayCreateImageForRect(CGDirectDisplayID display, CGRect rect). В документации указано, что параметр CGRect rect - это "прямоугольник, указанный в пространстве отображения", поскольку часть отображаемого изображения копируется в изображение ". Проблема в том, что вывод, который я получаю в консоли, не то, что я ожидал. Я пробовал так много разных преобразований, преобразований, кодовых флип и т.д., Что я на 100% запутался.

Итак, я догадываюсь, что мой вопрос сводится к следующему: имеет ли пространство экрана == пространство устройства == пространство отображения, и как правильно преобразовать его или ее ракурс просмотра (который является настраиваемым окном без полей) (внизу -left origin) в соответствии с координатами отображения (начало слева)?

Если кто-то мог бы установить меня прямо или указать мне в правильном направлении, я был бы всегда благодарен. Спасибо!

Ответ 1

Кварц использует координатное пространство, в котором начало (0, 0) находится в левом верхнем углу основного дисплея. Увеличение y уменьшается.

Cocoa использует координатное пространство, в котором начало координат (0, 0) находится в левом нижнем углу основного дисплея, а увеличение y увеличивается.

Вы можете преобразовать оконный фрейм из Cocoa в Quartz следующим образом:

NSRect frame = window.frame;
frame.origin.y = NSMaxY(NSScreen.screens[0].frame) - NSMaxY(frame);
CGRect quartzRect = NSRectToCGRect(frame);

Примечание: вы не используете окно -screen, вы всегда используете основной экран.

Это для прямоугольника в координатах окна. Для прямоугольника в представлении сначала конвертируйте из координат вида в координаты окна с помощью -[NSView convertRect:toView:] с nil в качестве вида назначения, обозначающего окно. Это было бы правильно для someView.bounds, но не для someView.frame, так как рамка представления находится в системе координат супервизора.