Filter out alpha channel for normal draw() operation
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.
diff --git a/vncviewer/Surface_OSX.cxx b/vncviewer/Surface_OSX.cxx
index 3313ae3..fe2d722 100644
--- a/vncviewer/Surface_OSX.cxx
+++ b/vncviewer/Surface_OSX.cxx
@@ -33,9 +33,10 @@
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 @@
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 @@
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;