6@implementation QNSView (Drawing)
10 if (qt_mac_resolveOption(-1, m_platformWindow->window(),
11 "_q_mac_wantsLayer",
"QT_MAC_WANTS_LAYER") != -1) {
12 qCWarning(lcQpaDrawing) <<
"Layer-backing is always enabled."
13 <<
" QT_MAC_WANTS_LAYER/_q_mac_wantsLayer has no effect.";
19 NSData *iccData = colorSpace.iccProfile().toNSData();
20 self.colorSpace = [[[NSColorSpace alloc] initWithICCProfileData:iccData] autorelease];
24 self.wantsLayer = YES;
29 if (!m_platformWindow)
31 return m_platformWindow->isOpaque();
39- (NSColorSpace*)colorSpace
42 return m_colorSpace ? m_colorSpace :
self.window.colorSpace;
47- (BOOL)shouldUseMetalLayer
71- (CALayer *)makeBackingLayer
73 if ([self shouldUseMetalLayer]) {
77 if ([MTLCreateSystemDefaultDevice() autorelease]) {
78 return [CAMetalLayer layer];
80 qCWarning(lcQpaDrawing) <<
"Failed to create QWindow::MetalSurface."
81 <<
"Metal is not supported by any of the GPUs in this system.";
85 return [
super makeBackingLayer];
95- (
void)setLayer:(CALayer *)layer
98 << (
self.wantsLayer ?
"layer-backed" :
"layer-hosted")
101 if (
layer.delegate &&
layer.delegate != self) {
102 qCWarning(lcQpaDrawing) <<
"Layer already has delegate" <<
layer.delegate
103 <<
"This delegate is responsible for all view updates for" <<
self;
108 [
super setLayer:layer];
110 [
self propagateBackingProperties];
112 if (
self.opaque && lcQpaDrawing().isDebugEnabled()) {
116 layer.backgroundColor = NSColor.magentaColor.CGColor;
123- (NSViewLayerContentsRedrawPolicy)layerContentsRedrawPolicy
127 return NSViewLayerContentsRedrawDuringViewResize;
130- (NSViewLayerContentsPlacement)layerContentsPlacement
136 return NSViewLayerContentsPlacementTopLeft;
139- (
void)viewDidChangeBackingProperties
141 qCDebug(lcQpaDrawing) <<
"Backing properties changed for" <<
self;
143 [
self propagateBackingProperties];
149 [
self setNeedsDisplay:YES];
152- (
void)propagateBackingProperties
164 auto devicePixelRatio = m_platformWindow->devicePixelRatio();
165 qCDebug(lcQpaDrawing) <<
"Updating" <<
self.layer <<
"content scale to" << devicePixelRatio;
166 self.layer.contentsScale = devicePixelRatio;
168 if ([
self.layer isKindOfClass:CAMetalLayer.class]) {
169 CAMetalLayer *metalLayer =
static_cast<CAMetalLayer *
>(
self.layer);
170 metalLayer.colorspace =
self.colorSpace.CGColorSpace;
171 qCDebug(lcQpaDrawing) <<
"Set" << metalLayer <<
"color space to" << metalLayer.colorspace;
181- (BOOL)
layer:(CALayer *)layer shouldInheritContentsScale:(
CGFloat)scale fromWindow:(NSWindow *)window
195- (
void)drawRect:(NSRect)dirtyBoundingRect
201 qCWarning(lcQpaDrawing) <<
"[QNSView drawRect] called for layer backed view";
208- (
void)displayLayer:(CALayer *)layer
211 "The displayLayer code path should only be hit for our own layer");
213 if (!m_platformWindow)
216 if (!NSThread.isMainThread) {
220 qCWarning(lcQpaDrawing) <<
"Display non non-main thread! Deferring to main thread";
221 dispatch_async(dispatch_get_main_queue(), ^{
self.needsDisplay = YES; });
225 qCDebug(lcQpaDrawing) <<
"[QNSView displayLayer]" << m_platformWindow->window();
226 m_platformWindow->handleExposeEvent(QRectF::fromCGRect(
self.bounds).toRect());
The QColorSpace class provides a color space abstraction.
SurfaceType
The SurfaceType enum describes what type of surface this is.
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
#define qCWarning(category,...)
#define qCDebug(category,...)
GLenum GLenum GLenum GLenum GLenum scale
#define Q_ASSERT_X(cond, x, msg)