]> source.dussan.org Git - tigervnc.git/commitdiff
Filter out alpha channel for normal draw() operation
authorPierre Ossman <ossman@cendio.se>
Fri, 28 Apr 2017 09:40:02 +0000 (11:40 +0200)
committerPierre Ossman <ossman@cendio.se>
Fri, 28 Apr 2017 10:58:57 +0000 (12:58 +0200)
macOS actually uses the alpha channel on windows, so we can get visual
artifacts if we feed it bogus alpha data. This filtering unfortunately
causes some CPU usage, but it's necessary until we can make sure the
framebuffer always contains proper 0xff for alpha.

(cherry picked from commit a88991bdc8154bda8a805755dd82cb71c93b35df)

vncviewer/Surface_OSX.cxx

index 3313ae3bd5ef546b57e45bed7d9d569324fbbcb9..fe2d722b9e9587f2cd02a30ec33cce04c3015129 100644 (file)
@@ -33,9 +33,10 @@ static CGColorSpaceRef srgb = CGColorSpaceCreateWithName(kCGColorSpaceSRGB);
 
 static CGImageRef create_image(CGColorSpaceRef lut,
                                const unsigned char* data,
-                               int w, int h)
+                               int w, int h, bool skip_alpha)
 {
   CGDataProviderRef provider;
+  CGImageAlphaInfo alpha;
 
   CGImageRef image;
 
@@ -44,8 +45,15 @@ static CGImageRef create_image(CGColorSpaceRef lut,
   if (!provider)
     throw rdr::Exception("CGDataProviderCreateWithData");
 
+  // FIXME: This causes a performance hit, but is necessary to avoid
+  //        artifacts in the edges of the window
+  if (skip_alpha)
+    alpha = kCGImageAlphaNoneSkipFirst;
+  else
+    alpha = kCGImageAlphaPremultipliedFirst;
+
   image = CGImageCreate(w, h, 8, 32, w * 4, lut,
-                        kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little,
+                        alpha | kCGBitmapByteOrder32Little,
                         provider, NULL, false, kCGRenderingIntentDefault);
   CGDataProviderRelease(provider);
   if (!image)
@@ -63,7 +71,7 @@ static void render(CGContextRef gc, CGColorSpaceRef lut,
   CGRect rect;
   CGImageRef image, subimage;
 
-  image = create_image(lut, data, src_w, src_h);
+  image = create_image(lut, data, src_w, src_h, mode == kCGBlendModeCopy);
 
   rect.origin.x = src_x;
   rect.origin.y = src_y;